/ Hex Artifact Content
Login

Artifact c63a05eff963c3c8d412441301df8246372d072f:


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 50 72 65  .  Tcl_Obj *pPre
1350: 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 2f 2a  UpdateHook;   /*
1360: 20 50 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   Pre-update hook
1370: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
1380: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
1390: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20  RollbackHook;   
13a0: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f   /* Rollback hoo
13b0: 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  k script (if any
13c0: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
13d0: 70 57 61 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20  pWalHook;       
13e0: 20 20 2f 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63    /* WAL hook sc
13f0: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
1400: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c  .  Tcl_Obj *pUnl
1410: 6f 63 6b 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a  ockNotify;    /*
1420: 20 55 6e 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73   Unlock notify s
1430: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
1440: 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  /.  SqlCollate *
1450: 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f  pCollate;      /
1460: 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 63 6f  * List of SQL co
1470: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
1480: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
14b0: 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e 74 20   of most recent 
14c0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 2a  sqlite3_exec() *
14d0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f  /.  Tcl_Obj *pCo
14e0: 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20 20 2f  llateNeeded;   /
14f0: 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  * Collation need
1500: 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 53  ed script */.  S
1510: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
1520: 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73  stmtList; /* Lis
1530: 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  t of prepared st
1540: 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c  atements*/.  Sql
1550: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74  PreparedStmt *st
1560: 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20  mtLast; /* Last 
1570: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
1580: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d   list */.  int m
1590: 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  axStmt;         
15a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
15b0: 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  t maximum number
15c0: 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a   of stmtList */.
15d0: 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20    int nStmt;    
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f0: 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d  Number of statem
1600: 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69 73 74  ents in stmtList
1610: 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68   */.  IncrblobCh
1620: 61 6e 6e 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62  annel *pIncrblob
1630: 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20  ;/* Linked list 
1640: 6f 66 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  of open incrblob
1650: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69   channels */.  i
1660: 6e 74 20 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c  nt nStep, nSort,
1670: 20 6e 49 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61   nIndex;  /* Sta
1680: 74 69 73 74 69 63 73 20 66 6f 72 20 6d 6f 73 74  tistics for most
1690: 20 72 65 63 65 6e 74 20 6f 70 65 72 61 74 69 6f   recent operatio
16a0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e  n */.  int nTran
16b0: 73 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  saction;        
16c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
16d0: 65 73 74 65 64 20 5b 74 72 61 6e 73 61 63 74 69  ested [transacti
16e0: 6f 6e 5d 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23  on] methods */.#
16f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1700: 54 0a 20 20 69 6e 74 20 62 4c 65 67 61 63 79 50  T.  int bLegacyP
1710: 72 65 70 61 72 65 3b 20 20 20 20 20 20 20 20 2f  repare;        /
1720: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 73 71  * True to use sq
1730: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
1740: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74  */.#endif.};..st
1750: 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61  ruct IncrblobCha
1760: 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33  nnel {.  sqlite3
1770: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20  _blob *pBlob;   
1780: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c     /* sqlite3 bl
1790: 6f 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53  ob handle */.  S
17a0: 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20  qliteDb *pDb;   
17b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
17c0: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
17d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
17e0: 69 6e 74 20 69 53 65 65 6b 3b 20 20 20 20 20 20  int iSeek;      
17f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1800: 72 65 6e 74 20 73 65 65 6b 20 6f 66 66 73 65 74  rent seek offset
1810: 20 2a 2f 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65   */.  Tcl_Channe
1820: 6c 20 63 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20  l channel;      
1830: 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74  /* Channel ident
1840: 69 66 69 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62  ifier */.  Incrb
1850: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78  lobChannel *pNex
1860: 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c  t;   /* Linked l
1870: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ist of all open 
1880: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
1890: 73 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43  s */.  IncrblobC
18a0: 68 61 6e 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20  hannel *pPrev;  
18b0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
18c0: 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72  of all open incr
18d0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
18e0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .};../*.** Compu
18f0: 74 65 20 61 20 73 74 72 69 6e 67 20 6c 65 6e 67  te a string leng
1900: 74 68 20 74 68 61 74 20 69 73 20 6c 69 6d 69 74  th that is limit
1910: 65 64 20 74 6f 20 77 68 61 74 20 63 61 6e 20 62  ed to what can b
1920: 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c  e stored in.** l
1930: 6f 77 65 72 20 33 30 20 62 69 74 73 20 6f 66 20  ower 30 bits of 
1940: 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20  a 32-bit signed 
1950: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
1960: 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 33 30 28  ic int strlen30(
1970: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
1980: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
1990: 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a   = z;.  while( *
19a0: 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20  z2 ){ z2++; }.  
19b0: 72 65 74 75 72 6e 20 30 78 33 66 66 66 66 66 66  return 0x3ffffff
19c0: 66 20 26 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a  f & (int)(z2 - z
19d0: 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
19e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
19f0: 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  LOB./*.** Close 
1a00: 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  all incrblob cha
1a10: 6e 6e 65 6c 73 20 6f 70 65 6e 65 64 20 75 73 69  nnels opened usi
1a20: 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ng database conn
1a30: 65 63 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54  ection pDb..** T
1a40: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68  his is called wh
1a50: 65 6e 20 73 68 75 74 74 69 6e 67 20 64 6f 77 6e  en shutting down
1a60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
1a70: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
1a80: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e  tic void closeIn
1a90: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53  crblobChannels(S
1aa0: 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b 0a 20  qliteDb *pDb){. 
1ab0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
1ac0: 20 2a 70 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43   *p;.  IncrblobC
1ad0: 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a  hannel *pNext;..
1ae0: 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e    for(p=pDb->pIn
1af0: 63 72 62 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65  crblob; p; p=pNe
1b00: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
1b10: 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20   p->pNext;..    
1b20: 2f 2a 20 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67  /* Note: Calling
1b30: 20 75 6e 72 65 67 69 73 74 65 72 20 68 65 72 65   unregister here
1b40: 20 63 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20   call Tcl_Close 
1b50: 6f 6e 20 74 68 65 20 69 6e 63 72 62 6c 6f 62 20  on the incrblob 
1b60: 63 68 61 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a  channel, .    **
1b70: 20 77 68 69 63 68 20 64 65 6c 65 74 65 73 20 74   which deletes t
1b80: 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  he IncrblobChann
1b90: 65 6c 20 73 74 72 75 63 74 75 72 65 20 61 74 20  el structure at 
1ba0: 2a 70 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20  *p. So do not.  
1bb0: 20 20 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72    ** call Tcl_Fr
1bc0: 65 65 28 29 20 68 65 72 65 2e 0a 20 20 20 20 2a  ee() here..    *
1bd0: 2f 0a 20 20 20 20 54 63 6c 5f 55 6e 72 65 67 69  /.    Tcl_Unregi
1be0: 73 74 65 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d  sterChannel(pDb-
1bf0: 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e  >interp, p->chan
1c00: 6e 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nel);.  }.}../*.
1c10: 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72  ** Close an incr
1c20: 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61  emental blob cha
1c30: 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nnel..*/.static 
1c40: 69 6e 74 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73  int incrblobClos
1c50: 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  e(ClientData ins
1c60: 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49  tanceData, Tcl_I
1c70: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
1c80: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1c90: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
1ca0: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
1cb0: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 63  ceData;.  int rc
1cc0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
1cd0: 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b  close(p->pBlob);
1ce0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1cf0: 20 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20   p->pDb->db;..  
1d00: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63 68  /* Remove the ch
1d10: 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 53  annel from the S
1d20: 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f  qliteDb.pIncrblo
1d30: 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28  b list. */.  if(
1d40: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
1d50: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
1d60: 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
1d70: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
1d80: 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
1d90: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
1da0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
1db0: 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d  pDb->pIncrblob==
1dc0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d  p ){.    p->pDb-
1dd0: 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e  >pIncrblob = p->
1de0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pNext;.  }..  /*
1df0: 20 46 72 65 65 20 74 68 65 20 49 6e 63 72 62 6c   Free the Incrbl
1e00: 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74  obChannel struct
1e10: 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65  ure */.  Tcl_Fre
1e20: 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20  e((char *)p);.. 
1e30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e40: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
1e50: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1e60: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
1e70: 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f  errmsg(db), TCL_
1e80: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
1e90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ea0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1eb0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
1ec0: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e  ead data from an
1ed0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
1ee0: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
1ef0: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
1f00: 62 49 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e 74  bInput(.  Client
1f10: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
1f20: 61 2c 20 0a 20 20 63 68 61 72 20 2a 62 75 66 2c  a, .  char *buf,
1f30: 20 0a 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c   .  int bufSize,
1f40: 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  .  int *errorCod
1f50: 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c  ePtr.){.  Incrbl
1f60: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
1f70: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1f80: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
1f90: 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 62 75    int nRead = bu
1fa0: 66 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f  fSize;         /
1fb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1fc0: 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  s to read */.  i
1fd0: 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  nt nBlob;       
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ff0: 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
2000: 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72   blob */.  int r
2010: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2020: 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2030: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
2040: 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  nBlob = sqlit
2050: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
2060: 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28  >pBlob);.  if( (
2070: 70 2d 3e 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e  p->iSeek+nRead)>
2080: 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65  nBlob ){.    nRe
2090: 61 64 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53  ad = nBlob-p->iS
20a0: 65 65 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  eek;.  }.  if( n
20b0: 52 65 61 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72  Read<=0 ){.    r
20c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
20d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
20e0: 62 5f 72 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c  b_read(p->pBlob,
20f0: 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52   (void *)buf, nR
2100: 65 61 64 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a  ead, p->iSeek);.
2110: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2120: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f  _OK ){.    *erro
2130: 72 43 6f 64 65 50 74 72 20 3d 20 72 63 3b 0a 20  rCodePtr = rc;. 
2140: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
2150: 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d  }..  p->iSeek +=
2160: 20 6e 52 65 61 64 3b 0a 20 20 72 65 74 75 72 6e   nRead;.  return
2170: 20 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nRead;.}../*.**
2180: 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20 61   Write data to a
2190: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  n incremental bl
21a0: 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73  ob channel..*/.s
21b0: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
21c0: 6f 62 4f 75 74 70 75 74 28 0a 20 20 43 6c 69 65  obOutput(.  Clie
21d0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
21e0: 61 74 61 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68  ata, .  CONST ch
21f0: 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20  ar *buf, .  int 
2200: 74 6f 57 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a  toWrite,.  int *
2210: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a  errorCodePtr.){.
2220: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
2230: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
2240: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
2250: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57  ceData;.  int nW
2260: 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65 3b 20  rite = toWrite; 
2270: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2280: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69   of bytes to wri
2290: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f  te */.  int nBlo
22a0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22b0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
22c0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a  ze of the blob *
22d0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72   /* sqlite error
2300: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f   code */..  nBlo
2310: 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  b = sqlite3_blob
2320: 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29  _bytes(p->pBlob)
2330: 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65  ;.  if( (p->iSee
2340: 6b 2b 6e 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20  k+nWrite)>nBlob 
2350: 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ){.    *errorCod
2360: 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20  ePtr = EINVAL;. 
2370: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
2380: 7d 0a 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d  }.  if( nWrite<=
2390: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
23a0: 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  0;.  }..  rc = s
23b0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
23c0: 65 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69  e(p->pBlob, (voi
23d0: 64 20 2a 29 62 75 66 2c 20 6e 57 72 69 74 65 2c  d *)buf, nWrite,
23e0: 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66   p->iSeek);.  if
23f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2400: 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ){.    *errorCod
2410: 65 50 74 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20  ePtr = EIO;.    
2420: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a  return -1;.  }..
2430: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57    p->iSeek += nW
2440: 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  rite;.  return n
2450: 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Write;.}../*.** 
2460: 53 65 65 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e  Seek an incremen
2470: 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  tal blob channel
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 69 6e 63 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20  incrblobSeek(.  
24a0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
24b0: 6e 63 65 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67  nceData, .  long
24c0: 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 73   offset,.  int s
24d0: 65 65 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a  eekMode,.  int *
24e0: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a  errorCodePtr.){.
24f0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
2500: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
2510: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
2520: 63 65 44 61 74 61 3b 0a 0a 20 20 73 77 69 74 63  ceData;..  switc
2530: 68 28 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20  h( seekMode ){. 
2540: 20 20 20 63 61 73 65 20 53 45 45 4b 5f 53 45 54     case SEEK_SET
2550: 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b  :.      p->iSeek
2560: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   = offset;.     
2570: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2580: 20 53 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20   SEEK_CUR:.     
2590: 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66   p->iSeek += off
25a0: 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  set;.      break
25b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f  ;.    case SEEK_
25c0: 45 4e 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53  END:.      p->iS
25d0: 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  eek = sqlite3_bl
25e0: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f  ob_bytes(p->pBlo
25f0: 62 29 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20  b) + offset;.   
2600: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64     break;..    d
2610: 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 21  efault: assert(!
2620: 22 42 61 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b  "Bad seekMode");
2630: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2640: 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61  ->iSeek;.}...sta
2650: 74 69 63 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f  tic void incrblo
2660: 62 57 61 74 63 68 28 43 6c 69 65 6e 74 44 61 74  bWatch(ClientDat
2670: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
2680: 69 6e 74 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a  int mode){ .  /*
2690: 20 4e 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61   NO-OP */ .}.sta
26a0: 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62  tic int incrblob
26b0: 48 61 6e 64 6c 65 28 43 6c 69 65 6e 74 44 61 74  Handle(ClientDat
26c0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
26d0: 69 6e 74 20 64 69 72 2c 20 43 6c 69 65 6e 74 44  int dir, ClientD
26e0: 61 74 61 20 2a 68 50 74 72 29 7b 0a 20 20 72 65  ata *hPtr){.  re
26f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2700: 7d 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68  }..static Tcl_Ch
2710: 61 6e 6e 65 6c 54 79 70 65 20 49 6e 63 72 62 6c  annelType Incrbl
2720: 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20  obChannelType = 
2730: 7b 0a 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20  {.  "incrblob", 
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 20 20 2f 2a 20 74 79 70 65 4e 61         /* typeNa
2760: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2780: 2f 0a 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f  /.  TCL_CHANNEL_
2790: 56 45 52 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20  VERSION_2,      
27a0: 20 20 20 20 20 20 20 2f 2a 20 76 65 72 73 69 6f         /* versio
27b0: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
27d0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73  /.  incrblobClos
27e0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
27f0: 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50         /* closeP
2800: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2820: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75  /.  incrblobInpu
2830: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2840: 20 20 20 20 20 20 20 2f 2a 20 69 6e 70 75 74 50         /* inputP
2850: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2870: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70  /.  incrblobOutp
2880: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
2890: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70 75 74         /* output
28a0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
28c0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b  /.  incrblobSeek
28d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28e0: 20 20 20 20 20 20 20 2f 2a 20 73 65 65 6b 50 72         /* seekPr
28f0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2910: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 20 2f 2a 20 73 65 74 4f 70 74         /* setOpt
2940: 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20  ionProc         
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2960: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 20 20 20 2f 2a 20 67 65 74 4f 70 74         /* getOpt
2990: 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20  ionProc         
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
29b0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 57 61 74 63  /.  incrblobWatc
29c0: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
29d0: 20 20 20 20 20 20 20 2f 2a 20 77 61 74 63 68 50         /* watchP
29e0: 72 6f 63 20 28 74 68 69 73 20 69 73 20 61 20 6e  roc (this is a n
29f0: 6f 2d 6f 70 29 20 20 20 20 20 20 20 20 20 20 2a  o-op)          *
2a00: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64  /.  incrblobHand
2a10: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
2a20: 20 20 20 20 20 20 20 2f 2a 20 67 65 74 48 61 6e         /* getHan
2a30: 64 6c 65 50 72 6f 63 20 28 61 6c 77 61 79 73 20  dleProc (always 
2a40: 72 65 74 75 72 6e 73 20 65 72 72 6f 72 29 20 2a  returns error) *
2a50: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a70: 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32         /* close2
2a80: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2aa0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d         /* blockM
2ad0: 6f 64 65 50 72 6f 63 20 20 20 20 20 20 20 20 20  odeProc         
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2af0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b10: 20 20 20 20 20 20 20 2f 2a 20 66 6c 75 73 68 50         /* flushP
2b20: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2b40: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 20 20 20 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65         /* handle
2b70: 72 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  rProc           
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2b90: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 20 20 20 20 2f 2a 20 77 69 64 65 53 65         /* wideSe
2bc0: 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  ekProc          
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2be0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  /.};../*.** Crea
2bf0: 74 65 20 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f  te a new incrblo
2c00: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
2c10: 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 49  atic int createI
2c20: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a  ncrblobChannel(.
2c30: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2c40: 74 65 72 70 2c 20 0a 20 20 53 71 6c 69 74 65 44  terp, .  SqliteD
2c50: 62 20 2a 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74  b *pDb, .  const
2c60: 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f   char *zDb,.  co
2c70: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
2c80: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
2c90: 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c  *zColumn, .  sql
2ca0: 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a  ite_int64 iRow,.
2cb0: 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
2cc0: 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  .){.  IncrblobCh
2cd0: 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69  annel *p;.  sqli
2ce0: 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64  te3 *db = pDb->d
2cf0: 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  b;.  sqlite3_blo
2d00: 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20  b *pBlob;.  int 
2d10: 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  rc;.  int flags 
2d20: 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28  = TCL_READABLE|(
2d30: 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a  isReadonly ? 0 :
2d40: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a   TCL_WRITABLE);.
2d50: 0a 20 20 2f 2a 20 54 68 69 73 20 76 61 72 69 61  .  /* This varia
2d60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6e  ble is used to n
2d70: 61 6d 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 73  ame the channels
2d80: 3a 20 22 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63  : "incrblob_[inc
2d90: 72 20 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73  r count]" */.  s
2da0: 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 20  tatic int count 
2db0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 43 68 61  = 0;.  char zCha
2dc0: 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20  nnel[64];..  rc 
2dd0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  = sqlite3_blob_o
2de0: 70 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61  pen(db, zDb, zTa
2df0: 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52  ble, zColumn, iR
2e00: 6f 77 2c 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c  ow, !isReadonly,
2e10: 20 26 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20   &pBlob);.  if( 
2e20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e30: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
2e40: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
2e50: 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
2e60: 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f  g(pDb->db), TCL_
2e70: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
2e80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2e90: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63  .  }..  p = (Inc
2ea0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54  rblobChannel *)T
2eb0: 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  cl_Alloc(sizeof(
2ec0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29  IncrblobChannel)
2ed0: 29 3b 0a 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20  );.  p->iSeek = 
2ee0: 30 3b 0a 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20  0;.  p->pBlob = 
2ef0: 70 42 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65  pBlob;..  sqlite
2f00: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2f10: 66 28 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68  f(zChannel), zCh
2f20: 61 6e 6e 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62  annel, "incrblob
2f30: 5f 25 64 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a  _%d", ++count);.
2f40: 20 20 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54    p->channel = T
2f50: 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 6c  cl_CreateChannel
2f60: 28 26 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  (&IncrblobChanne
2f70: 6c 54 79 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c  lType, zChannel,
2f80: 20 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 54 63   p, flags);.  Tc
2f90: 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65  l_RegisterChanne
2fa0: 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61  l(interp, p->cha
2fb0: 6e 6e 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e  nnel);..  /* Lin
2fc0: 6b 20 74 68 65 20 6e 65 77 20 63 68 61 6e 6e 65  k the new channe
2fd0: 6c 20 69 6e 74 6f 20 74 68 65 20 53 71 6c 69 74  l into the Sqlit
2fe0: 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69  eDb.pIncrblob li
2ff0: 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78  st. */.  p->pNex
3000: 74 20 3d 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c  t = pDb->pIncrbl
3010: 6f 62 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d  ob;.  p->pPrev =
3020: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65   0;.  if( p->pNe
3030: 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
3040: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
3050: 20 7d 0a 20 20 70 44 62 2d 3e 70 49 6e 63 72 62   }.  pDb->pIncrb
3060: 6c 6f 62 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44  lob = p;.  p->pD
3070: 62 20 3d 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f  b = pDb;..  Tcl_
3080: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
3090: 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65  , (char *)Tcl_Ge
30a0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e  tChannelName(p->
30b0: 63 68 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f  channel), TCL_VO
30c0: 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72  LATILE);.  retur
30d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73  n TCL_OK;.}.#els
30e0: 65 20 20 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73  e  /* else claus
30f0: 65 20 66 6f 72 20 22 23 69 66 6e 64 65 66 20 53  e for "#ifndef S
3100: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
3110: 4c 4f 42 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e  LOB" */.  #defin
3120: 65 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43  e closeIncrblobC
3130: 68 61 6e 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e  hannels(pDb).#en
3140: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20  dif../*.** Look 
3150: 61 74 20 74 68 65 20 73 63 72 69 70 74 20 70 72  at the script pr
3160: 65 66 69 78 20 69 6e 20 70 43 6d 64 2e 20 20 57  efix in pCmd.  W
3170: 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74  e will be execut
3180: 69 6e 67 20 74 68 69 73 20 73 63 72 69 70 74 0a  ing this script.
3190: 2a 2a 20 61 66 74 65 72 20 66 69 72 73 74 20 61  ** after first a
31a0: 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20  ppending one or 
31b0: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2e 20  more arguments. 
31c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
31d0: 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63  alyzes.** the sc
31e0: 72 69 70 74 20 74 6f 20 73 65 65 20 69 66 20 69  ript to see if i
31f0: 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  t is safe to use
3200: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
3210: 6f 6e 20 74 68 65 20 73 63 72 69 70 74 0a 2a 2a  on the script.**
3220: 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65   rather than the
3230: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 54 63   more general Tc
3240: 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20 54 63 6c  l_EvalEx().  Tcl
3250: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d  _EvalObjv() is m
3260: 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a  uch.** faster..*
3270: 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20 74 68 61  *.** Scripts tha
3280: 74 20 61 72 65 20 73 61 66 65 20 74 6f 20 75 73  t are safe to us
3290: 65 20 77 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f  e with Tcl_EvalO
32a0: 62 6a 76 28 29 20 63 6f 6e 73 69 73 74 73 20 6f  bjv() consists o
32b0: 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e  f a.** command n
32c0: 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ame followed by 
32d0: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67  zero or more arg
32e0: 75 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b  uments with no [
32f0: 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20  ...] or $.** or 
3300: 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65  {...} or ; to be
3310: 20 73 65 65 6e 20 61 6e 79 77 68 65 72 65 2e 20   seen anywhere. 
3320: 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20 73   Most callback s
3330: 63 72 69 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a  cripts consist.*
3340: 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 69 6e 67  * of just a sing
3350: 6c 65 20 70 72 6f 63 65 64 75 72 65 20 6e 61 6d  le procedure nam
3360: 65 20 61 6e 64 20 74 68 65 79 20 6d 65 65 74 20  e and they meet 
3370: 74 68 69 73 20 72 65 71 75 69 72 65 6d 65 6e 74  this requirement
3380: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3390: 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a  safeToUseEvalObj
33a0: 76 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  v(Tcl_Interp *in
33b0: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70  terp, Tcl_Obj *p
33c0: 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f  Cmd){.  /* We co
33d0: 75 6c 64 20 74 72 79 20 74 6f 20 64 6f 20 73 6f  uld try to do so
33e0: 6d 65 74 68 69 6e 67 20 77 69 74 68 20 54 63 6c  mething with Tcl
33f0: 5f 50 61 72 73 65 28 29 2e 20 20 42 75 74 20 77  _Parse().  But w
3400: 65 20 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20  e will instead. 
3410: 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20 73 65   ** just do a se
3420: 61 72 63 68 20 66 6f 72 20 66 6f 72 62 69 64 64  arch for forbidd
3430: 65 6e 20 63 68 61 72 61 63 74 65 72 73 2e 20 20  en characters.  
3440: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
3450: 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61  rbidden.  ** cha
3460: 72 61 63 74 65 72 73 20 61 70 70 65 61 72 20 69  racters appear i
3470: 6e 20 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20  n pCmd, we will 
3480: 72 65 70 6f 72 74 20 74 68 65 20 73 74 72 69 6e  report the strin
3490: 67 20 61 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a  g as unsafe..  *
34a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
34b0: 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20  z;.  int n;.  z 
34c0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
34d0: 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29  romObj(pCmd, &n)
34e0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
34f0: 20 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20   0 ){.    int c 
3500: 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66  = *(z++);.    if
3510: 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27  ( c=='$' || c=='
3520: 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72  [' || c==';' ) r
3530: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
3540: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
3550: 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e  * Find an SqlFun
3560: 63 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  c structure with
3570: 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e   the given name.
3580: 20 20 4f 72 20 63 72 65 61 74 65 20 61 20 6e 65    Or create a ne
3590: 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65  w.** one if an e
35a0: 78 69 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e  xisting one cann
35b0: 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20 20 52 65  ot be found.  Re
35c0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
35d0: 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75 63 74 75  o the.** structu
35e0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71  re..*/.static Sq
35f0: 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75  lFunc *findSqlFu
3600: 6e 63 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62  nc(SqliteDb *pDb
3610: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
3620: 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20  ame){.  SqlFunc 
3630: 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  *p, *pNew;.  int
3640: 20 69 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53 71   i;.  pNew = (Sq
3650: 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63  lFunc*)Tcl_Alloc
3660: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
3670: 2b 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  + strlen30(zName
3680: 29 20 2b 20 31 20 29 3b 0a 20 20 70 4e 65 77 2d  ) + 1 );.  pNew-
3690: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
36a0: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 66 6f 72 28  &pNew[1];.  for(
36b0: 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69  i=0; zName[i]; i
36c0: 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  ++){ pNew->zName
36d0: 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 4e  [i] = tolower(zN
36e0: 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20 20 70 4e 65  ame[i]); }.  pNe
36f0: 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  w->zName[i] = 0;
3700: 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70 46  .  for(p=pDb->pF
3710: 75 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  unc; p; p=p->pNe
3720: 78 74 29 7b 20 0a 20 20 20 20 69 66 28 20 73 74  xt){ .    if( st
3730: 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70  rcmp(p->zName, p
3740: 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29  New->zName)==0 )
3750: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65  {.      Tcl_Free
3760: 28 28 63 68 61 72 2a 29 70 4e 65 77 29 3b 0a 20  ((char*)pNew);. 
3770: 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20       return p;. 
3780: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d     }.  }.  pNew-
3790: 3e 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69  >interp = pDb->i
37a0: 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77 2d 3e 70  nterp;.  pNew->p
37b0: 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 4e 65 77  Db = pDb;.  pNew
37c0: 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20  ->pScript = 0;. 
37d0: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
37e0: 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62  Db->pFunc;.  pDb
37f0: 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a  ->pFunc = pNew;.
3800: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3810: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73  ../*.** Free a s
3820: 69 6e 67 6c 65 20 53 71 6c 50 72 65 70 61 72 65  ingle SqlPrepare
3830: 64 53 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  dStmt object..*/
3840: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 46  .static void dbF
3850: 72 65 65 53 74 6d 74 28 53 71 6c 50 72 65 70 61  reeStmt(SqlPrepa
3860: 72 65 64 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b  redStmt *pStmt){
3870: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3880: 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
3890: 33 5f 73 71 6c 28 70 53 74 6d 74 2d 3e 70 53 74  3_sql(pStmt->pSt
38a0: 6d 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  mt)==0 ){.    Tc
38b0: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
38c0: 53 74 6d 74 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d  Stmt->zSql);.  }
38d0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
38e0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
38f0: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f  ->pStmt);.  Tcl_
3900: 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 53 74  Free((char *)pSt
3910: 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  mt);.}../*.** Fi
3920: 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72 65 65 20  nalize and free 
3930: 61 20 6c 69 73 74 20 6f 66 20 70 72 65 70 61 72  a list of prepar
3940: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f  ed statements.*/
3950: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c 75  .static void flu
3960: 73 68 53 74 6d 74 43 61 63 68 65 28 53 71 6c 69  shStmtCache(Sqli
3970: 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 53 71  teDb *pDb){.  Sq
3980: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
3990: 50 72 65 53 74 6d 74 3b 0a 20 20 53 71 6c 50 72  PreStmt;.  SqlPr
39a0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e 65 78  eparedStmt *pNex
39b0: 74 3b 0a 0a 20 20 66 6f 72 28 70 50 72 65 53 74  t;..  for(pPreSt
39c0: 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  mt = pDb->stmtLi
39d0: 73 74 3b 20 70 50 72 65 53 74 6d 74 3b 20 70 50  st; pPreStmt; pP
39e0: 72 65 53 74 6d 74 3d 70 4e 65 78 74 29 7b 0a 20  reStmt=pNext){. 
39f0: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 72 65 53     pNext = pPreS
3a00: 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  tmt->pNext;.    
3a10: 64 62 46 72 65 65 53 74 6d 74 28 70 50 72 65 53  dbFreeStmt(pPreS
3a20: 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d  tmt);.  }.  pDb-
3a30: 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 44  >nStmt = 0;.  pD
3a40: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 30 3b  b->stmtLast = 0;
3a50: 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74  .  pDb->stmtList
3a60: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
3a70: 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72  CL calls this pr
3a80: 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20  ocedure when an 
3a90: 73 71 6c 69 74 65 33 20 64 61 74 61 62 61 73 65  sqlite3 database
3aa0: 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64   command is.** d
3ab0: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
3ac0: 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43  c void DbDeleteC
3ad0: 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20  md(void *db){.  
3ae0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
3af0: 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20  (SqliteDb*)db;. 
3b00: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
3b10: 70 44 62 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63  pDb);.  closeInc
3b20: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44  rblobChannels(pD
3b30: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c  b);.  sqlite3_cl
3b40: 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  ose(pDb->db);.  
3b50: 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e  while( pDb->pFun
3b60: 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63  c ){.    SqlFunc
3b70: 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70   *pFunc = pDb->p
3b80: 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70  Func;.    pDb->p
3b90: 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e  Func = pFunc->pN
3ba0: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
3bb0: 20 70 46 75 6e 63 2d 3e 70 44 62 3d 3d 70 44 62   pFunc->pDb==pDb
3bc0: 20 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   );.    Tcl_Decr
3bd0: 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e  RefCount(pFunc->
3be0: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63  pScript);.    Tc
3bf0: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 46  l_Free((char*)pF
3c00: 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  unc);.  }.  whil
3c10: 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  e( pDb->pCollate
3c20: 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61   ){.    SqlColla
3c30: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70  te *pCollate = p
3c40: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  Db->pCollate;.  
3c50: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
3c60: 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78  = pCollate->pNex
3c70: 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  t;.    Tcl_Free(
3c80: 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29  (char*)pCollate)
3c90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3ca0: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63  >zBusy ){.    Tc
3cb0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73  l_Free(pDb->zBus
3cc0: 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  y);.  }.  if( pD
3cd0: 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
3ce0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3cf0: 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66  Trace);.  }.  if
3d00: 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
3d10: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3d20: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a  pDb->zProfile);.
3d30: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
3d40: 41 75 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Auth ){.    Tcl_
3d50: 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29  Free(pDb->zAuth)
3d60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3d70: 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63  >zNull ){.    Tc
3d80: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c  l_Free(pDb->zNul
3d90: 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  l);.  }.  if( pD
3da0: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29  b->pUpdateHook )
3db0: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3dc0: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64  fCount(pDb->pUpd
3dd0: 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20  ateHook);.  }.  
3de0: 69 66 28 20 70 44 62 2d 3e 70 50 72 65 55 70 64  if( pDb->pPreUpd
3df0: 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  ateHook ){.    T
3e00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3e10: 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
3e20: 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ook);.  }.  if( 
3e30: 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
3e40: 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ok ){.    Tcl_De
3e50: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
3e60: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a  pRollbackHook);.
3e70: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3e80: 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  WalHook ){.    T
3e90: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3ea0: 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a  pDb->pWalHook);.
3eb0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3ec0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b  CollateNeeded ){
3ed0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3ee0: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
3ef0: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d 0a  ateNeeded);.  }.
3f00: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
3f10: 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  *)pDb);.}../*.**
3f20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3f30: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 64   called when a d
3f40: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
3f50: 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72 79  locked while try
3f60: 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75 74  ing.** to execut
3f70: 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63  e SQL..*/.static
3f80: 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64 6c   int DbBusyHandl
3f90: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e 74  er(void *cd, int
3fa0: 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c 69   nTries){.  Sqli
3fb0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3fc0: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
3fd0: 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61 6c   rc;.  char zVal
3fe0: 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  [30];..  sqlite3
3ff0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
4000: 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20 22 25  (zVal), zVal, "%
4010: 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 72  d", nTries);.  r
4020: 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c 28  c = Tcl_VarEval(
4030: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
4040: 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a 56  ->zBusy, " ", zV
4050: 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  al, (char*)0);. 
4060: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
4070: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
4080: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
4090: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
40a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
40b0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23 69   return 1;.}..#i
40c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
40d0: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
40e0: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
40f0: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
4100: 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72 65  d as the 'progre
4110: 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f 72  ss callback' for
4120: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
4130: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 50  /.static int DbP
4140: 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28 76  rogressHandler(v
4150: 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69  oid *cd){.  Sqli
4160: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
4170: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
4180: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
4190: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
41a0: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  ;.  rc = Tcl_Eva
41b0: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
41c0: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a  Db->zProgress);.
41d0: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
41e0: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
41f0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
4200: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
4210: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
4220: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
4230: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
4240: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
4250: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4260: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
4270: 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63 65  the SQLite trace
4280: 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76 65   handler wheneve
4290: 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b  r a new.** block
42a0: 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63 75   of SQL is execu
42b0: 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63  ted.  The TCL sc
42c0: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54 72  ript in pDb->zTr
42d0: 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64 2e  ace is executed.
42e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
42f0: 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28 76  DbTraceHandler(v
4300: 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63  oid *cd, const c
4310: 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53 71  har *zSql){.  Sq
4320: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4330: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
4340: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
4350: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
4360: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
4370: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
4380: 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c  tr, pDb->zTrace,
4390: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
43a0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
43b0: 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  (&str, zSql);.  
43c0: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
43d0: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
43e0: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
43f0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
4400: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65  (&str);.  Tcl_Re
4410: 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  setResult(pDb->i
4420: 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nterp);.}.#endif
4430: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4440: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
4450: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4460: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
4470: 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20 68  SQLite profile h
4480: 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20 73  andler after a s
4490: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c 20  tatement.** SQL 
44a0: 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20 54  has executed.  T
44b0: 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  he TCL script in
44c0: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 69   pDb->zProfile i
44d0: 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a  s evaluated..*/.
44e0: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50 72  static void DbPr
44f0: 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f 69  ofileHandler(voi
4500: 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61  d *cd, const cha
4510: 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65 5f  r *zSql, sqlite_
4520: 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53 71  uint64 tm){.  Sq
4530: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4540: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
4550: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
4560: 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d 3b    char zTm[100];
4570: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
4580: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d 29  intf(sizeof(zTm)
4590: 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22 2c  -1, zTm, "%lld",
45a0: 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   tm);.  Tcl_DStr
45b0: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
45c0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
45d0: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 50  nd(&str, pDb->zP
45e0: 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 54  rofile, -1);.  T
45f0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
4600: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53  Element(&str, zS
4610: 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ql);.  Tcl_DStri
4620: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
4630: 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54 63  &str, zTm);.  Tc
4640: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
4650: 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  rp, Tcl_DStringV
4660: 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54  alue(&str));.  T
4670: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
4680: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  str);.  Tcl_Rese
4690: 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  tResult(pDb->int
46a0: 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  erp);.}.#endif..
46b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
46c0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
46d0: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
46e0: 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54  is committed.  T
46f0: 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70 74  he.** TCL script
4700: 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74   in pDb->zCommit
4710: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 49   is executed.  I
4720: 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e  f it returns non
4730: 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69  -zero or.** if i
4740: 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  t throws an exce
4750: 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73  ption, the trans
4760: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
4770: 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a   back instead.**
4780: 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   of being commit
4790: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
47a0: 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c  nt DbCommitHandl
47b0: 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20  er(void *cd){.  
47c0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
47d0: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
47e0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
47f0: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
4800: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
4810: 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
4820: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
4830: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
4840: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
4850: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
4860: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
4870: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
4880: 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c   DbRollbackHandl
4890: 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  er(void *clientD
48a0: 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  ata){.  SqliteDb
48b0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
48c0: 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  b*)clientData;. 
48d0: 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 52 6f   assert(pDb->pRo
48e0: 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 69  llbackHook);.  i
48f0: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
4900: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
4910: 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c 6c  terp, pDb->pRoll
4920: 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b 0a  backHook, 0) ){.
4930: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
4940: 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e 74  ndError(pDb->int
4950: 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  erp);.  }.}../*.
4960: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
4970: 65 20 68 61 6e 64 6c 65 73 20 77 61 6c 5f 68 6f  e handles wal_ho
4980: 6f 6b 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 2a 2f  ok callbacks..*/
4990: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 57 61  .static int DbWa
49a0: 6c 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64  lHandler(.  void
49b0: 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 20 0a 20   *clientData, . 
49c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
49d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
49e0: 2c 20 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 0a  , .  int nEntry.
49f0: 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 53  ){.  int ret = S
4a00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c 5f  QLITE_OK;.  Tcl_
4a10: 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74 65  Obj *p;.  Sqlite
4a20: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4a30: 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b  eDb*)clientData;
4a40: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
4a50: 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74  nterp = pDb->int
4a60: 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70 44  erp;.  assert(pD
4a70: 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a 20  b->pWalHook);.. 
4a80: 20 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61   p = Tcl_Duplica
4a90: 74 65 4f 62 6a 28 70 44 62 2d 3e 70 57 61 6c 48  teObj(pDb->pWalH
4aa0: 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  ook);.  Tcl_Incr
4ab0: 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20 54  RefCount(p);.  T
4ac0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4ad0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4ae0: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
4af0: 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20  Obj(zDb, -1));. 
4b00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4b10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4b20: 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  , p, Tcl_NewIntO
4b30: 62 6a 28 6e 45 6e 74 72 79 29 29 3b 0a 20 20 69  bj(nEntry));.  i
4b40: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
4b50: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
4b60: 20 70 2c 20 30 29 20 0a 20 20 20 7c 7c 20 54 43   p, 0) .   || TC
4b70: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
4b80: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
4b90: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
4ba0: 28 69 6e 74 65 72 70 29 2c 20 26 72 65 74 29 0a  (interp), &ret).
4bb0: 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63    ){.    Tcl_Bac
4bc0: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
4bd0: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  erp);.  }.  Tcl_
4be0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 29 3b  DecrRefCount(p);
4bf0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ..  return ret;.
4c00: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
4c10: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
4c20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
4c30: 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
4c40: 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  FY).static void 
4c50: 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74  setTestUnlockNot
4c60: 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e 74 65  ifyVars(Tcl_Inte
4c70: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
4c80: 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b  iArg, int nArg){
4c90: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36 34 5d  .  char zBuf[64]
4ca0: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
4cb0: 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a 20  , "%d", iArg);. 
4cc0: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
4cd0: 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f  rp, "sqlite_unlo
4ce0: 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c 20  ck_notify_arg", 
4cf0: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
4d00: 5f 4f 4e 4c 59 29 3b 0a 20 20 73 70 72 69 6e 74  _ONLY);.  sprint
4d10: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 41  f(zBuf, "%d", nA
4d20: 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61  rg);.  Tcl_SetVa
4d30: 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
4d40: 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  e_unlock_notify_
4d50: 61 72 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66 2c  argcount", zBuf,
4d60: 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
4d70: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
4d80: 69 6e 65 20 73 65 74 54 65 73 74 55 6e 6c 6f 63  ine setTestUnloc
4d90: 6b 4e 6f 74 69 66 79 56 61 72 73 28 78 2c 79 2c  kNotifyVars(x,y,
4da0: 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  z).#endif..#ifde
4db0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4dc0: 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74  UNLOCK_NOTIFY.st
4dd0: 61 74 69 63 20 76 6f 69 64 20 44 62 55 6e 6c 6f  atic void DbUnlo
4de0: 63 6b 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a 2a  ckNotify(void **
4df0: 61 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29  apArg, int nArg)
4e00: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4e10: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
4e20: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  +){.    const in
4e30: 74 20 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f 45  t flags = (TCL_E
4e40: 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45  VAL_GLOBAL|TCL_E
4e50: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20  VAL_DIRECT);.   
4e60: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4e70: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 61 70 41   (SqliteDb *)apA
4e80: 72 67 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54 65  rg[i];.    setTe
4e90: 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61  stUnlockNotifyVa
4ea0: 72 73 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  rs(pDb->interp, 
4eb0: 69 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 61 73  i, nArg);.    as
4ec0: 73 65 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c 6f  sert( pDb->pUnlo
4ed0: 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 54  ckNotify);.    T
4ee0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
4ef0: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70  ->interp, pDb->p
4f00: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66 6c  UnlockNotify, fl
4f10: 61 67 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ags);.    Tcl_De
4f20: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
4f30: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a  pUnlockNotify);.
4f40: 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b      pDb->pUnlock
4f50: 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d 0a  Notify = 0;.  }.
4f60: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
4f70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
4f80: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a  REUPDATE_HOOK./*
4f90: 0a 2a 2a 20 50 72 65 2d 75 70 64 61 74 65 20 68  .** Pre-update h
4fa0: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  ook callback..*/
4fb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50  .static void DbP
4fc0: 72 65 55 70 64 61 74 65 48 61 6e 64 6c 65 72 28  reUpdateHandler(
4fd0: 0a 20 20 76 6f 69 64 20 2a 70 2c 20 0a 20 20 73  .  void *p, .  s
4fe0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e  qlite3 *db,.  in
4ff0: 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  t op,.  const ch
5000: 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73  ar *zDb, .  cons
5010: 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20  t char *zTbl, . 
5020: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4b   sqlite_int64 iK
5030: 65 79 31 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e  ey1,.  sqlite_in
5040: 74 36 34 20 69 4b 65 79 32 0a 29 7b 0a 20 20 53  t64 iKey2.){.  S
5050: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
5060: 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20 20  SqliteDb *)p;.  
5070: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20  Tcl_Obj *pCmd;. 
5080: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
5090: 61 72 20 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22  ar *azStr[] = {"
50a0: 44 45 4c 45 54 45 22 2c 20 22 49 4e 53 45 52 54  DELETE", "INSERT
50b0: 22 2c 20 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20  ", "UPDATE"};.. 
50c0: 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45   assert( (SQLITE
50d0: 5f 44 45 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20  _DELETE-1)/9 == 
50e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
50f0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2d 31 29  SQLITE_INSERT-1)
5100: 2f 39 20 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73  /9 == 1 );.  ass
5110: 65 72 74 28 20 28 53 51 4c 49 54 45 5f 55 50 44  ert( (SQLITE_UPD
5120: 41 54 45 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b  ATE-1)/9 == 2 );
5130: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
5140: 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 20 29  pPreUpdateHook )
5150: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d  ;.  assert( db==
5160: 70 44 62 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pDb->db );.  ass
5170: 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f  ert( op==SQLITE_
5180: 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d 53 51  INSERT || op==SQ
5190: 4c 49 54 45 5f 55 50 44 41 54 45 20 7c 7c 20 6f  LITE_UPDATE || o
51a0: 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  p==SQLITE_DELETE
51b0: 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63   );..  pCmd = Tc
51c0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
51d0: 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f  Db->pPreUpdateHo
51e0: 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  ok);.  Tcl_IncrR
51f0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
5200: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5210: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
5220: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
5230: 4f 62 6a 28 61 7a 53 74 72 5b 28 6f 70 2d 31 29  Obj(azStr[(op-1)
5240: 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  /9], -1));.  Tcl
5250: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5260: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
5270: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5280: 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  zDb, -1));.  Tcl
5290: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
52a0: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
52b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
52c0: 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63  zTbl, -1));.  Tc
52d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
52e0: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
52f0: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
5300: 6a 28 69 4b 65 79 31 29 29 3b 0a 20 20 54 63 6c  j(iKey1));.  Tcl
5310: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5320: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
5330: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
5340: 28 69 4b 65 79 32 29 29 3b 0a 20 20 54 63 6c 5f  (iKey2));.  Tcl_
5350: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
5360: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
5370: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
5380: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5390: 74 28 70 43 6d 64 29 3b 0a 7d 0a 23 65 6e 64 69  t(pCmd);.}.#endi
53a0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
53b0: 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
53c0: 4b 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  K */..static voi
53d0: 64 20 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65  d DbUpdateHandle
53e0: 72 28 0a 20 20 76 6f 69 64 20 2a 70 2c 20 0a 20  r(.  void *p, . 
53f0: 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74   int op,.  const
5400: 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63   char *zDb, .  c
5410: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c  onst char *zTbl,
5420: 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34   .  sqlite_int64
5430: 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c 69   rowid.){.  Sqli
5440: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
5450: 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c  iteDb *)p;.  Tcl
5460: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 73 74  _Obj *pCmd;.  st
5470: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5480: 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44 45 4c  *azStr[] = {"DEL
5490: 45 54 45 22 2c 20 22 49 4e 53 45 52 54 22 2c 20  ETE", "INSERT", 
54a0: 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20 61 73  "UPDATE"};..  as
54b0: 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 44 45  sert( (SQLITE_DE
54c0: 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30 20 29  LETE-1)/9 == 0 )
54d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c  ;.  assert( (SQL
54e0: 49 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f 39 20  ITE_INSERT-1)/9 
54f0: 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73 65 72 74  == 1 );.  assert
5500: 28 20 28 53 51 4c 49 54 45 5f 55 50 44 41 54 45  ( (SQLITE_UPDATE
5510: 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a 0a 20  -1)/9 == 2 );.. 
5520: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55   assert( pDb->pU
5530: 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61  pdateHook );.  a
5540: 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54  ssert( op==SQLIT
5550: 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d  E_INSERT || op==
5560: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c 7c  SQLITE_UPDATE ||
5570: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45   op==SQLITE_DELE
5580: 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20  TE );..  pCmd = 
5590: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
55a0: 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  (pDb->pUpdateHoo
55b0: 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  k);.  Tcl_IncrRe
55c0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
55d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
55e0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
55f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5600: 62 6a 28 61 7a 53 74 72 5b 28 6f 70 2d 31 29 2f  bj(azStr[(op-1)/
5610: 39 5d 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  9], -1));.  Tcl_
5620: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5630: 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63  ment(0, pCmd, Tc
5640: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
5650: 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  Db, -1));.  Tcl_
5660: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5670: 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63  ment(0, pCmd, Tc
5680: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
5690: 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  Tbl, -1));.  Tcl
56a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
56b0: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
56c0: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
56d0: 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f  (rowid));.  Tcl_
56e0: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
56f0: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
5700: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
5710: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5720: 74 28 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74 61 74  t(pCmd);.}..stat
5730: 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61  ic void tclColla
5740: 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64  teNeeded(.  void
5750: 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65   *pCtx,.  sqlite
5760: 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63  3 *db,.  int enc
5770: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
5780: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74  zName.){.  Sqlit
5790: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
57a0: 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54  teDb *)pCtx;.  T
57b0: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
57c0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
57d0: 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  bj(pDb->pCollate
57e0: 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49  Needed);.  Tcl_I
57f0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
5800: 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ipt);.  Tcl_List
5810: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5820: 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c  (0, pScript, Tcl
5830: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e  _NewStringObj(zN
5840: 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ame, -1));.  Tcl
5850: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
5860: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
5870: 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
5880: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
5890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
58a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
58b0: 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
58c0: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
58d0: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
58e0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c  ted.** using TCL
58f0: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74   script..*/.stat
5900: 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c  ic int tclSqlCol
5910: 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43  late(.  void *pC
5920: 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20  tx,.  int nA,.  
5930: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a  const void *zA,.
5940: 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73    int nB,.  cons
5950: 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20  t void *zB.){.  
5960: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20  SqlCollate *p = 
5970: 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43  (SqlCollate *)pC
5980: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
5990: 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54  Cmd;..  pCmd = T
59a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
59b0: 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b  p->zScript, -1);
59c0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
59d0: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c  unt(pCmd);.  Tcl
59e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
59f0: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
5a00: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
5a10: 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29  ringObj(zA, nA))
5a20: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
5a30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
5a40: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63  interp, pCmd, Tc
5a50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
5a60: 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45  B, nB));.  Tcl_E
5a70: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
5a80: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
5a90: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63  AL_DIRECT);.  Tc
5aa0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
5ab0: 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cmd);.  return (
5ac0: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
5ad0: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
5ae0: 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rp)));.}../*.** 
5af0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5b00: 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61  called to evalua
5b10: 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69  te an SQL functi
5b20: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  on implemented.*
5b30: 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69  * using TCL scri
5b40: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pt..*/.static vo
5b50: 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71  id tclSqlFunc(sq
5b60: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5b70: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
5b80: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  , sqlite3_value*
5b90: 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e  *argv){.  SqlFun
5ba0: 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75  c *p = sqlite3_u
5bb0: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
5bc0: 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  );.  Tcl_Obj *pC
5bd0: 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  md;.  int i;.  i
5be0: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72  nt rc;..  if( ar
5bf0: 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  gc==0 ){.    /* 
5c00: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
5c10: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
5c20: 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20   function, call 
5c30: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e  Tcl_EvalObjEx on
5c40: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69   the.    ** scri
5c50: 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65 63 74  pt object direct
5c60: 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  ly.  This allows
5c70: 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65   the TCL compile
5c80: 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 20 20  r to generate.  
5c90: 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20 66 6f    ** bytecode fo
5ca0: 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e  r the command on
5cb0: 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63   the first invoc
5cc0: 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d  ation and thus m
5cd0: 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62 73 65  ake.    ** subse
5ce0: 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
5cf0: 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 2a  s much faster. *
5d00: 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e  /.    pCmd = p->
5d10: 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c  pScript;.    Tcl
5d20: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
5d30: 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63  md);.    rc = Tc
5d40: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
5d50: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b  nterp, pCmd, 0);
5d60: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
5d70: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d  Count(pCmd);.  }
5d80: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
5d90: 74 68 65 72 65 20 61 72 65 20 61 72 67 75 6d 65  there are argume
5da0: 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74  nts to the funct
5db0: 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c  ion, make a shal
5dc0: 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65 0a  low copy of the.
5dd0: 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62      ** script ob
5de0: 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20 74 68  ject, lappend th
5df0: 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65  e arguments, the
5e00: 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 63  n evaluate the c
5e10: 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  opy..    **.    
5e20: 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77 22 20  ** By "shallow" 
5e30: 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20 61 20  copy, we mean a 
5e40: 6f 6e 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c  only the outer l
5e50: 69 73 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64  ist Tcl_Obj is d
5e60: 75 70 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a  uplicated..    *
5e70: 2a 20 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62  * The new Tcl_Ob
5e80: 6a 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  j contains point
5e90: 65 72 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ers to the origi
5ea0: 6e 61 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74  nal list element
5eb0: 73 2e 20 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  s. .    ** That 
5ec0: 77 61 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76  way, when Tcl_Ev
5ed0: 61 6c 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20  alObjv() is run 
5ee0: 61 6e 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65  and shimmers the
5ef0: 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20   first element. 
5f00: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73     ** of the lis
5f10: 74 20 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54  t to tclCmdNameT
5f20: 79 70 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e  ype, that altern
5f30: 61 74 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ate representati
5f40: 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  on will.    ** b
5f50: 65 20 70 72 65 73 65 72 76 65 64 20 61 6e 64 20  e preserved and 
5f60: 72 65 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65  reused on the ne
5f70: 78 74 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20  xt invocation.. 
5f80: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62     */.    Tcl_Ob
5f90: 6a 20 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e  j **aArg;.    in
5fa0: 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20  t nArg;.    if( 
5fb0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
5fc0: 65 6d 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70  ements(p->interp
5fd0: 2c 20 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e  , p->pScript, &n
5fe0: 41 72 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20  Arg, &aArg) ){. 
5ff0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6000: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
6010: 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  t, Tcl_GetString
6020: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
6030: 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 72  ), -1); .      r
6040: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 20 20 20 20  eturn;.    }    
6050: 20 0a 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c   .    pCmd = Tcl
6060: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72 67  _NewListObj(nArg
6070: 2c 20 61 41 72 67 29 3b 0a 20 20 20 20 54 63 6c  , aArg);.    Tcl
6080: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
6090: 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  md);.    for(i=0
60a0: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
60b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
60c0: 6c 75 65 20 2a 70 49 6e 20 3d 20 61 72 67 76 5b  lue *pIn = argv[
60d0: 69 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  i];.      Tcl_Ob
60e0: 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20  j *pVal;.       
60f0: 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 53       .      /* S
6100: 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61  et pVal to conta
6110: 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  in the i'th colu
6120: 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77 2e 20  mn of this row. 
6130: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
6140: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6150: 79 70 65 28 70 49 6e 29 20 29 7b 0a 20 20 20 20  ype(pIn) ){.    
6160: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6170: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20  BLOB: {.        
6180: 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71    int bytes = sq
6190: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
61a0: 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  s(pIn);.        
61b0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
61c0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c  ByteArrayObj(sql
61d0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
61e0: 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20  pIn), bytes);.  
61f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6200: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6210: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
6220: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  EGER: {.        
6230: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76    sqlite_int64 v
6240: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6250: 5f 69 6e 74 36 34 28 70 49 6e 29 3b 0a 20 20 20  _int64(pIn);.   
6260: 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32         if( v>=-2
6270: 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d  147483647 && v<=
6280: 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20  2147483647 ){.  
6290: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
62a0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28   Tcl_NewIntObj((
62b0: 69 6e 74 29 76 29 3b 0a 20 20 20 20 20 20 20 20  int)v);.        
62c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
62d0: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
62e0: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29  NewWideIntObj(v)
62f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6300: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6310: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6320: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
6330: 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  AT: {.          
6340: 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74  double r = sqlit
6350: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
6360: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
6370: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f  pVal = Tcl_NewDo
6380: 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20  ubleObj(r);.    
6390: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
63a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
63b0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
63c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61   {.          pVa
63d0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  l = Tcl_NewStrin
63e0: 67 4f 62 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75  gObj(p->pDb->zNu
63f0: 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  ll, -1);.       
6400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6410: 20 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61    }.        defa
6420: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ult: {.         
6430: 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c   int bytes = sql
6440: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
6450: 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  (pIn);.         
6460: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53   pVal = Tcl_NewS
6470: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
6480: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6490: 65 78 74 28 70 49 6e 29 2c 20 62 79 74 65 73 29  ext(pIn), bytes)
64a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
64b0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
64c0: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
64d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
64e0: 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65  dElement(p->inte
64f0: 72 70 2c 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b  rp, pCmd, pVal);
6500: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
6510: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
6520: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
6530: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6540: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
6550: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
6560: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
6570: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20  terp), -1); .   
6580: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6590: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
65a0: 66 28 20 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62  f( !p->useEvalOb
65b0: 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  jv ){.      /* T
65c0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 29 20 77  cl_EvalObjEx() w
65d0: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
65e0: 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f  y call Tcl_EvalO
65f0: 62 6a 76 28 29 20 69 66 20 70 43 6d 64 0a 20 20  bjv() if pCmd.  
6600: 20 20 20 20 2a 2a 20 69 73 20 61 20 6c 69 73 74      ** is a list
6610: 20 77 69 74 68 6f 75 74 20 61 20 73 74 72 69 6e   without a strin
6620: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
6630: 2e 20 20 54 6f 20 70 72 65 76 65 6e 74 20 74 68  .  To prevent th
6640: 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  is from.      **
6650: 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65   happening, make
6660: 20 73 75 72 65 20 70 43 6d 64 20 68 61 73 20 61   sure pCmd has a
6670: 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20 72 65   valid string re
6680: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  presentation */.
6690: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
66a0: 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d  ing(pCmd);.    }
66b0: 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  .    rc = Tcl_Ev
66c0: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
66d0: 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41  p, pCmd, TCL_EVA
66e0: 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 54  L_DIRECT);.    T
66f0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6700: 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCmd);.  }..  if
6710: 28 20 72 63 20 26 26 20 72 63 21 3d 54 43 4c 5f  ( rc && rc!=TCL_
6720: 52 45 54 55 52 4e 20 29 7b 0a 20 20 20 20 73 71  RETURN ){.    sq
6730: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
6740: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
6750: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
6760: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
6770: 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54   .  }else{.    T
6780: 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54  cl_Obj *pVar = T
6790: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
67a0: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  p->interp);.    
67b0: 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64  int n;.    u8 *d
67c0: 61 74 61 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ata;.    const c
67d0: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 70 56  har *zType = (pV
67e0: 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56  ar->typePtr ? pV
67f0: 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
6800: 65 20 3a 20 22 22 29 3b 0a 20 20 20 20 63 68 61  e : "");.    cha
6810: 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a  r c = zType[0];.
6820: 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26      if( c=='b' &
6830: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
6840: 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26  bytearray")==0 &
6850: 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30  & pVar->bytes==0
6860: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c   ){.      /* Onl
6870: 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20  y return a BLOB 
6880: 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20  type if the Tcl 
6890: 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79  variable is a by
68a0: 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20  tearray and.    
68b0: 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69    ** has no stri
68c0: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
68d0: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61  n. */.      data
68e0: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
68f0: 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  rayFromObj(pVar,
6900: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
6910: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
6920: 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e  context, data, n
6930: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
6940: 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
6950: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
6960: 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65  cmp(zType,"boole
6970: 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  an")==0 ){.     
6980: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
6990: 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b  bj(0, pVar, &n);
69a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
69b0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
69c0: 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, n);.    }else
69d0: 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73   if( c=='d' && s
69e0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75  trcmp(zType,"dou
69f0: 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
6a00: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
6a10: 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46    Tcl_GetDoubleF
6a20: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
6a30: 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &r);.      sqlit
6a40: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
6a50: 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20  (context, r);.  
6a60: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
6a70: 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'w' && strcmp(zT
6a80: 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d  ype,"wideInt")==
6a90: 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  0) ||.          
6aa0: 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d  (c=='i' && strcm
6ab0: 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d  p(zType,"int")==
6ac0: 30 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0) ){.      Tcl_
6ad0: 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20  WideInt v;.     
6ae0: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
6af0: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
6b00: 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &v);.      sqlit
6b10: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
6b20: 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20  context, v);.   
6b30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61   }else{.      da
6b40: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
6b50: 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
6b60: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  ingFromObj(pVar,
6b70: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
6b80: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
6b90: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a  context, (char *
6ba0: 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45  )data, n, SQLITE
6bb0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
6bc0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
6bd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
6be0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  THORIZATION./*.*
6bf0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 61 75  * This is the au
6c00: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e  thentication fun
6c10: 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e  ction.  It appen
6c20: 64 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63  ds the authentic
6c30: 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f  ation.** type co
6c40: 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61  de and the two a
6c50: 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64  rguments to zCmd
6c60: 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20  [] then invokes 
6c70: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e  the result.** on
6c80: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
6c90: 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69 73 20  .  The reply is 
6ca0: 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65  examined to dete
6cb0: 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20  rmine if the.** 
6cc0: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66  authentication f
6cd0: 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73  ails or succeeds
6ce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6cf0: 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  auth_callback(. 
6d00: 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69   void *pArg,.  i
6d10: 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74  nt code,.  const
6d20: 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20   char *zArg1,.  
6d30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
6d40: 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2,.  const char 
6d50: 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20  *zArg3,.  const 
6d60: 63 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20  char *zArg4.){. 
6d70: 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20   char *zCode;.  
6d80: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
6d90: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
6da0: 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b  st char *zReply;
6db0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
6dc0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41   = (SqliteDb*)pA
6dd0: 72 67 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64  rg;.  if( pDb->d
6de0: 69 73 61 62 6c 65 41 75 74 68 20 29 20 72 65 74  isableAuth ) ret
6df0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
6e00: 20 20 73 77 69 74 63 68 28 20 63 6f 64 65 20 29    switch( code )
6e10: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
6e20: 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20 20  E_COPY          
6e30: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6e40: 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b  ITE_COPY"; break
6e50: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6e60: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20  E_CREATE_INDEX  
6e70: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6e80: 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
6e90: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6ea0: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
6eb0: 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43  _TABLE      : zC
6ec0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6ed0: 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  TE_TABLE"; break
6ee0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6ef0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
6f00: 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  DEX : zCode="SQL
6f10: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
6f20: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
6f30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6f40: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
6f50: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6f60: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
6f70: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
6f80: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
6f90: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a  TE_TEMP_TRIGGER:
6fa0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6fb0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47  REATE_TEMP_TRIGG
6fc0: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
6fd0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
6fe0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20  TE_TEMP_VIEW  : 
6ff0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
7000: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b  EATE_TEMP_VIEW";
7010: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7020: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7030: 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64  RIGGER    : zCod
7040: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
7050: 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b  _TRIGGER"; break
7060: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7070: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20 20  E_CREATE_VIEW   
7080: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7090: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22  ITE_CREATE_VIEW"
70a0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
70b0: 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  e SQLITE_DELETE 
70c0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
70d0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54  de="SQLITE_DELET
70e0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
70f0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
7100: 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a  INDEX        : z
7110: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
7120: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
7130: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7140: 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20  _DROP_TABLE     
7150: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7160: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20  TE_DROP_TABLE"; 
7170: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7180: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
7190: 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65  _INDEX   : zCode
71a0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
71b0: 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  MP_INDEX"; break
71c0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
71d0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
71e0: 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  E   : zCode="SQL
71f0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
7200: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
7210: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
7220: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a  P_TEMP_TRIGGER :
7230: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
7240: 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ROP_TEMP_TRIGGER
7250: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7260: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
7270: 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43  EMP_VIEW    : zC
7280: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
7290: 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65  _TEMP_VIEW"; bre
72a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
72b0: 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52  ITE_DROP_TRIGGER
72c0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
72d0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47  QLITE_DROP_TRIGG
72e0: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
72f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
7300: 5f 56 49 45 57 20 20 20 20 20 20 20 20 20 3a 20  _VIEW         : 
7310: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
7320: 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  OP_VIEW"; break;
7330: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7340: 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20  _INSERT         
7350: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7360: 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61  TE_INSERT"; brea
7370: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7380: 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20  TE_PRAGMA       
7390: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
73a0: 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72  LITE_PRAGMA"; br
73b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
73c0: 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20 20 20  LITE_READ       
73d0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
73e0: 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72  SQLITE_READ"; br
73f0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7400: 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20  LITE_SELECT     
7410: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
7420: 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20  SQLITE_SELECT"; 
7430: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7440: 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
7450: 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  ON       : zCode
7460: 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  ="SQLITE_TRANSAC
7470: 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TION"; break;.  
7480: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50    case SQLITE_UP
7490: 44 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20  DATE            
74a0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
74b0: 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a  UPDATE"; break;.
74c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
74d0: 41 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20  ATTACH          
74e0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
74f0: 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b  E_ATTACH"; break
7500: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7510: 45 5f 44 45 54 41 43 48 20 20 20 20 20 20 20 20  E_DETACH        
7520: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7530: 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65  ITE_DETACH"; bre
7540: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7550: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20  ITE_ALTER_TABLE 
7560: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
7570: 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c  QLITE_ALTER_TABL
7580: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
7590: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  ase SQLITE_REIND
75a0: 45 58 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  EX           : z
75b0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49  Code="SQLITE_REI
75c0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
75d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e    case SQLITE_AN
75e0: 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20  ALYZE           
75f0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7600: 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b  ANALYZE"; break;
7610: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7620: 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20  _CREATE_VTABLE  
7630: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7640: 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45  TE_CREATE_VTABLE
7650: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7660: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  se SQLITE_DROP_V
7670: 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43  TABLE       : zC
7680: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
7690: 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  _VTABLE"; break;
76a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
76b0: 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20  _FUNCTION       
76c0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
76d0: 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72  TE_FUNCTION"; br
76e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
76f0: 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 20  LITE_SAVEPOINT  
7700: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
7710: 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54  SQLITE_SAVEPOINT
7720: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  "; break;.    de
7730: 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  fault           
7740: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
7750: 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61  ode="????"; brea
7760: 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74  k;.  }.  Tcl_DSt
7770: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
7780: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
7790: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
77a0: 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  Auth, -1);.  Tcl
77b0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
77c0: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64  ement(&str, zCod
77d0: 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  e);.  Tcl_DStrin
77e0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
77f0: 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72  str, zArg1 ? zAr
7800: 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g1 : "");.  Tcl_
7810: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
7820: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32  ment(&str, zArg2
7830: 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a   ? zArg2 : "");.
7840: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
7850: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
7860: 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a   zArg3 ? zArg3 :
7870: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
7880: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
7890: 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a  (&str, zArg4 ? z
78a0: 41 72 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63  Arg4 : "");.  rc
78b0: 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61   = Tcl_GlobalEva
78c0: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
78d0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
78e0: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
78f0: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
7900: 0a 20 20 7a 52 65 70 6c 79 20 3d 20 72 63 3d 3d  .  zReply = rc==
7910: 54 43 4c 5f 4f 4b 20 3f 20 54 63 6c 5f 47 65 74  TCL_OK ? Tcl_Get
7920: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
7930: 2d 3e 69 6e 74 65 72 70 29 20 3a 20 22 53 51 4c  ->interp) : "SQL
7940: 49 54 45 5f 44 45 4e 59 22 3b 0a 20 20 69 66 28  ITE_DENY";.  if(
7950: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
7960: 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29  SQLITE_OK")==0 )
7970: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
7980: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
7990: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
79a0: 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d  "SQLITE_DENY")==
79b0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
79c0: 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c  LITE_DENY;.  }el
79d0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  se if( strcmp(zR
79e0: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e  eply,"SQLITE_IGN
79f0: 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ORE")==0 ){.    
7a00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f  rc = SQLITE_IGNO
7a10: 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  RE;.  }else{.   
7a20: 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20   rc = 999;.  }. 
7a30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
7a40: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7a50: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
7a60: 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  N */../*.** This
7a70: 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61   routine reads a
7a80: 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72   line of text fr
7a90: 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72  om FILE in, stor
7aa0: 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69  es.** the text i
7ab0: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
7ac0: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  d from malloc() 
7ad0: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f  and returns a po
7ae0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
7af0: 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72  text.  NULL is r
7b00: 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f  eturned at end o
7b10: 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61  f file, or if ma
7b20: 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e  lloc().** fails.
7b30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
7b40: 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65  face is like "re
7b50: 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63  adline" but no c
7b60: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74  ommand-line edit
7b70: 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a  ing.** is done..
7b80: 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f  **.** copied fro
7b90: 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27  m shell.c from '
7ba0: 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64  .import' command
7bb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
7bc0: 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63  *local_getline(c
7bd0: 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49  har *zPrompt, FI
7be0: 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20  LE *in){.  char 
7bf0: 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c  *zLine;.  int nL
7c00: 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  ine;.  int n;.. 
7c10: 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20   nLine = 100;.  
7c20: 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  zLine = malloc( 
7c30: 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a  nLine );.  if( z
7c40: 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Line==0 ) return
7c50: 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 77   0;.  n = 0;.  w
7c60: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
7c70: 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29  f( n+100>nLine )
7c80: 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20  {.      nLine = 
7c90: 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20  nLine*2 + 100;. 
7ca0: 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61       zLine = rea
7cb0: 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e  lloc(zLine, nLin
7cc0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  e);.      if( zL
7cd0: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
7ce0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
7cf0: 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d   fgets(&zLine[n]
7d00: 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29  , nLine - n, in)
7d10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
7d20: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
7d30: 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20   free(zLine);.  
7d40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
7d50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c        }.      zL
7d60: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
7d70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7d80: 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b     while( zLine[
7d90: 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20  n] ){ n++; }.   
7da0: 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e   if( n>0 && zLin
7db0: 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a  e[n-1]=='\n' ){.
7dc0: 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
7dd0: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
7de0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7df0: 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20  }.  }.  zLine = 
7e00: 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20  realloc( zLine, 
7e10: 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  n+1 );.  return 
7e20: 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  zLine;.}.../*.**
7e30: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7e40: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d  s part of the im
7e50: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
7e60: 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a  the command:.**.
7e70: 2a 2a 20 20 20 24 64 62 20 74 72 61 6e 73 61 63  **   $db transac
7e80: 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c  tion [-deferred|
7e90: 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c  -immediate|-excl
7ea0: 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 2a 2a  usive] SCRIPT.**
7eb0: 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65  .** It is invoke
7ec0: 64 20 61 66 74 65 72 20 65 76 61 6c 75 61 74 69  d after evaluati
7ed0: 6e 67 20 74 68 65 20 73 63 72 69 70 74 20 53 43  ng the script SC
7ee0: 52 49 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20 6f  RIPT to commit o
7ef0: 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74 68  r rollback.** th
7f00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
7f10: 20 73 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65   savepoint opene
7f20: 64 20 62 79 20 74 68 65 20 5b 74 72 61 6e 73 61  d by the [transa
7f30: 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e 0a  ction] command..
7f40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
7f50: 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20  TransPostCmd(.  
7f60: 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b  ClientData data[
7f70: 5d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ],              
7f80: 20 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20       /* data[0] 
7f90: 69 73 20 74 68 65 20 53 71 6c 69 74 65 33 44 62  is the Sqlite3Db
7fa0: 2a 20 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54  * for $db */.  T
7fb0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7fc0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
7fd0: 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72      /* Tcl inter
7fe0: 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  preter */.  int 
7ff0: 72 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  result          
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8010: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76   /* Result of ev
8020: 61 6c 75 61 74 69 6e 67 20 53 43 52 49 50 54 20  aluating SCRIPT 
8030: 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
8040: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 6e 64  onst char *azEnd
8050: 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 52 45 4c 45  [] = {.    "RELE
8060: 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63  ASE _tcl_transac
8070: 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 2f 2a  tion",        /*
8080: 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20   rc==TCL_ERROR, 
8090: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 30 20  nTransaction!=0 
80a0: 2a 2f 0a 20 20 20 20 22 43 4f 4d 4d 49 54 22 2c  */.    "COMMIT",
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63 21            /* rc!
80d0: 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61  =TCL_ERROR, nTra
80e0: 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20  nsaction==0 */. 
80f0: 20 20 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20     "ROLLBACK TO 
8100: 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _tcl_transaction
8110: 20 3b 20 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f   ; RELEASE _tcl_
8120: 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20  transaction",.  
8130: 20 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20    "ROLLBACK"    
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8150: 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f       /* rc==TCL_
8160: 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74  ERROR, nTransact
8170: 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b 0a 20  ion==0 */.  };. 
8180: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
8190: 20 28 53 71 6c 69 74 65 44 62 2a 29 64 61 74 61   (SqliteDb*)data
81a0: 5b 30 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  [0];.  int rc = 
81b0: 72 65 73 75 6c 74 3b 0a 20 20 63 6f 6e 73 74 20  result;.  const 
81c0: 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20 20 70  char *zEnd;..  p
81d0: 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Db->nTransaction
81e0: 2d 2d 3b 0a 20 20 7a 45 6e 64 20 3d 20 61 7a 45  --;.  zEnd = azE
81f0: 6e 64 5b 28 72 63 3d 3d 54 43 4c 5f 45 52 52 4f  nd[(rc==TCL_ERRO
8200: 52 29 2a 32 20 2b 20 28 70 44 62 2d 3e 6e 54 72  R)*2 + (pDb->nTr
8210: 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 29 5d 3b 0a  ansaction==0)];.
8220: 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41  .  pDb->disableA
8230: 75 74 68 2b 2b 3b 0a 20 20 69 66 28 20 73 71 6c  uth++;.  if( sql
8240: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
8250: 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30  b, zEnd, 0, 0, 0
8260: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
8270: 69 73 20 69 73 20 61 20 74 72 69 63 6b 79 20 73  is is a tricky s
8280: 63 65 6e 61 72 69 6f 20 74 6f 20 68 61 6e 64 6c  cenario to handl
8290: 65 2e 20 54 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e. The most like
82a0: 6c 79 20 63 61 75 73 65 20 6f 66 20 61 6e 0a 20  ly cause of an. 
82b0: 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 73       ** error is
82c0: 20 74 68 61 74 20 74 68 65 20 65 78 65 63 28 29   that the exec()
82d0: 20 61 62 6f 76 65 20 77 61 73 20 61 6e 20 61 74   above was an at
82e0: 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20  tempt to commit 
82f0: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  the .      ** to
8300: 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74  p-level transact
8310: 69 6f 6e 20 74 68 61 74 20 72 65 74 75 72 6e 65  ion that returne
8320: 64 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 4f  d SQLITE_BUSY. O
8330: 72 2c 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2c 0a  r, less likely,.
8340: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e        ** that an
8350: 20 49 4f 2d 65 72 72 6f 72 20 68 61 73 20 6f 63   IO-error has oc
8360: 63 75 72 72 65 64 2e 20 49 6e 20 65 69 74 68 65  curred. In eithe
8370: 72 20 63 61 73 65 2c 20 74 68 72 6f 77 20 61 20  r case, throw a 
8380: 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  Tcl exception.  
8390: 20 20 20 20 2a 2a 20 61 6e 64 20 74 72 79 20 74      ** and try t
83a0: 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  o rollback the t
83b0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
83c0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75    **.      ** Bu
83d0: 74 20 69 74 20 63 6f 75 6c 64 20 61 6c 73 6f 20  t it could also 
83e0: 62 65 20 74 68 61 74 20 74 68 65 20 75 73 65 72  be that the user
83f0: 20 65 78 65 63 75 74 65 64 20 6f 6e 65 20 6f 72   executed one or
8400: 20 6d 6f 72 65 20 42 45 47 49 4e 2c 20 0a 20 20   more BEGIN, .  
8410: 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53      ** COMMIT, S
8420: 41 56 45 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53  AVEPOINT, RELEAS
8430: 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f  E or ROLLBACK co
8440: 6d 6d 61 6e 64 73 20 74 68 61 74 20 61 72 65 20  mmands that are 
8450: 63 6f 6e 66 75 73 69 6e 67 0a 20 20 20 20 20 20  confusing.      
8460: 2a 2a 20 74 68 69 73 20 6d 65 74 68 6f 64 27 73  ** this method's
8470: 20 6c 6f 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61   logic. Not clea
8480: 72 20 68 6f 77 20 74 68 69 73 20 77 6f 75 6c 64  r how this would
8490: 20 62 65 20 62 65 73 74 20 68 61 6e 64 6c 65 64   be best handled
84a0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 69  ..      */.    i
84b0: 66 28 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52  f( rc!=TCL_ERROR
84c0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
84d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
84e0: 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
84f0: 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
8500: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
8510: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8520: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
8530: 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  ->db, "ROLLBACK"
8540: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
8550: 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75    pDb->disableAu
8560: 74 68 2d 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20  th--;..  return 
8570: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  rc;.}../*.** Unl
8580: 65 73 73 20 53 51 4c 49 54 45 5f 54 45 53 54 20  ess SQLITE_TEST 
8590: 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73  is defined, this
85a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73   function is a s
85b0: 69 6d 70 6c 65 20 77 72 61 70 70 65 72 20 61 72  imple wrapper ar
85c0: 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ound.** sqlite3_
85d0: 70 72 65 70 61 72 65 5f 76 32 28 29 2e 20 49 66  prepare_v2(). If
85e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
85f0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 69 74  defined, then it
8600: 20 75 73 65 73 20 65 69 74 68 65 72 0a 2a 2a 20   uses either.** 
8610: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
8620: 76 32 28 29 20 6f 72 20 6c 65 67 61 63 79 20 69  v2() or legacy i
8630: 6e 74 65 72 66 61 63 65 20 73 71 6c 69 74 65 33  nterface sqlite3
8640: 5f 70 72 65 70 61 72 65 28 29 2c 20 64 65 70 65  _prepare(), depe
8650: 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74  nding.** on whet
8660: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 5b  her or not the [
8670: 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72  db_use_legacy_pr
8680: 65 70 61 72 65 5d 20 63 6f 6d 6d 61 6e 64 20 68  epare] command h
8690: 61 73 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20  as been used to 
86a0: 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 20 74 68  .** configure th
86b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
86c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 50 72  .static int dbPr
86d0: 65 70 61 72 65 28 0a 20 20 53 71 6c 69 74 65 44  epare(.  SqliteD
86e0: 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
86f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
8700: 62 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  base object */. 
8710: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
8720: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
8730: 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69   /* SQL to compi
8740: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
8750: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20  stmt **ppStmt,  
8760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8770: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
8780: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
8790: 61 72 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20  ar **pzOut      
87a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
87b0: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20  Pointer to next 
87c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
87d0: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
87e0: 45 5f 54 45 53 54 0a 20 20 69 66 28 20 70 44 62  E_TEST.  if( pDb
87f0: 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65  ->bLegacyPrepare
8800: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
8810: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
8820: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
8830: 2c 20 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29  , ppStmt, pzOut)
8840: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
8850: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72  eturn sqlite3_pr
8860: 65 70 61 72 65 5f 76 32 28 70 44 62 2d 3e 64 62  epare_v2(pDb->db
8870: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74  , zSql, -1, ppSt
8880: 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f  mt, pzOut);.}../
8890: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
88a0: 63 61 63 68 65 20 66 6f 72 20 61 20 70 72 65 70  cache for a prep
88b0: 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f  ared-statement o
88c0: 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
88d0: 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 66 69 72  ments the.** fir
88e0: 73 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  st SQL statement
88f0: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70   in the buffer p
8900: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 61 72  ointed to by par
8910: 61 6d 65 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a  ameter zIn. If.*
8920: 2a 20 6e 6f 20 73 75 63 68 20 70 72 65 70 61 72  * no such prepar
8930: 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  ed-statement can
8940: 20 62 65 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63   be found, alloc
8950: 61 74 65 20 61 6e 64 20 70 72 65 70 61 72 65 20  ate and prepare 
8960: 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e  a new.** one. In
8970: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 69   either case, bi
8980: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
8990: 61 6c 75 65 73 20 6f 66 20 74 68 65 20 72 65 6c  alues of the rel
89a0: 65 76 61 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72  evant Tcl.** var
89b0: 69 61 62 6c 65 73 20 74 6f 20 61 6e 79 20 24 76  iables to any $v
89c0: 61 72 2c 20 3a 76 61 72 20 6f 72 20 40 76 61 72  ar, :var or @var
89d0: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
89e0: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 42 65 66  e statement. Bef
89f0: 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
8a00: 2c 20 73 65 74 20 2a 70 70 50 72 65 53 74 6d 74  , set *ppPreStmt
8a10: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
8a20: 20 70 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d   prepared-statem
8a30: 65 6e 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  ent object..**.*
8a40: 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74  * Output paramet
8a50: 65 72 20 2a 70 7a 4f 75 74 20 69 73 20 73 65 74  er *pzOut is set
8a60: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
8a70: 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d   next SQL statem
8a80: 65 6e 74 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72  ent in.** buffer
8a90: 20 7a 49 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20   zIn, or to the 
8aa0: 27 5c 30 27 20 62 79 74 65 20 61 74 20 74 68 65  '\0' byte at the
8ab0: 20 65 6e 64 20 6f 66 20 7a 49 6e 20 69 66 20 74   end of zIn if t
8ac0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65  here is no.** ne
8ad0: 78 74 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  xt statement..**
8ae0: 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
8af0: 6c 2c 20 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74  l, TCL_OK is ret
8b00: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
8b10: 2c 20 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72  , TCL_ERROR is r
8b20: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
8b30: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8b40: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65  loaded into inte
8b50: 72 70 72 65 74 65 72 20 70 44 62 2d 3e 69 6e 74  rpreter pDb->int
8b60: 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  erp..*/.static i
8b70: 6e 74 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  nt dbPrepareAndB
8b80: 69 6e 64 28 0a 20 20 53 71 6c 69 74 65 44 62 20  ind(.  SqliteDb 
8b90: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
8ba0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8bb0: 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  se object */.  c
8bc0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20  har const *zIn, 
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8be0: 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65  * SQL to compile
8bf0: 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
8c00: 20 2a 2a 70 7a 4f 75 74 2c 20 20 20 20 20 20 20   **pzOut,       
8c10: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
8c20: 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51  inter to next SQ
8c30: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
8c40: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
8c50: 20 2a 2a 70 70 50 72 65 53 74 6d 74 20 20 20 20   **ppPreStmt    
8c60: 20 2f 2a 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20   /* OUT: Object 
8c70: 75 73 65 64 20 74 6f 20 63 61 63 68 65 20 73 74  used to cache st
8c80: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
8c90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
8ca0: 20 3d 20 7a 49 6e 3b 20 20 20 20 20 20 20 20 20   = zIn;         
8cb0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69  /* Pointer to fi
8cc0: 72 73 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  rst SQL statemen
8cd0: 74 20 69 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71  t in zIn */.  sq
8ce0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
8cf0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
8d00: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
8d10: 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ent object */.  
8d20: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
8d30: 2a 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20  *pPreStmt;      
8d40: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 61  /* Pointer to ca
8d50: 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ched statement *
8d60: 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20  /.  int nSql;   
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d80: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
8d90: 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 20 2a   zSql in bytes *
8da0: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20  /.  int nVar;   
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8dd0: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 73 74   variables in st
8de0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
8df0: 20 69 50 61 72 6d 20 3d 20 30 3b 20 20 20 20 20   iParm = 0;     
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e10: 4e 65 78 74 20 66 72 65 65 20 65 6e 74 72 79 20  Next free entry 
8e20: 69 6e 20 61 70 50 61 72 6d 20 2a 2f 0a 20 20 69  in apParm */.  i
8e30: 6e 74 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65  nt i;.  Tcl_Inte
8e40: 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62  rp *interp = pDb
8e50: 2d 3e 69 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70  ->interp;..  *pp
8e60: 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20  PreStmt = 0;..  
8e70: 2f 2a 20 54 72 69 6d 20 73 70 61 63 65 73 20 66  /* Trim spaces f
8e80: 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
8e90: 20 7a 53 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c   zSql and calcul
8ea0: 61 74 65 20 74 68 65 20 72 65 6d 61 69 6e 69 6e  ate the remainin
8eb0: 67 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77  g length. */.  w
8ec0: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a 53  hile( isspace(zS
8ed0: 71 6c 5b 30 5d 29 20 29 7b 20 7a 53 71 6c 2b 2b  ql[0]) ){ zSql++
8ee0: 3b 20 7d 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72  ; }.  nSql = str
8ef0: 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20  len30(zSql);..  
8f00: 66 6f 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70  for(pPreStmt = p
8f10: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50  Db->stmtList; pP
8f20: 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74  reStmt; pPreStmt
8f30: 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74  =pPreStmt->pNext
8f40: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
8f50: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20  PreStmt->nSql;. 
8f60: 20 20 20 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a     if( nSql>=n .
8f70: 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
8f80: 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c  p(pPreStmt->zSql
8f90: 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20  , zSql, n)==0.  
8fa0: 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e        && (zSql[n
8fb0: 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31  ]==0 || zSql[n-1
8fc0: 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20  ]==';').    ){. 
8fd0: 20 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72       pStmt = pPr
8fe0: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20  eStmt->pStmt;.  
8ff0: 20 20 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53      *pzOut = &zS
9000: 71 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  ql[pPreStmt->nSq
9010: 6c 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  l];..      /* Wh
9020: 65 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74  en a prepared st
9030: 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64  atement is found
9040: 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d  , unlink it from
9050: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
9060: 63 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69  che list.  It wi
9070: 6c 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65  ll later be adde
9080: 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  d back to the be
9090: 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
90a0: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
90b0: 73 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  st in order to i
90c0: 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70  mplement LRU rep
90d0: 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  lacement..      
90e0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  */.      if( pPr
90f0: 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a  eStmt->pPrev ){.
9100: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
9110: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
9120: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
9130: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9140: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
9150: 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  List = pPreStmt-
9160: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
9170: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
9180: 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  mt->pNext ){.   
9190: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
91a0: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50  Next->pPrev = pP
91b0: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20  reStmt->pPrev;. 
91c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
91d0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
91e0: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50  t = pPreStmt->pP
91f0: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
9200: 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b     pDb->nStmt--;
9210: 0a 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71  .      nVar = sq
9220: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
9230: 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74  eter_count(pStmt
9240: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9250: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
9260: 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64  * If no prepared
9270: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66   statement was f
9280: 6f 75 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68  ound. Compile th
9290: 65 20 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f  e SQL text. Also
92a0: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61   allocate.  ** a
92b0: 20 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64   new SqlPrepared
92c0: 53 74 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20  Stmt structure. 
92d0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74   */.  if( pPreSt
92e0: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  mt==0 ){.    int
92f0: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28   nByte;..    if(
9300: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72   SQLITE_OK!=dbPr
9310: 65 70 61 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c  epare(pDb, zSql,
9320: 20 26 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20   &pStmt, pzOut) 
9330: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
9340: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
9350: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
9360: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  bj(sqlite3_errms
9370: 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29  g(pDb->db), -1))
9380: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
9390: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
93a0: 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30      if( pStmt==0
93b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51   ){.      if( SQ
93c0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
93d0: 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62  _errcode(pDb->db
93e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
93f0: 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65  A compile-time e
9400: 72 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74  rror in the stat
9410: 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  ement. */.      
9420: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
9430: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
9440: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
9450: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
9460: 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20  db), -1));.     
9470: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9480: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
9490: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
94a0: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61   statement was a
94b0: 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75   no-op.  Continu
94c0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74  e to the next st
94d0: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20  atement.        
94e0: 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74  ** in the SQL st
94f0: 72 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ring..        */
9500: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9510: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  TCL_OK;.      }.
9520: 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
9530: 74 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  t( pPreStmt==0 )
9540: 3b 0a 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c  ;.    nVar = sql
9550: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
9560: 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ter_count(pStmt)
9570: 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69  ;.    nByte = si
9580: 7a 65 6f 66 28 53 71 6c 50 72 65 70 61 72 65 64  zeof(SqlPrepared
9590: 53 74 6d 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a  Stmt) + nVar*siz
95a0: 65 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a  eof(Tcl_Obj *);.
95b0: 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28      pPreStmt = (
95c0: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a  SqlPreparedStmt*
95d0: 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65  )Tcl_Alloc(nByte
95e0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
95f0: 72 65 53 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65  reStmt, 0, nByte
9600: 29 3b 0a 0a 20 20 20 20 70 50 72 65 53 74 6d 74  );..    pPreStmt
9610: 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b  ->pStmt = pStmt;
9620: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e  .    pPreStmt->n
9630: 53 71 6c 20 3d 20 28 69 6e 74 29 28 2a 70 7a 4f  Sql = (int)(*pzO
9640: 75 74 20 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20  ut - zSql);.    
9650: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d  pPreStmt->zSql =
9660: 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
9670: 6d 74 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  mt);.    pPreStm
9680: 74 2d 3e 61 70 50 61 72 6d 20 3d 20 28 54 63 6c  t->apParm = (Tcl
9690: 5f 4f 62 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d  _Obj **)&pPreStm
96a0: 74 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  t[1];.#ifdef SQL
96b0: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28  ITE_TEST.    if(
96c0: 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 3d   pPreStmt->zSql=
96d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
96e0: 20 2a 7a 43 6f 70 79 20 3d 20 54 63 6c 5f 41 6c   *zCopy = Tcl_Al
96f0: 6c 6f 63 28 70 50 72 65 53 74 6d 74 2d 3e 6e 53  loc(pPreStmt->nS
9700: 71 6c 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 6d  ql + 1);.      m
9710: 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71  emcpy(zCopy, zSq
9720: 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  l, pPreStmt->nSq
9730: 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b  l);.      zCopy[
9740: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 20  pPreStmt->nSql] 
9750: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 70 50  = '\0';.      pP
9760: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 7a  reStmt->zSql = z
9770: 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Copy;.    }.#end
9780: 69 66 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  if.  }.  assert(
9790: 20 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 61   pPreStmt );.  a
97a0: 73 73 65 72 74 28 20 73 74 72 6c 65 6e 33 30 28  ssert( strlen30(
97b0: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d  pPreStmt->zSql)=
97c0: 3d 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20  =pPreStmt->nSql 
97d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
97e0: 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d  memcmp(pPreStmt-
97f0: 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 70 50 72  >zSql, zSql, pPr
9800: 65 53 74 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a  eStmt->nSql) );.
9810: 0a 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65  .  /* Bind value
9820: 73 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20  s to parameters 
9830: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
9840: 24 20 6f 72 20 3a 20 2a 2f 20 20 0a 20 20 66 6f  $ or : */  .  fo
9850: 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20  r(i=1; i<=nVar; 
9860: 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
9870: 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c  char *zVar = sql
9880: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
9890: 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20  ter_name(pStmt, 
98a0: 69 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 72  i);.    if( zVar
98b0: 21 3d 30 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d  !=0 && (zVar[0]=
98c0: 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d  ='$' || zVar[0]=
98d0: 3d 27 3a 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d  =':' || zVar[0]=
98e0: 3d 27 40 27 29 20 29 7b 0a 20 20 20 20 20 20 54  ='@') ){.      T
98f0: 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54  cl_Obj *pVar = T
9900: 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74  cl_GetVar2Ex(int
9910: 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30  erp, &zVar[1], 0
9920: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
9930: 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  pVar ){.        
9940: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 75  int n;.        u
9950: 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20  8 *data;.       
9960: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
9970: 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79 70 65  pe = (pVar->type
9980: 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65  Ptr ? pVar->type
9990: 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b  Ptr->name : "");
99a0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 20  .        char c 
99b0: 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20  = zType[0];.    
99c0: 20 20 20 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d      if( zVar[0]=
99d0: 3d 27 40 27 20 7c 7c 0a 20 20 20 20 20 20 20 20  ='@' ||.        
99e0: 20 20 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74     (c=='b' && st
99f0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65  rcmp(zType,"byte
9a00: 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56  array")==0 && pV
9a10: 61 72 2d 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b  ar->bytes==0) ){
9a20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  .          /* Lo
9a30: 61 64 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69  ad a BLOB type i
9a40: 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62  f the Tcl variab
9a50: 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61  le is a bytearra
9a60: 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  y and.          
9a70: 2a 2a 20 69 74 20 68 61 73 20 6e 6f 20 73 74 72  ** it has no str
9a80: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
9a90: 6f 6e 20 6f 72 20 74 68 65 20 68 6f 73 74 0a 20  on or the host. 
9aa0: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61           ** para
9ab0: 6d 65 74 65 72 20 6e 61 6d 65 20 62 65 67 69 6e  meter name begin
9ac0: 73 20 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20  s with "@". */. 
9ad0: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
9ae0: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
9af0: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
9b00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
9b10: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
9b20: 53 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e  Stmt, i, data, n
9b30: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
9b40: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
9b50: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61  IncrRefCount(pVa
9b60: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  r);.          pP
9b70: 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69  reStmt->apParm[i
9b80: 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a  Parm++] = pVar;.
9b90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
9ba0: 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63  ( c=='b' && strc
9bb0: 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61  mp(zType,"boolea
9bc0: 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
9bd0: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72      Tcl_GetIntFr
9be0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
9bf0: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  ar, &n);.       
9c00: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
9c10: 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29  int(pStmt, i, n)
9c20: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
9c30: 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74  if( c=='d' && st
9c40: 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62  rcmp(zType,"doub
9c50: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
9c60: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
9c70: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
9c80: 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  DoubleFromObj(in
9c90: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b  terp, pVar, &r);
9ca0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9cb0: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70  e3_bind_double(p
9cc0: 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20  Stmt, i, r);.   
9cd0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
9ce0: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
9cf0: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
9d00: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
9d10: 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26         (c=='i' &
9d20: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
9d30: 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20  int")==0) ){.   
9d40: 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49         Tcl_WideI
9d50: 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20  nt v;.          
9d60: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
9d70: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
9d80: 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20  ar, &v);.       
9d90: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
9da0: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c 20  int64(pStmt, i, 
9db0: 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  v);.        }els
9dc0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74  e{.          dat
9dd0: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
9de0: 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69  ar *)Tcl_GetStri
9df0: 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ngFromObj(pVar, 
9e00: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  &n);.          s
9e10: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
9e20: 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72  (pStmt, i, (char
9e30: 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49   *)data, n, SQLI
9e40: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
9e50: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
9e60: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
9e70: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
9e80: 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b  ->apParm[iParm++
9e90: 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20  ] = pVar;.      
9ea0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
9eb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9ec0: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
9ed0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
9ee0: 20 20 7d 0a 20 20 7d 0a 20 20 70 50 72 65 53 74    }.  }.  pPreSt
9ef0: 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72  mt->nParm = iPar
9f00: 6d 3b 0a 20 20 2a 70 70 50 72 65 53 74 6d 74 20  m;.  *ppPreStmt 
9f10: 3d 20 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72  = pPreStmt;..  r
9f20: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
9f30: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
9f40: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72   statement refer
9f50: 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79  ence obtained by
9f60: 20 63 61 6c 6c 69 6e 67 20 64 62 50 72 65 70 61   calling dbPrepa
9f70: 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20  reAndBind()..** 
9f80: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
9f90: 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c  exactly one call
9fa0: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
9fb0: 6e 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20  n for each call 
9fc0: 74 6f 0a 2a 2a 20 64 62 50 72 65 70 61 72 65 41  to.** dbPrepareA
9fd0: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20  ndBind()..**.** 
9fe0: 49 66 20 74 68 65 20 64 69 73 63 61 72 64 20 70  If the discard p
9ff0: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
a000: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 73  zero, then the s
a010: 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65 6c 65  tatement is dele
a020: 74 65 64 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ted.** immediate
a030: 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 20 69 74  ly. Otherwise it
a040: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
a050: 20 4c 52 55 20 6c 69 73 74 20 61 6e 64 20 6d 61   LRU list and ma
a060: 79 20 62 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a  y be returned.**
a070: 20 62 79 20 61 20 73 75 62 73 65 71 75 65 6e 74   by a subsequent
a080: 20 63 61 6c 6c 20 74 6f 20 64 62 50 72 65 70 61   call to dbPrepa
a090: 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a  reAndBind()..*/.
a0a0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 52 65  static void dbRe
a0b0: 6c 65 61 73 65 53 74 6d 74 28 0a 20 20 53 71 6c  leaseStmt(.  Sql
a0c0: 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20  iteDb *pDb,     
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a0e0: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
a0f0: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
a100: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 2c 20  Stmt *pPreStmt, 
a110: 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
a120: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
a130: 65 20 74 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e to release */.
a140: 20 20 69 6e 74 20 64 69 73 63 61 72 64 20 20 20    int discard   
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a160: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c    /* True to del
a170: 65 74 65 20 28 6e 6f 74 20 63 61 63 68 65 29 20  ete (not cache) 
a180: 74 68 65 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a  the pPreStmt */.
a190: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
a1a0: 2a 20 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64  * Free the bound
a1b0: 20 73 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62   string and blob
a1c0: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
a1d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 65   for(i=0; i<pPre
a1e0: 53 74 6d 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b  Stmt->nParm; i++
a1f0: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
a200: 65 66 43 6f 75 6e 74 28 70 50 72 65 53 74 6d 74  efCount(pPreStmt
a210: 2d 3e 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20  ->apParm[i]);.  
a220: 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50  }.  pPreStmt->nP
a230: 61 72 6d 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  arm = 0;..  if( 
a240: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20  pDb->maxStmt<=0 
a250: 7c 7c 20 64 69 73 63 61 72 64 20 29 7b 0a 20 20  || discard ){.  
a260: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
a270: 65 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c  e is turned off,
a280: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65   deallocated the
a290: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
a2a0: 20 20 64 62 46 72 65 65 53 74 6d 74 28 70 50 72    dbFreeStmt(pPr
a2b0: 65 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  eStmt);.  }else{
a2c0: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
a2d0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
a2e0: 6e 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  nt to the beginn
a2f0: 69 6e 67 20 6f 66 20 74 68 65 20 63 61 63 68 65  ing of the cache
a300: 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50   list. */.    pP
a310: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20  reStmt->pNext = 
a320: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
a330: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72     pPreStmt->pPr
a340: 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ev = 0;.    if( 
a350: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
a360: 0a 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c  .     pDb->stmtL
a370: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72  ist->pPrev = pPr
a380: 65 53 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20  eStmt;.    }.   
a390: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d   pDb->stmtList =
a3a0: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 69   pPreStmt;.    i
a3b0: 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  f( pDb->stmtLast
a3c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
a3d0: 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d  ert( pDb->nStmt=
a3e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  =0 );.      pDb-
a3f0: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65  >stmtLast = pPre
a400: 53 74 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Stmt;.    }else{
a410: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a420: 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20  Db->nStmt>0 );. 
a430: 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53     }.    pDb->nS
a440: 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 2f  tmt++;.   .    /
a450: 2a 20 49 66 20 77 65 20 68 61 76 65 20 74 6f 6f  * If we have too
a460: 20 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20   many statement 
a470: 69 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f 76 65  in cache, remove
a480: 20 74 68 65 20 73 75 72 70 6c 75 73 20 66 72 6f   the surplus fro
a490: 6d 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  m .    ** the en
a4a0: 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  d of the cache l
a4b0: 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69  ist.  */.    whi
a4c0: 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70  le( pDb->nStmt>p
a4d0: 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20  Db->maxStmt ){. 
a4e0: 20 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64       SqlPrepared
a4f0: 53 74 6d 74 20 2a 70 4c 61 73 74 20 3d 20 70 44  Stmt *pLast = pD
a500: 62 2d 3e 73 74 6d 74 4c 61 73 74 3b 0a 20 20 20  b->stmtLast;.   
a510: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
a520: 20 3d 20 70 4c 61 73 74 2d 3e 70 50 72 65 76 3b   = pLast->pPrev;
a530: 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74  .      pDb->stmt
a540: 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  Last->pNext = 0;
a550: 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d  .      pDb->nStm
a560: 74 2d 2d 3b 0a 20 20 20 20 20 20 64 62 46 72 65  t--;.      dbFre
a570: 65 53 74 6d 74 28 70 4c 61 73 74 29 3b 0a 20 20  eStmt(pLast);.  
a580: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
a590: 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
a5a0: 77 69 74 68 20 64 62 45 76 61 6c 58 58 58 28 29  with dbEvalXXX()
a5b0: 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
a5c0: 2a 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 29  *   dbEvalInit()
a5d0: 0a 2a 2a 20 20 20 64 62 45 76 61 6c 53 74 65 70  .**   dbEvalStep
a5e0: 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 46 69  ().**   dbEvalFi
a5f0: 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 20 20 64 62  nalize().**   db
a600: 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a  EvalRowInfo().**
a610: 20 20 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56     dbEvalColumnV
a620: 61 6c 75 65 28 29 0a 2a 2f 0a 74 79 70 65 64 65  alue().*/.typede
a630: 66 20 73 74 72 75 63 74 20 44 62 45 76 61 6c 43  f struct DbEvalC
a640: 6f 6e 74 65 78 74 20 44 62 45 76 61 6c 43 6f 6e  ontext DbEvalCon
a650: 74 65 78 74 3b 0a 73 74 72 75 63 74 20 44 62 45  text;.struct DbE
a660: 76 61 6c 43 6f 6e 74 65 78 74 20 7b 0a 20 20 53  valContext {.  S
a670: 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20  qliteDb *pDb;   
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a690: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
a6a0: 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  e */.  Tcl_Obj *
a6b0: 70 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSql;           
a6c0: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
a6d0: 20 68 6f 6c 64 69 6e 67 20 73 74 72 69 6e 67 20   holding string 
a6e0: 7a 53 71 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  zSql */.  const 
a6f0: 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
a700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
a710: 61 69 6e 69 6e 67 20 53 51 4c 20 74 6f 20 65 78  aining SQL to ex
a720: 65 63 75 74 65 20 2a 2f 0a 20 20 53 71 6c 50 72  ecute */.  SqlPr
a730: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
a740: 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 43 75  Stmt;      /* Cu
a750: 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
a760: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a790: 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
a7a0: 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20  ed by pStmt */. 
a7b0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
a7c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a7d0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72 61   /* Name of arra
a7e0: 79 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  y variable */.  
a7f0: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
a800: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
a810: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  /* Array of colu
a820: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a  mn names */.};..
a830: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
a840: 79 20 63 61 63 68 65 20 6f 66 20 63 6f 6c 75 6d  y cache of colum
a850: 6e 20 6e 61 6d 65 73 20 63 75 72 72 65 6e 74 6c  n names currentl
a860: 79 20 68 65 6c 64 20 61 73 20 70 61 72 74 20 6f  y held as part o
a870: 66 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43  f.** the DbEvalC
a880: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
a890: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
a8a0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
a8b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
a8c0: 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d  ReleaseColumnNam
a8d0: 65 73 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  es(DbEvalContext
a8e0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
a8f0: 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pColName ){.    
a900: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
a910: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
a920: 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  ++){.      Tcl_D
a930: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 61  ecrRefCount(p->a
a940: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
a950: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 46 72 65 65    }.    Tcl_Free
a960: 28 28 63 68 61 72 20 2a 29 70 2d 3e 61 70 43 6f  ((char *)p->apCo
a970: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61  lName);.    p->a
a980: 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  pColName = 0;.  
a990: 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  }.  p->nCol = 0;
a9a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
a9b0: 6c 69 7a 65 20 61 20 44 62 45 76 61 6c 43 6f 6e  lize a DbEvalCon
a9c0: 74 65 78 74 20 73 74 72 75 63 74 75 72 65 2e 0a  text structure..
a9d0: 2a 2a 0a 2a 2a 20 49 66 20 70 41 72 72 61 79 20  **.** If pArray 
a9e0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
a9f0: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  n it contains th
aa00: 65 20 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c 20  e name of a Tcl 
aa10: 61 72 72 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c  array.** variabl
aa20: 65 2e 20 54 68 65 20 22 2a 22 20 6d 65 6d 62 65  e. The "*" membe
aa30: 72 20 6f 66 20 74 68 69 73 20 61 72 72 61 79 20  r of this array 
aa40: 69 73 20 73 65 74 20 74 6f 20 61 20 6c 69 73 74  is set to a list
aa50: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74   containing.** t
aa60: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
aa70: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
aa80: 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
aa90: 74 20 61 73 20 70 61 72 74 20 6f 66 20 65 61 63  t as part of eac
aaa0: 68 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 64 62 45  h.** call to dbE
aab0: 76 61 6c 53 74 65 70 28 29 2c 20 69 6e 20 6f 72  valStep(), in or
aac0: 64 65 72 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  der from left to
aad0: 20 72 69 67 68 74 2e 20 65 2e 67 2e 20 69 66 20   right. e.g. if 
aae0: 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66  the names .** of
aaf0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f   the returned co
ab00: 6c 75 6d 6e 73 20 61 72 65 20 61 2c 20 62 20 61  lumns are a, b a
ab10: 6e 64 20 63 2c 20 69 74 20 64 6f 65 73 20 74 68  nd c, it does th
ab20: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  e equivalent of 
ab30: 74 68 65 20 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d  the .** tcl comm
ab40: 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  and:.**.**     s
ab50: 65 74 20 24 7b 70 41 72 72 61 79 7d 28 2a 29 20  et ${pArray}(*) 
ab60: 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69  {a b c}.*/.stati
ab70: 63 20 76 6f 69 64 20 64 62 45 76 61 6c 49 6e 69  c void dbEvalIni
ab80: 74 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65  t(.  DbEvalConte
ab90: 78 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  xt *p,          
aba0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
abb0: 74 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  to structure to 
abc0: 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  initialize */.  
abd0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20  SqliteDb *pDb,  
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
ac00: 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  le */.  Tcl_Obj 
ac10: 2a 70 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20  *pSql,          
ac20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
ac30: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c  t containing SQL
ac40: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c   script */.  Tcl
ac50: 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 20 20 20  _Obj *pArray    
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ac70: 4e 61 6d 65 20 6f 66 20 54 63 6c 20 61 72 72 61  Name of Tcl arra
ac80: 79 20 74 6f 20 73 65 74 20 28 2a 29 20 65 6c 65  y to set (*) ele
ac90: 6d 65 6e 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20  ment of */.){.  
aca0: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
acb0: 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  eof(DbEvalContex
acc0: 74 29 29 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20  t));.  p->pDb = 
acd0: 70 44 62 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d  pDb;.  p->zSql =
ace0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
acf0: 53 71 6c 29 3b 0a 20 20 70 2d 3e 70 53 71 6c 20  Sql);.  p->pSql 
ad00: 3d 20 70 53 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e  = pSql;.  Tcl_In
ad10: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 71 6c 29  crRefCount(pSql)
ad20: 3b 0a 20 20 69 66 28 20 70 41 72 72 61 79 20 29  ;.  if( pArray )
ad30: 7b 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20  {.    p->pArray 
ad40: 3d 20 70 41 72 72 61 79 3b 0a 20 20 20 20 54 63  = pArray;.    Tc
ad50: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
ad60: 41 72 72 61 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Array);.  }.}../
ad70: 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f  *.** Obtain info
ad80: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
ad90: 65 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 44  e row that the D
ada0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 70 61 73  bEvalContext pas
adb0: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
adc0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 63 75 72  rst argument cur
add0: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
ade0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
adf0: 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a   dbEvalRowInfo(.
ae00: 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
ae10: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
ae20: 20 20 2f 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20    /* Evaluation 
ae30: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
ae40: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae60: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63  OUT: Number of c
ae70: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
ae80: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43   Tcl_Obj ***papC
ae90: 6f 6c 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  olName          
aea0: 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f   /* OUT: Array o
aeb0: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  f column names *
aec0: 2f 0a 29 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  /.){.  /* Comput
aed0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
aee0: 2f 0a 20 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70  /.  if( 0==p->ap
aef0: 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  ColName ){.    s
af00: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
af10: 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74  mt = p->pPreStmt
af20: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74  ->pStmt;.    int
af30: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
af40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
af50: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
af60: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
af90: 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
afa0: 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20  ed by pStmt */. 
afb0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
afc0: 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  olName = 0;     
afd0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c   /* Array of col
afe0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20  umn names */..  
aff0: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c    p->nCol = nCol
b000: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
b010: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
b020: 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26      if( nCol>0 &
b030: 26 20 28 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c  & (papColName ||
b040: 20 70 2d 3e 70 41 72 72 61 79 29 20 29 7b 0a 20   p->pArray) ){. 
b050: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d       apColName =
b060: 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f   (Tcl_Obj**)Tcl_
b070: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63  Alloc( sizeof(Tc
b080: 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a  l_Obj*)*nCol );.
b090: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
b0a0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
b0b0: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69       apColName[i
b0c0: 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ] = Tcl_NewStrin
b0d0: 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  gObj(sqlite3_col
b0e0: 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  umn_name(pStmt,i
b0f0: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ), -1);.        
b100: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
b110: 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a  (apColName[i]);.
b120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
b130: 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43  >apColName = apC
b140: 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20  olName;.    }.. 
b150: 20 20 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73     /* If results
b160: 20 61 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65   are being store
b170: 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61  d in an array va
b180: 72 69 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65  riable, then cre
b190: 61 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 61  ate.    ** the a
b1a0: 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f  rray(*) entry fo
b1b0: 72 20 74 68 61 74 20 61 72 72 61 79 0a 20 20 20  r that array.   
b1c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
b1d0: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20 54  Array ){.      T
b1e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
b1f0: 70 20 3d 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65  p = p->pDb->inte
b200: 72 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  rp;.      Tcl_Ob
b210: 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63  j *pColList = Tc
b220: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
b230: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72    Tcl_Obj *pStar
b240: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
b250: 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20  Obj("*", -1);.. 
b260: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
b270: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
b280: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
b290: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
b2a0: 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61  erp, pColList, a
b2b0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
b2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f      }.      Tcl_
b2d0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74  IncrRefCount(pSt
b2e0: 61 72 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  ar);.      Tcl_O
b2f0: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
b300: 2c 20 70 2d 3e 70 41 72 72 61 79 2c 20 70 53 74  , p->pArray, pSt
b310: 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29  ar, pColList, 0)
b320: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  ;.      Tcl_Decr
b330: 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b  RefCount(pStar);
b340: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
b350: 28 20 70 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a  ( papColName ){.
b360: 20 20 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20      *papColName 
b370: 3d 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a  = p->apColName;.
b380: 20 20 7d 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20    }.  if( pnCol 
b390: 29 7b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20  ){.    *pnCol = 
b3a0: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a  p->nCol;.  }.}..
b3b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65  /*.** Return one
b3c0: 20 6f 66 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f   of TCL_OK, TCL_
b3d0: 42 52 45 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52  BREAK or TCL_ERR
b3e0: 4f 52 2e 20 49 66 20 54 43 4c 5f 45 52 52 4f 52  OR. If TCL_ERROR
b3f0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c   is.** returned,
b400: 20 74 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d   then an error m
b410: 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
b420: 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65   in the interpre
b430: 74 65 72 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65  ter before.** re
b440: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  turning..**.** A
b450: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
b460: 20 54 43 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68   TCL_OK means th
b470: 65 72 65 20 69 73 20 61 20 72 6f 77 20 6f 66 20  ere is a row of 
b480: 64 61 74 61 20 61 76 61 69 6c 61 62 6c 65 2e 20  data available. 
b490: 54 68 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20  The.** data may 
b4a0: 62 65 20 61 63 63 65 73 73 65 64 20 75 73 69 6e  be accessed usin
b4b0: 67 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28  g dbEvalRowInfo(
b4c0: 29 20 61 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75  ) and dbEvalColu
b4d0: 6d 6e 56 61 6c 75 65 28 29 2e 20 54 68 69 73 0a  mnValue(). This.
b4e0: 2a 2a 20 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20  ** is analogous 
b4f0: 74 6f 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  to a return of S
b500: 51 4c 49 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73  QLITE_ROW from s
b510: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 49  qlite3_step(). I
b520: 66 20 54 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69  f TCL_BREAK.** i
b530: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
b540: 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 20   the SQL script 
b550: 68 61 73 20 66 69 6e 69 73 68 65 64 20 65 78 65  has finished exe
b560: 63 75 74 69 6e 67 20 61 6e 64 20 74 68 65 72 65  cuting and there
b570: 20 61 72 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68   are.** no furth
b580: 65 72 20 72 6f 77 73 20 61 76 61 69 6c 61 62 6c  er rows availabl
b590: 65 2e 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  e. This is simil
b5a0: 61 72 20 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e  ar to SQLITE_DON
b5b0: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
b5c0: 20 64 62 45 76 61 6c 53 74 65 70 28 44 62 45 76   dbEvalStep(DbEv
b5d0: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  alContext *p){. 
b5e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
b5f0: 65 76 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20  evSql = 0;      
b600: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
b610: 75 65 20 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f  ue of p->zSql */
b620: 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53  ..  while( p->zS
b630: 71 6c 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65  ql[0] || p->pPre
b640: 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Stmt ){.    int 
b650: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  rc;.    if( p->p
b660: 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  PreStmt==0 ){.  
b670: 20 20 20 20 7a 50 72 65 76 53 71 6c 20 3d 20 28      zPrevSql = (
b680: 70 2d 3e 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71  p->zSql==zPrevSq
b690: 6c 20 3f 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29  l ? 0 : p->zSql)
b6a0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 62 50  ;.      rc = dbP
b6b0: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 70 2d  repareAndBind(p-
b6c0: 3e 70 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26  >pDb, p->zSql, &
b6d0: 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72  p->zSql, &p->pPr
b6e0: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  eStmt);.      if
b6f0: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
b700: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65  eturn rc;.    }e
b710: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
b720: 63 73 3b 0a 20 20 20 20 20 20 53 71 6c 69 74 65  cs;.      Sqlite
b730: 44 62 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62  Db *pDb = p->pDb
b740: 3b 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70 61  ;.      SqlPrepa
b750: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
b760: 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b  t = p->pPreStmt;
b770: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b780: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 50 72  tmt *pStmt = pPr
b790: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20  eStmt->pStmt;.. 
b7a0: 20 20 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74       rcs = sqlit
b7b0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
b7c0: 20 20 20 20 20 20 69 66 28 20 72 63 73 3d 3d 53        if( rcs==S
b7d0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
b7e0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
b7f0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
b800: 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20    if( p->pArray 
b810: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 45 76 61  ){.        dbEva
b820: 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30  lRowInfo(p, 0, 0
b830: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b840: 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 72   rcs = sqlite3_r
b850: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20  eset(pStmt);..  
b860: 20 20 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d      pDb->nStep =
b870: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
b880: 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54  atus(pStmt,SQLIT
b890: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
b8a0: 4c 53 43 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20  LSCAN_STEP,1);. 
b8b0: 20 20 20 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20       pDb->nSort 
b8c0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
b8d0: 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49  tatus(pStmt,SQLI
b8e0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
b8f0: 52 54 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62  RT,1);.      pDb
b900: 2d 3e 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  ->nIndex = sqlit
b910: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
b920: 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54  Stmt,SQLITE_STMT
b930: 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
b940: 2c 31 29 3b 0a 20 20 20 20 20 20 64 62 52 65 6c  ,1);.      dbRel
b950: 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  easeColumnNames(
b960: 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  p);.      p->pPr
b970: 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20  eStmt = 0;..    
b980: 20 20 69 66 28 20 72 63 73 21 3d 53 51 4c 49 54    if( rcs!=SQLIT
b990: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b9a0: 2f 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65  /* If a run-time
b9b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
b9c0: 65 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20  eport the error 
b9d0: 61 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67  and stop reading
b9e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
b9f0: 53 51 4c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  SQL.  */.       
ba00: 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70   dbReleaseStmt(p
ba10: 44 62 2c 20 70 50 72 65 53 74 6d 74 2c 20 31 29  Db, pPreStmt, 1)
ba20: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53  ;.#if SQLITE_TES
ba30: 54 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  T.        if( p-
ba40: 3e 70 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65  >pDb->bLegacyPre
ba50: 70 61 72 65 20 26 26 20 72 63 73 3d 3d 53 51 4c  pare && rcs==SQL
ba60: 49 54 45 5f 53 43 48 45 4d 41 20 26 26 20 7a 50  ITE_SCHEMA && zP
ba70: 72 65 76 53 71 6c 20 29 7b 0a 20 20 20 20 20 20  revSql ){.      
ba80: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 75      /* If the ru
ba90: 6e 74 69 6d 65 20 65 72 72 6f 72 20 77 61 73 20  ntime error was 
baa0: 61 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  an SQLITE_SCHEMA
bab0: 2c 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  , and the databa
bac0: 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  se.          ** 
bad0: 68 61 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67  handle is config
bae0: 75 72 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  ured to use the 
baf0: 6c 65 67 61 63 79 20 73 71 6c 69 74 65 33 5f 70  legacy sqlite3_p
bb00: 72 65 70 61 72 65 28 29 20 0a 20 20 20 20 20 20  repare() .      
bb10: 20 20 20 20 2a 2a 20 69 6e 74 65 72 66 61 63 65      ** interface
bb20: 2c 20 72 65 74 72 79 20 70 72 65 70 61 72 65 28  , retry prepare(
bb30: 29 2f 73 74 65 70 28 29 20 6f 6e 20 74 68 65 20  )/step() on the 
bb40: 73 61 6d 65 20 53 51 4c 20 73 74 61 74 65 6d 65  same SQL stateme
bb50: 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt..          **
bb60: 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
bb70: 6e 73 20 6f 6e 63 65 2e 20 49 66 20 74 68 65 72  ns once. If ther
bb80: 65 20 69 73 20 61 20 73 65 63 6f 6e 64 20 53 51  e is a second SQ
bb90: 4c 49 54 45 5f 53 43 48 45 4d 41 0a 20 20 20 20  LITE_SCHEMA.    
bba0: 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20        ** error, 
bbb0: 74 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  the error will b
bbc0: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
bbd0: 65 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20  e caller. */.   
bbe0: 20 20 20 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d         p->zSql =
bbf0: 20 7a 50 72 65 76 53 71 6c 3b 0a 20 20 20 20 20   zPrevSql;.     
bc00: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
bc10: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
bc20: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
bc30: 62 6a 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  bjResult(pDb->in
bc40: 74 65 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20  terp,.          
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
bc60: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
bc70: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
bc80: 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20  Db->db), -1));. 
bc90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
bca0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
bcb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62  else{.        db
bcc0: 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c  ReleaseStmt(pDb,
bcd0: 20 70 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20   pPreStmt, 0);. 
bce0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
bcf0: 0a 0a 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20  ..  /* Finished 
bd00: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
bd10: 42 52 45 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  BREAK;.}../*.** 
bd20: 46 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63  Free all resourc
bd30: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  es currently hel
bd40: 64 20 62 79 20 74 68 65 20 44 62 45 76 61 6c 43  d by the DbEvalC
bd50: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
bd60: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
bd70: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
bd80: 2e 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  . There should b
bd90: 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 61  e exactly one ca
bda0: 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
bdb0: 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20  ion.** for each 
bdc0: 63 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c 49 6e  call to dbEvalIn
bdd0: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
bde0: 76 6f 69 64 20 64 62 45 76 61 6c 46 69 6e 61 6c  void dbEvalFinal
bdf0: 69 7a 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  ize(DbEvalContex
be00: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  t *p){.  if( p->
be10: 70 50 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20  pPreStmt ){.    
be20: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
be30: 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74  >pPreStmt->pStmt
be40: 29 3b 0a 20 20 20 20 64 62 52 65 6c 65 61 73 65  );.    dbRelease
be50: 53 74 6d 74 28 70 2d 3e 70 44 62 2c 20 70 2d 3e  Stmt(p->pDb, p->
be60: 70 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20  pPreStmt, 0);.  
be70: 20 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20    p->pPreStmt = 
be80: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  0;.  }.  if( p->
be90: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 54 63  pArray ){.    Tc
bea0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
beb0: 2d 3e 70 41 72 72 61 79 29 3b 0a 20 20 20 20 70  ->pArray);.    p
bec0: 2d 3e 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20  ->pArray = 0;.  
bed0: 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  }.  Tcl_DecrRefC
bee0: 6f 75 6e 74 28 70 2d 3e 70 53 71 6c 29 3b 0a 20  ount(p->pSql);. 
bef0: 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e   dbReleaseColumn
bf00: 4e 61 6d 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  Names(p);.}../*.
bf10: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
bf20: 74 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a  ter to a Tcl_Obj
bf30: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
bf40: 72 65 66 2d 63 6f 75 6e 74 20 30 20 74 68 61 74  ref-count 0 that
bf50: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
bf60: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69   value for the i
bf70: 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col'th column of
bf80: 20 74 68 65 20 72 6f 77 20 63 75 72 72 65 6e 74   the row current
bf90: 6c 79 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ly pointed to by
bfa0: 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f  .** the DbEvalCo
bfb0: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
bfc0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
bfd0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
bfe0: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20  .static Tcl_Obj 
bff0: 2a 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c  *dbEvalColumnVal
c000: 75 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ue(DbEvalContext
c010: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
c020: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
c030: 70 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53  pStmt = p->pPreS
c040: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 73 77  tmt->pStmt;.  sw
c050: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f  itch( sqlite3_co
c060: 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
c070: 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61   iCol) ){.    ca
c080: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
c090: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 79 74 65  {.      int byte
c0a0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
c0b0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
c0c0: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e  iCol);.      con
c0d0: 73 74 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d  st char *zBlob =
c0e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c0f0: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 43 6f 6c  blob(pStmt, iCol
c100: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 42  );.      if( !zB
c110: 6c 6f 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b  lob ) bytes = 0;
c120: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63  .      return Tc
c130: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
c140: 6a 28 28 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79  j((u8*)zBlob, by
c150: 74 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tes);.    }.    
c160: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
c170: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  GER: {.      sql
c180: 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71  ite_int64 v = sq
c190: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
c1a0: 36 34 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b  64(pStmt, iCol);
c1b0: 0a 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32  .      if( v>=-2
c1c0: 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d  147483647 && v<=
c1d0: 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20  2147483647 ){.  
c1e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
c1f0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29  _NewIntObj((int)
c200: 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
c210: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c220: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
c230: 6a 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  j(v);.      }.  
c240: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
c250: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
c260: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
c270: 77 44 6f 75 62 6c 65 4f 62 6a 28 73 71 6c 69 74  wDoubleObj(sqlit
c280: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
c290: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a  (pStmt, iCol));.
c2a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
c2b0: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
c2c0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
c2d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70  ewStringObj(p->p
c2e0: 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a  Db->zNull, -1);.
c2f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
c300: 75 72 6e 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  urn Tcl_NewStrin
c310: 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69  gObj((char*)sqli
c320: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
c330: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 2c 20 2d 31  pStmt, iCol), -1
c340: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75  );.}../*.** If u
c350: 73 69 6e 67 20 54 63 6c 20 76 65 72 73 69 6f 6e  sing Tcl version
c360: 20 38 2e 36 20 6f 72 20 67 72 65 61 74 65 72 2c   8.6 or greater,
c370: 20 75 73 65 20 74 68 65 20 4e 52 20 66 75 6e 63   use the NR func
c380: 74 69 6f 6e 73 20 74 6f 20 61 76 6f 69 64 0a 2a  tions to avoid.*
c390: 2a 20 72 65 63 75 72 73 69 76 65 20 65 76 61 6c  * recursive eval
c3a0: 75 74 69 6f 6e 20 6f 66 20 73 63 72 69 70 74 73  ution of scripts
c3b0: 20 62 79 20 74 68 65 20 5b 64 62 20 65 76 61 6c   by the [db eval
c3c0: 5d 20 61 6e 64 20 5b 64 62 20 74 72 61 6e 73 5d  ] and [db trans]
c3d0: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 76  .** commands. Ev
c3e0: 65 6e 20 69 66 20 74 68 65 20 68 65 61 64 65 72  en if the header
c3f0: 73 20 75 73 65 64 20 77 68 69 6c 65 20 63 6f 6d  s used while com
c400: 70 69 6c 69 6e 67 20 74 68 65 20 65 78 74 65 6e  piling the exten
c410: 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 38 2e 36 20  sion.** are 8.6 
c420: 6f 72 20 6e 65 77 65 72 2c 20 74 68 65 20 63 6f  or newer, the co
c430: 64 65 20 73 74 69 6c 6c 20 74 65 73 74 73 20 74  de still tests t
c440: 68 65 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 61  he Tcl version a
c450: 74 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68  t runtime..** Th
c460: 69 73 20 61 6c 6c 6f 77 73 20 73 74 75 62 73 2d  is allows stubs-
c470: 65 6e 61 62 6c 65 64 20 62 75 69 6c 64 73 20 74  enabled builds t
c480: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20 6f  o be used with o
c490: 6c 64 65 72 20 54 63 6c 20 6c 69 62 72 61 72 69  lder Tcl librari
c4a0: 65 73 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d  es..*/.#if TCL_M
c4b0: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3e 38 20 7c  AJOR_VERSION>8 |
c4c0: 7c 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52  | (TCL_MAJOR_VER
c4d0: 53 49 4f 4e 3d 3d 38 20 26 26 20 54 43 4c 5f 4d  SION==8 && TCL_M
c4e0: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 3e 3d 36 29  INOR_VERSION>=6)
c4f0: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
c500: 5f 54 43 4c 5f 4e 52 45 20 31 0a 73 74 61 74 69  _TCL_NRE 1.stati
c510: 63 20 69 6e 74 20 44 62 55 73 65 4e 72 65 28 76  c int DbUseNre(v
c520: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f  oid){.  int majo
c530: 72 2c 20 6d 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f  r, minor;.  Tcl_
c540: 47 65 74 56 65 72 73 69 6f 6e 28 26 6d 61 6a 6f  GetVersion(&majo
c550: 72 2c 20 26 6d 69 6e 6f 72 2c 20 30 2c 20 30 29  r, &minor, 0, 0)
c560: 3b 0a 20 20 72 65 74 75 72 6e 28 20 28 6d 61 6a  ;.  return( (maj
c570: 6f 72 3d 3d 38 20 26 26 20 6d 69 6e 6f 72 3e 3d  or==8 && minor>=
c580: 36 29 20 7c 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b  6) || major>8 );
c590: 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 0a 2a 2a 20  .}.#else./* .** 
c5a0: 43 6f 6d 70 69 6c 69 6e 67 20 75 73 69 6e 67 20  Compiling using 
c5b0: 68 65 61 64 65 72 73 20 65 61 72 6c 69 65 72 20  headers earlier 
c5c0: 74 68 61 6e 20 38 2e 36 2e 20 49 6e 20 74 68 69  than 8.6. In thi
c5d0: 73 20 63 61 73 65 20 4e 52 20 63 61 6e 6e 6f 74  s case NR cannot
c5e0: 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 73 6f 20   be.** used, so 
c5f0: 44 62 55 73 65 4e 72 65 28 29 20 74 6f 20 61 6c  DbUseNre() to al
c600: 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f  ways return zero
c610: 2e 20 41 64 64 20 23 64 65 66 69 6e 65 73 20 66  . Add #defines f
c620: 6f 72 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  or the other.** 
c630: 54 63 6c 5f 4e 52 78 78 78 28 29 20 66 75 6e 63  Tcl_NRxxx() func
c640: 74 69 6f 6e 73 20 74 6f 20 70 72 65 76 65 6e 74  tions to prevent
c650: 20 74 68 65 6d 20 66 72 6f 6d 20 63 61 75 73 69   them from causi
c660: 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 65  ng compilation e
c670: 72 72 6f 72 73 2c 0a 2a 2a 20 65 76 65 6e 20 74  rrors,.** even t
c680: 68 6f 75 67 68 20 74 68 65 20 6f 6e 6c 79 20 69  hough the only i
c690: 6e 76 6f 63 61 74 69 6f 6e 73 20 6f 66 20 74 68  nvocations of th
c6a0: 65 6d 20 61 72 65 20 77 69 74 68 69 6e 20 63 6f  em are within co
c6b0: 6e 64 69 74 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73  nditional blocks
c6c0: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 72 6d   .** of the form
c6d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 44 62  :.**.**   if( Db
c6e0: 55 73 65 4e 72 65 28 29 20 29 20 7b 20 2e 2e 2e  UseNre() ) { ...
c6f0: 20 7d 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 53   }.*/.# define S
c700: 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 30 0a  QLITE_TCL_NRE 0.
c710: 23 20 64 65 66 69 6e 65 20 44 62 55 73 65 4e 72  # define DbUseNr
c720: 65 28 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54  e() 0.# define T
c730: 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b  cl_NRAddCallback
c740: 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 30 0a  (a,b,c,d,e,f) 0.
c750: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45  # define Tcl_NRE
c760: 76 61 6c 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a  valObj(a,b,c) 0.
c770: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43  # define Tcl_NRC
c780: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62  reateCommand(a,b
c790: 2c 63 2c 64 2c 65 2c 66 29 20 30 0a 23 65 6e 64  ,c,d,e,f) 0.#end
c7a0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
c7b0: 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  unction is part 
c7c0: 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  of the implement
c7d0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d  ation of the com
c7e0: 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64  mand:.**.**   $d
c7f0: 62 20 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41  b eval SQL ?ARRA
c800: 59 4e 41 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f  YNAME? SCRIPT.*/
c810: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 45 76  .static int DbEv
c820: 61 6c 4e 65 78 74 43 6d 64 28 0a 20 20 43 6c 69  alNextCmd(.  Cli
c830: 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20  entData data[], 
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20    /* data[0] is 
c860: 74 68 65 20 28 44 62 45 76 61 6c 43 6f 6e 74 65  the (DbEvalConte
c870: 78 74 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  xt*) */.  Tcl_In
c880: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c8a0: 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65  * Tcl interprete
c8b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c  r */.  int resul
c8c0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
c8e0: 65 73 75 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a  esult so far */.
c8f0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ){.  int rc = re
c900: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
c910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
c920: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
c930: 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d  * The first elem
c940: 65 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 5b  ent of the data[
c950: 5d 20 61 72 72 61 79 20 69 73 20 61 20 70 6f 69  ] array is a poi
c960: 6e 74 65 72 20 74 6f 20 61 20 44 62 45 76 61 6c  nter to a DbEval
c970: 43 6f 6e 74 65 78 74 0a 20 20 2a 2a 20 73 74 72  Context.  ** str
c980: 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64  ucture allocated
c990: 20 75 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63   using Tcl_Alloc
c9a0: 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 65  (). The second e
c9b0: 6c 65 6d 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d  lement of data[]
c9c0: 0a 20 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74  .  ** is a point
c9d0: 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20  er to a Tcl_Obj 
c9e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
c9f0: 63 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72  cript to run for
ca00: 20 65 61 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72   each row.  ** r
ca10: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 71  eturned by the q
ca20: 75 65 72 69 65 73 20 65 6e 63 61 70 73 75 6c 61  ueries encapsula
ca30: 74 65 64 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20  ted in data[0]. 
ca40: 2a 2f 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65  */.  DbEvalConte
ca50: 78 74 20 2a 70 20 3d 20 28 44 62 45 76 61 6c 43  xt *p = (DbEvalC
ca60: 6f 6e 74 65 78 74 20 2a 29 64 61 74 61 5b 30 5d  ontext *)data[0]
ca70: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63  ;.  Tcl_Obj *pSc
ca80: 72 69 70 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20  ript = (Tcl_Obj 
ca90: 2a 29 64 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c  *)data[1];.  Tcl
caa0: 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 70  _Obj *pArray = p
cab0: 2d 3e 70 41 72 72 61 79 3b 0a 0a 20 20 77 68 69  ->pArray;..  whi
cac0: 6c 65 28 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20  le( (rc==TCL_OK 
cad0: 7c 7c 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49  || rc==TCL_CONTI
cae0: 4e 55 45 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d  NUE) && TCL_OK==
caf0: 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70  (rc = dbEvalStep
cb00: 28 70 29 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  (p)) ){.    int 
cb10: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  i;.    int nCol;
cb20: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
cb30: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62  pColName;.    db
cb40: 45 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26  EvalRowInfo(p, &
cb50: 6e 43 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65  nCol, &apColName
cb60: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
cb70: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
cb80: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
cb90: 6c 20 3d 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  l = dbEvalColumn
cba0: 56 61 6c 75 65 28 70 2c 20 69 29 3b 0a 20 20 20  Value(p, i);.   
cbb0: 20 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30     if( pArray==0
cbc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
cbd0: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
cbe0: 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  p, apColName[i],
cbf0: 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20   0, pVal, 0);.  
cc00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cc10: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
cc20: 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79  2(interp, pArray
cc30: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20  , apColName[i], 
cc40: 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  pVal, 0);.      
cc50: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
cc60: 54 68 65 20 72 65 71 75 69 72 65 64 20 69 6e 74  The required int
cc70: 65 72 70 72 65 74 65 72 20 76 61 72 69 61 62 6c  erpreter variabl
cc80: 65 73 20 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c  es are now popul
cc90: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
cca0: 74 61 20 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ta .    ** from 
ccb0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
ccc0: 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73   If using NRE, s
ccd0: 63 68 65 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b  chedule callback
cce0: 73 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20  s to evaluate.  
ccf0: 20 20 2a 2a 20 73 63 72 69 70 74 20 70 53 63 72    ** script pScr
cd00: 69 70 74 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76  ipt, then to inv
cd10: 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  oke this functio
cd20: 6e 20 61 67 61 69 6e 20 74 6f 20 66 65 74 63 68  n again to fetch
cd30: 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
cd40: 20 72 6f 77 20 28 6f 72 20 63 6c 65 61 6e 20 75   row (or clean u
cd50: 70 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  p if there is no
cd60: 20 6e 65 78 74 20 72 6f 77 20 6f 72 20 74 68 65   next row or the
cd70: 20 73 63 72 69 70 74 20 74 68 72 6f 77 73 20 61   script throws a
cd80: 6e 0a 20 20 20 20 2a 2a 20 65 78 63 65 70 74 69  n.    ** excepti
cd90: 6f 6e 29 2e 20 41 66 74 65 72 20 73 63 68 65 64  on). After sched
cda0: 75 6c 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61  uling the callba
cdb0: 63 6b 73 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74  cks, return cont
cdc0: 72 6f 6c 20 74 6f 20 74 68 65 20 0a 20 20 20 20  rol to the .    
cdd0: 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a  ** caller..    *
cde0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 20  *.    ** If not 
cdf0: 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75  using NRE, evalu
ce00: 61 74 65 20 70 53 63 72 69 70 74 20 64 69 72 65  ate pScript dire
ce10: 63 74 6c 79 20 61 6e 64 20 63 6f 6e 74 69 6e 75  ctly and continu
ce20: 65 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a  e with the.    *
ce30: 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  * next iteration
ce40: 20 6f 66 20 74 68 69 73 20 77 68 69 6c 65 28 2e   of this while(.
ce50: 2e 2e 29 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20  ..) loop.  */.  
ce60: 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29    if( DbUseNre()
ce70: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52   ){.      Tcl_NR
ce80: 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  AddCallback(inte
ce90: 72 70 2c 20 44 62 45 76 61 6c 4e 65 78 74 43 6d  rp, DbEvalNextCm
cea0: 64 2c 20 28 76 6f 69 64 2a 29 70 2c 20 28 76 6f  d, (void*)p, (vo
ceb0: 69 64 2a 29 70 53 63 72 69 70 74 2c 20 30 2c 20  id*)pScript, 0, 
cec0: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
ced0: 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69   Tcl_NREvalObj(i
cee0: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
cef0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
cf00: 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76       rc = Tcl_Ev
cf10: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
cf20: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
cf30: 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65   }.  }..  Tcl_De
cf40: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
cf50: 70 74 29 3b 0a 20 20 64 62 45 76 61 6c 46 69 6e  pt);.  dbEvalFin
cf60: 61 6c 69 7a 65 28 70 29 3b 0a 20 20 54 63 6c 5f  alize(p);.  Tcl_
cf70: 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b  Free((char *)p);
cf80: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f  ..  if( rc==TCL_
cf90: 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 42 52  OK || rc==TCL_BR
cfa0: 45 41 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52  EAK ){.    Tcl_R
cfb0: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
cfc0: 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c  p);.    rc = TCL
cfd0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
cfe0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
cff0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d000: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
d010: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
d020: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74  he following dat
d030: 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65  abase .** handle
d040: 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 3a 0a 2a   sub-commands:.*
d050: 2a 0a 2a 2a 20 20 20 24 64 62 20 75 70 64 61 74  *.**   $db updat
d060: 65 5f 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a  e_hook ?SCRIPT?.
d070: 2a 2a 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f  **   $db wal_hoo
d080: 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20  k ?SCRIPT?.**   
d090: 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20  $db commit_hook 
d0a0: 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24 64  ?SCRIPT?.**   $d
d0b0: 62 20 70 72 65 75 70 64 61 74 65 20 68 6f 6f 6b  b preupdate hook
d0c0: 20 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a 73 74 61   ?SCRIPT?.*/.sta
d0d0: 74 69 63 20 76 6f 69 64 20 44 62 48 6f 6f 6b 43  tic void DbHookC
d0e0: 6d 64 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  md(.  Tcl_Interp
d0f0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20   *interp,       
d100: 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74        /* Tcl int
d110: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 53 71  erpreter */.  Sq
d120: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20  liteDb *pDb,    
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d140: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
d150: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
d160: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
d170: 20 20 20 20 20 20 2f 2a 20 53 43 52 49 50 54 20        /* SCRIPT 
d180: 61 72 67 75 6d 65 6e 74 20 28 6f 72 20 4e 55 4c  argument (or NUL
d190: 4c 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  L) */.  Tcl_Obj 
d1a0: 2a 2a 70 70 48 6f 6f 6b 20 20 20 20 20 20 20 20  **ppHook        
d1b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
d1c0: 65 72 20 74 6f 20 6d 65 6d 62 65 72 20 6f 66 20  er to member of 
d1d0: 53 71 6c 69 74 65 44 62 20 2a 2f 0a 29 7b 0a 20  SqliteDb */.){. 
d1e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d1f0: 44 62 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 2a  Db->db;..  if( *
d200: 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63  ppHook ){.    Tc
d210: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
d220: 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b  nterp, *ppHook);
d230: 0a 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b  .    if( pArg ){
d240: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
d250: 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29  efCount(*ppHook)
d260: 3b 0a 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20  ;.      *ppHook 
d270: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
d280: 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20   if( pArg ){.   
d290: 20 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f   assert( !(*ppHo
d2a0: 6f 6b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 54  ok) );.    if( T
d2b0: 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68  cl_GetCharLength
d2c0: 28 70 41 72 67 29 3e 30 20 29 7b 0a 20 20 20 20  (pArg)>0 ){.    
d2d0: 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 70 41 72 67    *ppHook = pArg
d2e0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72  ;.      Tcl_Incr
d2f0: 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b  RefCount(*ppHook
d300: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
d310: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d320: 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
d330: 4b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 75  K.  sqlite3_preu
d340: 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 28  pdate_hook(db, (
d350: 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
d360: 6f 6f 6b 3f 44 62 50 72 65 55 70 64 61 74 65 48  ook?DbPreUpdateH
d370: 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b  andler:0), pDb);
d380: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
d390: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62  3_update_hook(db
d3a0: 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  , (pDb->pUpdateH
d3b0: 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61 6e 64  ook?DbUpdateHand
d3c0: 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20  ler:0), pDb);.  
d3d0: 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b  sqlite3_rollback
d3e0: 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e  _hook(db, (pDb->
d3f0: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62  pRollbackHook?Db
d400: 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a  RollbackHandler:
d410: 30 29 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c 69  0), pDb);.  sqli
d420: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
d430: 20 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f   (pDb->pWalHook?
d440: 44 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c  DbWalHandler:0),
d450: 20 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pDb);.}../*.** 
d460: 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d  The "sqlite" com
d470: 6d 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74  mand below creat
d480: 65 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d  es a new Tcl com
d490: 6d 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a  mand for each.**
d4a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f   connection it o
d4b0: 70 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74  pens to an SQLit
d4c0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
d4d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
d4e0: 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72  oked.** whenever
d4f0: 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f   one of those co
d500: 6e 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69  nnection-specifi
d510: 63 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78  c commands is ex
d520: 65 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c  ecuted.** in Tcl
d530: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
d540: 69 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63  if you run Tcl c
d550: 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ode like this:.*
d560: 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74  *.**       sqlit
d570: 65 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61  e3 db1  "my_data
d580: 62 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64  base".**       d
d590: 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54  b1 close.**.** T
d5a0: 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64  he first command
d5b0: 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74   opens a connect
d5c0: 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64  ion to the "my_d
d5d0: 61 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73  atabase" databas
d5e0: 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74  e.** and calls t
d5f0: 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22  hat connection "
d600: 64 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e  db1".  The secon
d610: 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73  d command causes
d620: 20 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74   this.** subrout
d630: 69 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ine to be invoke
d640: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
d650: 20 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a   DbObjCmd(void *
d660: 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  cd, Tcl_Interp *
d670: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
d680: 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a  ,Tcl_Obj *const*
d690: 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44  objv){.  SqliteD
d6a0: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
d6b0: 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68  Db*)cd;.  int ch
d6c0: 6f 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  oice;.  int rc =
d6d0: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69   TCL_OK;.  stati
d6e0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42  c const char *DB
d6f0: 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  _strs[] = {.    
d700: 22 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20  "authorizer",   
d710: 20 20 20 20 20 20 22 62 61 63 6b 75 70 22 2c 20        "backup", 
d720: 20 20 20 20 20 20 20 20 20 20 20 22 62 75 73 79             "busy
d730: 22 2c 0a 20 20 20 20 22 63 61 63 68 65 22 2c 20  ",.    "cache", 
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 68               "ch
d750: 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20  anges",         
d760: 20 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 22    "close",.    "
d770: 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20  collate",       
d780: 20 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f       "collation_
d790: 6e 65 65 64 65 64 22 2c 20 20 22 63 6f 6d 6d 69  needed",  "commi
d7a0: 74 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 63 6f  t_hook",.    "co
d7b0: 6d 70 6c 65 74 65 22 2c 20 20 20 20 20 20 20 20  mplete",        
d7c0: 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20     "copy",      
d7d0: 20 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65 5f          "enable_
d7e0: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c  load_extension",
d7f0: 0a 20 20 20 20 22 65 72 72 6f 72 63 6f 64 65 22  .    "errorcode"
d800: 2c 20 20 20 20 20 20 20 20 20 20 22 65 76 61 6c  ,          "eval
d810: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
d820: 22 65 78 69 73 74 73 22 2c 0a 20 20 20 20 22 66  "exists",.    "f
d830: 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20  unction",       
d840: 20 20 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20      "incrblob", 
d850: 20 20 20 20 20 20 20 20 20 22 69 6e 74 65 72 72           "interr
d860: 75 70 74 22 2c 0a 20 20 20 20 22 6c 61 73 74 5f  upt",.    "last_
d870: 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20  insert_rowid",  
d880: 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20  "nullvalue",    
d890: 20 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22       "onecolumn"
d8a0: 2c 0a 20 20 20 20 22 70 72 65 75 70 64 61 74 65  ,.    "preupdate
d8b0: 22 2c 20 20 20 20 20 20 20 20 20 20 22 70 72 6f  ",          "pro
d8c0: 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  file",          
d8d0: 20 22 70 72 6f 67 72 65 73 73 22 2c 0a 20 20 20   "progress",.   
d8e0: 20 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20   "rekey",       
d8f0: 20 20 20 20 20 20 20 22 72 65 73 74 6f 72 65 22         "restore"
d900: 2c 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c  ,           "rol
d910: 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20  lback_hook",.   
d920: 20 22 73 74 61 74 75 73 22 2c 20 20 20 20 20 20   "status",      
d930: 20 20 20 20 20 20 20 22 74 69 6d 65 6f 75 74 22         "timeout"
d940: 2c 20 20 20 20 20 20 20 20 20 20 20 22 74 6f 74  ,           "tot
d950: 61 6c 5f 63 68 61 6e 67 65 73 22 2c 0a 20 20 20  al_changes",.   
d960: 20 22 74 72 61 63 65 22 2c 20 20 20 20 20 20 20   "trace",       
d970: 20 20 20 20 20 20 20 22 74 72 61 6e 73 61 63 74         "transact
d980: 69 6f 6e 22 2c 20 20 20 20 20 20 20 22 75 6e 6c  ion",       "unl
d990: 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 0a 20 20 20  ock_notify",.   
d9a0: 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 20   "update_hook", 
d9b0: 20 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e 22         "version"
d9c0: 2c 20 20 20 20 20 20 20 20 20 20 20 22 77 61 6c  ,           "wal
d9d0: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 30 20 20 20  _hook",.    0   
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42   .  };.  enum DB
da00: 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41  _enum {.    DB_A
da10: 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20  UTHORIZER,      
da20: 20 20 44 42 5f 42 41 43 4b 55 50 2c 20 20 20 20    DB_BACKUP,    
da30: 20 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c 0a         DB_BUSY,.
da40: 20 20 20 20 44 42 5f 43 41 43 48 45 2c 20 20 20      DB_CACHE,   
da50: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 48 41            DB_CHA
da60: 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20 20 44  NGES,          D
da70: 42 5f 43 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f  B_CLOSE,.    DB_
da80: 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20 20 20  COLLATE,        
da90: 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f     DB_COLLATION_
daa0: 4e 45 45 44 45 44 2c 20 44 42 5f 43 4f 4d 4d 49  NEEDED, DB_COMMI
dab0: 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 43  T_HOOK,.    DB_C
dac0: 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20 20 20 20  OMPLETE,        
dad0: 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20    DB_COPY,      
dae0: 20 20 20 20 20 20 20 44 42 5f 45 4e 41 42 4c 45         DB_ENABLE
daf0: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c  _LOAD_EXTENSION,
db00: 0a 20 20 20 20 44 42 5f 45 52 52 4f 52 43 4f 44  .    DB_ERRORCOD
db10: 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f 45 56  E,         DB_EV
db20: 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  AL,             
db30: 44 42 5f 45 58 49 53 54 53 2c 0a 20 20 20 20 44  DB_EXISTS,.    D
db40: 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20  B_FUNCTION,     
db50: 20 20 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42       DB_INCRBLOB
db60: 2c 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 54  ,         DB_INT
db70: 45 52 52 55 50 54 2c 0a 20 20 20 20 44 42 5f 4c  ERRUPT,.    DB_L
db80: 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44  AST_INSERT_ROWID
db90: 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20  , DB_NULLVALUE, 
dba0: 20 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c         DB_ONECOL
dbb0: 55 4d 4e 2c 0a 20 20 20 20 44 42 5f 50 52 45 55  UMN,.    DB_PREU
dbc0: 50 44 41 54 45 2c 20 20 20 20 20 20 20 20 20 44  PDATE,         D
dbd0: 42 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20 20  B_PROFILE,      
dbe0: 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c      DB_PROGRESS,
dbf0: 0a 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 20 20  .    DB_REKEY,  
dc00: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 45             DB_RE
dc10: 53 54 4f 52 45 2c 20 20 20 20 20 20 20 20 20 20  STORE,          
dc20: 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b  DB_ROLLBACK_HOOK
dc30: 2c 0a 20 20 20 20 44 42 5f 53 54 41 54 55 53 2c  ,.    DB_STATUS,
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54              DB_T
dc50: 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20  IMEOUT,         
dc60: 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45   DB_TOTAL_CHANGE
dc70: 53 2c 0a 20 20 20 20 44 42 5f 54 52 41 43 45 2c  S,.    DB_TRACE,
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
dc90: 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20  TRANSACTION,    
dca0: 20 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49    DB_UNLOCK_NOTI
dcb0: 46 59 2c 0a 20 20 20 20 44 42 5f 55 50 44 41 54  FY,.    DB_UPDAT
dcc0: 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 20 44 42  E_HOOK,       DB
dcd0: 5f 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20  _VERSION,       
dce0: 20 20 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 2c 0a     DB_WAL_HOOK,.
dcf0: 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20    };.  /* don't 
dd00: 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20 63  leave trailing c
dd10: 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d  ommas on DB_enum
dd20: 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74 68  , it confuses th
dd30: 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c  e AIX xlc compil
dd40: 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a  er */..  if( obj
dd50: 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c<2 ){.    Tcl_W
dd60: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
dd70: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55  rp, 1, objv, "SU
dd80: 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a  BCOMMAND ...");.
dd90: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dda0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
ddb0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
ddc0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
ddd0: 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f  [1], DB_strs, "o
dde0: 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69  ption", 0, &choi
ddf0: 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ce) ){.    retur
de00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
de10: 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e 75  ..  switch( (enu
de20: 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65  m DB_enum)choice
de30: 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62   ){..  /*    $db
de40: 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c   authorizer ?CAL
de50: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
de60: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
de70: 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  n callback to au
de80: 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c  thorize each SQL
de90: 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74   operation as it
dea0: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   is.  ** compile
deb0: 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20  d.  5 arguments 
dec0: 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20  are appended to 
ded0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66  the callback bef
dee0: 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69  ore it is.  ** i
def0: 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  nvoked:.  **.  *
df00: 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74 68  *   (1) The auth
df10: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28  orization type (
df20: 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ex: SQLITE_CREAT
df30: 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f  E_TABLE, SQLITE_
df40: 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a  INSERT, ...).  *
df50: 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64 65  *   (2) First de
df60: 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28  scriptive name (
df70: 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f  depends on autho
df80: 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20  rization type). 
df90: 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64   **   (3) Second
dfa0: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
dfb0: 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d  e.  **   (4) Nam
dfc0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
dfd0: 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22  e (ex: "main", "
dfe0: 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35  temp").  **   (5
dff0: 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65  ) Name of trigge
e000: 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20  r that is doing 
e010: 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a  the access.  **.
e020: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63    ** The callbac
e030: 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  k should return 
e040: 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  on of the follow
e050: 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c  ing strings: SQL
e060: 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c  ITE_OK,.  ** SQL
e070: 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53  ITE_IGNORE, or S
e080: 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79  QLITE_DENY.  Any
e090: 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
e0a0: 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  lue is an error.
e0b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
e0c0: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76  is method is inv
e0d0: 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67  oked with no arg
e0e0: 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72  uments, the curr
e0f0: 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ent authorizatio
e100: 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20  n.  ** callback 
e110: 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
e120: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
e130: 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b  DB_AUTHORIZER: {
e140: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
e150: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
e160: 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  N.    Tcl_Append
e170: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e180: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f  authorization no
e190: 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
e1a0: 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a  his build", 0);.
e1b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e1c0: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
e1d0: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
e1e0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
e1f0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
e200: 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
e210: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
e220: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e230: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
e240: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
e250: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
e260: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
e270: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
e280: 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20  Db->zAuth, 0);. 
e290: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
e2a0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41  {.      char *zA
e2b0: 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  uth;.      int l
e2c0: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
e2d0: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
e2e0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
e2f0: 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20  ->zAuth);.      
e300: 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20  }.      zAuth = 
e310: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
e320: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
e330: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
e340: 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Auth && len>0 ){
e350: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41  .        pDb->zA
e360: 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  uth = Tcl_Alloc(
e370: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
e380: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
e390: 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65  zAuth, zAuth, le
e3a0: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
e3b0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
e3c0: 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  zAuth = 0;.     
e3d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
e3e0: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
e3f0: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
e400: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
e410: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
e420: 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c  horizer(pDb->db,
e430: 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20   auth_callback, 
e440: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
e450: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
e460: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
e470: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
e480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e490: 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
e4a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
e4b0: 64 62 20 62 61 63 6b 75 70 20 3f 44 41 54 41 42  db backup ?DATAB
e4c0: 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20  ASE? FILENAME.  
e4d0: 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 6f 72 20  **.  ** Open or 
e4e0: 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
e4f0: 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c  e file named FIL
e500: 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72  ENAME.  Transfer
e510: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e   the.  ** conten
e520: 74 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 62  t of local datab
e530: 61 73 65 20 44 41 54 41 42 41 53 45 20 28 64 65  ase DATABASE (de
e540: 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 20 69  fault: "main") i
e550: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 49 4c  nto the.  ** FIL
e560: 45 4e 41 4d 45 20 64 61 74 61 62 61 73 65 2e 0a  ENAME database..
e570: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42    */.  case DB_B
e580: 41 43 4b 55 50 3a 20 7b 0a 20 20 20 20 63 6f 6e  ACKUP: {.    con
e590: 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69  st char *zDestFi
e5a0: 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
e5b0: 61 72 20 2a 7a 53 72 63 44 62 3b 0a 20 20 20 20  ar *zSrcDb;.    
e5c0: 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a  sqlite3 *pDest;.
e5d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
e5e0: 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 0a 20 20  up *pBackup;..  
e5f0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
e600: 0a 20 20 20 20 20 20 7a 53 72 63 44 62 20 3d 20  .      zSrcDb = 
e610: 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 44  "main";.      zD
e620: 65 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65  estFile = Tcl_Ge
e630: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
e640: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
e650: 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
e660: 20 7a 53 72 63 44 62 20 3d 20 54 63 6c 5f 47 65   zSrcDb = Tcl_Ge
e670: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
e680: 3b 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c  ;.      zDestFil
e690: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
e6a0: 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20  g(objv[3]);.    
e6b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
e6c0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
e6d0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
e6e0: 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e  ?DATABASE? FILEN
e6f0: 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  AME");.      ret
e700: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e710: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
e720: 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74  lite3_open(zDest
e730: 46 69 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a 20  File, &pDest);. 
e740: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e750: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  E_OK ){.      Tc
e760: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e770: 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f  nterp, "cannot o
e780: 70 65 6e 20 74 61 72 67 65 74 20 64 61 74 61 62  pen target datab
e790: 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  ase: ",.        
e7a0: 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
e7b0: 67 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a  g(pDest), (char*
e7c0: 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
e7d0: 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b  e3_close(pDest);
e7e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
e7f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
e800: 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c     pBackup = sql
e810: 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
e820: 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20  (pDest, "main", 
e830: 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29  pDb->db, zSrcDb)
e840: 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75  ;.    if( pBacku
e850: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  p==0 ){.      Tc
e860: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e870: 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70 20 66  nterp, "backup f
e880: 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20  ailed: ",.      
e890: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
e8a0: 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68 61  msg(pDest), (cha
e8b0: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
e8c0: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
e8d0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e8e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e8f0: 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63  .    while(  (rc
e900: 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
e910: 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
e920: 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  00))==SQLITE_OK 
e930: 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ){}.    sqlite3_
e940: 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42  backup_finish(pB
e950: 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20  ackup);.    if( 
e960: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
e970: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  ){.      rc = TC
e980: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  L_OK;.    }else{
e990: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
e9a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e9b0: 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20  "backup failed: 
e9c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
e9d0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
e9e0: 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  st), (char*)0);.
e9f0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
ea00: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
ea10: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
ea20: 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  est);.    break;
ea30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
ea40: 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b  b busy ?CALLBACK
ea50: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
ea60: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
ea70: 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20  lback if an SQL 
ea80: 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70  statement attemp
ea90: 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ts to open.  ** 
eaa0: 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73  a locked databas
eab0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63  e file..  */.  c
eac0: 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20  ase DB_BUSY: {. 
ead0: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
eae0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
eaf0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
eb00: 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41  2, objv, "CALLBA
eb10: 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  CK");.      retu
eb20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
eb30: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
eb40: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
eb50: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
eb60: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
eb70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
eb80: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a  pDb->zBusy, 0);.
eb90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
eba0: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
ebb0: 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  Busy;.      int 
ebc0: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
ebd0: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
ebe0: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
ebf0: 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20  b->zBusy);.     
ec00: 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d   }.      zBusy =
ec10: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
ec20: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
ec30: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
ec40: 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29  zBusy && len>0 )
ec50: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
ec60: 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Busy = Tcl_Alloc
ec70: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
ec80: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
ec90: 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c  >zBusy, zBusy, l
eca0: 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
ecb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
ecc0: 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20  >zBusy = 0;.    
ecd0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
ece0: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
ecf0: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
ed00: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
ed10: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
ed20: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
ed30: 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  DbBusyHandler, p
ed40: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
ed50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ed60: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
ed70: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
ed80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ed90: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
eda0: 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20  *     $db cache 
edb0: 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20 24  flush.  **     $
edc0: 64 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e 0a  db cache size n.
edd0: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20    **.  ** Flush 
ede0: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
edf0: 74 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f 72  tement cache, or
ee00: 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
ee10: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
ee20: 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74  cached statement
ee30: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
ee40: 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 63  B_CACHE: {.    c
ee50: 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20  har *subCmd;.   
ee60: 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28   int n;..    if(
ee70: 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20   objc<=2 ){.    
ee80: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
ee90: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
eea0: 6a 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69 6f  jv, "cache optio
eeb0: 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20 20  n ?arg?");.     
eec0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
eed0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62  R;.    }.    sub
eee0: 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Cmd = Tcl_GetStr
eef0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76  ingFromObj( objv
ef00: 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69 66  [2], 0 );.    if
ef10: 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20 26  ( *subCmd=='f' &
ef20: 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c  & strcmp(subCmd,
ef30: 22 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20  "flush")==0 ){. 
ef40: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
ef50: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
ef60: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ef70: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66  erp, 2, objv, "f
ef80: 6c 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20 20  lush");.        
ef90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
efa0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
efb0: 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
efc0: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
efd0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
efe0: 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27  if( *subCmd=='s'
eff0: 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d   && strcmp(subCm
f000: 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  d,"size")==0 ){.
f010: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
f020: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  4 ){.        Tcl
f030: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
f040: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
f050: 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20 20  size n");.      
f060: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f070: 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
f080: 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c  .        if( TCL
f090: 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49  _ERROR==Tcl_GetI
f0a0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
f0b0: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
f0c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
f0d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e  AppendResult( in
f0e0: 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f  terp, "cannot co
f0f0: 6e 76 65 72 74 20 5c 22 22 2c 20 0a 20 20 20 20  nvert \"", .    
f100: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
f110: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f120: 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20  objv[3],0), "\" 
f130: 74 6f 20 69 6e 74 65 67 65 72 22 2c 20 30 29 3b  to integer", 0);
f140: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
f150: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
f160: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f170: 20 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b        if( n<0 ){
f180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 75  .            flu
f190: 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62  shStmtCache( pDb
f1a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
f1b0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
f1c0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58   }else if( n>MAX
f1d0: 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20  _PREPARED_STMTS 
f1e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
f1f0: 20 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f   = MAX_PREPARED_
f200: 53 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20 20  STMTS;.         
f210: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62   }.          pDb
f220: 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20  ->maxStmt = n;. 
f230: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f240: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f250: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
f260: 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61 64  lt( interp, "bad
f270: 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20   option \"", .  
f280: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
f290: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
f2a0: 76 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75  v[2],0), "\": mu
f2b0: 73 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20 73  st be flush or s
f2c0: 69 7a 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ize", 0);.      
f2d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f2e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
f2f0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
f300: 20 24 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a   $db changes.  *
f310: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
f320: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
f330: 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66   that were modif
f340: 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f  ied, inserted, o
f350: 72 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a  r deleted by.  *
f360: 2a 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  * the most recen
f370: 74 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  t INSERT, UPDATE
f380: 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
f390: 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64  ment, not includ
f3a0: 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68  ing .  ** any ch
f3b0: 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 72  anges made by tr
f3c0: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a  igger programs..
f3d0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
f3e0: 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63  HANGES: {.    Tc
f3f0: 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
f400: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
f410: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
f420: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f430: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 2, objv, "");.
f440: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f450: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
f460: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
f470: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
f480: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
f490: 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  tIntObj(pResult,
f4a0: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
f4b0: 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20  (pDb->db));.    
f4c0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
f4d0: 20 20 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20      $db close.  
f4e0: 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e  **.  ** Shutdown
f4f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
f500: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f  */.  case DB_CLO
f510: 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65  SE: {.    Tcl_De
f520: 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  leteCommand(inte
f530: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
f540: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
f550: 2c 20 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  , 0));.    break
f560: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
f570: 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 65       $db collate
f580: 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a   NAME SCRIPT.  *
f590: 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20  *.  ** Create a 
f5a0: 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f  new SQL collatio
f5b0: 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  n function calle
f5c0: 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65  d NAME.  Wheneve
f5d0: 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63  r.  ** that func
f5e0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
f5f0: 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f  invoke SCRIPT to
f600: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75   evaluate the fu
f610: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
f620: 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20  ase DB_COLLATE: 
f630: 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65  {.    SqlCollate
f640: 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20   *pCollate;.    
f650: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
f660: 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a   char *zScript;.
f670: 20 20 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b      int nScript;
f680: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  .    if( objc!=4
f690: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
f6a0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
f6b0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d  p, 2, objv, "NAM
f6c0: 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20  E SCRIPT");.    
f6d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f6e0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  OR;.    }.    zN
f6f0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
f700: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f710: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63 72  2], 0);.    zScr
f720: 69 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ipt = Tcl_GetStr
f730: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f740: 33 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20  3], &nScript);. 
f750: 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53     pCollate = (S
f760: 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41  qlCollate*)Tcl_A
f770: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
f780: 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72 69 70  ollate) + nScrip
f790: 74 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28  t + 1 );.    if(
f7a0: 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72   pCollate==0 ) r
f7b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f7c0: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69  .    pCollate->i
f7d0: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
f7e0: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e      pCollate->pN
f7f0: 65 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c  ext = pDb->pColl
f800: 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  ate;.    pCollat
f810: 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68  e->zScript = (ch
f820: 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d  ar*)&pCollate[1]
f830: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  ;.    pDb->pColl
f840: 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a  ate = pCollate;.
f850: 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c      memcpy(pColl
f860: 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53  ate->zScript, zS
f870: 63 72 69 70 74 2c 20 6e 53 63 72 69 70 74 2b 31  cript, nScript+1
f880: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
f890: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
f8a0: 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
f8b0: 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  me, SQLITE_UTF8,
f8c0: 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 61   .        pColla
f8d0: 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74  te, tclSqlCollat
f8e0: 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  e) ){.      Tcl_
f8f0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
f900: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
f910: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
f920: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
f930: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
f940: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
f950: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
f960: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
f970: 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  b collation_need
f980: 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ed SCRIPT.  **. 
f990: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
f9a0: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
f9b0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
f9c0: 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20  AME.  Whenever. 
f9d0: 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f   ** that functio
f9e0: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76  n is called, inv
f9f0: 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
fa00: 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
fa10: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
fa20: 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45   DB_COLLATION_NE
fa30: 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28 20  EDED: {.    if( 
fa40: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
fa50: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
fa60: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
fa70: 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20  v, "SCRIPT");.  
fa80: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fa90: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
faa0: 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  if( pDb->pCollat
fab0: 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 20  eNeeded ){.     
fac0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
fad0: 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  t(pDb->pCollateN
fae0: 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  eeded);.    }.  
faf0: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e    pDb->pCollateN
fb00: 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c  eeded = Tcl_Dupl
fb10: 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d  icateObj(objv[2]
fb20: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  );.    Tcl_IncrR
fb30: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f  efCount(pDb->pCo
fb40: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
fb50: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74    sqlite3_collat
fb60: 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e  ion_needed(pDb->
fb70: 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c  db, pDb, tclColl
fb80: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
fb90: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
fba0: 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68      $db commit_h
fbb0: 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ook ?CALLBACK?. 
fbc0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
fbd0: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
fbe0: 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ck just before c
fbf0: 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79 20  ommitting every 
fc00: 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  SQL transaction.
fc10: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  .  ** If the cal
fc20: 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e 20  lback throws an 
fc30: 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65 74  exception or ret
fc40: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
fc50: 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72 61  hen the.  ** tra
fc60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f 72  nsaction is abor
fc70: 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41 43  ted.  If CALLBAC
fc80: 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74  K is an empty st
fc90: 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62 61  ring, the callba
fca0: 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  ck.  ** is disab
fcb0: 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  led..  */.  case
fcc0: 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a   DB_COMMIT_HOOK:
fcd0: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
fce0: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
fcf0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
fd00: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
fd10: 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
fd20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
fd30: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
fd40: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
fd50: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
fd60: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54  mit ){.        T
fd70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
fd80: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f  interp, pDb->zCo
fd90: 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  mmit, 0);.      
fda0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
fdb0: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74     char *zCommit
fdc0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
fdd0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
fde0: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
fdf0: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
fe00: 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20  >zCommit);.     
fe10: 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74   }.      zCommit
fe20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
fe30: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
fe40: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
fe50: 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e  ( zCommit && len
fe60: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
fe70: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c  b->zCommit = Tcl
fe80: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
fe90: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
fea0: 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20  y(pDb->zCommit, 
feb0: 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b  zCommit, len+1);
fec0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fed0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d        pDb->zComm
fee0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  it = 0;.      }.
fef0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
ff00: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
ff10: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
ff20: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
ff30: 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
ff40: 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62 43  ook(pDb->db, DbC
ff50: 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70 44  ommitHandler, pD
ff60: 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
ff70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ff80: 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62  _commit_hook(pDb
ff90: 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
ffa0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
ffb0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
ffc0: 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65 20     $db complete 
ffd0: 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  SQL.  **.  ** Re
ffe0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51 4c  turn TRUE if SQL
fff0: 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53   is a complete S
10000 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52  QL statement.  R
10010 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 20  eturn FALSE if. 
10020 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c   ** additional l
10030 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61 72  ines of input ar
10040 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20  e needed.  This 
10050 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  is similar to th
10060 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20  e.  ** built-in 
10070 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20  "info complete" 
10080 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a  command of Tcl..
10090 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
100a0 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64  OMPLETE: {.#ifnd
100b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
100c0 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f  OMPLETE.    Tcl_
100d0 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
100e0 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65    int isComplete
100f0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
10100 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
10110 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10120 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
10130 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L");.      retur
10140 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10150 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65 74   }.    isComplet
10160 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70  e = sqlite3_comp
10170 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74 72  lete( Tcl_GetStr
10180 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
10190 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 52  2], 0) );.    pR
101a0 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
101b0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
101c0 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f  ;.    Tcl_SetBoo
101d0 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c  leanObj(pResult,
101e0 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65   isComplete);.#e
101f0 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
10200 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
10210 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61   copy conflict-a
10220 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20 66  lgorithm table f
10230 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41 54  ilename ?SEPARAT
10240 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54  OR? ?NULLINDICAT
10250 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  OR?.  **.  ** Co
10260 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61 62  py data into tab
10270 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65  le from filename
10280 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69  , optionally usi
10290 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20 2a  ng SEPARATOR.  *
102a0 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61  * as column sepa
102b0 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63 6f  rators.  If a co
102c0 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20  lumn contains a 
102d0 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20  null string, or 
102e0 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f  the.  ** value o
102f0 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c  f NULLINDICATOR,
10300 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72   a NULL is inser
10310 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ted for the colu
10320 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63  mn..  ** conflic
10330 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f  t-algorithm is o
10340 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ne of the sqlite
10350 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69   conflict algori
10360 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f  thms:.  **    ro
10370 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66  llback, abort, f
10380 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70  ail, ignore, rep
10390 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63  lace.  ** On suc
103a0 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65  cess, return the
103b0 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73   number of lines
103c0 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20   processed, not 
103d0 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d 65  necessarily same
103e0 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68 61  .  ** as 'db cha
103f0 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f 6e  nges' due to con
10400 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20  flict-algorithm 
10410 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20  selected..  **. 
10420 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73   ** This code is
10430 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d   basically an im
10440 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68  plementation/enh
10450 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a  ancement of.  **
10460 20 74 68 65 20 73 71 6c 69 74 65 33 20 73 68 65   the sqlite3 she
10470 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20 63  ll.c ".import" c
10480 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a  ommand..  **.  *
10490 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75  * This command u
104a0 73 61 67 65 20 69 73 20 65 71 75 69 76 61 6c 65  sage is equivale
104b0 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  nt to the sqlite
104c0 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d 65  2.x COPY stateme
104d0 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20 69  nt,.  ** which i
104e0 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74 61  mports file data
104f0 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75 73   into a table us
10500 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65 53  ing the PostgreS
10510 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f 72  QL COPY file for
10520 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20  mat:.  **   $db 
10530 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c  copy $conflit_al
10540 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24  go $table_name $
10550 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a  filename \t \\N.
10560 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
10570 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  OPY: {.    char 
10580 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *zTable;        
10590 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
105a0 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20   data into this 
105b0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61  table */.    cha
105c0 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20  r *zFile;       
105d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
105e0 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  file from which 
105f0 74 6f 20 65 78 74 72 61 63 74 20 64 61 74 61 20  to extract data 
10600 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  */.    char *zCo
10610 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20  nflict;         
10620 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69     /* The confli
10630 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20  ct algorithm to 
10640 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  use */.    sqlit
10650 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
10660 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61 74         /* A stat
10670 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
10680 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
10690 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
106a0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
106b0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
106c0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
106e0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
106f0 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e   in an SQL strin
10700 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20  g */.    int i, 
10710 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
10720 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
10730 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74  nters */.    int
10740 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20   nSep;          
10750 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10760 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
10770 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74  Sep[] */.    int
10780 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20   nNull;         
10790 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
107a0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
107b0 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68  Null[] */.    ch
107c0 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
107d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
107e0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
107f0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65  .    char *zLine
10800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10810 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e   /* A single lin
10820 65 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d 20  e of input from 
10830 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
10840 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20  char **azCol;   
10850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
10860 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70  Line[] broken up
10870 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f   into columns */
10880 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  .    char *zComm
10890 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
108a0 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69   /* How to commi
108b0 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20  t changes */.   
108c0 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20   FILE *in;      
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
108e0 54 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  The input file *
108f0 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  /.    int lineno
10900 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10910 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
10920 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a   of input file *
10930 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65  /.    char zLine
10940 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20 20  Num[80];        
10950 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
10960 20 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a 2f   print buffer */
10970 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
10980 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
10990 20 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75 6c   /* interp resul
109a0 74 20 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a  t */..    char *
109b0 7a 53 65 70 3b 0a 20 20 20 20 63 68 61 72 20 2a  zSep;.    char *
109c0 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f  zNull;.    if( o
109d0 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20  bjc<5 || objc>7 
109e0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
109f0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10a00 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20  , 2, objv, .    
10a10 20 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41       "CONFLICT-A
10a20 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c 45 20 46  LGORITHM TABLE F
10a30 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52 41 54  ILENAME ?SEPARAT
10a40 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54  OR? ?NULLINDICAT
10a50 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  OR?");.      ret
10a60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10a70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
10a80 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20 20 7a 53  c>=6 ){.      zS
10a90 65 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ep = Tcl_GetStri
10aa0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35  ngFromObj(objv[5
10ab0 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ], 0);.    }else
10ac0 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22  {.      zSep = "
10ad0 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  \t";.    }.    i
10ae0 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20  f( objc>=7 ){.  
10af0 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f      zNull = Tcl_
10b00 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
10b10 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20  (objv[6], 0);.  
10b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
10b30 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d  Null = "";.    }
10b40 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d  .    zConflict =
10b50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10b60 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
10b70 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20  );.    zTable = 
10b80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10b90 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29  mObj(objv[3], 0)
10ba0 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 54 63  ;.    zFile = Tc
10bb0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10bc0 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a  bj(objv[4], 0);.
10bd0 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65      nSep = strle
10be0 6e 33 30 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e  n30(zSep);.    n
10bf0 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28  Null = strlen30(
10c00 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  zNull);.    if( 
10c10 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSep==0 ){.     
10c20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10c30 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a  t(interp,"Error:
10c40 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61   non-null separa
10c50 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72  tor required for
10c60 20 63 6f 70 79 22 2c 30 29 3b 0a 20 20 20 20 20   copy",0);.     
10c70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10c80 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
10c90 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  strcmp(zConflict
10ca0 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d  , "rollback") !=
10cb0 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72   0 &&.       str
10cc0 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
10cd0 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30 20  abort"   ) != 0 
10ce0 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70  &&.       strcmp
10cf0 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69  (zConflict, "fai
10d00 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26 26 0a  l"    ) != 0 &&.
10d10 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
10d20 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65  onflict, "ignore
10d30 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20  "  ) != 0 &&.   
10d40 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66      strcmp(zConf
10d50 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20  lict, "replace" 
10d60 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20  ) != 0 ) {.     
10d70 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10d80 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
10d90 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74  : \"", zConflict
10da0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
10db0 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67  \", conflict-alg
10dc0 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f  orithm must be o
10dd0 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c  ne of: rollback,
10de0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
10df0 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e  abort, fail, ign
10e00 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22  ore, or replace"
10e10 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
10e20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10e30 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73    }.    zSql = s
10e40 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
10e50 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25  SELECT * FROM '%
10e60 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  q'", zTable);.  
10e70 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
10e80 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
10e90 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10ea0 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20  "Error: no such 
10eb0 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65  table: ", zTable
10ec0 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
10ed0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10ee0 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
10ef0 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
10f00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10f10 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
10f20 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
10f30 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
10f40 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
10f50 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
10f60 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10f70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
10f80 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
10f90 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
10fa0 20 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20   0);.      nCol 
10fb0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
10fc0 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c        nCol = sql
10fd0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
10fe0 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  t(pStmt);.    }.
10ff0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
11000 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
11010 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b   if( nCol==0 ) {
11020 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
11030 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
11040 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63     zSql = malloc
11050 28 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e  ( nByte + 50 + n
11060 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  Col*2 );.    if(
11070 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20   zSql==0 ) {.   
11080 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11090 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
110a0 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63  or: can't malloc
110b0 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ()", 0);.      r
110c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
110d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
110e0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74  e3_snprintf(nByt
110f0 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53  e+50, zSql, "INS
11100 45 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27  ERT OR %q INTO '
11110 25 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20  %q' VALUES(?",. 
11120 20 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63          zConflic
11130 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  t, zTable);.    
11140 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71  j = strlen30(zSq
11150 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  l);.    for(i=1;
11160 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
11170 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
11180 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c   ',';.      zSql
11190 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20  [j++] = '?';.   
111a0 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d   }.    zSql[j++]
111b0 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c   = ')';.    zSql
111c0 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  [j] = 0;.    rc 
111d0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
111e0 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  e(pDb->db, zSql,
111f0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
11200 0a 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b  .    free(zSql);
11210 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
11220 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
11230 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
11240 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33  rror: ", sqlite3
11250 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
11260 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11270 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
11280 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
11290 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
112a0 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65   }.    in = fope
112b0 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a  n(zFile, "rb");.
112c0 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b      if( in==0 ){
112d0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
112e0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
112f0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
11300 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69  pen file: ", zFi
11310 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  le, NULL);.     
11320 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
11330 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
11340 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f  ;.    }.    azCo
11360 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  l = malloc( size
11370 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43  of(azCol[0])*(nC
11380 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28  ol+1) );.    if(
11390 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20   azCol==0 ) {.  
113a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
113b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
113c0 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f  ror: can't mallo
113d0 63 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  c()", 0);.      
113e0 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
113f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11400 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76  OR;.    }.    (v
11410 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63  oid)sqlite3_exec
11420 28 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e  (pDb->db, "BEGIN
11430 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
11440 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d   zCommit = "COMM
11450 49 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  IT";.    while( 
11460 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67  (zLine = local_g
11470 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d  etline(0, in))!=
11480 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
11490 2a 7a 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f  *z;.      lineno
114a0 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b  ++;.      azCol[
114b0 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20  0] = zLine;.    
114c0 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69    for(i=0, z=zLi
114d0 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  ne; *z; z++){.  
114e0 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53        if( *z==zS
114f0 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70  ep[0] && strncmp
11500 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d  (z, zSep, nSep)=
11510 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11520 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
11530 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
11540 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20   if( i<nCol ){. 
11550 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c             azCol
11560 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a  [i] = &z[nSep];.
11570 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d              z +=
11580 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20   nSep-1;.       
11590 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
115a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
115b0 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20   i+1!=nCol ){.  
115c0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72        char *zErr
115d0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45  ;.        int nE
115e0 72 72 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 46  rr = strlen30(zF
115f0 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20 20  ile) + 200;.    
11600 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f      zErr = mallo
11610 63 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 20  c(nErr);.       
11620 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
11630 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
11640 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45  nprintf(nErr, zE
11650 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
11660 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65   "Error: %s line
11670 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64   %d: expected %d
11680 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
11690 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a   but found %d",.
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69               zFi
116b0 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c  le, lineno, nCol
116c0 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
116d0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
116e0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c  lt(interp, zErr,
116f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66   0);.          f
11700 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20  ree(zErr);.     
11710 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f     }.        zCo
11720 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  mmit = "ROLLBACK
11730 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
11740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11750 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
11760 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f   i++){.        /
11770 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c  * check for null
11780 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69   data, if so, bi
11790 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  nd as null */.  
117a0 20 20 20 20 20 20 69 66 28 20 28 6e 4e 75 6c 6c        if( (nNull
117b0 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43  >0 && strcmp(azC
117c0 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30  ol[i], zNull)==0
117d0 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  ).          || s
117e0 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d  trlen30(azCol[i]
117f0 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 29 7b  )==0 .        ){
11800 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11810 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
11820 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  mt, i+1);.      
11830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11840 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
11850 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c  text(pStmt, i+1,
11860 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53   azCol[i], -1, S
11870 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
11880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
118a0 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
118b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
118c0 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
118d0 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a     free(zLine);.
118e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
118f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11900 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11910 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
11920 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
11930 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
11940 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d  );.        zComm
11950 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b  it = "ROLLBACK";
11960 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
11970 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11980 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20    free(azCol);. 
11990 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
119a0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
119b0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
119c0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
119d0 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d  ec(pDb->db, zCom
119e0 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a  mit, 0, 0, 0);..
119f0 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b      if( zCommit[
11a00 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20  0] == 'C' ){.   
11a10 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20 73     /* success, s
11a20 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75 6d  et result as num
11a30 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f  ber of lines pro
11a40 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  cessed */.      
11a50 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
11a60 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11a70 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  p);.      Tcl_Se
11a80 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  tIntObj(pResult,
11a90 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20   lineno);.      
11aa0 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
11ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
11ac0 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e 64   failure, append
11ad0 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66 61   lineno where fa
11ae0 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
11af0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
11b00 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c  izeof(zLineNum),
11b10 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c   zLineNum,"%d",l
11b20 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63  ineno);.      Tc
11b30 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11b40 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20  nterp,", failed 
11b50 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
11b60 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75   line: ",zLineNu
11b70 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  m,0);.      rc =
11b80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11b90 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
11ba0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
11bb0 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  db enable_load_e
11bc0 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e  xtension BOOLEAN
11bd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20  .  **.  ** Turn 
11be0 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f  the extension lo
11bf0 61 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f 6e  ading feature on
11c00 20 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66 20   or off.  It if 
11c10 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66 61  off by.  ** defa
11c20 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ult..  */.  case
11c30 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f   DB_ENABLE_LOAD_
11c40 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66  EXTENSION: {.#if
11c50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11c60 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
11c70 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20      int onoff;. 
11c80 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
11c90 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
11ca0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
11cb0 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45   2, objv, "BOOLE
11cc0 41 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AN");.      retu
11cd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11ce0 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f    }.    if( Tcl_
11cf0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
11d00 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
11d10 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20  ], &onoff) ){.  
11d20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11d30 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
11d40 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
11d50 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44  oad_extension(pD
11d60 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20  b->db, onoff);. 
11d70 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a     break;.#else.
11d80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11d90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 78  sult(interp, "ex
11da0 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20  tension loading 
11db0 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 74  is turned off at
11dc0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a   compile-time",.
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11de0 20 20 20 20 20 30 29 3b 0a 20 20 20 20 72 65 74       0);.    ret
11df0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
11e00 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  endif.  }..  /*.
11e10 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f    **    $db erro
11e20 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rcode.  **.  ** 
11e30 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72  Return the numer
11e40 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  ic error code th
11e50 61 74 20 77 61 73 20 72 65 74 75 72 6e 65 64 20  at was returned 
11e60 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  by the most rece
11e70 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20  nt.  ** call to 
11e80 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
11e90 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
11ea0 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20  RRORCODE: {.    
11eb0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
11ec0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
11ed0 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  IntObj(sqlite3_e
11ee0 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29  rrcode(pDb->db))
11ef0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
11f00 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
11f10 24 64 62 20 65 78 69 73 74 73 20 24 73 71 6c 0a  $db exists $sql.
11f20 20 20 2a 2a 20 20 20 20 24 64 62 20 6f 6e 65 63    **    $db onec
11f30 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a  olumn $sql.  **.
11f40 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75    ** The onecolu
11f50 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65  mn method is the
11f60 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a   equivalent of:.
11f70 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78 20    **     lindex 
11f80 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 20  [$db eval $sql] 
11f90 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  0.  */.  case DB
11fa0 5f 45 58 49 53 54 53 3a 20 0a 20 20 63 61 73 65  _EXISTS: .  case
11fb0 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 20 7b   DB_ONECOLUMN: {
11fc0 0a 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65  .    DbEvalConte
11fd0 78 74 20 73 45 76 61 6c 3b 0a 20 20 20 20 69 66  xt sEval;.    if
11fe0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
11ff0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
12000 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
12010 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
12020 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12030 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
12040 64 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61  dbEvalInit(&sEva
12050 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c  l, pDb, objv[2],
12060 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62   0);.    rc = db
12070 45 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29  EvalStep(&sEval)
12080 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ;.    if( choice
12090 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29  ==DB_ONECOLUMN )
120a0 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
120b0 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
120c0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
120d0 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 45 76 61  lt(interp, dbEva
120e0 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45  lColumnValue(&sE
120f0 76 61 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  val, 0));.      
12100 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
12110 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20  L_BREAK ){.     
12120 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
12130 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
12140 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
12150 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
12160 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  || rc==TCL_OK ){
12170 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
12180 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
12190 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
121a0 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29 29 3b 0a  j(rc==TCL_OK));.
121b0 20 20 20 20 7d 0a 20 20 20 20 64 62 45 76 61 6c      }.    dbEval
121c0 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c 29  Finalize(&sEval)
121d0 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54  ;..    if( rc==T
121e0 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20  CL_BREAK ){.    
121f0 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
12200 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
12210 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a    }.   .  /*.  *
12220 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20 24 73  *    $db eval $s
12230 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e  ql ?array? ?{  .
12240 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a  ..code... }?.  *
12250 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 20 73  *.  ** The SQL s
12260 74 61 74 65 6d 65 6e 74 20 69 6e 20 24 73 71 6c  tatement in $sql
12270 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20   is evaluated.  
12280 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 74 68  For each row, th
12290 65 20 76 61 6c 75 65 73 20 61 72 65 0a 20 20 2a  e values are.  *
122a0 2a 20 70 6c 61 63 65 64 20 69 6e 20 65 6c 65 6d  * placed in elem
122b0 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72 72 61  ents of the arra
122c0 79 20 6e 61 6d 65 64 20 22 61 72 72 61 79 22 20  y named "array" 
122d0 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69  and ...code... i
122e0 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a  s executed..  **
122f0 20 49 66 20 22 61 72 72 61 79 22 20 61 6e 64 20   If "array" and 
12300 22 63 6f 64 65 22 20 61 72 65 20 6f 6d 69 74 74  "code" are omitt
12310 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c  ed, then no call
12320 62 61 63 6b 20 69 73 20 65 76 65 72 79 20 69 6e  back is every in
12330 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22  voked..  ** If "
12340 61 72 72 61 79 22 20 69 73 20 61 6e 20 65 6d 70  array" is an emp
12350 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20  ty string, then 
12360 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 70  the values are p
12370 6c 61 63 65 64 20 69 6e 20 76 61 72 69 61 62 6c  laced in variabl
12380 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 76  es.  ** that hav
12390 65 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  e the same name 
123a0 61 73 20 74 68 65 20 66 69 65 6c 64 73 20 65 78  as the fields ex
123b0 74 72 61 63 74 65 64 20 62 79 20 74 68 65 20 71  tracted by the q
123c0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  uery..  */.  cas
123d0 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a 20 20 20  e DB_EVAL: {.   
123e0 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f   if( objc<3 || o
123f0 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20 20 20 54  bjc>5 ){.      T
12400 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
12410 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
12420 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d   "SQL ?ARRAY-NAM
12430 45 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20  E? ?SCRIPT?");. 
12440 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
12450 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
12460 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
12470 0a 20 20 20 20 20 20 44 62 45 76 61 6c 43 6f 6e  .      DbEvalCon
12480 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20 20 20  text sEval;.    
12490 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20    Tcl_Obj *pRet 
124a0 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
124b0 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
124c0 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
124d0 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 26      dbEvalInit(&
124e0 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76  sEval, pDb, objv
124f0 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 77  [2], 0);.      w
12500 68 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d 3d 28 72  hile( TCL_OK==(r
12510 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 26  c = dbEvalStep(&
12520 73 45 76 61 6c 29 29 20 29 7b 0a 20 20 20 20 20  sEval)) ){.     
12530 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
12540 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
12550 20 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66      dbEvalRowInf
12560 6f 28 26 73 45 76 61 6c 2c 20 26 6e 43 6f 6c 2c  o(&sEval, &nCol,
12570 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   0);.        for
12580 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
12590 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  +){.          Tc
125a0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
125b0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
125c0 52 65 74 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d  Ret, dbEvalColum
125d0 6e 56 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 69  nValue(&sEval, i
125e0 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
125f0 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 45 76      }.      dbEv
12600 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61  alFinalize(&sEva
12610 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
12620 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
12630 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
12640 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
12650 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72  pRet);.        r
12660 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
12670 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44 65    }.      Tcl_De
12680 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
12690 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
126a0 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64     ClientData cd
126b0 5b 32 5d 3b 0a 20 20 20 20 20 20 44 62 45 76 61  [2];.      DbEva
126c0 6c 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 20  lContext *p;.   
126d0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72     Tcl_Obj *pArr
126e0 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 63  ay = 0;.      Tc
126f0 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
12700 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  .      if( objc=
12710 3d 35 20 26 26 20 2a 28 63 68 61 72 20 2a 29 54  =5 && *(char *)T
12720 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
12730 76 5b 33 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  v[3]) ){.       
12740 20 70 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33   pArray = objv[3
12750 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
12760 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
12770 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20 20 20 54  objc-1];.      T
12780 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
12790 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 20 20  pScript);.      
127a0 0a 20 20 20 20 20 20 70 20 3d 20 28 44 62 45 76  .      p = (DbEv
127b0 61 6c 43 6f 6e 74 65 78 74 20 2a 29 54 63 6c 5f  alContext *)Tcl_
127c0 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 44 62 45  Alloc(sizeof(DbE
127d0 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20  valContext));.  
127e0 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 70      dbEvalInit(p
127f0 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20  , pDb, objv[2], 
12800 70 41 72 72 61 79 29 3b 0a 0a 20 20 20 20 20 20  pArray);..      
12810 63 64 5b 30 5d 20 3d 20 28 76 6f 69 64 20 2a 29  cd[0] = (void *)
12820 70 3b 0a 20 20 20 20 20 20 63 64 5b 31 5d 20 3d  p;.      cd[1] =
12830 20 28 76 6f 69 64 20 2a 29 70 53 63 72 69 70 74   (void *)pScript
12840 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 44 62 45  ;.      rc = DbE
12850 76 61 6c 4e 65 78 74 43 6d 64 28 63 64 2c 20 69  valNextCmd(cd, i
12860 6e 74 65 72 70 2c 20 54 43 4c 5f 4f 4b 29 3b 0a  nterp, TCL_OK);.
12870 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
12880 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
12890 20 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f 6e      $db function
128a0 20 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74   NAME [-argcount
128b0 20 4e 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a   N] SCRIPT.  **.
128c0 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
128d0 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63  w SQL function c
128e0 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65  alled NAME.  Whe
128f0 6e 65 76 65 72 20 74 68 61 74 20 66 75 6e 63 74  never that funct
12900 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c  ion is.  ** call
12910 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50  ed, invoke SCRIP
12920 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  T to evaluate th
12930 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  e function..  */
12940 0a 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43 54  .  case DB_FUNCT
12950 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75  ION: {.    SqlFu
12960 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54  nc *pFunc;.    T
12970 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b  cl_Obj *pScript;
12980 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
12990 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d  ;.    int nArg =
129a0 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a   -1;.    if( obj
129b0 63 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 63 6f  c==6 ){.      co
129c0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 54 63  nst char *z = Tc
129d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
129e0 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  [3]);.      int 
129f0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b  n = strlen30(z);
12a00 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20 26  .      if( n>2 &
12a10 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61  & strncmp(z, "-a
12a20 72 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29  rgcount",n)==0 )
12a30 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 63  {.        if( Tc
12a40 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
12a50 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
12a60 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e   &nArg) ) return
12a70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12a80 20 20 20 20 69 66 28 20 6e 41 72 67 3c 30 20 29      if( nArg<0 )
12a90 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
12aa0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
12ab0 65 72 70 2c 20 22 6e 75 6d 62 65 72 20 6f 66 20  erp, "number of 
12ac0 61 72 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62  arguments must b
12ad0 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c  e non-negative",
12ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12af0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
12b00 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r*)0);.         
12b10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12b20 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
12b30 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69     }.      pScri
12b40 70 74 20 3d 20 6f 62 6a 76 5b 35 5d 3b 0a 20 20  pt = objv[5];.  
12b50 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
12b60 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
12b70 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
12b80 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
12b90 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74 20  NAME [-argcount 
12ba0 4e 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20  N] SCRIPT");.   
12bb0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12bc0 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROR;.    }else{.
12bd0 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
12be0 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a 20  objv[3];.    }. 
12bf0 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47     zName = Tcl_G
12c00 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
12c10 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
12c20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c   pFunc = findSql
12c30 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29  Func(pDb, zName)
12c40 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 3d  ;.    if( pFunc=
12c50 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
12c60 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70  ERROR;.    if( p
12c70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 29 7b  Func->pScript ){
12c80 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
12c90 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70  efCount(pFunc->p
12ca0 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20  Script);.    }. 
12cb0 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70     pFunc->pScrip
12cc0 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20 20 20  t = pScript;.   
12cd0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
12ce0 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  t(pScript);.    
12cf0 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62  pFunc->useEvalOb
12d00 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65 45 76  jv = safeToUseEv
12d10 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 70  alObjv(interp, p
12d20 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20  Script);.    rc 
12d30 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
12d40 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64  _function(pDb->d
12d50 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  b, zName, nArg, 
12d60 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
12d70 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53       pFunc, tclS
12d80 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
12d90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12da0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
12db0 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
12dc0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
12dd0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
12de0 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
12df0 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
12e00 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 0a  OLATILE);.    }.
12e10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
12e20 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
12e30 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d 72 65 61  b incrblob ?-rea
12e40 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c  donly? ?DB? TABL
12e50 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a 20  E COLUMN ROWID. 
12e60 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e   */.  case DB_IN
12e70 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66 64 65 66  CRBLOB: {.#ifdef
12e80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
12e90 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c 5f 41 70  RBLOB.    Tcl_Ap
12ea0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12eb0 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20 6e 6f 74  p, "incrblob not
12ec0 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
12ed0 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20  is build", 0);. 
12ee0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12ef0 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ROR;.#else.    i
12f00 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20  nt isReadonly = 
12f10 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
12f20 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b  r *zDb = "main";
12f30 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
12f40 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  *zTable;.    con
12f50 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
12f60 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e  ;.    Tcl_WideIn
12f70 74 20 69 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20  t iRow;..    /* 
12f80 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 2d 72  Check for the -r
12f90 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20 2a  eadonly option *
12fa0 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  /.    if( objc>3
12fb0 20 26 26 20 73 74 72 63 6d 70 28 54 63 6c 5f 47   && strcmp(Tcl_G
12fc0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
12fd0 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d  ), "-readonly")=
12fe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73 52 65  =0 ){.      isRe
12ff0 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adonly = 1;.    
13000 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  }..    if( objc!
13010 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20  =(5+isReadonly) 
13020 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69 73 52 65  && objc!=(6+isRe
13030 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adonly) ){.     
13040 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
13050 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
13060 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20  v, "?-readonly? 
13070 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d  ?DB? TABLE COLUM
13080 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 20  N ROWID");.     
13090 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
130a0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
130b0 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73 52 65 61  ( objc==(6+isRea
130c0 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  donly) ){.      
130d0 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
130e0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
130f0 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d    }.    zTable =
13100 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
13110 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20 20  bjv[objc-3]);.  
13120 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f    zColumn = Tcl_
13130 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f  GetString(objv[o
13140 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20 72 63 20  bjc-2]);.    rc 
13150 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  = Tcl_GetWideInt
13160 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
13170 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69  objv[objc-1], &i
13180 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  Row);..    if( r
13190 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c==TCL_OK ){.   
131a0 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 49 6e     rc = createIn
131b0 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20  crblobChannel(. 
131c0 20 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c           interp,
131d0 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c   pDb, zDb, zTabl
131e0 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77  e, zColumn, iRow
131f0 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20  , isReadonly.   
13200 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64     );.    }.#end
13210 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
13220 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
13230 20 24 64 62 20 69 6e 74 65 72 72 75 70 74 0a 20   $db interrupt. 
13240 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75   **.  ** Interru
13250 70 74 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  pt the execution
13260 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f   of the inner-mo
13270 73 74 20 53 51 4c 20 69 6e 74 65 72 70 72 65 74  st SQL interpret
13280 65 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 63  er.  This.  ** c
13290 61 75 73 65 73 20 74 68 65 20 53 51 4c 20 73 74  auses the SQL st
132a0 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72  atement to retur
132b0 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 53 51  n an error of SQ
132c0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a  LITE_INTERRUPT..
132d0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49    */.  case DB_I
132e0 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20 20 20 20  NTERRUPT: {.    
132f0 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
13300 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  t(pDb->db);.    
13310 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
13320 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75  .  **     $db nu
13330 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f  llvalue ?STRING?
13340 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67  .  **.  ** Chang
13350 65 20 74 65 78 74 20 75 73 65 64 20 77 68 65 6e  e text used when
13360 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61   a NULL comes ba
13370 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ck from the data
13380 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47  base. If ?STRING
13390 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72  ?.  ** is not pr
133a0 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  esent, then the 
133b0 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75  current string u
133c0 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20  sed for NULL is 
133d0 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49  returned..  ** I
133e0 66 20 53 54 52 49 4e 47 20 69 73 20 70 72 65 73  f STRING is pres
133f0 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47  ent, then STRING
13400 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
13410 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  **.  */.  case D
13420 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20  B_NULLVALUE: {. 
13430 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
13440 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
13450 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
13460 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
13470 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22  bjv, "NULLVALUE"
13480 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13490 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
134a0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
134b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   ){.      int le
134c0 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  n;.      char *z
134d0 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
134e0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
134f0 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
13500 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c    if( pDb->zNull
13510 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
13520 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  Free(pDb->zNull)
13530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13540 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e  if( zNull && len
13550 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
13560 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41  b->zNull = Tcl_A
13570 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
13580 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
13590 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c  pDb->zNull, zNul
135a0 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  l, len);.       
135b0 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d   pDb->zNull[len]
135c0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d   = '\0';.      }
135d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
135e0 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  b->zNull = 0;.  
135f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13600 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
13610 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
13620 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a  StringObj(pDb->z
13630 4e 75 6c 6c 2c 20 2d 31 29 29 3b 0a 20 20 20 20  Null, -1));.    
13640 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
13650 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61  .  **     $db la
13660 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20  st_insert_rowid 
13670 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
13680 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
13690 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  ch is the ROWID 
136a0 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
136b0 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f  ent insert..  */
136c0 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f  .  case DB_LAST_
136d0 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a  INSERT_ROWID: {.
136e0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
136f0 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69  sult;.    Tcl_Wi
13700 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20  deInt rowid;.   
13710 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
13720 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
13730 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
13740 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
13750 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13760 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
13770 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  owid = sqlite3_l
13780 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
13790 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70  (pDb->db);.    p
137a0 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
137b0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
137c0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69  );.    Tcl_SetWi
137d0 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  deIntObj(pResult
137e0 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72  , rowid);.    br
137f0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
13800 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f   ** The DB_ONECO
13810 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69  LUMN method is i
13820 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74  mplemented toget
13830 68 65 72 20 77 69 74 68 20 44 42 5f 45 58 49 53  her with DB_EXIS
13840 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20  TS..  */..  /*  
13850 20 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f    $db progress ?
13860 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a  N CALLBACK?.  **
13870 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68   .  ** Invoke th
13880 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
13890 20 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c   every N virtual
138a0 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73   machine opcodes
138b0 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67   while executing
138c0 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
138d0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
138e0 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66  OGRESS: {.    if
138f0 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
13900 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
13910 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
13920 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13930 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
13940 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20  Progress, 0);.  
13950 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
13960 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
13970 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67       char *zProg
13980 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  ress;.      int 
13990 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e  len;.      int N
139a0 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f  ;.      if( TCL_
139b0 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
139c0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
139d0 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20  jv[2], &N) ){.  
139e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
139f0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b  _ERROR;.      };
13a00 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
13a10 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
13a20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
13a30 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20  b->zProgress);. 
13a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72       }.      zPr
13a50 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74  ogress = Tcl_Get
13a60 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
13a70 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[3], &len);.  
13a80 20 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73      if( zProgres
13a90 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  s && len>0 ){.  
13aa0 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67        pDb->zProg
13ab0 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  ress = Tcl_Alloc
13ac0 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
13ad0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
13ae0 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f  >zProgress, zPro
13af0 67 72 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20  gress, len+1);. 
13b00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13b10 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65      pDb->zProgre
13b20 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ss = 0;.      }.
13b30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13b40 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
13b50 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20  LBACK.      if( 
13b60 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
13b70 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
13b80 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
13b90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13ba0 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
13bb0 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50  (pDb->db, N, DbP
13bc0 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20  rogressHandler, 
13bd0 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
13be0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
13bf0 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
13c00 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ler(pDb->db, 0, 
13c10 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
13c20 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
13c30 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
13c40 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
13c50 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c  2, objv, "N CALL
13c60 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
13c70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13c80 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
13c90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
13ca0 62 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42  b profile ?CALLB
13cb0 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ACK?.  **.  ** M
13cc0 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73  ake arrangements
13cd0 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43   to invoke the C
13ce0 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20  ALLBACK routine 
13cf0 61 66 74 65 72 20 65 61 63 68 20 53 51 4c 20 73  after each SQL s
13d00 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
13d10 61 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65  at has run.  The
13d20 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
13d30 20 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20   and the amount 
13d40 6f 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61  of elapse time a
13d50 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64  re.  ** appended
13d60 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
13d70 6f 72 65 20 74 68 65 20 73 63 72 69 70 74 20 69  ore the script i
13d80 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  s run..  */.  ca
13d90 73 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b  se DB_PROFILE: {
13da0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
13db0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
13dc0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13dd0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
13de0 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
13df0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13e00 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13e10 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
13e20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
13e30 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  le ){.        Tc
13e40 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13e50 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
13e60 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  file, 0);.      
13e70 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
13e80 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c     char *zProfil
13e90 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  e;.      int len
13ea0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
13eb0 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
13ec0 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
13ed0 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  b->zProfile);.  
13ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
13ef0 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  file = Tcl_GetSt
13f00 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
13f10 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
13f20 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26    if( zProfile &
13f30 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
13f40 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
13f50 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
13f60 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
13f70 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72   memcpy(pDb->zPr
13f80 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c  ofile, zProfile,
13f90 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
13fa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
13fb0 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b  b->zProfile = 0;
13fc0 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65  .      }.#if !de
13fd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13fe0 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66  T_TRACE) && !def
13ff0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14000 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
14010 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
14020 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
14030 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
14040 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
14050 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
14060 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f  e(pDb->db, DbPro
14070 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  fileHandler, pDb
14080 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
140a0 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c  profile(pDb->db,
140b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
140c0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
140d0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
140e0 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72  *.  **     $db r
140f0 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20  ekey KEY.  **.  
14100 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e  ** Change the en
14110 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20  cryption key on 
14120 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
14130 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  en database..  *
14140 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45  /.  case DB_REKE
14150 59 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  Y: {.#ifdef SQLI
14160 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
14170 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76   int nKey;.    v
14180 6f 69 64 20 2a 70 4b 65 79 3b 0a 23 65 6e 64 69  oid *pKey;.#endi
14190 66 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  f.    if( objc!=
141a0 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
141b0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
141c0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45  rp, 2, objv, "KE
141d0 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Y");.      retur
141e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
141f0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
14200 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 70  _HAS_CODEC.    p
14210 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
14220 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
14230 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20  jv[2], &nKey);. 
14240 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
14250 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70  rekey(pDb->db, p
14260 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
14270 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
14280 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
14290 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
142a0 5f 65 72 72 73 74 72 28 72 63 29 2c 20 30 29 3b  _errstr(rc), 0);
142b0 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
142c0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e  ERROR;.    }.#en
142d0 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
142e0 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
142f0 72 65 73 74 6f 72 65 20 3f 44 41 54 41 42 41 53  restore ?DATABAS
14300 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a  E? FILENAME.  **
14310 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  .  ** Open a dat
14320 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64  abase file named
14330 20 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e   FILENAME.  Tran
14340 73 66 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74  sfer the content
14350 20 0a 20 20 2a 2a 20 6f 66 20 46 49 4c 45 4e 41   .  ** of FILENA
14360 4d 45 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ME into the loca
14370 6c 20 64 61 74 61 62 61 73 65 20 44 41 54 41 42  l database DATAB
14380 41 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22 6d  ASE (default: "m
14390 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  ain")..  */.  ca
143a0 73 65 20 44 42 5f 52 45 53 54 4f 52 45 3a 20 7b  se DB_RESTORE: {
143b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
143c0 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63  *zSrcFile;.    c
143d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74  onst char *zDest
143e0 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
143f0 2a 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  *pSrc;.    sqlit
14400 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
14410 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d  up;.    int nTim
14420 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  eout = 0;..    i
14430 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
14440 20 20 20 20 7a 44 65 73 74 44 62 20 3d 20 22 6d      zDestDb = "m
14450 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 53 72 63  ain";.      zSrc
14460 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
14470 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
14480 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
14490 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 44  c==4 ){.      zD
144a0 65 73 74 44 62 20 3d 20 54 63 6c 5f 47 65 74 53  estDb = Tcl_GetS
144b0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
144c0 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d        zSrcFile =
144d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
144e0 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c  bjv[3]);.    }el
144f0 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72  se{.      Tcl_Wr
14500 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
14510 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41  p, 2, objv, "?DA
14520 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
14530 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
14540 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14550 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
14560 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 53 72 63 46  e3_open_v2(zSrcF
14570 69 6c 65 2c 20 26 70 53 72 63 2c 20 53 51 4c 49  ile, &pSrc, SQLI
14580 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
14590 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
145a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
145b0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
145c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
145d0 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 75 72 63  annot open sourc
145e0 65 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a 20  e database: ",. 
145f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14600 33 5f 65 72 72 6d 73 67 28 70 53 72 63 29 2c 20  3_errmsg(pSrc), 
14610 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
14620 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
14630 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Src);.      retu
14640 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14650 20 20 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20    }.    pBackup 
14660 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
14670 5f 69 6e 69 74 28 70 44 62 2d 3e 64 62 2c 20 7a  _init(pDb->db, z
14680 44 65 73 74 44 62 2c 20 70 53 72 63 2c 20 22 6d  DestDb, pSrc, "m
14690 61 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70  ain");.    if( p
146a0 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20  Backup==0 ){.   
146b0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
146c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73  ult(interp, "res
146d0 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a  tore failed: ",.
146e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
146f0 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
14700 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  b), (char*)0);. 
14710 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
14720 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20  se(pSrc);.      
14730 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
14750 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
14760 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61  _backup_step(pBa
14770 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49  ckup,100))==SQLI
14780 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20  TE_OK.          
14790 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54      || rc==SQLIT
147a0 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
147b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
147c0 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69  USY ){.        i
147d0 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d  f( nTimeout++ >=
147e0 20 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20   3 ) break;.    
147f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65      sqlite3_slee
14800 70 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a  p(100);.      }.
14810 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
14820 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28  3_backup_finish(
14830 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66  pBackup);.    if
14840 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
14850 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E ){.      rc = 
14860 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  TCL_OK;.    }els
14870 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
14880 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c  _BUSY || rc==SQL
14890 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  ITE_LOCKED ){.  
148a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
148b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65  sult(interp, "re
148c0 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 73 6f  store failed: so
148d0 75 72 63 65 20 64 61 74 61 62 61 73 65 20 62 75  urce database bu
148e0 73 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sy",.           
148f0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
14900 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20  r*)0);.      rc 
14910 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
14920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
14930 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
14940 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20  nterp, "restore 
14950 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20  failed: ",.     
14960 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
14970 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28  rmsg(pDb->db), (
14980 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
14990 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
149a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
149b0 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20  3_close(pSrc);. 
149c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
149d0 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
149e0 20 73 74 61 74 75 73 20 28 73 74 65 70 7c 73 6f   status (step|so
149f0 72 74 7c 61 75 74 6f 69 6e 64 65 78 29 0a 20 20  rt|autoindex).  
14a00 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61 79 20  **.  ** Display 
14a10 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
14a20 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20  S_FULLSCAN_STEP 
14a30 6f 72 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  or .  ** SQLITE_
14a40 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20  STMTSTATUS_SORT 
14a50 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
14a60 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f 0a 20  ent eval..  */. 
14a70 20 63 61 73 65 20 44 42 5f 53 54 41 54 55 53 3a   case DB_STATUS:
14a80 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a 20 20   {.    int v;.  
14a90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
14aa0 70 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  p;.    if( objc!
14ab0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
14ac0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
14ad0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 28  erp, 2, objv, "(
14ae0 73 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e  step|sort|autoin
14af0 64 65 78 29 22 29 3b 0a 20 20 20 20 20 20 72 65  dex)");.      re
14b00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14b10 20 20 20 20 7d 0a 20 20 20 20 7a 4f 70 20 3d 20      }.    zOp = 
14b20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
14b30 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  jv[2]);.    if( 
14b40 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 74 65  strcmp(zOp, "ste
14b50 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  p")==0 ){.      
14b60 76 20 3d 20 70 44 62 2d 3e 6e 53 74 65 70 3b 0a  v = pDb->nStep;.
14b70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
14b80 72 63 6d 70 28 7a 4f 70 2c 20 22 73 6f 72 74 22  rcmp(zOp, "sort"
14b90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  )==0 ){.      v 
14ba0 3d 20 70 44 62 2d 3e 6e 53 6f 72 74 3b 0a 20 20  = pDb->nSort;.  
14bb0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
14bc0 6d 70 28 7a 4f 70 2c 20 22 61 75 74 6f 69 6e 64  mp(zOp, "autoind
14bd0 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ex")==0 ){.     
14be0 20 76 20 3d 20 70 44 62 2d 3e 6e 49 6e 64 65 78   v = pDb->nIndex
14bf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14c00 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
14c10 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20  ult(interp, .   
14c20 20 20 20 20 20 20 20 20 20 22 62 61 64 20 61 72           "bad ar
14c30 67 75 6d 65 6e 74 3a 20 73 68 6f 75 6c 64 20 62  gument: should b
14c40 65 20 61 75 74 6f 69 6e 64 65 78 2c 20 73 74 65  e autoindex, ste
14c50 70 2c 20 6f 72 20 73 6f 72 74 22 2c 20 0a 20 20  p, or sort", .  
14c60 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
14c70 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )0);.      retur
14c80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
14c90 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62   }.    Tcl_SetOb
14ca0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
14cb0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29  Tcl_NewIntObj(v)
14cc0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
14cd0 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  }.  .  /*.  **  
14ce0 20 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d     $db timeout M
14cf0 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a  ILLESECONDS.  **
14d00 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20  .  ** Delay for 
14d10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
14d20 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69  lliseconds speci
14d30 66 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65  fied when a file
14d40 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f   is locked..  */
14d50 0a 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f  .  case DB_TIMEO
14d60 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73  UT: {.    int ms
14d70 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
14d80 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
14d90 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
14da0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49  rp, 2, objv, "MI
14db0 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20  LLISECONDS");.  
14dc0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14dd0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
14de0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
14df0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
14e00 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65  jv[2], &ms) ) re
14e10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14e20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
14e30 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62  _timeout(pDb->db
14e40 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b  , ms);.    break
14e50 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20  ;.  }.  .  /*.  
14e60 2a 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c  **     $db total
14e70 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20  _changes.  **.  
14e80 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
14e90 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
14ea0 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c  t were modified,
14eb0 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65   inserted, or de
14ec0 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63  leted .  ** sinc
14ed0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  e the database h
14ee0 61 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65  andle was create
14ef0 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
14f00 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a  B_TOTAL_CHANGES:
14f10 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
14f20 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28  pResult;.    if(
14f30 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
14f40 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
14f50 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
14f60 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
14f70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14f80 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75  .    }.    pResu
14f90 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
14fa0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
14fb0 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
14fc0 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65  (pResult, sqlite
14fd0 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
14fe0 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62  pDb->db));.    b
14ff0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
15000 20 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41     $db trace ?CA
15010 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
15020 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65  * Make arrangeme
15030 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  nts to invoke th
15040 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69  e CALLBACK routi
15050 6e 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20  ne for each SQL 
15060 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
15070 68 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e  hat is executed.
15080 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68    The text of th
15090 65 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65  e SQL is appende
150a0 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65  d to CALLBACK be
150b0 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  fore.  ** it is 
150c0 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20  executed..  */. 
150d0 20 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20   case DB_TRACE: 
150e0 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
150f0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
15100 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
15110 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
15120 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
15130 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15140 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
15150 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
15160 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
15170 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
15180 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15190 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63  terp, pDb->zTrac
151a0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
151b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
151c0 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20  char *zTrace;.  
151d0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
151e0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
151f0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ce ){.        Tc
15200 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61  l_Free(pDb->zTra
15210 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ce);.      }.   
15220 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f     zTrace = Tcl_
15230 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
15240 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
15250 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63  .      if( zTrac
15260 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  e && len>0 ){.  
15270 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
15280 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  e = Tcl_Alloc( l
15290 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
152a0 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54    memcpy(pDb->zT
152b0 72 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65  race, zTrace, le
152c0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
152d0 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
152e0 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  zTrace = 0;.    
152f0 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64    }.#if !defined
15300 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
15310 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
15320 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
15330 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
15340 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
15350 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  e ){.        pDb
15360 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
15370 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
15380 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62  e3_trace(pDb->db
15390 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72  , DbTraceHandler
153a0 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
153b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
153c0 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e  ite3_trace(pDb->
153d0 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
153e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
153f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
15400 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e    /*    $db tran
15410 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72  saction [-deferr
15420 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65  ed|-immediate|-e
15430 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54  xclusive] SCRIPT
15440 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74  .  **.  ** Start
15450 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
15460 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f  on (if we are no
15470 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  t already in the
15480 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a   midst of a.  **
15490 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e   transaction) an
154a0 64 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43  d execute the TC
154b0 4c 20 73 63 72 69 70 74 20 53 43 52 49 50 54 2e  L script SCRIPT.
154c0 20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a 20    After SCRIPT. 
154d0 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65   ** completes, e
154e0 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65  ither commit the
154f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
15500 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20  roll it back if 
15510 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f  SCRIPT.  ** thro
15520 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e  ws an exception.
15530 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74    Or if no new t
15540 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74  ransation was st
15550 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e  arted, do nothin
15560 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65  g..  ** pass the
15570 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70   exception on up
15580 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a   the stack..  **
15590 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  .  ** This comma
155a0 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65 64 20  nd was inspired 
155b0 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73  by Dave Thomas's
155c0 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74   talk on Ruby at
155d0 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f   the.  ** 2005 O
155e0 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75  'Reilly Open Sou
155f0 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28  rce Convention (
15600 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63  OSCON)..  */.  c
15610 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49  ase DB_TRANSACTI
15620 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ON: {.    Tcl_Ob
15630 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20  j *pScript;.    
15640 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67  const char *zBeg
15650 69 6e 20 3d 20 22 53 41 56 45 50 4f 49 4e 54 20  in = "SAVEPOINT 
15660 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _tcl_transaction
15670 22 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  ";.    if( objc!
15680 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =3 && objc!=4 ){
15690 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
156a0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
156b0 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d  2, objv, "[TYPE]
156c0 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
156d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
156e0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
156f0 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pDb->nTransact
15700 69 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d 3d  ion==0 && objc==
15710 34 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69  4 ){.      stati
15720 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54  c const char *TT
15730 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20  YPE_strs[] = {. 
15740 20 20 20 20 20 20 20 22 64 65 66 65 72 72 65 64         "deferred
15750 22 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65 22  ",   "exclusive"
15760 2c 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c 20  ,  "immediate", 
15770 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  0.      };.     
15780 20 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d   enum TTYPE_enum
15790 20 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50 45   {.        TTYPE
157a0 5f 44 45 46 45 52 52 45 44 2c 20 54 54 59 50 45  _DEFERRED, TTYPE
157b0 5f 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59 50  _EXCLUSIVE, TTYP
157c0 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20  E_IMMEDIATE.    
157d0 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 74    };.      int t
157e0 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20  type;.      if( 
157f0 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
15800 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
15810 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73 2c  [2], TTYPE_strs,
15820 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79   "transaction ty
15830 70 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pe",.           
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 30 2c 20 26 74 74 79 70 65 29 20 29 7b     0, &ttype) ){
15860 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15870 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
15880 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28   }.      switch(
15890 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75   (enum TTYPE_enu
158a0 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20  m)ttype ){.     
158b0 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 44 45     case TTYPE_DE
158c0 46 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f  FERRED:    /* no
158d0 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20 20  -op */;         
158e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
158f0 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
15900 45 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20 7a  E_EXCLUSIVE:   z
15910 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 45  Begin = "BEGIN E
15920 58 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65 61  XCLUSIVE";  brea
15930 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
15940 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a  TTYPE_IMMEDIATE:
15950 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47     zBegin = "BEG
15960 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20 20  IN IMMEDIATE";  
15970 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
15980 20 20 20 7d 0a 20 20 20 20 70 53 63 72 69 70 74     }.    pScript
15990 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
159a0 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65  ..    /* Run the
159b0 20 53 51 4c 69 74 65 20 42 45 47 49 4e 20 63 6f   SQLite BEGIN co
159c0 6d 6d 61 6e 64 20 74 6f 20 6f 70 65 6e 20 61 20  mmand to open a 
159d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73  transaction or s
159e0 61 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20  avepoint. */.   
159f0 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
15a00 68 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  h++;.    rc = sq
15a10 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
15a20 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30  db, zBegin, 0, 0
15a30 2c 20 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e 64  , 0);.    pDb->d
15a40 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20  isableAuth--;.  
15a50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15a60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
15a70 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15a80 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
15a90 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
15aa0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15ab0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
15ac0 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73  .    pDb->nTrans
15ad0 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20 2f  action++;..    /
15ae0 2a 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20  * If using NRE, 
15af0 73 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c 62  schedule a callb
15b00 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  ack to invoke th
15b10 65 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74  e script pScript
15b20 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 20  , then.    ** a 
15b30 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b 20  second callback 
15b40 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f  to commit (or ro
15b50 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61 6e  llback) the tran
15b60 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70  saction or savep
15b70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  oint.    ** open
15b80 65 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f 74  ed above. If not
15b90 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c   using NRE, eval
15ba0 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20  uate the script 
15bb0 64 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a 20  directly, then. 
15bc0 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63 74     ** call funct
15bd0 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74 43  ion DbTransPostC
15be0 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20 28  md() to commit (
15bf0 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65  or rollback) the
15c00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
15c10 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e    ** or savepoin
15c20 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44  t.  */.    if( D
15c30 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20  bUseNre() ){.   
15c40 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c     Tcl_NRAddCall
15c50 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 54  back(interp, DbT
15c60 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c  ransPostCmd, cd,
15c70 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
15c80 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69   Tcl_NREvalObj(i
15c90 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
15ca0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
15cb0 20 20 20 20 20 72 63 20 3d 20 44 62 54 72 61 6e       rc = DbTran
15cc0 73 50 6f 73 74 43 6d 64 28 26 63 64 2c 20 69 6e  sPostCmd(&cd, in
15cd0 74 65 72 70 2c 20 54 63 6c 5f 45 76 61 6c 4f 62  terp, Tcl_EvalOb
15ce0 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72  jEx(interp, pScr
15cf0 69 70 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a  ipt, 0));.    }.
15d00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
15d10 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
15d20 20 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 3f   unlock_notify ?
15d30 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63  script?.  */.  c
15d40 61 73 65 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ase DB_UNLOCK_NO
15d50 54 49 46 59 3a 20 7b 0a 23 69 66 6e 64 65 66 20  TIFY: {.#ifndef 
15d60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
15d70 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20  LOCK_NOTIFY.    
15d80 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15d90 28 69 6e 74 65 72 70 2c 20 22 75 6e 6c 6f 63 6b  (interp, "unlock
15da0 5f 6e 6f 74 69 66 79 20 6e 6f 74 20 61 76 61 69  _notify not avai
15db0 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75  lable in this bu
15dc0 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 63  ild", 0);.    rc
15dd0 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65   = TCL_ERROR;.#e
15de0 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lse.    if( objc
15df0 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=2 && objc!=3 )
15e00 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
15e10 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
15e20 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49   2, objv, "?SCRI
15e30 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 63 20  PT?");.      rc 
15e40 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
15e50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 6f   }else{.      vo
15e60 69 64 20 28 2a 78 4e 6f 74 69 66 79 29 28 76 6f  id (*xNotify)(vo
15e70 69 64 20 2a 2a 2c 20 69 6e 74 29 20 3d 20 30 3b  id **, int) = 0;
15e80 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4e 6f  .      void *pNo
15e90 74 69 66 79 41 72 67 20 3d 20 30 3b 0a 0a 20 20  tifyArg = 0;..  
15ea0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 55 6e      if( pDb->pUn
15eb0 6c 6f 63 6b 4e 6f 74 69 66 79 20 29 7b 0a 20 20  lockNotify ){.  
15ec0 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
15ed0 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c  fCount(pDb->pUnl
15ee0 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20  ockNotify);.    
15ef0 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b      pDb->pUnlock
15f00 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 20 20  Notify = 0;.    
15f10 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
15f20 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
15f30 20 20 20 20 78 4e 6f 74 69 66 79 20 3d 20 44 62      xNotify = Db
15f40 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20 20  UnlockNotify;.  
15f50 20 20 20 20 20 20 70 4e 6f 74 69 66 79 41 72 67        pNotifyArg
15f60 20 3d 20 28 76 6f 69 64 20 2a 29 70 44 62 3b 0a   = (void *)pDb;.
15f70 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e          pDb->pUn
15f80 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 6f 62 6a  lockNotify = obj
15f90 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63  v[2];.        Tc
15fa0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
15fb0 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
15fc0 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  y);.      }.  . 
15fd0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
15fe0 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 70  _unlock_notify(p
15ff0 44 62 2d 3e 64 62 2c 20 78 4e 6f 74 69 66 79 2c  Db->db, xNotify,
16000 20 70 4e 6f 74 69 66 79 41 72 67 29 20 29 7b 0a   pNotifyArg) ){.
16010 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
16020 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16030 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
16040 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
16050 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
16060 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
16070 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
16080 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
16090 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75    **    $db preu
160a0 70 64 61 74 65 5f 68 6f 6f 6b 20 63 6f 75 6e 74  pdate_hook count
160b0 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65  .  **    $db pre
160c0 75 70 64 61 74 65 5f 68 6f 6f 6b 20 68 6f 6f 6b  update_hook hook
160d0 20 3f 53 43 52 49 50 54 3f 0a 20 20 2a 2a 20 20   ?SCRIPT?.  **  
160e0 20 20 24 64 62 20 70 72 65 75 70 64 61 74 65 5f    $db preupdate_
160f0 68 6f 6f 6b 20 6e 65 77 20 49 4e 44 45 58 0a 20  hook new INDEX. 
16100 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70   **    $db preup
16110 64 61 74 65 5f 68 6f 6f 6b 20 6f 6c 64 20 49 4e  date_hook old IN
16120 44 45 58 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  DEX.  */.  case 
16130 44 42 5f 50 52 45 55 50 44 41 54 45 3a 20 7b 0a  DB_PREUPDATE: {.
16140 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
16150 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
16160 48 4f 4f 4b 0a 20 20 20 20 54 63 6c 5f 41 70 70  HOOK.    Tcl_App
16170 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
16180 2c 20 22 70 72 65 75 70 64 61 74 65 5f 68 6f 6f  , "preupdate_hoo
16190 6b 20 77 61 73 20 6f 6d 69 74 74 65 64 20 61 74  k was omitted at
161a0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 29 3b   compile-time");
161b0 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52  .    rc = TCL_ER
161c0 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73  ROR;.#else.    s
161d0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
161e0 20 2a 61 7a 53 75 62 5b 5d 20 3d 20 7b 22 63 6f   *azSub[] = {"co
161f0 75 6e 74 22 2c 20 22 64 65 70 74 68 22 2c 20 22  unt", "depth", "
16200 68 6f 6f 6b 22 2c 20 22 6e 65 77 22 2c 20 22 6f  hook", "new", "o
16210 6c 64 22 2c 20 30 7d 3b 0a 20 20 20 20 65 6e 75  ld", 0};.    enu
16220 6d 20 44 62 50 72 65 75 70 64 61 74 65 53 75 62  m DbPreupdateSub
16230 43 6d 64 20 7b 0a 20 20 20 20 20 20 50 52 45 5f  Cmd {.      PRE_
16240 43 4f 55 4e 54 2c 20 50 52 45 5f 44 45 50 54 48  COUNT, PRE_DEPTH
16250 2c 20 50 52 45 5f 48 4f 4f 4b 2c 20 50 52 45 5f  , PRE_HOOK, PRE_
16260 4e 45 57 2c 20 50 52 45 5f 4f 4c 44 0a 20 20 20  NEW, PRE_OLD.   
16270 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 53 75 62   };.    int iSub
16280 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  ;..    if( objc<
16290 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
162a0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
162b0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 55  rp, 2, objv, "SU
162c0 42 2d 43 4f 4d 4d 41 4e 44 20 3f 41 52 47 53 3f  B-COMMAND ?ARGS?
162d0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
162e0 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
162f0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16300 6a 76 5b 32 5d 2c 20 61 7a 53 75 62 2c 20 22 73  jv[2], azSub, "s
16310 75 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20  ub-command", 0, 
16320 26 69 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20  &iSub) ){.      
16330 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16340 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
16350 74 63 68 28 20 28 65 6e 75 6d 20 44 62 50 72 65  tch( (enum DbPre
16360 75 70 64 61 74 65 53 75 62 43 6d 64 29 69 53 75  updateSubCmd)iSu
16370 62 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  b ){.      case 
16380 50 52 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20 20  PRE_COUNT: {.   
16390 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20       int nCol = 
163a0 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
163b0 65 5f 63 6f 75 6e 74 28 70 44 62 2d 3e 64 62 29  e_count(pDb->db)
163c0 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  ;.        Tcl_Se
163d0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
163e0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
163f0 28 6e 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20  (nCol));.       
16400 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
16410 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f  .      case PRE_
16420 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 20 20 20 20  HOOK: {.        
16430 69 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20 20  if( objc>4 ){.  
16440 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
16450 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
16460 20 32 2c 20 6f 62 6a 76 2c 20 22 68 6f 6f 6b 20   2, objv, "hook 
16470 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
16480 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
16490 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
164a0 7d 0a 20 20 20 20 20 20 20 20 44 62 48 6f 6f 6b  }.        DbHook
164b0 43 6d 64 28 69 6e 74 65 72 70 2c 20 70 44 62 2c  Cmd(interp, pDb,
164c0 20 28 6f 62 6a 63 3d 3d 34 20 3f 20 6f 62 6a 76   (objc==4 ? objv
164d0 5b 33 5d 20 3a 20 30 29 2c 20 26 70 44 62 2d 3e  [3] : 0), &pDb->
164e0 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b  pPreUpdateHook);
164f0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
16500 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
16510 61 73 65 20 50 52 45 5f 44 45 50 54 48 3a 20 7b  ase PRE_DEPTH: {
16520 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
16530 20 2a 70 52 65 74 3b 0a 20 20 20 20 20 20 20 20   *pRet;.        
16540 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
16550 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f           Tcl_Wro
16560 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
16570 2c 20 33 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 3, objv, "");.
16580 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16590 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
165a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 52      }.        pR
165b0 65 74 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  et = Tcl_NewIntO
165c0 62 6a 28 73 71 6c 69 74 65 33 5f 70 72 65 75 70  bj(sqlite3_preup
165d0 64 61 74 65 5f 64 65 70 74 68 28 70 44 62 2d 3e  date_depth(pDb->
165e0 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 54 63  db));.        Tc
165f0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
16600 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
16610 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16620 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
16630 20 50 52 45 5f 4e 45 57 3a 0a 20 20 20 20 20 20   PRE_NEW:.      
16640 63 61 73 65 20 50 52 45 5f 4f 4c 44 3a 20 7b 0a  case PRE_OLD: {.
16650 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
16660 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16670 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 75 65 3b  3_value *pValue;
16680 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a  .        if( obj
16690 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=4 ){.        
166a0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
166b0 67 73 28 69 6e 74 65 72 70 2c 20 33 2c 20 6f 62  gs(interp, 3, ob
166c0 6a 76 2c 20 22 49 4e 44 45 58 22 29 3b 0a 20 20  jv, "INDEX");.  
166d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
166e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
166f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
16700 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
16710 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
16720 5d 2c 20 26 69 49 64 78 29 20 29 7b 0a 20 20 20  ], &iIdx) ){.   
16730 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
16740 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
16750 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
16760 69 53 75 62 3d 3d 50 52 45 5f 4f 4c 44 20 29 7b  iSub==PRE_OLD ){
16770 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
16780 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
16790 65 5f 6f 6c 64 28 70 44 62 2d 3e 64 62 2c 20 69  e_old(pDb->db, i
167a0 49 64 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20  Idx, &pValue);. 
167b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
167c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
167d0 69 53 75 62 3d 3d 50 52 45 5f 4e 45 57 20 29 3b  iSub==PRE_NEW );
167e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
167f0 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
16800 65 5f 6e 65 77 28 70 44 62 2d 3e 64 62 2c 20 69  e_new(pDb->db, i
16810 49 64 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20  Idx, &pValue);. 
16820 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
16830 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16840 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16850 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a   Tcl_Obj *pObj;.
16860 20 20 20 20 20 20 20 20 20 20 70 4f 62 6a 20 3d            pObj =
16870 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
16880 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
16890 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
168a0 75 65 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ue), -1);.      
168b0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
168c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 4f 62  sult(interp, pOb
168d0 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  j);.        }els
168e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  e{.          Tcl
168f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16900 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
16910 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
16920 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
16930 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16950 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
16960 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
16970 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f  REUPDATE_HOOK */
16980 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
16990 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
169a0 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f 73 63 72 69  b wal_hook ?scri
169b0 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  pt?.  **    $db 
169c0 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72  update_hook ?scr
169d0 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62  ipt?.  **    $db
169e0 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f   rollback_hook ?
169f0 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63  script?.  */.  c
16a00 61 73 65 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 3a  ase DB_WAL_HOOK:
16a10 20 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44 41   .  case DB_UPDA
16a20 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65  TE_HOOK: .  case
16a30 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f   DB_ROLLBACK_HOO
16a40 4b 3a 20 7b 0a 20 20 20 20 2f 2a 20 73 65 74 20  K: {.    /* set 
16a50 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20  ppHook to point 
16a60 61 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f  at pUpdateHook o
16a70 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c  r pRollbackHook,
16a80 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20   depending on . 
16a90 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24     ** whether [$
16aa0 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20  db update_hook] 
16ab0 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b  or [$db rollback
16ac0 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b  _hook] was invok
16ad0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54  ed..    */.    T
16ae0 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b  cl_Obj **ppHook;
16af0 20 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65   .    if( choice
16b00 3d 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 20  ==DB_WAL_HOOK ) 
16b10 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
16b20 57 61 6c 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28  WalHook;.    if(
16b30 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41   choice==DB_UPDA
16b40 54 45 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b  TE_HOOK ) ppHook
16b50 20 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74 65   = &pDb->pUpdate
16b60 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63 68  Hook;.    if( ch
16b70 6f 69 63 65 3d 3d 44 42 5f 52 4f 4c 4c 42 41 43  oice==DB_ROLLBAC
16b80 4b 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20  K_HOOK ) ppHook 
16b90 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  = &pDb->pRollbac
16ba0 6b 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 6f  kHook;.    if( o
16bb0 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 20  bjc>3 ){.       
16bc0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
16bd0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
16be0 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20  , "?SCRIPT?");. 
16bf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
16c00 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
16c10 20 20 20 44 62 48 6f 6f 6b 43 6d 64 28 69 6e 74     DbHookCmd(int
16c20 65 72 70 2c 20 70 44 62 2c 20 28 6f 62 6a 63 3d  erp, pDb, (objc=
16c30 3d 33 20 3f 20 6f 62 6a 76 5b 32 5d 20 3a 20 30  =3 ? objv[2] : 0
16c40 29 2c 20 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  ), ppHook);.    
16c50 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
16c60 20 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a      $db version.
16c70 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
16c80 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72   the version str
16c90 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61 74  ing for this dat
16ca0 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
16cb0 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b  se DB_VERSION: {
16cc0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
16cd0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
16ce0 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65   *)sqlite3_libve
16cf0 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41  rsion(), TCL_STA
16d00 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  TIC);.    break;
16d10 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e  .  }...  } /* En
16d20 64 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20  d of the SWITCH 
16d30 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72  statement */.  r
16d40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
16d50 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 0a   SQLITE_TCL_NRE.
16d60 2f 2a 0a 2a 2a 20 41 64 61 70 74 6f 72 20 74 68  /*.** Adaptor th
16d70 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 6f  at provides an o
16d80 62 6a 43 6d 64 20 69 6e 74 65 72 66 61 63 65 20  bjCmd interface 
16d90 74 6f 20 74 68 65 20 4e 52 45 2d 65 6e 61 62 6c  to the NRE-enabl
16da0 65 64 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 20  ed.** interface 
16db0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a  implementation..
16dc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
16dd0 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72 28 0a 20  ObjCmdAdaptor(. 
16de0 20 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c   void *cd,.  Tcl
16df0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16e00 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
16e10 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62  cl_Obj *const*ob
16e20 6a 76 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54  jv.){.  return T
16e30 63 6c 5f 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f 63  cl_NRCallObjProc
16e40 28 69 6e 74 65 72 70 2c 20 44 62 4f 62 6a 43 6d  (interp, DbObjCm
16e50 64 2c 20 63 64 2c 20 6f 62 6a 63 2c 20 6f 62 6a  d, cd, objc, obj
16e60 76 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  v);.}.#endif /* 
16e70 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 2a  SQLITE_TCL_NRE *
16e80 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  /../*.**   sqlit
16e90 65 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41  e3 DBNAME FILENA
16ea0 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45  ME ?-vfs VFSNAME
16eb0 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72  ? ?-key KEY? ?-r
16ec0 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f  eadonly BOOLEAN?
16ed0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3f 2d                ?-
16ef0 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20  create BOOLEAN? 
16f00 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41  ?-nomutex BOOLEA
16f10 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  N?.**.** This is
16f20 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f   the main Tcl co
16f30 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65  mmand.  When the
16f40 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f   "sqlite" Tcl co
16f50 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f  mmand is.** invo
16f60 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ked, this routin
16f70 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73  e runs to proces
16f80 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a  s that command..
16f90 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
16fa0 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45  argument, DBNAME
16fb0 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72  , is an arbitrar
16fc0 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77  y name for a new
16fd0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
16fe0 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63  nection.  This c
16ff0 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61  ommand creates a
17000 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   new command nam
17010 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61  ed.** DBNAME tha
17020 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e  t is used to con
17030 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63  trol that connec
17040 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62  tion.  The datab
17050 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
17060 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77 68 65  n is deleted whe
17070 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d  n the DBNAME com
17080 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e  mand is deleted.
17090 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
170a0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
170b0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
170c0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
170d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
170e0 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54  Main(void *cd, T
170f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17100 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f  p, int objc,Tcl_
17110 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29  Obj *const*objv)
17120 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b  {.  SqliteDb *p;
17130 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17140 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  Arg;.  char *zEr
17150 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  rMsg;.  int i;. 
17160 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
17170 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  le;.  const char
17180 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 69 6e   *zVfs = 0;.  in
17190 74 20 66 6c 61 67 73 3b 0a 20 20 54 63 6c 5f 44  t flags;.  Tcl_D
171a0 53 74 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65  String translate
171b0 64 46 69 6c 65 6e 61 6d 65 3b 0a 23 69 66 64 65  dFilename;.#ifde
171c0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
171d0 45 43 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  EC.  void *pKey 
171e0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20  = 0;.  int nKey 
171f0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e  = 0;.#endif.  in
17200 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6e  t rc;..  /* In n
17210 6f 72 6d 61 6c 20 75 73 65 2c 20 65 61 63 68 20  ormal use, each 
17220 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
17230 72 75 6e 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  runs in a single
17240 20 74 68 72 65 61 64 2e 20 20 53 6f 0a 20 20 2a   thread.  So.  *
17250 2a 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65  * by default, we
17260 20 63 61 6e 20 74 75 72 6e 20 6f 66 20 6d 75 74   can turn of mut
17270 65 78 69 6e 67 20 6f 6e 20 53 51 4c 69 74 65 20  exing on SQLite 
17280 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
17290 69 6f 6e 73 2e 0a 20 20 2a 2a 20 48 6f 77 65 76  ions..  ** Howev
172a0 65 72 2c 20 66 6f 72 20 74 65 73 74 69 6e 67 20  er, for testing 
172b0 70 75 72 70 6f 73 65 73 20 69 74 20 69 73 20 75  purposes it is u
172c0 73 65 66 75 6c 20 74 6f 20 68 61 76 65 20 6d 75  seful to have mu
172d0 74 65 78 65 73 20 74 75 72 6e 65 64 0a 20 20 2a  texes turned.  *
172e0 2a 20 6f 6e 2e 20 20 53 6f 2c 20 62 79 20 64 65  * on.  So, by de
172f0 66 61 75 6c 74 2c 20 6d 75 74 65 78 65 73 20 64  fault, mutexes d
17300 65 66 61 75 6c 74 20 6f 66 66 2e 20 20 42 75 74  efault off.  But
17310 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   if compiled wit
17320 68 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 43  h.  ** SQLITE_TC
17330 4c 5f 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55  L_DEFAULT_FULLMU
17340 54 45 58 20 74 68 65 6e 20 6d 75 74 65 78 65 73  TEX then mutexes
17350 20 64 65 66 61 75 6c 74 20 6f 6e 2e 0a 20 20 2a   default on..  *
17360 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
17370 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46 55 4c 4c  TCL_DEFAULT_FULL
17380 4d 55 54 45 58 0a 20 20 66 6c 61 67 73 20 3d 20  MUTEX.  flags = 
17390 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
173a0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
173b0 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c  PEN_CREATE | SQL
173c0 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
173d0 45 58 3b 0a 23 65 6c 73 65 0a 20 20 66 6c 61 67  EX;.#else.  flag
173e0 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
173f0 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
17400 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
17410 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
17420 55 54 45 58 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  UTEX;.#endif..  
17430 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
17440 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65     zArg = Tcl_Ge
17450 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
17460 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[1], 0);.    
17470 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
17480 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29  "-version")==0 )
17490 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
174a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
174b0 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c  sqlite3_version,
174c0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
174d0 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
174e0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
174f0 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63 22 29  rg,"-has-codec")
17500 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ==0 ){.#ifdef SQ
17510 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
17520 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
17530 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22  esult(interp,"1"
17540 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ,0);.#else.     
17550 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
17560 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b  t(interp,"0",0);
17570 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
17580 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
17590 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33   }.  }.  for(i=3
175a0 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20 69 2b 3d 32  ; i+1<objc; i+=2
175b0 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63  ){.    zArg = Tc
175c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
175d0 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 74  [i]);.    if( st
175e0 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22  rcmp(zArg,"-key"
175f0 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )==0 ){.#ifdef S
17600 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
17610 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c        pKey = Tcl
17620 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
17630 6d 4f 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20  mObj(objv[i+1], 
17640 26 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20  &nKey);.#endif. 
17650 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
17660 63 6d 70 28 7a 41 72 67 2c 20 22 2d 76 66 73 22  cmp(zArg, "-vfs"
17670 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 56  )==0 ){.      zV
17680 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  fs = Tcl_GetStri
17690 6e 67 28 6f 62 6a 76 5b 69 2b 31 5d 29 3b 0a 20  ng(objv[i+1]);. 
176a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
176b0 63 6d 70 28 7a 41 72 67 2c 20 22 2d 72 65 61 64  cmp(zArg, "-read
176c0 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  only")==0 ){.   
176d0 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20     int b;.      
176e0 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
176f0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
17700 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29  , objv[i+1], &b)
17710 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17720 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ROR;.      if( b
17730 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
17740 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50  s &= ~(SQLITE_OP
17750 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
17760 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
17770 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
17780 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
17790 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
177a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c  else{.        fl
177b0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
177c0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
177d0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
177e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
177f0 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RITE;.      }.  
17800 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
17810 6d 70 28 7a 41 72 67 2c 20 22 2d 63 72 65 61 74  mp(zArg, "-creat
17820 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
17830 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
17840 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
17850 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17860 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
17870 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17880 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 26 26  ;.      if( b &&
17890 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
178a0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d  _OPEN_READONLY)=
178b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  =0 ){.        fl
178c0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
178d0 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20  EN_CREATE;.     
178e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
178f0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
17900 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20  _OPEN_CREATE;.  
17910 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
17920 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
17930 20 22 2d 6e 6f 6d 75 74 65 78 22 29 3d 3d 30 20   "-nomutex")==0 
17940 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a  ){.      int b;.
17950 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
17960 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
17970 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31  interp, objv[i+1
17980 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
17990 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
179a0 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20   if( b ){.      
179b0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
179c0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a  E_OPEN_NOMUTEX;.
179d0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
179e0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55   ~SQLITE_OPEN_FU
179f0 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d  LLMUTEX;.      }
17a00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c  else{.        fl
17a10 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
17a20 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20  PEN_NOMUTEX;.   
17a30 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
17a40 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
17a50 22 2d 66 75 6c 6c 6d 75 74 65 78 22 29 3d 3d 30  "-fullmutex")==0
17a60 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
17a70 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
17a80 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
17a90 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b  (interp, objv[i+
17aa0 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  1], &b) ) return
17ab0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
17ac0 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20    if( b ){.     
17ad0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
17ae0 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
17af0 58 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  X;.        flags
17b00 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
17b10 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  _NOMUTEX;.      
17b20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
17b30 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
17b40 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a  OPEN_FULLMUTEX;.
17b50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
17b60 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
17b70 67 2c 20 22 2d 75 72 69 22 29 3d 3d 30 20 29 7b  g, "-uri")==0 ){
17b80 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
17b90 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
17ba0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
17bb0 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
17bc0 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
17bd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
17be0 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20  f( b ){.        
17bf0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
17c00 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 20 20 20 20  OPEN_URI;.      
17c10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
17c20 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
17c30 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 20 20 20 20  OPEN_URI;.      
17c40 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
17c50 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
17c60 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b  ult(interp, "unk
17c70 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c 20  nown option: ", 
17c80 7a 41 72 67 2c 20 28 63 68 61 72 2a 29 30 29 3b  zArg, (char*)0);
17c90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
17ca0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
17cb0 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33 20   }.  if( objc<3 
17cc0 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31 20 29  || (objc&1)!=1 )
17cd0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
17ce0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
17cf0 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 22  , objv, .      "
17d00 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20  HANDLE FILENAME 
17d10 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f  ?-vfs VFSNAME? ?
17d20 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41  -readonly BOOLEA
17d30 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c  N? ?-create BOOL
17d40 45 41 4e 3f 22 0a 20 20 20 20 20 20 22 20 3f 2d  EAN?".      " ?-
17d50 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f  nomutex BOOLEAN?
17d60 20 3f 2d 66 75 6c 6c 6d 75 74 65 78 20 42 4f 4f   ?-fullmutex BOO
17d70 4c 45 41 4e 3f 20 3f 2d 75 72 69 20 42 4f 4f 4c  LEAN? ?-uri BOOL
17d80 45 41 4e 3f 22 0a 23 69 66 64 65 66 20 53 51 4c  EAN?".#ifdef SQL
17d90 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
17da0 20 20 20 20 22 20 3f 2d 6b 65 79 20 43 4f 44 45      " ?-key CODE
17db0 43 4b 45 59 3f 22 0a 23 65 6e 64 69 66 0a 20 20  CKEY?".#endif.  
17dc0 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20    );.    return 
17dd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
17de0 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
17df0 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54  p = (SqliteDb*)T
17e00 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
17e10 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
17e20 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  =0 ){.    Tcl_Se
17e30 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
17e40 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c  "malloc failed",
17e50 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
17e60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17e70 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  OR;.  }.  memset
17e80 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
17e90 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63  ));.  zFile = Tc
17ea0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
17eb0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
17ec0 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72    zFile = Tcl_Tr
17ed0 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28  anslateFileName(
17ee0 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26  interp, zFile, &
17ef0 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61  translatedFilena
17f00 6d 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  me);.  rc = sqli
17f10 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c  te3_open_v2(zFil
17f20 65 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73  e, &p->db, flags
17f30 2c 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44  , zVfs);.  Tcl_D
17f40 53 74 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e  StringFree(&tran
17f50 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b  slatedFilename);
17f60 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a  .  if( p->db ){.
17f70 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
17f80 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
17f90 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20  de(p->db) ){.   
17fa0 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c     zErrMsg = sql
17fb0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
17fc0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
17fd0 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
17fe0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
17ff0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ->db);.      p->
18000 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  db = 0;.    }.  
18010 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 72 72 4d  }else{.    zErrM
18020 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
18030 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
18040 65 33 5f 65 72 72 73 74 72 28 72 63 29 29 3b 0a  e3_errstr(rc));.
18050 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
18060 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
18070 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73  ( p->db ){.    s
18080 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62  qlite3_key(p->db
18090 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , pKey, nKey);. 
180a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
180b0 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
180c0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
180d0 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54  terp, zErrMsg, T
180e0 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
180f0 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
18100 2a 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  *)p);.    sqlite
18110 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
18120 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18130 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ERROR;.  }.  p->
18140 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52  maxStmt = NUM_PR
18150 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20  EPARED_STMTS;.  
18160 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  p->interp = inte
18170 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c  rp;.  zArg = Tcl
18180 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
18190 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
181a0 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20   if( DbUseNre() 
181b0 29 7b 0a 20 20 20 20 54 63 6c 5f 4e 52 43 72 65  ){.    Tcl_NRCre
181c0 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
181d0 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d  p, zArg, DbObjCm
181e0 64 41 64 61 70 74 6f 72 2c 20 44 62 4f 62 6a 43  dAdaptor, DbObjC
181f0 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  md,.            
18200 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
18210 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d  r*)p, DbDeleteCm
18220 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
18230 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
18240 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41  mmand(interp, zA
18250 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63  rg, DbObjCmd, (c
18260 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65  har*)p, DbDelete
18270 43 6d 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cmd);.  }.  retu
18280 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
18290 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75  .** Provide a du
182a0 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  mmy Tcl_InitStub
182b0 73 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e  s if we are usin
182c0 67 20 74 68 69 73 20 61 73 20 61 20 73 74 61 74  g this as a stat
182d0 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a  ic.** library..*
182e0 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43  /.#ifndef USE_TC
182f0 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20  L_STUBS.# undef 
18300 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23   Tcl_InitStubs.#
18310 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74   define Tcl_Init
18320 53 74 75 62 73 28 61 2c 62 2c 63 29 20 54 43 4c  Stubs(a,b,c) TCL
18330 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a  _VERSION.#endif.
18340 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
18350 20 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41   we have a PACKA
18360 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f  GE_VERSION macro
18370 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20   defined.  This 
18380 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e  will be.** defin
18390 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
183a0 20 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65   by the TEA make
183b0 66 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72  file.  But other
183c0 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f   makefiles.** do
183d0 20 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a   not define it..
183e0 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41  */.#ifndef PACKA
183f0 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66  GE_VERSION.# def
18400 69 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53  ine PACKAGE_VERS
18410 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ION SQLITE_VERSI
18420 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ON.#endif../*.**
18430 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
18440 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54   module..**.** T
18450 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63  his Tcl module c
18460 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73  ontains only a s
18470 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f  ingle new Tcl co
18480 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c  mmand named "sql
18490 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20  ite"..** (Hence 
184a0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65  there is no name
184b0 73 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73  space.  There is
184c0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69   no point in usi
184d0 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a  ng a namespace.*
184e0 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69  * if the extensi
184f0 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73  on only supplies
18500 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20   one new name!) 
18510 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f   The "sqlite" co
18520 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64  mmand is.** used
18530 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53   to open a new S
18540 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
18550 20 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28   See the DbMain(
18560 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a  ) routine above.
18570 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
18580 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
18590 2a 0a 2a 2a 20 54 68 65 20 45 58 54 45 52 4e 20  *.** The EXTERN 
185a0 6d 61 63 72 6f 73 20 61 72 65 20 72 65 71 75 69  macros are requi
185b0 72 65 64 20 62 79 20 54 43 4c 20 69 6e 20 6f 72  red by TCL in or
185c0 64 65 72 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 77  der to work on w
185d0 69 6e 64 6f 77 73 2e 0a 2a 2f 0a 45 58 54 45 52  indows..*/.EXTER
185e0 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e  N int Sqlite3_In
185f0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
18600 6e 74 65 72 70 29 7b 0a 20 20 69 6e 74 20 72 63  nterp){.  int rc
18610 20 3d 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73   = Tcl_InitStubs
18620 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20  (interp, "8.4", 
18630 30 29 3d 3d 30 20 3f 20 54 43 4c 5f 45 52 52 4f  0)==0 ? TCL_ERRO
18640 52 20 3a 20 54 43 4c 5f 4f 4b 3b 0a 20 20 69 66  R : TCL_OK;.  if
18650 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
18660 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
18670 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
18680 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c   "sqlite3", (Tcl
18690 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
186a0 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  ain, 0, 0);.#ifn
186b0 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46  def SQLITE_3_SUF
186c0 46 49 58 5f 4f 4e 4c 59 0a 20 20 20 20 2f 2a 20  FIX_ONLY.    /* 
186d0 54 68 65 20 22 73 71 6c 69 74 65 22 20 61 6c 69  The "sqlite" ali
186e0 61 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74  as is undocument
186f0 65 64 2e 20 20 49 74 20 69 73 20 68 65 72 65 20  ed.  It is here 
18700 6f 6e 6c 79 20 74 6f 20 73 75 70 70 6f 72 74 0a  only to support.
18710 20 20 20 20 2a 2a 20 6c 65 67 61 63 79 20 73 63      ** legacy sc
18720 72 69 70 74 73 2e 20 20 41 6c 6c 20 6e 65 77 20  ripts.  All new 
18730 73 63 72 69 70 74 73 20 73 68 6f 75 6c 64 20 75  scripts should u
18740 73 65 20 6f 6e 6c 79 20 74 68 65 20 22 73 71 6c  se only the "sql
18750 69 74 65 33 22 0a 20 20 20 20 2a 2a 20 63 6f 6d  ite3".    ** com
18760 6d 61 6e 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  mand. */.    Tcl
18770 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
18780 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
18790 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50  e", (Tcl_ObjCmdP
187a0 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20  roc*)DbMain, 0, 
187b0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  0);.#endif.    r
187c0 63 20 3d 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  c = Tcl_PkgProvi
187d0 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  de(interp, "sqli
187e0 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45  te3", PACKAGE_VE
187f0 52 53 49 4f 4e 29 3b 0a 20 20 7d 0a 20 20 72 65  RSION);.  }.  re
18800 74 75 72 6e 20 72 63 3b 0a 7d 0a 45 58 54 45 52  turn rc;.}.EXTER
18810 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33  N int Tclsqlite3
18820 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
18830 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
18840 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69  n Sqlite3_Init(i
18850 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e  nterp); }.EXTERN
18860 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 55 6e 6c   int Sqlite3_Unl
18870 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
18880 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
18890 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
188a0 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
188b0 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e 6c 6f 61  Tclsqlite3_Unloa
188c0 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
188d0 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
188e0 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
188f0 20 7d 0a 0a 2f 2a 20 42 65 63 61 75 73 65 20 69   }../* Because i
18900 74 20 61 63 63 65 73 73 65 73 20 74 68 65 20 66  t accesses the f
18910 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e 64 20 75  ile-system and u
18920 73 65 73 20 70 65 72 73 69 73 74 65 6e 74 20 73  ses persistent s
18930 74 61 74 65 2c 20 53 51 4c 69 74 65 0a 2a 2a 20  tate, SQLite.** 
18940 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
18950 64 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  d appropriate fo
18960 72 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74  r safe interpret
18970 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 77 65 20  ers.  Hence, we 
18980 64 65 6c 69 62 65 72 61 74 65 6c 79 0a 2a 2a 20  deliberately.** 
18990 6f 6d 69 74 20 74 68 65 20 5f 53 61 66 65 49 6e  omit the _SafeIn
189a0 69 74 28 29 20 69 6e 74 65 72 66 61 63 65 73 2e  it() interfaces.
189b0 0a 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .*/..#ifndef SQL
189c0 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c  ITE_3_SUFFIX_ONL
189d0 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69  Y.int Sqlite_Ini
189e0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
189f0 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71  terp){ return Sq
18a00 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
18a10 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c  p); }.int Tclsql
18a20 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ite_Init(Tcl_Int
18a30 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
18a40 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
18a50 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74  t(interp); }.int
18a60 20 53 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54   Sqlite_Unload(T
18a70 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18a80 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
18a90 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
18aa0 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 55 6e  int Tclsqlite_Un
18ab0 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
18ac0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
18ad0 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
18ae0 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK; }.#endif..#i
18af0 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a  fdef TCLSH./****
18b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c  *********.** All
18b50 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74 68 61   of the code tha
18b60 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65  t follows is use
18b70 64 20 74 6f 20 62 75 69 6c 64 20 73 74 61 6e 64  d to build stand
18b80 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72 70  alone TCL interp
18b90 72 65 74 65 72 73 0a 2a 2a 20 74 68 61 74 20 61  reters.** that a
18ba0 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69  re statically li
18bb0 6e 6b 65 64 20 77 69 74 68 20 53 51 4c 69 74 65  nked with SQLite
18bc0 2e 20 20 45 6e 61 62 6c 65 20 74 68 65 73 65 20  .  Enable these 
18bd0 62 79 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  by compiling.** 
18be0 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 6e 20 77  with -DTCLSH=n w
18bf0 68 65 72 65 20 6e 20 63 61 6e 20 62 65 20 31 20  here n can be 1 
18c00 6f 72 20 32 2e 20 20 41 6e 20 6e 20 6f 66 20 31  or 2.  An n of 1
18c10 20 67 65 6e 65 72 61 74 65 73 20 61 20 73 74 61   generates a sta
18c20 6e 64 61 72 64 0a 2a 2a 20 74 63 6c 73 68 20 62  ndard.** tclsh b
18c30 75 74 20 77 69 74 68 20 53 51 4c 69 74 65 20 62  ut with SQLite b
18c40 75 69 6c 74 20 69 6e 2e 20 20 41 6e 20 6e 20 6f  uilt in.  An n o
18c50 66 20 32 20 67 65 6e 65 72 61 74 65 73 20 74 68  f 2 generates th
18c60 65 20 53 51 4c 69 74 65 20 73 70 61 63 65 0a 2a  e SQLite space.*
18c70 2a 20 61 6e 61 6c 79 73 69 73 20 70 72 6f 67 72  * analysis progr
18c80 61 6d 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  am..*/..#if defi
18c90 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
18ca0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
18cb0 54 45 5f 54 43 4c 4d 44 35 29 0a 2f 2a 0a 20 2a  TE_TCLMD5)./*. *
18cc0 20 54 68 69 73 20 63 6f 64 65 20 69 6d 70 6c 65   This code imple
18cd0 6d 65 6e 74 73 20 74 68 65 20 4d 44 35 20 6d 65  ments the MD5 me
18ce0 73 73 61 67 65 2d 64 69 67 65 73 74 20 61 6c 67  ssage-digest alg
18cf0 6f 72 69 74 68 6d 2e 0a 20 2a 20 54 68 65 20 61  orithm.. * The a
18d00 6c 67 6f 72 69 74 68 6d 20 69 73 20 64 75 65 20  lgorithm is due 
18d10 74 6f 20 52 6f 6e 20 52 69 76 65 73 74 2e 20 20  to Ron Rivest.  
18d20 54 68 69 73 20 63 6f 64 65 20 77 61 73 0a 20 2a  This code was. *
18d30 20 77 72 69 74 74 65 6e 20 62 79 20 43 6f 6c 69   written by Coli
18d40 6e 20 50 6c 75 6d 62 20 69 6e 20 31 39 39 33 2c  n Plumb in 1993,
18d50 20 6e 6f 20 63 6f 70 79 72 69 67 68 74 20 69 73   no copyright is
18d60 20 63 6c 61 69 6d 65 64 2e 0a 20 2a 20 54 68 69   claimed.. * Thi
18d70 73 20 63 6f 64 65 20 69 73 20 69 6e 20 74 68 65  s code is in the
18d80 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 3b 20   public domain; 
18d90 64 6f 20 77 69 74 68 20 69 74 20 77 68 61 74 20  do with it what 
18da0 79 6f 75 20 77 69 73 68 2e 0a 20 2a 0a 20 2a 20  you wish.. *. * 
18db0 45 71 75 69 76 61 6c 65 6e 74 20 63 6f 64 65 20  Equivalent code 
18dc0 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  is available fro
18dd0 6d 20 52 53 41 20 44 61 74 61 20 53 65 63 75 72  m RSA Data Secur
18de0 69 74 79 2c 20 49 6e 63 2e 0a 20 2a 20 54 68 69  ity, Inc.. * Thi
18df0 73 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20  s code has been 
18e00 74 65 73 74 65 64 20 61 67 61 69 6e 73 74 20 74  tested against t
18e10 68 61 74 2c 20 61 6e 64 20 69 73 20 65 71 75 69  hat, and is equi
18e20 76 61 6c 65 6e 74 2c 0a 20 2a 20 65 78 63 65 70  valent,. * excep
18e30 74 20 74 68 61 74 20 79 6f 75 20 64 6f 6e 27 74  t that you don't
18e40 20 6e 65 65 64 20 74 6f 20 69 6e 63 6c 75 64 65   need to include
18e50 20 74 77 6f 20 70 61 67 65 73 20 6f 66 20 6c 65   two pages of le
18e60 67 61 6c 65 73 65 0a 20 2a 20 77 69 74 68 20 65  galese. * with e
18e70 76 65 72 79 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a  very copy.. *. *
18e80 20 54 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   To compute the 
18e90 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f  message digest o
18ea0 66 20 61 20 63 68 75 6e 6b 20 6f 66 20 62 79 74  f a chunk of byt
18eb0 65 73 2c 20 64 65 63 6c 61 72 65 20 61 6e 0a 20  es, declare an. 
18ec0 2a 20 4d 44 35 43 6f 6e 74 65 78 74 20 73 74 72  * MD5Context str
18ed0 75 63 74 75 72 65 2c 20 70 61 73 73 20 69 74 20  ucture, pass it 
18ee0 74 6f 20 4d 44 35 49 6e 69 74 2c 20 63 61 6c 6c  to MD5Init, call
18ef0 20 4d 44 35 55 70 64 61 74 65 20 61 73 0a 20 2a   MD5Update as. *
18f00 20 6e 65 65 64 65 64 20 6f 6e 20 62 75 66 66 65   needed on buffe
18f10 72 73 20 66 75 6c 6c 20 6f 66 20 62 79 74 65 73  rs full of bytes
18f20 2c 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  , and then call 
18f30 4d 44 35 46 69 6e 61 6c 2c 20 77 68 69 63 68 0a  MD5Final, which.
18f40 20 2a 20 77 69 6c 6c 20 66 69 6c 6c 20 61 20 73   * will fill a s
18f50 75 70 70 6c 69 65 64 20 31 36 2d 62 79 74 65 20  upplied 16-byte 
18f60 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 64  array with the d
18f70 69 67 65 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20  igest.. */../*. 
18f80 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 6f 6e  * If compiled on
18f90 20 61 20 6d 61 63 68 69 6e 65 20 74 68 61 74 20   a machine that 
18fa0 64 6f 65 73 6e 27 74 20 68 61 76 65 20 61 20 33  doesn't have a 3
18fb0 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 0a 20  2-bit integer,. 
18fc0 2a 20 79 6f 75 20 6a 75 73 74 20 73 65 74 20 22  * you just set "
18fd0 75 69 6e 74 33 32 22 20 74 6f 20 74 68 65 20 61  uint32" to the a
18fe0 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61 74  ppropriate datat
18ff0 79 70 65 20 66 6f 72 20 61 6e 0a 20 2a 20 75 6e  ype for an. * un
19000 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
19010 74 65 67 65 72 2e 20 20 46 6f 72 20 65 78 61 6d  teger.  For exam
19020 70 6c 65 3a 0a 20 2a 0a 20 2a 20 20 20 20 20 20  ple:. *. *      
19030 20 63 63 20 2d 44 75 69 6e 74 33 32 3d 27 75 6e   cc -Duint32='un
19040 73 69 67 6e 65 64 20 6c 6f 6e 67 27 20 6d 64 35  signed long' md5
19050 2e 63 0a 20 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65  .c. *. */.#ifnde
19060 66 20 75 69 6e 74 33 32 0a 23 20 20 64 65 66 69  f uint32.#  defi
19070 6e 65 20 75 69 6e 74 33 32 20 75 6e 73 69 67 6e  ne uint32 unsign
19080 65 64 20 69 6e 74 0a 23 65 6e 64 69 66 0a 0a 73  ed int.#endif..s
19090 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74  truct MD5Context
190a0 20 7b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b   {.  int isInit;
190b0 0a 20 20 75 69 6e 74 33 32 20 62 75 66 5b 34 5d  .  uint32 buf[4]
190c0 3b 0a 20 20 75 69 6e 74 33 32 20 62 69 74 73 5b  ;.  uint32 bits[
190d0 32 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  2];.  unsigned c
190e0 68 61 72 20 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74  har in[64];.};.t
190f0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 44  ypedef struct MD
19100 35 43 6f 6e 74 65 78 74 20 4d 44 35 43 6f 6e 74  5Context MD5Cont
19110 65 78 74 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65  ext;../*. * Note
19120 3a 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 68  : this code is h
19130 61 72 6d 6c 65 73 73 20 6f 6e 20 6c 69 74 74 6c  armless on littl
19140 65 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65  e-endian machine
19150 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s.. */.static vo
19160 69 64 20 62 79 74 65 52 65 76 65 72 73 65 20 28  id byteReverse (
19170 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
19180 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  uf, unsigned lon
19190 67 73 29 7b 0a 20 20 20 20 20 20 20 20 75 69 6e  gs){.        uin
191a0 74 33 32 20 74 3b 0a 20 20 20 20 20 20 20 20 64  t32 t;.        d
191b0 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o {.            
191c0 20 20 20 20 74 20 3d 20 28 75 69 6e 74 33 32 29      t = (uint32)
191d0 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 33  ((unsigned)buf[3
191e0 5d 3c 3c 38 20 7c 20 62 75 66 5b 32 5d 29 20 3c  ]<<8 | buf[2]) <
191f0 3c 20 31 36 20 7c 0a 20 20 20 20 20 20 20 20 20  < 16 |.         
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19210 20 20 20 28 28 75 6e 73 69 67 6e 65 64 29 62 75     ((unsigned)bu
19220 66 5b 31 5d 3c 3c 38 20 7c 20 62 75 66 5b 30 5d  f[1]<<8 | buf[0]
19230 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
19240 20 20 20 2a 28 75 69 6e 74 33 32 20 2a 29 62 75     *(uint32 *)bu
19250 66 20 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20  f = t;.         
19260 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20 34 3b         buf += 4;
19270 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
19280 20 28 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a   (--longs);.}./*
19290 20 54 68 65 20 66 6f 75 72 20 63 6f 72 65 20 66   The four core f
192a0 75 6e 63 74 69 6f 6e 73 20 2d 20 46 31 20 69 73  unctions - F1 is
192b0 20 6f 70 74 69 6d 69 7a 65 64 20 73 6f 6d 65 77   optimized somew
192c0 68 61 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69  hat */../* #defi
192d0 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29 20 28  ne F1(x, y, z) (
192e0 78 20 26 20 79 20 7c 20 7e 78 20 26 20 7a 29 20  x & y | ~x & z) 
192f0 2a 2f 0a 23 64 65 66 69 6e 65 20 46 31 28 78 2c  */.#define F1(x,
19300 20 79 2c 20 7a 29 20 28 7a 20 5e 20 28 78 20 26   y, z) (z ^ (x &
19310 20 28 79 20 5e 20 7a 29 29 29 0a 23 64 65 66 69   (y ^ z))).#defi
19320 6e 65 20 46 32 28 78 2c 20 79 2c 20 7a 29 20 46  ne F2(x, y, z) F
19330 31 28 7a 2c 20 78 2c 20 79 29 0a 23 64 65 66 69  1(z, x, y).#defi
19340 6e 65 20 46 33 28 78 2c 20 79 2c 20 7a 29 20 28  ne F3(x, y, z) (
19350 78 20 5e 20 79 20 5e 20 7a 29 0a 23 64 65 66 69  x ^ y ^ z).#defi
19360 6e 65 20 46 34 28 78 2c 20 79 2c 20 7a 29 20 28  ne F4(x, y, z) (
19370 79 20 5e 20 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f  y ^ (x | ~z))../
19380 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 65  * This is the ce
19390 6e 74 72 61 6c 20 73 74 65 70 20 69 6e 20 74 68  ntral step in th
193a0 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2e  e MD5 algorithm.
193b0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 44 35 53   */.#define MD5S
193c0 54 45 50 28 66 2c 20 77 2c 20 78 2c 20 79 2c 20  TEP(f, w, x, y, 
193d0 7a 2c 20 64 61 74 61 2c 20 73 29 20 5c 0a 20 20  z, data, s) \.  
193e0 20 20 20 20 20 20 28 20 77 20 2b 3d 20 66 28 78        ( w += f(x
193f0 2c 20 79 2c 20 7a 29 20 2b 20 64 61 74 61 2c 20  , y, z) + data, 
19400 20 77 20 3d 20 77 3c 3c 73 20 7c 20 77 3e 3e 28   w = w<<s | w>>(
19410 33 32 2d 73 29 2c 20 20 77 20 2b 3d 20 78 20 29  32-s),  w += x )
19420 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 63 6f 72 65  ../*. * The core
19430 20 6f 66 20 74 68 65 20 4d 44 35 20 61 6c 67 6f   of the MD5 algo
19440 72 69 74 68 6d 2c 20 74 68 69 73 20 61 6c 74 65  rithm, this alte
19450 72 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 4d  rs an existing M
19460 44 35 20 68 61 73 68 20 74 6f 0a 20 2a 20 72 65  D5 hash to. * re
19470 66 6c 65 63 74 20 74 68 65 20 61 64 64 69 74 69  flect the additi
19480 6f 6e 20 6f 66 20 31 36 20 6c 6f 6e 67 77 6f 72  on of 16 longwor
19490 64 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2e 20  ds of new data. 
194a0 20 4d 44 35 55 70 64 61 74 65 20 62 6c 6f 63 6b   MD5Update block
194b0 73 0a 20 2a 20 74 68 65 20 64 61 74 61 20 61 6e  s. * the data an
194c0 64 20 63 6f 6e 76 65 72 74 73 20 62 79 74 65 73  d converts bytes
194d0 20 69 6e 74 6f 20 6c 6f 6e 67 77 6f 72 64 73 20   into longwords 
194e0 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
194f0 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  .. */.static voi
19500 64 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 75  d MD5Transform(u
19510 69 6e 74 33 32 20 62 75 66 5b 34 5d 2c 20 63 6f  int32 buf[4], co
19520 6e 73 74 20 75 69 6e 74 33 32 20 69 6e 5b 31 36  nst uint32 in[16
19530 5d 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67 69  ]){.        regi
19540 73 74 65 72 20 75 69 6e 74 33 32 20 61 2c 20 62  ster uint32 a, b
19550 2c 20 63 2c 20 64 3b 0a 0a 20 20 20 20 20 20 20  , c, d;..       
19560 20 61 20 3d 20 62 75 66 5b 30 5d 3b 0a 20 20 20   a = buf[0];.   
19570 20 20 20 20 20 62 20 3d 20 62 75 66 5b 31 5d 3b       b = buf[1];
19580 0a 20 20 20 20 20 20 20 20 63 20 3d 20 62 75 66  .        c = buf
19590 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 64 20 3d  [2];.        d =
195a0 20 62 75 66 5b 33 5d 3b 0a 0a 20 20 20 20 20 20   buf[3];..      
195b0 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c    MD5STEP(F1, a,
195c0 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d   b, c, d, in[ 0]
195d0 2b 30 78 64 37 36 61 61 34 37 38 2c 20 20 37 29  +0xd76aa478,  7)
195e0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
195f0 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
19600 2c 20 69 6e 5b 20 31 5d 2b 30 78 65 38 63 37 62  , in[ 1]+0xe8c7b
19610 37 35 36 2c 20 31 32 29 3b 0a 20 20 20 20 20 20  756, 12);.      
19620 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
19630 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d   d, a, b, in[ 2]
19640 2b 30 78 32 34 32 30 37 30 64 62 2c 20 31 37 29  +0x242070db, 17)
19650 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
19660 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F1, b, c, d, a
19670 2c 20 69 6e 5b 20 33 5d 2b 30 78 63 31 62 64 63  , in[ 3]+0xc1bdc
19680 65 65 65 2c 20 32 32 29 3b 0a 20 20 20 20 20 20  eee, 22);.      
19690 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c    MD5STEP(F1, a,
196a0 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d   b, c, d, in[ 4]
196b0 2b 30 78 66 35 37 63 30 66 61 66 2c 20 20 37 29  +0xf57c0faf,  7)
196c0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
196d0 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
196e0 2c 20 69 6e 5b 20 35 5d 2b 30 78 34 37 38 37 63  , in[ 5]+0x4787c
196f0 36 32 61 2c 20 31 32 29 3b 0a 20 20 20 20 20 20  62a, 12);.      
19700 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
19710 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d   d, a, b, in[ 6]
19720 2b 30 78 61 38 33 30 34 36 31 33 2c 20 31 37 29  +0xa8304613, 17)
19730 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
19740 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F1, b, c, d, a
19750 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 64 34 36 39  , in[ 7]+0xfd469
19760 35 30 31 2c 20 32 32 29 3b 0a 20 20 20 20 20 20  501, 22);.      
19770 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c    MD5STEP(F1, a,
19780 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d   b, c, d, in[ 8]
19790 2b 30 78 36 39 38 30 39 38 64 38 2c 20 20 37 29  +0x698098d8,  7)
197a0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
197b0 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
197c0 2c 20 69 6e 5b 20 39 5d 2b 30 78 38 62 34 34 66  , in[ 9]+0x8b44f
197d0 37 61 66 2c 20 31 32 29 3b 0a 20 20 20 20 20 20  7af, 12);.      
197e0 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
197f0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d   d, a, b, in[10]
19800 2b 30 78 66 66 66 66 35 62 62 31 2c 20 31 37 29  +0xffff5bb1, 17)
19810 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
19820 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F1, b, c, d, a
19830 2c 20 69 6e 5b 31 31 5d 2b 30 78 38 39 35 63 64  , in[11]+0x895cd
19840 37 62 65 2c 20 32 32 29 3b 0a 20 20 20 20 20 20  7be, 22);.      
19850 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c    MD5STEP(F1, a,
19860 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d   b, c, d, in[12]
19870 2b 30 78 36 62 39 30 31 31 32 32 2c 20 20 37 29  +0x6b901122,  7)
19880 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
19890 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
198a0 2c 20 69 6e 5b 31 33 5d 2b 30 78 66 64 39 38 37  , in[13]+0xfd987
198b0 31 39 33 2c 20 31 32 29 3b 0a 20 20 20 20 20 20  193, 12);.      
198c0 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
198d0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d   d, a, b, in[14]
198e0 2b 30 78 61 36 37 39 34 33 38 65 2c 20 31 37 29  +0xa679438e, 17)
198f0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
19900 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F1, b, c, d, a
19910 2c 20 69 6e 5b 31 35 5d 2b 30 78 34 39 62 34 30  , in[15]+0x49b40
19920 38 32 31 2c 20 32 32 29 3b 0a 0a 20 20 20 20 20  821, 22);..     
19930 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61     MD5STEP(F2, a
19940 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31  , b, c, d, in[ 1
19950 5d 2b 30 78 66 36 31 65 32 35 36 32 2c 20 20 35  ]+0xf61e2562,  5
19960 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19970 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
19980 63 2c 20 69 6e 5b 20 36 5d 2b 30 78 63 30 34 30  c, in[ 6]+0xc040
19990 62 33 34 30 2c 20 20 39 29 3b 0a 20 20 20 20 20  b340,  9);.     
199a0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63     MD5STEP(F2, c
199b0 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31  , d, a, b, in[11
199c0 5d 2b 30 78 32 36 35 65 35 61 35 31 2c 20 31 34  ]+0x265e5a51, 14
199d0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
199e0 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F2, b, c, d, 
199f0 61 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 39 62 36  a, in[ 0]+0xe9b6
19a00 63 37 61 61 2c 20 32 30 29 3b 0a 20 20 20 20 20  c7aa, 20);.     
19a10 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61     MD5STEP(F2, a
19a20 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35  , b, c, d, in[ 5
19a30 5d 2b 30 78 64 36 32 66 31 30 35 64 2c 20 20 35  ]+0xd62f105d,  5
19a40 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19a50 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
19a60 63 2c 20 69 6e 5b 31 30 5d 2b 30 78 30 32 34 34  c, in[10]+0x0244
19a70 31 34 35 33 2c 20 20 39 29 3b 0a 20 20 20 20 20  1453,  9);.     
19a80 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63     MD5STEP(F2, c
19a90 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35  , d, a, b, in[15
19aa0 5d 2b 30 78 64 38 61 31 65 36 38 31 2c 20 31 34  ]+0xd8a1e681, 14
19ab0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19ac0 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F2, b, c, d, 
19ad0 61 2c 20 69 6e 5b 20 34 5d 2b 30 78 65 37 64 33  a, in[ 4]+0xe7d3
19ae0 66 62 63 38 2c 20 32 30 29 3b 0a 20 20 20 20 20  fbc8, 20);.     
19af0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61     MD5STEP(F2, a
19b00 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39  , b, c, d, in[ 9
19b10 5d 2b 30 78 32 31 65 31 63 64 65 36 2c 20 20 35  ]+0x21e1cde6,  5
19b20 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19b30 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
19b40 63 2c 20 69 6e 5b 31 34 5d 2b 30 78 63 33 33 37  c, in[14]+0xc337
19b50 30 37 64 36 2c 20 20 39 29 3b 0a 20 20 20 20 20  07d6,  9);.     
19b60 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63     MD5STEP(F2, c
19b70 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33  , d, a, b, in[ 3
19b80 5d 2b 30 78 66 34 64 35 30 64 38 37 2c 20 31 34  ]+0xf4d50d87, 14
19b90 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19ba0 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F2, b, c, d, 
19bb0 61 2c 20 69 6e 5b 20 38 5d 2b 30 78 34 35 35 61  a, in[ 8]+0x455a
19bc0 31 34 65 64 2c 20 32 30 29 3b 0a 20 20 20 20 20  14ed, 20);.     
19bd0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61     MD5STEP(F2, a
19be0 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33  , b, c, d, in[13
19bf0 5d 2b 30 78 61 39 65 33 65 39 30 35 2c 20 20 35  ]+0xa9e3e905,  5
19c00 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19c10 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
19c20 63 2c 20 69 6e 5b 20 32 5d 2b 30 78 66 63 65 66  c, in[ 2]+0xfcef
19c30 61 33 66 38 2c 20 20 39 29 3b 0a 20 20 20 20 20  a3f8,  9);.     
19c40 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63     MD5STEP(F2, c
19c50 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37  , d, a, b, in[ 7
19c60 5d 2b 30 78 36 37 36 66 30 32 64 39 2c 20 31 34  ]+0x676f02d9, 14
19c70 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19c80 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F2, b, c, d, 
19c90 61 2c 20 69 6e 5b 31 32 5d 2b 30 78 38 64 32 61  a, in[12]+0x8d2a
19ca0 34 63 38 61 2c 20 32 30 29 3b 0a 0a 20 20 20 20  4c8a, 20);..    
19cb0 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
19cc0 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
19cd0 35 5d 2b 30 78 66 66 66 61 33 39 34 32 2c 20 20  5]+0xfffa3942,  
19ce0 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
19cf0 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
19d00 20 63 2c 20 69 6e 5b 20 38 5d 2b 30 78 38 37 37   c, in[ 8]+0x877
19d10 31 66 36 38 31 2c 20 31 31 29 3b 0a 20 20 20 20  1f681, 11);.    
19d20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
19d30 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
19d40 31 5d 2b 30 78 36 64 39 64 36 31 32 32 2c 20 31  1]+0x6d9d6122, 1
19d50 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
19d60 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F3, b, c, d,
19d70 20 61 2c 20 69 6e 5b 31 34 5d 2b 30 78 66 64 65   a, in[14]+0xfde
19d80 35 33 38 30 63 2c 20 32 33 29 3b 0a 20 20 20 20  5380c, 23);.    
19d90 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
19da0 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
19db0 31 5d 2b 30 78 61 34 62 65 65 61 34 34 2c 20 20  1]+0xa4beea44,  
19dc0 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
19dd0 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
19de0 20 63 2c 20 69 6e 5b 20 34 5d 2b 30 78 34 62 64   c, in[ 4]+0x4bd
19df0 65 63 66 61 39 2c 20 31 31 29 3b 0a 20 20 20 20  ecfa9, 11);.    
19e00 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
19e10 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
19e20 37 5d 2b 30 78 66 36 62 62 34 62 36 30 2c 20 31  7]+0xf6bb4b60, 1
19e30 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
19e40 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F3, b, c, d,
19e50 20 61 2c 20 69 6e 5b 31 30 5d 2b 30 78 62 65 62   a, in[10]+0xbeb
19e60 66 62 63 37 30 2c 20 32 33 29 3b 0a 20 20 20 20  fbc70, 23);.    
19e70 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
19e80 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31  a, b, c, d, in[1
19e90 33 5d 2b 30 78 32 38 39 62 37 65 63 36 2c 20 20  3]+0x289b7ec6,  
19ea0 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
19eb0 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
19ec0 20 63 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 61 61   c, in[ 0]+0xeaa
19ed0 31 32 37 66 61 2c 20 31 31 29 3b 0a 20 20 20 20  127fa, 11);.    
19ee0 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
19ef0 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
19f00 33 5d 2b 30 78 64 34 65 66 33 30 38 35 2c 20 31  3]+0xd4ef3085, 1
19f10 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
19f20 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F3, b, c, d,
19f30 20 61 2c 20 69 6e 5b 20 36 5d 2b 30 78 30 34 38   a, in[ 6]+0x048
19f40 38 31 64 30 35 2c 20 32 33 29 3b 0a 20 20 20 20  81d05, 23);.    
19f50 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
19f60 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
19f70 39 5d 2b 30 78 64 39 64 34 64 30 33 39 2c 20 20  9]+0xd9d4d039,  
19f80 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
19f90 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
19fa0 20 63 2c 20 69 6e 5b 31 32 5d 2b 30 78 65 36 64   c, in[12]+0xe6d
19fb0 62 39 39 65 35 2c 20 31 31 29 3b 0a 20 20 20 20  b99e5, 11);.    
19fc0 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
19fd0 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
19fe0 35 5d 2b 30 78 31 66 61 32 37 63 66 38 2c 20 31  5]+0x1fa27cf8, 1
19ff0 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
1a000 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F3, b, c, d,
1a010 20 61 2c 20 69 6e 5b 20 32 5d 2b 30 78 63 34 61   a, in[ 2]+0xc4a
1a020 63 35 36 36 35 2c 20 32 33 29 3b 0a 0a 20 20 20  c5665, 23);..   
1a030 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1a040 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
1a050 20 30 5d 2b 30 78 66 34 32 39 32 32 34 34 2c 20   0]+0xf4292244, 
1a060 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   6);.        MD5
1a070 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
1a080 2c 20 63 2c 20 69 6e 5b 20 37 5d 2b 30 78 34 33  , c, in[ 7]+0x43
1a090 32 61 66 66 39 37 2c 20 31 30 29 3b 0a 20 20 20  2aff97, 10);.   
1a0a0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1a0b0 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1a0c0 31 34 5d 2b 30 78 61 62 39 34 32 33 61 37 2c 20  14]+0xab9423a7, 
1a0d0 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  15);.        MD5
1a0e0 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64  STEP(F4, b, c, d
1a0f0 2c 20 61 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 63  , a, in[ 5]+0xfc
1a100 39 33 61 30 33 39 2c 20 32 31 29 3b 0a 20 20 20  93a039, 21);.   
1a110 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1a120 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
1a130 31 32 5d 2b 30 78 36 35 35 62 35 39 63 33 2c 20  12]+0x655b59c3, 
1a140 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   6);.        MD5
1a150 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
1a160 2c 20 63 2c 20 69 6e 5b 20 33 5d 2b 30 78 38 66  , c, in[ 3]+0x8f
1a170 30 63 63 63 39 32 2c 20 31 30 29 3b 0a 20 20 20  0ccc92, 10);.   
1a180 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1a190 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1a1a0 31 30 5d 2b 30 78 66 66 65 66 66 34 37 64 2c 20  10]+0xffeff47d, 
1a1b0 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  15);.        MD5
1a1c0 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64  STEP(F4, b, c, d
1a1d0 2c 20 61 2c 20 69 6e 5b 20 31 5d 2b 30 78 38 35  , a, in[ 1]+0x85
1a1e0 38 34 35 64 64 31 2c 20 32 31 29 3b 0a 20 20 20  845dd1, 21);.   
1a1f0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1a200 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
1a210 20 38 5d 2b 30 78 36 66 61 38 37 65 34 66 2c 20   8]+0x6fa87e4f, 
1a220 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   6);.        MD5
1a230 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
1a240 2c 20 63 2c 20 69 6e 5b 31 35 5d 2b 30 78 66 65  , c, in[15]+0xfe
1a250 32 63 65 36 65 30 2c 20 31 30 29 3b 0a 20 20 20  2ce6e0, 10);.   
1a260 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1a270 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1a280 20 36 5d 2b 30 78 61 33 30 31 34 33 31 34 2c 20   6]+0xa3014314, 
1a290 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  15);.        MD5
1a2a0 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64  STEP(F4, b, c, d
1a2b0 2c 20 61 2c 20 69 6e 5b 31 33 5d 2b 30 78 34 65  , a, in[13]+0x4e
1a2c0 30 38 31 31 61 31 2c 20 32 31 29 3b 0a 20 20 20  0811a1, 21);.   
1a2d0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1a2e0 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
1a2f0 20 34 5d 2b 30 78 66 37 35 33 37 65 38 32 2c 20   4]+0xf7537e82, 
1a300 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   6);.        MD5
1a310 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
1a320 2c 20 63 2c 20 69 6e 5b 31 31 5d 2b 30 78 62 64  , c, in[11]+0xbd
1a330 33 61 66 32 33 35 2c 20 31 30 29 3b 0a 20 20 20  3af235, 10);.   
1a340 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1a350 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1a360 20 32 5d 2b 30 78 32 61 64 37 64 32 62 62 2c 20   2]+0x2ad7d2bb, 
1a370 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  15);.        MD5
1a380 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64  STEP(F4, b, c, d
1a390 2c 20 61 2c 20 69 6e 5b 20 39 5d 2b 30 78 65 62  , a, in[ 9]+0xeb
1a3a0 38 36 64 33 39 31 2c 20 32 31 29 3b 0a 0a 20 20  86d391, 21);..  
1a3b0 20 20 20 20 20 20 62 75 66 5b 30 5d 20 2b 3d 20        buf[0] += 
1a3c0 61 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 31  a;.        buf[1
1a3d0 5d 20 2b 3d 20 62 3b 0a 20 20 20 20 20 20 20 20  ] += b;.        
1a3e0 62 75 66 5b 32 5d 20 2b 3d 20 63 3b 0a 20 20 20  buf[2] += c;.   
1a3f0 20 20 20 20 20 62 75 66 5b 33 5d 20 2b 3d 20 64       buf[3] += d
1a400 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61 72 74  ;.}../*. * Start
1a410 20 4d 44 35 20 61 63 63 75 6d 75 6c 61 74 69 6f   MD5 accumulatio
1a420 6e 2e 20 20 53 65 74 20 62 69 74 20 63 6f 75 6e  n.  Set bit coun
1a430 74 20 74 6f 20 30 20 61 6e 64 20 62 75 66 66 65  t to 0 and buffe
1a440 72 20 74 6f 20 6d 79 73 74 65 72 69 6f 75 73 0a  r to mysterious.
1a450 20 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f   * initializatio
1a460 6e 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f  n constants.. */
1a470 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35  .static void MD5
1a480 49 6e 69 74 28 4d 44 35 43 6f 6e 74 65 78 74 20  Init(MD5Context 
1a490 2a 63 74 78 29 7b 0a 20 20 20 20 20 20 20 20 63  *ctx){.        c
1a4a0 74 78 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  tx->isInit = 1;.
1a4b0 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66          ctx->buf
1a4c0 5b 30 5d 20 3d 20 30 78 36 37 34 35 32 33 30 31  [0] = 0x67452301
1a4d0 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
1a4e0 75 66 5b 31 5d 20 3d 20 30 78 65 66 63 64 61 62  uf[1] = 0xefcdab
1a4f0 38 39 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  89;.        ctx-
1a500 3e 62 75 66 5b 32 5d 20 3d 20 30 78 39 38 62 61  >buf[2] = 0x98ba
1a510 64 63 66 65 3b 0a 20 20 20 20 20 20 20 20 63 74  dcfe;.        ct
1a520 78 2d 3e 62 75 66 5b 33 5d 20 3d 20 30 78 31 30  x->buf[3] = 0x10
1a530 33 32 35 34 37 36 3b 0a 20 20 20 20 20 20 20 20  325476;.        
1a540 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 30  ctx->bits[0] = 0
1a550 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
1a560 69 74 73 5b 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  its[1] = 0;.}../
1a570 2a 0a 20 2a 20 55 70 64 61 74 65 20 63 6f 6e 74  *. * Update cont
1a580 65 78 74 20 74 6f 20 72 65 66 6c 65 63 74 20 74  ext to reflect t
1a590 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e  he concatenation
1a5a0 20 6f 66 20 61 6e 6f 74 68 65 72 20 62 75 66 66   of another buff
1a5b0 65 72 20 66 75 6c 6c 0a 20 2a 20 6f 66 20 62 79  er full. * of by
1a5c0 74 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  tes.. */.static 
1a5d0 0a 76 6f 69 64 20 4d 44 35 55 70 64 61 74 65 28  .void MD5Update(
1a5e0 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 2c  MD5Context *ctx,
1a5f0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1a600 63 68 61 72 20 2a 62 75 66 2c 20 75 6e 73 69 67  char *buf, unsig
1a610 6e 65 64 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20  ned int len){.  
1a620 20 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b 0a        uint32 t;.
1a630 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61  .        /* Upda
1a640 74 65 20 62 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a  te bitcount */..
1a650 20 20 20 20 20 20 20 20 74 20 3d 20 63 74 78 2d          t = ctx-
1a660 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20  >bits[0];.      
1a670 20 20 69 66 20 28 28 63 74 78 2d 3e 62 69 74 73    if ((ctx->bits
1a680 5b 30 5d 20 3d 20 74 20 2b 20 28 28 75 69 6e 74  [0] = t + ((uint
1a690 33 32 29 6c 65 6e 20 3c 3c 20 33 29 29 20 3c 20  32)len << 3)) < 
1a6a0 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t).             
1a6b0 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 2b     ctx->bits[1]+
1a6c0 2b 3b 20 2f 2a 20 43 61 72 72 79 20 66 72 6f 6d  +; /* Carry from
1a6d0 20 6c 6f 77 20 74 6f 20 68 69 67 68 20 2a 2f 0a   low to high */.
1a6e0 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74          ctx->bit
1a6f0 73 5b 31 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32  s[1] += len >> 2
1a700 39 3b 0a 0a 20 20 20 20 20 20 20 20 74 20 3d 20  9;..        t = 
1a710 28 74 20 3e 3e 20 33 29 20 26 20 30 78 33 66 3b  (t >> 3) & 0x3f;
1a720 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 6c 72      /* Bytes alr
1a730 65 61 64 79 20 69 6e 20 73 68 73 49 6e 66 6f 2d  eady in shsInfo-
1a740 3e 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 20 20  >data */..      
1a750 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20    /* Handle any 
1a760 6c 65 61 64 69 6e 67 20 6f 64 64 2d 73 69 7a 65  leading odd-size
1a770 64 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20  d chunks */..   
1a780 20 20 20 20 20 69 66 20 28 20 74 20 29 20 7b 0a       if ( t ) {.
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1a7b0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
1a7c0 72 20 2a 29 63 74 78 2d 3e 69 6e 20 2b 20 74 3b  r *)ctx->in + t;
1a7d0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a7e0 20 20 74 20 3d 20 36 34 2d 74 3b 0a 20 20 20 20    t = 64-t;.    
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1a800 6c 65 6e 20 3c 20 74 29 20 7b 0a 20 20 20 20 20  len < t) {.     
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75 66     memcpy(p, buf
1a830 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  , len);.        
1a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a850 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
1a860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a870 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1a880 28 70 2c 20 62 75 66 2c 20 74 29 3b 0a 20 20 20  (p, buf, t);.   
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74               byt
1a8a0 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e  eReverse(ctx->in
1a8b0 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20  , 16);.         
1a8c0 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66         MD5Transf
1a8d0 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75  orm(ctx->buf, (u
1a8e0 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29  int32 *)ctx->in)
1a8f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a900 20 20 62 75 66 20 2b 3d 20 74 3b 0a 20 20 20 20    buf += t;.    
1a910 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20              len 
1a920 2d 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  -= t;.        }.
1a930 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 63  .        /* Proc
1a940 65 73 73 20 64 61 74 61 20 69 6e 20 36 34 2d 62  ess data in 64-b
1a950 79 74 65 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20  yte chunks */.. 
1a960 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 6c 65         while (le
1a970 6e 20 3e 3d 20 36 34 29 20 7b 0a 20 20 20 20 20  n >= 64) {.     
1a980 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1a990 79 28 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20  y(ctx->in, buf, 
1a9a0 36 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  64);.           
1a9b0 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65       byteReverse
1a9c0 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20  (ctx->in, 16);. 
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
1a9e0 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d  D5Transform(ctx-
1a9f0 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29  >buf, (uint32 *)
1aa00 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  ctx->in);.      
1aa10 20 20 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d            buf +=
1aa20 20 36 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20   64;.           
1aa30 20 20 20 20 20 6c 65 6e 20 2d 3d 20 36 34 3b 0a       len -= 64;.
1aa40 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1aa50 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79     /* Handle any
1aa60 20 72 65 6d 61 69 6e 69 6e 67 20 62 79 74 65 73   remaining bytes
1aa70 20 6f 66 20 64 61 74 61 2e 20 2a 2f 0a 0a 20 20   of data. */..  
1aa80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78        memcpy(ctx
1aa90 2d 3e 69 6e 2c 20 62 75 66 2c 20 6c 65 6e 29 3b  ->in, buf, len);
1aaa0 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46 69 6e 61 6c 20  .}../*. * Final 
1aab0 77 72 61 70 75 70 20 2d 20 70 61 64 20 74 6f 20  wrapup - pad to 
1aac0 36 34 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79  64-byte boundary
1aad0 20 77 69 74 68 20 74 68 65 20 62 69 74 20 70 61   with the bit pa
1aae0 74 74 65 72 6e 20 0a 20 2a 20 31 20 30 2a 20 28  ttern . * 1 0* (
1aaf0 36 34 2d 62 69 74 20 63 6f 75 6e 74 20 6f 66 20  64-bit count of 
1ab00 62 69 74 73 20 70 72 6f 63 65 73 73 65 64 2c 20  bits processed, 
1ab10 4d 53 42 2d 66 69 72 73 74 29 0a 20 2a 2f 0a 73  MSB-first). */.s
1ab20 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 46 69  tatic void MD5Fi
1ab30 6e 61 6c 28 75 6e 73 69 67 6e 65 64 20 63 68 61  nal(unsigned cha
1ab40 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20 4d 44  r digest[16], MD
1ab50 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  5Context *ctx){.
1ab60 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
1ab70 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20   count;.        
1ab80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1ab90 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;..        /* Co
1aba0 6d 70 75 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  mpute number of 
1abb0 62 79 74 65 73 20 6d 6f 64 20 36 34 20 2a 2f 0a  bytes mod 64 */.
1abc0 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20          count = 
1abd0 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3e 3e  (ctx->bits[0] >>
1abe0 20 33 29 20 26 20 30 78 33 46 3b 0a 0a 20 20 20   3) & 0x3F;..   
1abf0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
1ac00 66 69 72 73 74 20 63 68 61 72 20 6f 66 20 70 61  first char of pa
1ac10 64 64 69 6e 67 20 74 6f 20 30 78 38 30 2e 20 20  dding to 0x80.  
1ac20 54 68 69 73 20 69 73 20 73 61 66 65 20 73 69 6e  This is safe sin
1ac30 63 65 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  ce there is.    
1ac40 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 61 74         always at
1ac50 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20   least one byte 
1ac60 66 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  free */.        
1ac70 70 20 3d 20 63 74 78 2d 3e 69 6e 20 2b 20 63 6f  p = ctx->in + co
1ac80 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 2b  unt;.        *p+
1ac90 2b 20 3d 20 30 78 38 30 3b 0a 0a 20 20 20 20 20  + = 0x80;..     
1aca0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
1acb0 61 64 64 69 6e 67 20 6e 65 65 64 65 64 20 74 6f  adding needed to
1acc0 20 6d 61 6b 65 20 36 34 20 62 79 74 65 73 20 2a   make 64 bytes *
1acd0 2f 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20  /.        count 
1ace0 3d 20 36 34 20 2d 20 31 20 2d 20 63 6f 75 6e 74  = 64 - 1 - count
1acf0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ;..        /* Pa
1ad00 64 20 6f 75 74 20 74 6f 20 35 36 20 6d 6f 64 20  d out to 56 mod 
1ad10 36 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  64 */.        if
1ad20 20 28 63 6f 75 6e 74 20 3c 20 38 29 20 7b 0a 20   (count < 8) {. 
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ad40 2a 20 54 77 6f 20 6c 6f 74 73 20 6f 66 20 70 61  * Two lots of pa
1ad50 64 64 69 6e 67 3a 20 20 50 61 64 20 74 68 65 20  dding:  Pad the 
1ad60 66 69 72 73 74 20 62 6c 6f 63 6b 20 74 6f 20 36  first block to 6
1ad70 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  4 bytes */.     
1ad80 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65             memse
1ad90 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74 29 3b 0a  t(p, 0, count);.
1ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adb0 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
1adc0 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20  >in, 16);.      
1add0 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61            MD5Tra
1ade0 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
1adf0 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
1ae00 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  in);..          
1ae10 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 66 69 6c        /* Now fil
1ae20 6c 20 74 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  l the next block
1ae30 20 77 69 74 68 20 35 36 20 62 79 74 65 73 20 2a   with 56 bytes *
1ae40 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1ae50 20 20 6d 65 6d 73 65 74 28 63 74 78 2d 3e 69 6e    memset(ctx->in
1ae60 2c 20 30 2c 20 35 36 29 3b 0a 20 20 20 20 20 20  , 0, 56);.      
1ae70 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1ae80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1ae90 64 20 62 6c 6f 63 6b 20 74 6f 20 35 36 20 62 79  d block to 56 by
1aea0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tes */.         
1aeb0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c         memset(p,
1aec0 20 30 2c 20 63 6f 75 6e 74 2d 38 29 3b 0a 20 20   0, count-8);.  
1aed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1aee0 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
1aef0 3e 69 6e 2c 20 31 34 29 3b 0a 0a 20 20 20 20 20  >in, 14);..     
1af00 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 6c 65 6e     /* Append len
1af10 67 74 68 20 69 6e 20 62 69 74 73 20 61 6e 64 20  gth in bits and 
1af20 74 72 61 6e 73 66 6f 72 6d 20 2a 2f 0a 20 20 20  transform */.   
1af30 20 20 20 20 20 28 28 75 69 6e 74 33 32 20 2a 29       ((uint32 *)
1af40 63 74 78 2d 3e 69 6e 29 5b 20 31 34 20 5d 20 3d  ctx->in)[ 14 ] =
1af50 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20   ctx->bits[0];. 
1af60 20 20 20 20 20 20 20 28 28 75 69 6e 74 33 32 20         ((uint32 
1af70 2a 29 63 74 78 2d 3e 69 6e 29 5b 20 31 35 20 5d  *)ctx->in)[ 15 ]
1af80 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 3b   = ctx->bits[1];
1af90 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 54 72 61  ..        MD5Tra
1afa0 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
1afb0 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
1afc0 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 62 79 74  in);.        byt
1afd0 65 52 65 76 65 72 73 65 28 28 75 6e 73 69 67 6e  eReverse((unsign
1afe0 65 64 20 63 68 61 72 20 2a 29 63 74 78 2d 3e 62  ed char *)ctx->b
1aff0 75 66 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  uf, 4);.        
1b000 6d 65 6d 63 70 79 28 64 69 67 65 73 74 2c 20 63  memcpy(digest, c
1b010 74 78 2d 3e 62 75 66 2c 20 31 36 29 3b 0a 7d 0a  tx->buf, 16);.}.
1b020 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1b030 20 31 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67   128-bit MD5 dig
1b040 65 73 74 20 69 6e 74 6f 20 61 20 33 32 2d 64 69  est into a 32-di
1b050 67 69 74 20 62 61 73 65 2d 31 36 20 6e 75 6d 62  git base-16 numb
1b060 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1b070 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61  id MD5DigestToBa
1b080 73 65 31 36 28 75 6e 73 69 67 6e 65 64 20 63 68  se16(unsigned ch
1b090 61 72 20 2a 64 69 67 65 73 74 2c 20 63 68 61 72  ar *digest, char
1b0a0 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
1b0b0 63 20 63 68 61 72 20 63 6f 6e 73 74 20 7a 45 6e  c char const zEn
1b0c0 63 6f 64 65 5b 5d 20 3d 20 22 30 31 32 33 34 35  code[] = "012345
1b0d0 36 37 38 39 61 62 63 64 65 66 22 3b 0a 20 20 69  6789abcdef";.  i
1b0e0 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72 28  nt i, j;..  for(
1b0f0 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 2b  j=i=0; i<16; i++
1b100 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 64  ){.    int a = d
1b110 69 67 65 73 74 5b 69 5d 3b 0a 20 20 20 20 7a 42  igest[i];.    zB
1b120 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64  uf[j++] = zEncod
1b130 65 5b 28 61 3e 3e 34 29 26 30 78 66 5d 3b 0a 20  e[(a>>4)&0xf];. 
1b140 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a     zBuf[j++] = z
1b150 45 6e 63 6f 64 65 5b 61 20 26 20 30 78 66 5d 3b  Encode[a & 0xf];
1b160 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d  .  }.  zBuf[j] =
1b170 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0;.}.../*.** Co
1b180 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74 20  nvert a 128-bit 
1b190 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20  MD5 digest into 
1b1a0 73 65 71 75 65 6e 63 79 20 6f 66 20 65 69 67 68  sequency of eigh
1b1b0 74 20 35 2d 64 69 67 69 74 20 69 6e 74 65 67 65  t 5-digit intege
1b1c0 72 73 0a 2a 2a 20 65 61 63 68 20 72 65 70 72 65  rs.** each repre
1b1d0 73 65 6e 74 69 6e 67 20 31 36 20 62 69 74 73 20  senting 16 bits 
1b1e0 6f 66 20 74 68 65 20 64 69 67 65 73 74 20 61 6e  of the digest an
1b1f0 64 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  d separated from
1b200 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 20 62   each.** other b
1b210 79 20 61 20 22 2d 22 20 63 68 61 72 61 63 74 65  y a "-" characte
1b220 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
1b230 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73  d MD5DigestToBas
1b240 65 31 30 78 38 28 75 6e 73 69 67 6e 65 64 20 63  e10x8(unsigned c
1b250 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20  har digest[16], 
1b260 63 68 61 72 20 7a 44 69 67 65 73 74 5b 35 30 5d  char zDigest[50]
1b270 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
1b280 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 3b   unsigned int x;
1b290 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1b2a0 31 36 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 78  16; i+=2){.    x
1b2b0 20 3d 20 64 69 67 65 73 74 5b 69 5d 2a 32 35 36   = digest[i]*256
1b2c0 20 2b 20 64 69 67 65 73 74 5b 69 2b 31 5d 3b 0a   + digest[i+1];.
1b2d0 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 7a 44      if( i>0 ) zD
1b2e0 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d 20 27 2d 27  igest[j++] = '-'
1b2f0 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a  ;.    sprintf(&z
1b300 44 69 67 65 73 74 5b 6a 5d 2c 20 22 25 30 35 75  Digest[j], "%05u
1b310 22 2c 20 78 29 3b 0a 20 20 20 20 6a 20 2b 3d 20  ", x);.    j += 
1b320 35 3b 0a 20 20 7d 0a 20 20 7a 44 69 67 65 73 74  5;.  }.  zDigest
1b330 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  [j] = 0;.}../*.*
1b340 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  * A TCL command 
1b350 66 6f 72 20 6d 64 35 2e 20 20 54 68 65 20 61 72  for md5.  The ar
1b360 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 74 65  gument is the te
1b370 78 74 20 74 6f 20 62 65 20 68 61 73 68 65 64 2e  xt to be hashed.
1b380 20 20 54 68 65 0a 2a 2a 20 52 65 73 75 6c 74 20    The.** Result 
1b390 69 73 20 74 68 65 20 68 61 73 68 20 69 6e 20 62  is the hash in b
1b3a0 61 73 65 36 34 2e 20 20 0a 2a 2f 0a 73 74 61 74  ase64.  .*/.stat
1b3b0 69 63 20 69 6e 74 20 6d 64 35 5f 63 6d 64 28 76  ic int md5_cmd(v
1b3c0 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65  oid*cd, Tcl_Inte
1b3d0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
1b3e0 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
1b3f0 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43   **argv){.  MD5C
1b400 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 75 6e  ontext ctx;.  un
1b410 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
1b420 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a  st[16];.  char z
1b430 42 75 66 5b 35 30 5d 3b 0a 20 20 76 6f 69 64 20  Buf[50];.  void 
1b440 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73  (*converter)(uns
1b450 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61  igned char*, cha
1b460 72 2a 29 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  r*);..  if( argc
1b470 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1b480 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1b490 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73  rp,"wrong # args
1b4a0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1b4b0 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
1b4c0 20 20 20 22 20 54 45 58 54 5c 22 22 2c 20 30 29     " TEXT\"", 0)
1b4d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1b4e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44  _ERROR;.  }.  MD
1b4f0 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 4d  5Init(&ctx);.  M
1b500 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20 28  D5Update(&ctx, (
1b510 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 61  unsigned char*)a
1b520 72 67 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65  rgv[1], (unsigne
1b530 64 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d  d)strlen(argv[1]
1b540 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64  ));.  MD5Final(d
1b550 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20  igest, &ctx);.  
1b560 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69  converter = (voi
1b570 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68  d(*)(unsigned ch
1b580 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20  ar*,char*))cd;. 
1b590 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73   converter(diges
1b5a0 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f  t, zBuf);.  Tcl_
1b5b0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1b5c0 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  erp, zBuf, (char
1b5d0 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
1b5e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1b5f0 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f  A TCL command to
1b600 20 74 61 6b 65 20 74 68 65 20 6d 64 35 20 68 61   take the md5 ha
1b610 73 68 20 6f 66 20 61 20 66 69 6c 65 2e 20 20 54  sh of a file.  T
1b620 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
1b630 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68  he.** name of th
1b640 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
1b650 63 20 69 6e 74 20 6d 64 35 66 69 6c 65 5f 63 6d  c int md5file_cm
1b660 64 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49  d(void*cd, Tcl_I
1b670 6e 74 65 72 70 2a 69 6e 74 65 72 70 2c 20 69 6e  nterp*interp, in
1b680 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
1b690 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 46 49  ar **argv){.  FI
1b6a0 4c 45 20 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f 6e  LE *in;.  MD5Con
1b6b0 74 65 78 74 20 63 74 78 3b 0a 20 20 76 6f 69 64  text ctx;.  void
1b6c0 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e   (*converter)(un
1b6d0 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68  signed char*, ch
1b6e0 61 72 2a 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ar*);.  unsigned
1b6f0 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d   char digest[16]
1b700 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
1b710 32 34 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67  240];..  if( arg
1b720 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1b730 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1b740 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67  erp,"wrong # arg
1b750 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1b760 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1b770 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
1b780 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1b790 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b7a0 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61 72  .  in = fopen(ar
1b7b0 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20 69  gv[1],"rb");.  i
1b7c0 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
1b7d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1b7e0 28 69 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65 20  (interp,"unable 
1b7f0 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 22  to open file \""
1b800 2c 20 61 72 67 76 5b 31 5d 2c 20 0a 20 20 20 20  , argv[1], .    
1b810 20 20 20 20 20 22 5c 22 20 66 6f 72 20 72 65 61       "\" for rea
1b820 64 69 6e 67 22 2c 20 30 29 3b 0a 20 20 20 20 72  ding", 0);.    r
1b830 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b840 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26  .  }.  MD5Init(&
1b850 63 74 78 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ctx);.  for(;;){
1b860 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
1b870 6e 20 3d 20 28 69 6e 74 29 66 72 65 61 64 28 7a  n = (int)fread(z
1b880 42 75 66 2c 20 31 2c 20 73 69 7a 65 6f 66 28 7a  Buf, 1, sizeof(z
1b890 42 75 66 29 2c 20 69 6e 29 3b 0a 20 20 20 20 69  Buf), in);.    i
1b8a0 66 28 20 6e 3c 3d 30 20 29 20 62 72 65 61 6b 3b  f( n<=0 ) break;
1b8b0 0a 20 20 20 20 4d 44 35 55 70 64 61 74 65 28 26  .    MD5Update(&
1b8c0 63 74 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ctx, (unsigned c
1b8d0 68 61 72 2a 29 7a 42 75 66 2c 20 28 75 6e 73 69  har*)zBuf, (unsi
1b8e0 67 6e 65 64 29 6e 29 3b 0a 20 20 7d 0a 20 20 66  gned)n);.  }.  f
1b8f0 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 4d 44 35  close(in);.  MD5
1b900 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 20 26 63  Final(digest, &c
1b910 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72  tx);.  converter
1b920 20 3d 20 28 76 6f 69 64 28 2a 29 28 75 6e 73 69   = (void(*)(unsi
1b930 67 6e 65 64 20 63 68 61 72 2a 2c 63 68 61 72 2a  gned char*,char*
1b940 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65 72 74 65  ))cd;.  converte
1b950 72 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b  r(digest, zBuf);
1b960 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1b970 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1b980 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72  , (char*)0);.  r
1b990 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b9a0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
1b9b0 74 68 65 20 66 6f 75 72 20 6e 65 77 20 54 43 4c  the four new TCL
1b9c0 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 67 65   commands for ge
1b9d0 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63 68 65  nerating MD5 che
1b9e0 63 6b 73 75 6d 73 0a 2a 2a 20 77 69 74 68 20 74  cksums.** with t
1b9f0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1ba00 65 72 2e 0a 2a 2f 0a 69 6e 74 20 4d 64 35 5f 49  er..*/.int Md5_I
1ba10 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
1ba20 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 43  interp){.  Tcl_C
1ba30 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
1ba40 65 72 70 2c 20 22 6d 64 35 22 2c 20 28 54 63 6c  erp, "md5", (Tcl
1ba50 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 5f 63 6d  _CmdProc*)md5_cm
1ba60 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1ba70 20 20 20 20 20 20 20 4d 44 35 44 69 67 65 73 74         MD5Digest
1ba80 54 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a 20 20  ToBase16, 0);.  
1ba90 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e  Tcl_CreateComman
1baa0 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 2d 31  d(interp, "md5-1
1bab0 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72  0x8", (Tcl_CmdPr
1bac0 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20  oc*)md5_cmd,.   
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65   MD5DigestToBase
1baf0 31 30 78 38 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  10x8, 0);.  Tcl_
1bb00 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
1bb10 74 65 72 70 2c 20 22 6d 64 35 66 69 6c 65 22 2c  terp, "md5file",
1bb20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d   (Tcl_CmdProc*)m
1bb30 64 35 66 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20  d5file_cmd,.    
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb50 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1bb60 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  6, 0);.  Tcl_Cre
1bb70 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
1bb80 70 2c 20 22 6d 64 35 66 69 6c 65 2d 31 30 78 38  p, "md5file-10x8
1bb90 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a  ", (Tcl_CmdProc*
1bba0 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a 20 20  )md5file_cmd,.  
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73    MD5DigestToBas
1bbd0 65 31 30 78 38 2c 20 30 29 3b 0a 20 20 72 65 74  e10x8, 0);.  ret
1bbe0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
1bbf0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
1bc00 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
1bc10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1bc20 43 4c 4d 44 35 29 20 2a 2f 0a 0a 23 69 66 20 64  CLMD5) */..#if d
1bc30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1bc40 53 54 29 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67  ST)./*.** During
1bc50 20 74 65 73 74 69 6e 67 2c 20 74 68 65 20 73 70   testing, the sp
1bc60 65 63 69 61 6c 20 6d 64 35 73 75 6d 28 29 20 61  ecial md5sum() a
1bc70 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1bc80 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  n is available..
1bc90 2a 2a 20 69 6e 73 69 64 65 20 53 51 4c 69 74 65  ** inside SQLite
1bca0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1bcb0 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
1bcc0 65 6e 74 20 74 68 61 74 20 66 75 6e 63 74 69 6f  ent that functio
1bcd0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1bce0 64 20 6d 64 35 73 74 65 70 28 73 71 6c 69 74 65  d md5step(sqlite
1bcf0 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
1bd00 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
1bd10 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1bd20 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78  gv){.  MD5Contex
1bd30 74 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  t *p;.  int i;. 
1bd40 20 69 66 28 20 61 72 67 63 3c 31 20 29 20 72 65   if( argc<1 ) re
1bd50 74 75 72 6e 3b 0a 20 20 70 20 3d 20 73 71 6c 69  turn;.  p = sqli
1bd60 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
1bd70 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
1bd80 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
1bd90 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
1bda0 0a 20 20 69 66 28 20 21 70 2d 3e 69 73 49 6e 69  .  if( !p->isIni
1bdb0 74 20 29 7b 0a 20 20 20 20 4d 44 35 49 6e 69 74  t ){.    MD5Init
1bdc0 28 70 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (p);.  }.  for(i
1bdd0 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
1bde0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1bdf0 20 2a 7a 44 61 74 61 20 3d 20 28 63 68 61 72 2a   *zData = (char*
1be00 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1be10 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  ext(argv[i]);.  
1be20 20 20 69 66 28 20 7a 44 61 74 61 20 29 7b 0a 20    if( zData ){. 
1be30 20 20 20 20 20 4d 44 35 55 70 64 61 74 65 28 70       MD5Update(p
1be40 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1be50 2a 29 7a 44 61 74 61 2c 20 28 69 6e 74 29 73 74  *)zData, (int)st
1be60 72 6c 65 6e 28 7a 44 61 74 61 29 29 3b 0a 20 20  rlen(zData));.  
1be70 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
1be80 20 76 6f 69 64 20 6d 64 35 66 69 6e 61 6c 69 7a   void md5finaliz
1be90 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
1bea0 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 4d  t *context){.  M
1beb0 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20  D5Context *p;.  
1bec0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69  unsigned char di
1bed0 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72  gest[16];.  char
1bee0 20 7a 42 75 66 5b 33 33 5d 3b 0a 20 20 70 20 3d   zBuf[33];.  p =
1bef0 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
1bf00 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
1bf10 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  xt, sizeof(*p));
1bf20 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65  .  MD5Final(dige
1bf30 73 74 2c 70 29 3b 0a 20 20 4d 44 35 44 69 67 65  st,p);.  MD5Dige
1bf40 73 74 54 6f 42 61 73 65 31 36 28 64 69 67 65 73  stToBase16(diges
1bf50 74 2c 20 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69  t, zBuf);.  sqli
1bf60 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1bf70 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d  context, zBuf, -
1bf80 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
1bf90 45 4e 54 29 3b 0a 7d 0a 69 6e 74 20 4d 64 35 5f  ENT);.}.int Md5_
1bfa0 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33  Register(sqlite3
1bfb0 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20   *db){.  int rc 
1bfc0 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
1bfd0 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d  _function(db, "m
1bfe0 64 35 73 75 6d 22 2c 20 2d 31 2c 20 53 51 4c 49  d5sum", -1, SQLI
1bff0 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 0a  TE_UTF8, 0, 0, .
1c000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c020 20 6d 64 35 73 74 65 70 2c 20 6d 64 35 66 69 6e   md5step, md5fin
1c030 61 6c 69 7a 65 29 3b 0a 20 20 73 71 6c 69 74 65  alize);.  sqlite
1c040 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
1c050 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d 22  ion(db, "md5sum"
1c060 2c 20 2d 31 29 3b 20 20 2f 2a 20 54 6f 20 65 78  , -1);  /* To ex
1c070 65 72 63 69 73 65 20 74 68 69 73 20 41 50 49 20  ercise this API 
1c080 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
1c090 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
1c0a0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1c0b0 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   */.../*.** If t
1c0c0 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69  he macro TCLSH i
1c0d0 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20  s one, then put 
1c0e0 69 6e 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72  in code this for
1c0f0 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72   the.** "main" r
1c100 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
1c110 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20   initialize Tcl 
1c120 61 6e 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66  and take input f
1c130 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20  rom.** standard 
1c140 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 61 20 66  input, or if a f
1c150 69 6c 65 20 69 73 20 6e 61 6d 65 64 20 6f 6e 20  ile is named on 
1c160 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
1c170 0a 2a 2a 20 74 68 65 20 54 43 4c 20 69 6e 74 65  .** the TCL inte
1c180 72 70 72 65 74 65 72 20 72 65 61 64 73 20 61 6e  rpreter reads an
1c190 64 20 65 76 61 6c 75 61 74 65 73 20 74 68 61 74  d evaluates that
1c1a0 20 66 69 6c 65 2e 0a 2a 2f 0a 23 69 66 20 54 43   file..*/.#if TC
1c1b0 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 6f  LSH==1.static co
1c1c0 6e 73 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f  nst char *tclsh_
1c1d0 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 7b  main_loop(void){
1c1e0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1c1f0 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d  char zMainloop[]
1c200 20 3d 0a 20 20 20 20 22 73 65 74 20 6c 69 6e 65   =.    "set line
1c210 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 77 68 69 6c   {}\n".    "whil
1c220 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d  e {![eof stdin]}
1c230 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20   {\n".      "if 
1c240 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c  {$line!=\"\"} {\
1c250 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
1c260 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20   -nonewline \"> 
1c270 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65  \"\n".      "} e
1c280 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  lse {\n".       
1c290 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e   "puts -nonewlin
1c2a0 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20  e \"% \"\n".    
1c2b0 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 66    "}\n".      "f
1c2c0 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20  lush stdout\n". 
1c2d0 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e       "append lin
1c2e0 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e  e [gets stdin]\n
1c2f0 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 69 6e  ".      "if {[in
1c300 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e  fo complete $lin
1c310 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  e]} {\n".       
1c320 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70   "if {[catch {up
1c330 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20  level #0 $line} 
1c340 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20  result]} {\n".  
1c350 20 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74          "puts st
1c360 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72  derr \"Error: $r
1c370 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20  esult\"\n".     
1c380 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72     "} elseif {$r
1c390 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  esult!=\"\"} {\n
1c3a0 22 0a 20 20 20 20 20 20 20 20 20 20 22 70 75 74  ".          "put
1c3b0 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20  s $result\n".   
1c3c0 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20       "}\n".     
1c3d0 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c     "set line {}\
1c3e0 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65  n".      "} else
1c3f0 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 61   {\n".        "a
1c400 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e  ppend line \\n\n
1c410 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20  ".      "}\n".  
1c420 20 20 22 7d 5c 6e 22 0a 20 20 3b 0a 20 20 72 65    "}\n".  ;.  re
1c430 74 75 72 6e 20 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a  turn zMainloop;.
1c440 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 54 43 4c  }.#endif.#if TCL
1c450 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63 6f 6e  SH==2.static con
1c460 73 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d  st char *tclsh_m
1c470 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 3b 0a  ain_loop(void);.
1c480 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1c490 51 4c 49 54 45 5f 54 45 53 54 0a 73 74 61 74 69  QLITE_TEST.stati
1c4a0 63 20 76 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28  c void init_all(
1c4b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 73  Tcl_Interp *);.s
1c4c0 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 5f 61  tatic int init_a
1c4d0 6c 6c 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74  ll_cmd(.  Client
1c4e0 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49  Data cd,.  Tcl_I
1c4f0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1c500 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1c510 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c520 5b 5d 0a 29 7b 0a 0a 20 20 54 63 6c 5f 49 6e 74  [].){..  Tcl_Int
1c530 65 72 70 20 2a 73 6c 61 76 65 3b 0a 20 20 69 66  erp *slave;.  if
1c540 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1c550 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1c560 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1c570 76 2c 20 22 53 4c 41 56 45 22 29 3b 0a 20 20 20  v, "SLAVE");.   
1c580 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c590 52 3b 0a 20 20 7d 0a 0a 20 20 73 6c 61 76 65 20  R;.  }..  slave 
1c5a0 3d 20 54 63 6c 5f 47 65 74 53 6c 61 76 65 28 69  = Tcl_GetSlave(i
1c5b0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1c5c0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a  ring(objv[1]));.
1c5d0 20 20 69 66 28 20 21 73 6c 61 76 65 20 29 7b 0a    if( !slave ){.
1c5e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c5f0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 69  RROR;.  }..  ini
1c600 74 5f 61 6c 6c 28 73 6c 61 76 65 29 3b 0a 20 20  t_all(slave);.  
1c610 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1c620 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63 6d 64 3a 20  ../*.** Tclcmd: 
1c630 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72  db_use_legacy_pr
1c640 65 70 61 72 65 20 44 42 20 42 4f 4f 4c 45 41 4e  epare DB BOOLEAN
1c650 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 69 72  .**.**   The fir
1c660 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  st argument to t
1c670 68 69 73 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74  his command must
1c680 20 62 65 20 61 20 64 61 74 61 62 61 73 65 20 63   be a database c
1c690 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 64 20 62  ommand created b
1c6a0 79 0a 2a 2a 20 20 20 5b 73 71 6c 69 74 65 33 5d  y.**   [sqlite3]
1c6b0 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
1c6c0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
1c6d0 2c 20 74 68 65 6e 20 74 68 65 20 68 61 6e 64 6c  , then the handl
1c6e0 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a  e is configured.
1c6f0 2a 2a 20 20 20 74 6f 20 75 73 65 20 74 68 65 20  **   to use the 
1c700 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1c710 76 32 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  v2() function to
1c720 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65   prepare stateme
1c730 6e 74 73 2e 20 49 66 20 69 74 0a 2a 2a 20 20 20  nts. If it.**   
1c740 69 73 20 66 61 6c 73 65 2c 20 73 71 6c 69 74 65  is false, sqlite
1c750 33 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a  3_prepare()..*/.
1c760 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f 75 73  static int db_us
1c770 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65  e_legacy_prepare
1c780 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  _cmd(.  ClientDa
1c790 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  ta cd,.  Tcl_Int
1c7a0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c7b0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c7c0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c7d0 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
1c7e0 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 53 71 6c  o cmdInfo;.  Sql
1c7f0 69 74 65 44 62 20 2a 70 44 62 3b 0a 20 20 69 6e  iteDb *pDb;.  in
1c800 74 20 62 50 72 65 70 61 72 65 3b 0a 0a 20 20 69  t bPrepare;..  i
1c810 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1c820 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1c830 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1c840 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22  jv, "DB BOOLEAN"
1c850 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c860 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1c870 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
1c880 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
1c890 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c8a0 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f  jv[1]), &cmdInfo
1c8b0 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ) ){.    Tcl_App
1c8c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1c8d0 2c 20 22 6e 6f 20 73 75 63 68 20 64 62 3a 20 22  , "no such db: "
1c8e0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1c8f0 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
1c900 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
1c910 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1c920 20 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62   pDb = (SqliteDb
1c930 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69  *)cmdInfo.objCli
1c940 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 54  entData;.  if( T
1c950 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
1c960 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1c970 76 5b 32 5d 2c 20 26 62 50 72 65 70 61 72 65 29  v[2], &bPrepare)
1c980 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1c990 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1c9a0 20 70 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65   pDb->bLegacyPre
1c9b0 70 61 72 65 20 3d 20 62 50 72 65 70 61 72 65 3b  pare = bPrepare;
1c9c0 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ..  Tcl_ResetRes
1c9d0 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72  ult(interp);.  r
1c9e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1c9f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
1ca00 6e 66 69 67 75 72 65 20 74 68 65 20 69 6e 74 65  nfigure the inte
1ca10 72 70 72 65 74 65 72 20 70 61 73 73 65 64 20 61  rpreter passed a
1ca20 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
1ca30 6d 65 6e 74 20 74 6f 20 68 61 76 65 20 61 63 63  ment to have acc
1ca40 65 73 73 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ess.** to the co
1ca50 6d 6d 61 6e 64 73 20 61 6e 64 20 6c 69 6e 6b 65  mmands and linke
1ca60 64 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  d variables that
1ca70 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a 2a 20   make up:.**.** 
1ca80 20 20 2a 20 74 68 65 20 5b 73 71 6c 69 74 65 33    * the [sqlite3
1ca90 5d 20 65 78 74 65 6e 73 69 6f 6e 20 69 74 73 65  ] extension itse
1caa0 6c 66 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  lf, .**.**   * I
1cab0 66 20 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 20  f SQLITE_TCLMD5 
1cac0 6f 72 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69  or SQLITE_TEST i
1cad0 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4d  s defined, the M
1cae0 64 35 20 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64  d5 commands, and
1caf0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51  .**.**   * If SQ
1cb00 4c 49 54 45 5f 54 45 53 54 20 69 73 20 73 65 74  LITE_TEST is set
1cb10 2c 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 65  , the various te
1cb20 73 74 20 69 6e 74 65 72 66 61 63 65 73 20 75 73  st interfaces us
1cb30 65 64 20 62 79 20 74 68 65 20 54 63 6c 0a 2a 2a  ed by the Tcl.**
1cb40 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65 2e       test suite.
1cb50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1cb60 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74  init_all(Tcl_Int
1cb70 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
1cb80 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
1cb90 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  erp);..#if defin
1cba0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
1cbb0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1cbc0 45 5f 54 43 4c 4d 44 35 29 0a 20 20 4d 64 35 5f  E_TCLMD5).  Md5_
1cbd0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
1cbe0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 74 61  ndif..  /* Insta
1cbf0 6c 6c 20 74 68 65 20 5b 72 65 67 69 73 74 65 72  ll the [register
1cc00 5f 64 62 73 74 61 74 5f 76 74 61 62 5d 20 63 6f  _dbstat_vtab] co
1cc10 6d 6d 61 6e 64 20 74 6f 20 61 63 63 65 73 73 20  mmand to access 
1cc20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
1cc30 6f 6e 0a 20 20 2a 2a 20 6f 66 20 76 69 72 74 75  on.  ** of virtu
1cc40 61 6c 20 74 61 62 6c 65 20 64 62 73 74 61 74 20  al table dbstat 
1cc50 28 73 6f 75 72 63 65 20 66 69 6c 65 20 74 65 73  (source file tes
1cc60 74 5f 73 74 61 74 2e 63 29 2e 20 54 68 69 73 20  t_stat.c). This 
1cc70 63 6f 6d 6d 61 6e 64 20 69 73 0a 20 20 2a 2a 20  command is.  ** 
1cc80 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 65 73  required for tes
1cc90 74 66 69 78 74 75 72 65 20 61 6e 64 20 73 71 6c  tfixture and sql
1cca0 69 74 65 33 5f 61 6e 61 6c 79 7a 65 72 2c 20 62  ite3_analyzer, b
1ccb0 75 74 20 6e 6f 74 20 62 79 20 74 68 65 20 70 72  ut not by the pr
1ccc0 6f 64 75 63 74 69 6f 6e 0a 20 20 2a 2a 20 54 63  oduction.  ** Tc
1ccd0 6c 20 65 78 74 65 6e 73 69 6f 6e 2e 20 20 2a 2f  l extension.  */
1cce0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1ccf0 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 54 43 4c  ITE_TEST) || TCL
1cd00 53 48 3d 3d 32 0a 20 20 7b 0a 20 20 20 20 65 78  SH==2.  {.    ex
1cd10 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1cd20 65 73 74 53 74 61 74 5f 49 6e 69 74 28 54 63 6c  estStat_Init(Tcl
1cd30 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 53  _Interp*);.    S
1cd40 71 6c 69 74 65 74 65 73 74 53 74 61 74 5f 49 6e  qlitetestStat_In
1cd50 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  it(interp);.  }.
1cd60 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1cd70 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20  QLITE_TEST.  {. 
1cd80 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1cd90 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28  liteconfig_Init(
1cda0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1cdb0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1cdc0 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
1cdd0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1cde0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1cdf0 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f  etest2_Init(Tcl_
1ce00 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1ce10 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1ce20 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est3_Init(Tcl_In
1ce30 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1ce40 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1ce50 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t4_Init(Tcl_Inte
1ce60 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1ce70 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35   int Sqlitetest5
1ce80 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1ce90 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1cea0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49  nt Sqlitetest6_I
1ceb0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1cec0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1ced0 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69   Sqlitetest7_Ini
1cee0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1cef0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1cf00 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28  qlitetest8_Init(
1cf10 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1cf20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1cf30 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63  itetest9_Init(Tc
1cf40 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1cf50 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1cf60 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28  etestasync_Init(
1cf70 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1cf80 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1cf90 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f  itetest_autoext_
1cfa0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1cfb0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1cfc0 74 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d  t Sqlitetest_dem
1cfd0 6f 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ovfs_Init(Tcl_In
1cfe0 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74  terp *);.    ext
1cff0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1d000 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c  st_func_Init(Tcl
1d010 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1d020 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1d030 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28  test_hexio_Init(
1d040 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1d050 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1d060 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69  itetest_init_Ini
1d070 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1d080 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1d090 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63  qlitetest_malloc
1d0a0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1d0b0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1d0c0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75  nt Sqlitetest_mu
1d0d0 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  tex_Init(Tcl_Int
1d0e0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1d0f0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1d100 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f  schema_Init(Tcl_
1d110 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1d120 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1d130 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f  estsse_Init(Tcl_
1d140 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1d150 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1d160 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54  esttclvar_Init(T
1d170 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1d180 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1d190 74 65 74 65 73 74 66 73 5f 49 6e 69 74 28 54 63  tetestfs_Init(Tc
1d1a0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1d1b0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1d1c0 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74  etestThread_Init
1d1d0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1d1e0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1d1f0 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f  litetestOnefile_
1d200 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74 65  Init();.    exte
1d210 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1d220 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c  tOsinst_Init(Tcl
1d230 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1d240 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1d250 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28  testbackup_Init(
1d260 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1d270 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1d280 69 74 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f  itetestintarray_
1d290 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1d2a0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1d2b0 74 20 53 71 6c 69 74 65 74 65 73 74 76 66 73 5f  t Sqlitetestvfs_
1d2c0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1d2d0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1d2e0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 72 74 72  nt Sqlitetestrtr
1d2f0 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ee_Init(Tcl_Inte
1d300 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1d310 20 69 6e 74 20 53 71 6c 69 74 65 71 75 6f 74 61   int Sqlitequota
1d320 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1d330 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1d340 6e 74 20 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c  nt Sqlitemultipl
1d350 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ex_Init(Tcl_Inte
1d360 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1d370 20 69 6e 74 20 53 71 6c 69 74 65 53 75 70 65 72   int SqliteSuper
1d380 6c 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lock_Init(Tcl_In
1d390 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1d3a0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1d3b0 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 54 63  tSyscall_Init(Tc
1d3c0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 23 69 66 20  l_Interp*);.#if 
1d3d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1d3e0 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26  NABLE_SESSION) &
1d3f0 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
1d400 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
1d410 45 5f 48 4f 4f 4b 29 0a 20 20 20 20 65 78 74 65  E_HOOK).    exte
1d420 72 6e 20 69 6e 74 20 54 65 73 74 53 65 73 73 69  rn int TestSessi
1d430 6f 6e 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  on_Init(Tcl_Inte
1d440 72 70 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  rp*);.#endif..#i
1d450 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d460 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c  _ENABLE_FTS3) ||
1d470 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1d480 45 4e 41 42 4c 45 5f 46 54 53 34 29 0a 20 20 20  ENABLE_FTS4).   
1d490 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1d4a0 74 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74 28  tetestfts3_Init(
1d4b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1d4c0 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  rp);.#endif..#if
1d4d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1d4e0 45 5f 5a 49 50 56 46 53 0a 20 20 20 20 65 78 74  E_ZIPVFS.    ext
1d4f0 65 72 6e 20 69 6e 74 20 5a 69 70 76 66 73 5f 49  ern int Zipvfs_I
1d500 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1d510 3b 0a 20 20 20 20 5a 69 70 76 66 73 5f 49 6e 69  ;.    Zipvfs_Ini
1d520 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
1d530 66 0a 0a 20 20 20 20 53 71 6c 69 74 65 63 6f 6e  f..    Sqlitecon
1d540 66 69 67 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  fig_Init(interp)
1d550 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1d560 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  1_Init(interp);.
1d570 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f      Sqlitetest2_
1d580 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1d590 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e    Sqlitetest3_In
1d5a0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1d5b0 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
1d5c0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1d5d0 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69  litetest5_Init(i
1d5e0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1d5f0 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74  tetest6_Init(int
1d600 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d610 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72  test7_Init(inter
1d620 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1d630 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st8_Init(interp)
1d640 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1d650 39 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  9_Init(interp);.
1d660 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61 73      Sqlitetestas
1d670 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ync_Init(interp)
1d680 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1d690 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e  _autoext_Init(in
1d6a0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1d6b0 65 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e  etest_demovfs_In
1d6c0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1d6d0 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f  Sqlitetest_func_
1d6e0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1d6f0 20 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78    Sqlitetest_hex
1d700 69 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  io_Init(interp);
1d710 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1d720 69 6e 69 74 5f 49 6e 69 74 28 69 6e 74 65 72 70  init_Init(interp
1d730 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1d740 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e  t_malloc_Init(in
1d750 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1d760 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74  etest_mutex_Init
1d770 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1d780 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49  litetestschema_I
1d790 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1d7a0 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61   Sqlitetesttclva
1d7b0 72 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  r_Init(interp);.
1d7c0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 66 73      Sqlitetestfs
1d7d0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1d7e0 20 20 20 53 71 6c 69 74 65 74 65 73 74 54 68 72     SqlitetestThr
1d7f0 65 61 64 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ead_Init(interp)
1d800 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1d810 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 69 6e 74  Onefile_Init(int
1d820 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d830 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28  testOsinst_Init(
1d840 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1d850 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e  itetestbackup_In
1d860 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1d870 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72  Sqlitetestintarr
1d880 61 79 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ay_Init(interp);
1d890 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 76  .    Sqlitetestv
1d8a0 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  fs_Init(interp);
1d8b0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 72  .    Sqlitetestr
1d8c0 74 72 65 65 5f 49 6e 69 74 28 69 6e 74 65 72 70  tree_Init(interp
1d8d0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 71 75 6f  );.    Sqlitequo
1d8e0 74 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ta_Init(interp);
1d8f0 0a 20 20 20 20 53 71 6c 69 74 65 6d 75 6c 74 69  .    Sqlitemulti
1d900 70 6c 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70  plex_Init(interp
1d910 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 53 75 70  );.    SqliteSup
1d920 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e 74 65  erlock_Init(inte
1d930 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1d940 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28  estSyscall_Init(
1d950 69 6e 74 65 72 70 29 3b 0a 23 69 66 20 64 65 66  interp);.#if def
1d960 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1d970 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26 26 20 64  LE_SESSION) && d
1d980 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1d990 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
1d9a0 4f 4f 4b 29 0a 20 20 20 20 54 65 73 74 53 65 73  OOK).    TestSes
1d9b0 73 69 6f 6e 5f 49 6e 69 74 28 69 6e 74 65 72 70  sion_Init(interp
1d9c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  );.#endif..#if d
1d9d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1d9e0 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65  ABLE_FTS3) || de
1d9f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1da00 42 4c 45 5f 46 54 53 34 29 0a 20 20 20 20 53 71  BLE_FTS4).    Sq
1da10 6c 69 74 65 74 65 73 74 66 74 73 33 5f 49 6e 69  litetestfts3_Ini
1da20 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
1da30 66 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  f..    Tcl_Creat
1da40 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20  eObjCommand(.   
1da50 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22 6c 6f       interp, "lo
1da60 61 64 5f 74 65 73 74 66 69 78 74 75 72 65 5f 65  ad_testfixture_e
1da70 78 74 65 6e 73 69 6f 6e 73 22 2c 20 69 6e 69 74  xtensions", init
1da80 5f 61 6c 6c 5f 63 6d 64 2c 20 30 2c 20 30 0a 20  _all_cmd, 0, 0. 
1da90 20 20 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72     );.    Tcl_Cr
1daa0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a  eateObjCommand(.
1dab0 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
1dac0 22 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70  "db_use_legacy_p
1dad0 72 65 70 61 72 65 22 2c 20 64 62 5f 75 73 65 5f  repare", db_use_
1dae0 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63  legacy_prepare_c
1daf0 6d 64 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  md, 0, 0.    );.
1db00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
1db10 53 45 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  SE.    Sqlitetes
1db20 74 73 73 65 5f 49 6e 69 74 28 69 6e 74 65 72 70  tsse_Init(interp
1db30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65  );.#endif.  }.#e
1db40 6e 64 69 66 0a 7d 0a 0a 23 64 65 66 69 6e 65 20  ndif.}..#define 
1db50 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20  TCLSH_MAIN main 
1db60 20 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66    /* Needed to f
1db70 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70  ake out mktclapp
1db80 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41   */.int TCLSH_MA
1db90 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  IN(int argc, cha
1dba0 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c  r **argv){.  Tcl
1dbb0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
1dbc0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  ..#if !defined(_
1dbd0 57 49 4e 33 32 5f 57 43 45 29 0a 20 20 69 66 28  WIN32_WCE).  if(
1dbe0 20 67 65 74 65 6e 76 28 22 42 52 45 41 4b 22 29   getenv("BREAK")
1dbf0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1dc00 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20  stderr,.        
1dc10 22 61 74 74 61 63 68 20 64 65 62 75 67 67 65 72  "attach debugger
1dc20 20 74 6f 20 70 72 6f 63 65 73 73 20 25 64 20 61   to process %d a
1dc30 6e 64 20 70 72 65 73 73 20 61 6e 79 20 6b 65 79  nd press any key
1dc40 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 5c 6e 22   to continue.\n"
1dc50 2c 0a 20 20 20 20 20 20 20 20 47 45 54 50 49 44  ,.        GETPID
1dc60 28 29 29 3b 0a 20 20 20 20 66 67 65 74 63 28 73  ());.    fgetc(s
1dc70 74 64 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tdin);.  }.#endi
1dc80 66 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c  f..  /* Call sql
1dc90 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20  ite3_shutdown() 
1dca0 6f 6e 63 65 20 62 65 66 6f 72 65 20 64 6f 69 6e  once before doin
1dcb0 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e  g anything else.
1dcc0 20 54 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a   This is to.  **
1dcd0 20 74 65 73 74 20 74 68 61 74 20 73 71 6c 69 74   test that sqlit
1dce0 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 63 61  e3_shutdown() ca
1dcf0 6e 20 62 65 20 73 61 66 65 6c 79 20 63 61 6c 6c  n be safely call
1dd00 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
1dd10 62 65 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69  before.  ** sqli
1dd20 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1dd30 20 69 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65   is. */.  sqlite
1dd40 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 20  3_shutdown();.. 
1dd50 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61   Tcl_FindExecuta
1dd60 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
1dd70 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65  interp = Tcl_Cre
1dd80 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 0a 23 69  ateInterp();..#i
1dd90 66 20 54 43 4c 53 48 3d 3d 32 0a 20 20 73 71 6c  f TCLSH==2.  sql
1dda0 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
1ddb0 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45  TE_CONFIG_SINGLE
1ddc0 54 48 52 45 41 44 29 3b 0a 23 65 6e 64 69 66 0a  THREAD);.#endif.
1ddd0 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 69 6e 74 65  .  init_all(inte
1dde0 72 70 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3e  rp);.  if( argc>
1ddf0 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =2 ){.    int i;
1de00 0a 20 20 20 20 63 68 61 72 20 7a 41 72 67 63 5b  .    char zArgc[
1de10 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  32];.    sqlite3
1de20 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1de30 28 7a 41 72 67 63 29 2c 20 7a 41 72 67 63 2c 20  (zArgc), zArgc, 
1de40 22 25 64 22 2c 20 61 72 67 63 2d 28 33 2d 54 43  "%d", argc-(3-TC
1de50 4c 53 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  LSH));.    Tcl_S
1de60 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
1de70 67 63 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f  gc", zArgc, TCL_
1de80 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
1de90 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
1dea0 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76  erp,"argv0",argv
1deb0 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  [1],TCL_GLOBAL_O
1dec0 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  NLY);.    Tcl_Se
1ded0 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
1dee0 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42  v", "", TCL_GLOB
1def0 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f  AL_ONLY);.    fo
1df00 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61  r(i=3-TCLSH; i<a
1df10 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
1df20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
1df30 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76  rp, "argv", argv
1df40 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54  [i],.          T
1df50 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c  CL_GLOBAL_ONLY |
1df60 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e   TCL_LIST_ELEMEN
1df70 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56  T | TCL_APPEND_V
1df80 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ALUE);.    }.   
1df90 20 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26   if( TCLSH==1 &&
1dfa0 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e   Tcl_EvalFile(in
1dfb0 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d  terp, argv[1])!=
1dfc0 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
1dfd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66  const char *zInf
1dfe0 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69  o = Tcl_GetVar(i
1dff0 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66  nterp, "errorInf
1e000 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  o", TCL_GLOBAL_O
1e010 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NLY);.      if( 
1e020 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f  zInfo==0 ) zInfo
1e030 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1e040 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
1e050 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1e060 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c  derr,"%s: %s\n",
1e070 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a   *argv, zInfo);.
1e080 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1e090 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1e0a0 54 43 4c 53 48 3d 3d 32 20 7c 7c 20 61 72 67 63  TCLSH==2 || argc
1e0b0 3c 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47  <=1 ){.    Tcl_G
1e0c0 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70  lobalEval(interp
1e0d0 2c 20 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f  , tclsh_main_loo
1e0e0 70 28 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  p());.  }.  retu
1e0f0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
1e100 2a 20 54 43 4c 53 48 20 2a 2f 0a                 * TCLSH */.