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

Artifact 21432a361808b6c3d405710cdd22fa1b16f7b84f:


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 49 6e  nclude "sqliteIn
0500: 74 2e 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c  t.h".# include <
0510: 73 74 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c  stdlib.h>.# incl
0520: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
0530: 20 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74   include <assert
0540: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  .h>.#endif.#incl
0550: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f  ude <ctype.h>../
0560: 2a 0a 20 2a 20 57 69 6e 64 6f 77 73 20 6e 65 65  *. * Windows nee
0570: 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68 69 63 68  ds to know which
0580: 20 73 79 6d 62 6f 6c 73 20 74 6f 20 65 78 70 6f   symbols to expo
0590: 72 74 2e 20 20 55 6e 69 78 20 64 6f 65 73 20 6e  rt.  Unix does n
05a0: 6f 74 2e 0a 20 2a 20 42 55 49 4c 44 5f 73 71 6c  ot.. * BUILD_sql
05b0: 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20 75 6e  ite should be un
05c0: 64 65 66 69 6e 65 64 20 66 6f 72 20 55 6e 69 78  defined for Unix
05d0: 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 42 55 49  .. */.#ifdef BUI
05e0: 4c 44 5f 73 71 6c 69 74 65 0a 23 75 6e 64 65 66  LD_sqlite.#undef
05f0: 20 54 43 4c 5f 53 54 4f 52 41 47 45 5f 43 4c 41   TCL_STORAGE_CLA
0600: 53 53 0a 23 64 65 66 69 6e 65 20 54 43 4c 5f 53  SS.#define TCL_S
0610: 54 4f 52 41 47 45 5f 43 4c 41 53 53 20 44 4c 4c  TORAGE_CLASS DLL
0620: 45 58 50 4f 52 54 0a 23 65 6e 64 69 66 20 2f 2a  EXPORT.#endif /*
0630: 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 2a 2f   BUILD_sqlite */
0640: 0a 0a 23 64 65 66 69 6e 65 20 4e 55 4d 5f 50 52  ..#define NUM_PR
0650: 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31 30 0a  EPARED_STMTS 10.
0660: 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 52 45 50  #define MAX_PREP
0670: 41 52 45 44 5f 53 54 4d 54 53 20 31 30 30 0a 0a  ARED_STMTS 100..
0680: 2f 2a 0a 2a 2a 20 49 66 20 54 43 4c 20 75 73 65  /*.** If TCL use
0690: 73 20 55 54 46 2d 38 20 61 6e 64 20 53 51 4c 69  s UTF-8 and SQLi
06a0: 74 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  te is configured
06b0: 20 74 6f 20 75 73 65 20 69 73 6f 38 38 35 39 2c   to use iso8859,
06c0: 20 74 68 65 6e 20 77 65 0a 2a 2a 20 68 61 76 65   then we.** have
06d0: 20 74 6f 20 64 6f 20 61 20 74 72 61 6e 73 6c 61   to do a transla
06e0: 74 69 6f 6e 20 77 68 65 6e 20 67 6f 69 6e 67 20  tion when going 
06f0: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 2e  between the two.
0700: 20 20 53 65 74 20 74 68 65 20 0a 2a 2a 20 55 54    Set the .** UT
0710: 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45  F_TRANSLATION_NE
0720: 45 44 45 44 20 6d 61 63 72 6f 20 74 6f 20 69 6e  EDED macro to in
0730: 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20 6e  dicate that we n
0740: 65 65 64 20 74 6f 20 64 6f 0a 2a 2a 20 74 68 69  eed to do.** thi
0750: 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2e 20 20  s translation.  
0760: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
0770: 54 43 4c 5f 55 54 46 5f 4d 41 58 29 20 26 26 20  TCL_UTF_MAX) && 
0780: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0790: 55 54 46 38 29 0a 23 20 64 65 66 69 6e 65 20 55  UTF8).# define U
07a0: 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e  TF_TRANSLATION_N
07b0: 45 45 44 45 44 20 31 0a 23 65 6e 64 69 66 0a 0a  EEDED 1.#endif..
07c0: 2f 2a 0a 2a 2a 20 4e 65 77 20 53 51 4c 20 66 75  /*.** New SQL fu
07d0: 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 63  nctions can be c
07e0: 72 65 61 74 65 64 20 61 73 20 54 43 4c 20 73 63  reated as TCL sc
07f0: 72 69 70 74 73 2e 20 20 45 61 63 68 20 73 75 63  ripts.  Each suc
0800: 68 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  h function.** is
0810: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61 6e   described by an
0820: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0830: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
0840: 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ture..*/.typedef
0850: 20 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63 20   struct SqlFunc 
0860: 53 71 6c 46 75 6e 63 3b 0a 73 74 72 75 63 74 20  SqlFunc;.struct 
0870: 53 71 6c 46 75 6e 63 20 7b 0a 20 20 54 63 6c 5f  SqlFunc {.  Tcl_
0880: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20  Interp *interp; 
0890: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
08a0: 65 72 70 72 65 74 20 74 6f 20 65 78 65 63 75 74  erpret to execut
08b0: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  e the function *
08c0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63  /.  Tcl_Obj *pSc
08d0: 72 69 70 74 3b 20 20 20 20 20 2f 2a 20 54 68 65  ript;     /* The
08e0: 20 54 63 6c 5f 4f 62 6a 20 72 65 70 72 65 73 65   Tcl_Obj represe
08f0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
0900: 63 72 69 70 74 20 2a 2f 0a 20 20 69 6e 74 20 75  cript */.  int u
0910: 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20 20 20  seEvalObjv;     
0920: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74 20 69   /* True if it i
0930: 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54 63  s safe to use Tc
0940: 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a 20 20  l_EvalObjv */.  
0950: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
0960: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
0970: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
0980: 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 4e 65  /.  SqlFunc *pNe
0990: 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  xt;       /* Nex
09a0: 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68  t function on th
09b0: 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  e list of them a
09c0: 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ll */.};../*.** 
09d0: 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  New collation se
09e0: 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69 6f 6e  quences function
09f0: 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20   can be created 
0a00: 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20  as TCL scripts. 
0a10: 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20 66 75   Each such.** fu
0a20: 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63 72 69  nction is descri
0a30: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0a40: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0a50: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0a60: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0a70: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71 6c 43   SqlCollate SqlC
0a80: 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74 20 53  ollate;.struct S
0a90: 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20 54 63  qlCollate {.  Tc
0aa0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0ab0: 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69  ;   /* The TCL i
0ac0: 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65 63  nterpret to exec
0ad0: 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ute the function
0ae0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63 72   */.  char *zScr
0af0: 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ipt;        /* T
0b00: 68 65 20 73 63 72 69 70 74 20 74 6f 20 62 65 20  he script to be 
0b10: 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c  run */.  SqlColl
0b20: 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 2f  ate *pNext;    /
0b30: 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20  * Next function 
0b40: 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74  on the list of t
0b50: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  hem all */.};../
0b60: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20 73 74  *.** Prepared st
0b70: 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63 61 63  atements are cac
0b80: 68 65 64 20 66 6f 72 20 66 61 73 74 65 72 20 65  hed for faster e
0b90: 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63 68 20  xecution.  Each 
0ba0: 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74  prepared.** stat
0bb0: 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72 69 62  ement is describ
0bc0: 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63  ed by an instanc
0bd0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0be0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
0bf0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0c00: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
0c10: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 3b  SqlPreparedStmt;
0c20: 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65 70 61  .struct SqlPrepa
0c30: 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71 6c 50  redStmt {.  SqlP
0c40: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e 65  reparedStmt *pNe
0c50: 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20  xt;  /* Next in 
0c60: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a 20  linked list */. 
0c70: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0c80: 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50 72 65   *pPrev;  /* Pre
0c90: 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c 69 73  vious on the lis
0ca0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  t */.  sqlite3_s
0cb0: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
0cc0: 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
0cd0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
0ce0: 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20 20  nt nSql;        
0cf0: 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61 72 73          /* chars
0d00: 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20 20   in zSql[] */.  
0d10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
0d20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74  ;        /* Text
0d30: 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   of the SQL stat
0d40: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ement */.  int n
0d50: 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Parm;           
0d60: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
0d70: 70 50 61 72 6d 20 61 72 72 61 79 20 2a 2f 0a 20  pParm array */. 
0d80: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61 72   Tcl_Obj **apPar
0d90: 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  m;        /* Arr
0da0: 61 79 20 6f 66 20 72 65 66 65 72 65 6e 63 65 64  ay of referenced
0db0: 20 6f 62 6a 65 63 74 20 70 6f 69 6e 74 65 72 73   object pointers
0dc0: 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20   */.};..typedef 
0dd0: 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43  struct IncrblobC
0de0: 68 61 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f 62 43  hannel IncrblobC
0df0: 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 54  hannel;../*.** T
0e00: 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
0e10: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
0e20: 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 20  ucture for each 
0e30: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a  SQLite database.
0e40: 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  ** that has been
0e50: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 53   opened by the S
0e60: 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65 72 66  QLite TCL interf
0e70: 61 63 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ace..*/.typedef 
0e80: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20  struct SqliteDb 
0e90: 53 71 6c 69 74 65 44 62 3b 0a 73 74 72 75 63 74  SqliteDb;.struct
0ea0: 20 53 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71   SqliteDb {.  sq
0eb0: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
0ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0ed0: 22 72 65 61 6c 22 20 64 61 74 61 62 61 73 65 20  "real" database 
0ee0: 73 74 72 75 63 74 75 72 65 2e 20 4d 55 53 54 20  structure. MUST 
0ef0: 42 45 20 46 49 52 53 54 20 2a 2f 0a 20 20 54 63  BE FIRST */.  Tc
0f00: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0f10: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
0f20: 69 6e 74 65 72 70 72 65 74 65 72 20 75 73 65 64  interpreter used
0f30: 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
0f40: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  se */.  char *zB
0f50: 75 73 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  usy;            
0f60: 20 20 20 2f 2a 20 54 68 65 20 62 75 73 79 20 63     /* The busy c
0f70: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0f80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  */.  char *zComm
0f90: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
0fa0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 69 74 20 68 6f  /* The commit ho
0fb0: 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  ok callback rout
0fc0: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
0fd0: 54 72 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Trace;          
0fe0: 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65      /* The trace
0ff0: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
1000: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72  e */.  char *zPr
1010: 6f 66 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  ofile;          
1020: 20 20 2f 2a 20 54 68 65 20 70 72 6f 66 69 6c 65    /* The profile
1030: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
1040: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72  e */.  char *zPr
1050: 6f 67 72 65 73 73 3b 20 20 20 20 20 20 20 20 20  ogress;         
1060: 20 20 2f 2a 20 54 68 65 20 70 72 6f 67 72 65 73    /* The progres
1070: 73 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  s callback routi
1080: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  ne */.  char *zA
1090: 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  uth;            
10a0: 20 20 20 2f 2a 20 54 68 65 20 61 75 74 68 6f 72     /* The author
10b0: 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ization callback
10c0: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e   routine */.  in
10d0: 74 20 64 69 73 61 62 6c 65 41 75 74 68 3b 20 20  t disableAuth;  
10e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
10f0: 62 6c 65 20 74 68 65 20 61 75 74 68 6f 72 69 7a  ble the authoriz
1100: 65 72 20 69 66 20 69 74 20 65 78 69 73 74 73 20  er if it exists 
1110: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c  */.  char *zNull
1120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1130: 2f 2a 20 54 65 78 74 20 74 6f 20 73 75 62 73 74  /* Text to subst
1140: 69 74 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c  itute for an SQL
1150: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20   NULL value */. 
1160: 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b   SqlFunc *pFunc;
1170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1180: 69 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74  ist of SQL funct
1190: 69 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ions */.  Tcl_Ob
11a0: 6a 20 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20  j *pUpdateHook; 
11b0: 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68       /* Update h
11c0: 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61  ook script (if a
11d0: 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ny) */.  Tcl_Obj
11e0: 20 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b   *pRollbackHook;
11f0: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
1200: 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20  hook script (if 
1210: 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  any) */.  Tcl_Ob
1220: 6a 20 2a 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  j *pUnlockNotify
1230: 3b 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 6e  ;    /* Unlock n
1240: 6f 74 69 66 79 20 73 63 72 69 70 74 20 28 69 66  otify script (if
1250: 20 61 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f   any) */.  SqlCo
1260: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b  llate *pCollate;
1270: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1280: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
1290: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
12a0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
12b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
12c0: 72 6e 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20  rn code of most 
12d0: 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  recent sqlite3_e
12e0: 78 65 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f  xec() */.  Tcl_O
12f0: 62 6a 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64  bj *pCollateNeed
1300: 65 64 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  ed;   /* Collati
1310: 6f 6e 20 6e 65 65 64 65 64 20 73 63 72 69 70 74  on needed script
1320: 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65   */.  SqlPrepare
1330: 64 53 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b  dStmt *stmtList;
1340: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 72 65 70   /* List of prep
1350: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2a  ared statements*
1360: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
1370: 74 6d 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f  tmt *stmtLast; /
1380: 2a 20 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74  * Last statement
1390: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
13a0: 20 20 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20    int maxStmt;  
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c0: 54 68 65 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d  The next maximum
13d0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c   number of stmtL
13e0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74  ist */.  int nSt
13f0: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
1400: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1410: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73   statements in s
1420: 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 49 6e 63  tmtList */.  Inc
1430: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 49  rblobChannel *pI
1440: 6e 63 72 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65  ncrblob;/* Linke
1450: 64 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 69  d list of open i
1460: 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73  ncrblob channels
1470: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 65 70 2c   */.  int nStep,
1480: 20 6e 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20   nSort;         
1490: 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 66   /* Statistics f
14a0: 6f 72 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6f  or most recent o
14b0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
14c0: 74 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 20  t nTransaction; 
14d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14e0: 65 72 20 6f 66 20 6e 65 73 74 65 64 20 5b 74 72  er of nested [tr
14f0: 61 6e 73 61 63 74 69 6f 6e 5d 20 6d 65 74 68 6f  ansaction] metho
1500: 64 73 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  ds */.};..struct
1510: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
1520: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f   {.  sqlite3_blo
1530: 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 2f  b *pBlob;      /
1540: 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20 68  * sqlite3 blob h
1550: 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69 74  andle */.  Sqlit
1560: 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20  eDb *pDb;       
1570: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
1580: 65 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ed database conn
1590: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
15a0: 69 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20 20  iSeek;          
15b0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
15c0: 20 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a   seek offset */.
15d0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
15e0: 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20 43  annel;      /* C
15f0: 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69 65  hannel identifie
1600: 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r */.  IncrblobC
1610: 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20 20  hannel *pNext;  
1620: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
1630: 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72  of all open incr
1640: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
1650: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1660: 65 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20  el *pPrev;   /* 
1670: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61  Linked list of a
1680: 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  ll open incrblob
1690: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a   channels */.};.
16a0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
16b0: 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74   string length t
16c0: 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74  hat is limited t
16d0: 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74  o what can be st
16e0: 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72  ored in.** lower
16f0: 20 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32   30 bits of a 32
1700: 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
1710: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
1720: 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73  nt strlen30(cons
1730: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f  t char *z){.  co
1740: 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a  nst char *z2 = z
1750: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29  ;.  while( *z2 )
1760: 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75  { z2++; }.  retu
1770: 72 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20  rn 0x3fffffff & 
1780: 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d  (int)(z2 - z);.}
1790: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
17a0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
17b0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
17c0: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
17d0: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 64  s opened using d
17e0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17f0: 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73 20  on pDb..** This 
1800: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 73  is called when s
1810: 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68 65  hutting down the
1820: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1830: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1840: 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72 62 6c  void closeIncrbl
1850: 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69 74  obChannels(Sqlit
1860: 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e 63  eDb *pDb){.  Inc
1870: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b  rblobChannel *p;
1880: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1890: 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f  el *pNext;..  fo
18a0: 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62 6c  r(p=pDb->pIncrbl
18b0: 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  ob; p; p=pNext){
18c0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
18d0: 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 4e  pNext;..    /* N
18e0: 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e 72  ote: Calling unr
18f0: 65 67 69 73 74 65 72 20 68 65 72 65 20 63 61 6c  egister here cal
1900: 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20 74  l Tcl_Close on t
1910: 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e  he incrblob chan
1920: 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a 20 77 68 69  nel, .    ** whi
1930: 63 68 20 64 65 6c 65 74 65 73 20 74 68 65 20 49  ch deletes the I
1940: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73  ncrblobChannel s
1950: 74 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e 20  tructure at *p. 
1960: 53 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a  So do not.    **
1970: 20 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28 29   call Tcl_Free()
1980: 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
1990: 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65 72    Tcl_Unregister
19a0: 43 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e 74  Channel(pDb->int
19b0: 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29  erp, p->channel)
19c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
19d0: 6c 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65 6e  lose an incremen
19e0: 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  tal blob channel
19f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a00: 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28 43 6c  incrblobClose(Cl
1a10: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
1a20: 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  eData, Tcl_Inter
1a30: 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 49 6e  p *interp){.  In
1a40: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1a50: 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e   = (IncrblobChan
1a60: 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61  nel *)instanceDa
1a70: 74 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  ta;.  int rc = s
1a80: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
1a90: 65 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 73  e(p->pBlob);.  s
1aa0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
1ab0: 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52  pDb->db;..  /* R
1ac0: 65 6d 6f 76 65 20 74 68 65 20 63 68 61 6e 6e 65  emove the channe
1ad0: 6c 20 66 72 6f 6d 20 74 68 65 20 53 71 6c 69 74  l from the Sqlit
1ae0: 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69  eDb.pIncrblob li
1af0: 73 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  st. */.  if( p->
1b00: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
1b10: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
1b20: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
1b30: 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
1b40: 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
1b50: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
1b60: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44 62 2d   }.  if( p->pDb-
1b70: 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20 29 7b  >pIncrblob==p ){
1b80: 0a 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70 49 6e  .    p->pDb->pIn
1b90: 63 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65 78  crblob = p->pNex
1ba0: 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65  t;.  }..  /* Fre
1bb0: 65 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68  e the IncrblobCh
1bc0: 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20  annel structure 
1bd0: 2a 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63  */.  Tcl_Free((c
1be0: 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28  har *)p);..  if(
1bf0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c00: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
1c10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
1c20: 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
1c30: 73 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41  sg(db), TCL_VOLA
1c40: 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72  TILE);.    retur
1c50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1c60: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
1c80: 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 69 6e 63  data from an inc
1c90: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
1ca0: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
1cb0: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49 6e 70   int incrblobInp
1cc0: 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ut(.  ClientData
1cd0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a   instanceData, .
1ce0: 20 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20 20    char *buf, .  
1cf0: 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20 69  int bufSize,.  i
1d00: 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  nt *errorCodePtr
1d10: 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  .){.  IncrblobCh
1d20: 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72  annel *p = (Incr
1d30: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e  blobChannel *)in
1d40: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e  stanceData;.  in
1d50: 74 20 6e 52 65 61 64 20 3d 20 62 75 66 53 69 7a  t nRead = bufSiz
1d60: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
1d70: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1d80: 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e   read */.  int n
1d90: 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
1da0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
1db0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
1dc0: 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  b */.  int rc;  
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72      /* sqlite er
1df0: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e  ror code */..  n
1e00: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62  Blob = sqlite3_b
1e10: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c  lob_bytes(p->pBl
1e20: 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69  ob);.  if( (p->i
1e30: 53 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f  Seek+nRead)>nBlo
1e40: 62 20 29 7b 0a 20 20 20 20 6e 52 65 61 64 20 3d  b ){.    nRead =
1e50: 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b   nBlob-p->iSeek;
1e60: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61 64  .  }.  if( nRead
1e70: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
1e80: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  n 0;.  }..  rc =
1e90: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
1ea0: 61 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f  ad(p->pBlob, (vo
1eb0: 69 64 20 2a 29 62 75 66 2c 20 6e 52 65 61 64 2c  id *)buf, nRead,
1ec0: 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66   p->iSeek);.  if
1ed0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ee0: 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ){.    *errorCod
1ef0: 65 50 74 72 20 3d 20 72 63 3b 0a 20 20 20 20 72  ePtr = rc;.    r
1f00: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20  eturn -1;.  }.. 
1f10: 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52 65   p->iSeek += nRe
1f20: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52 65  ad;.  return nRe
1f30: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  ad;.}../*.** Wri
1f40: 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69 6e  te data to an in
1f50: 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
1f60: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
1f70: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 4f 75  c int incrblobOu
1f80: 74 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  tput(.  ClientDa
1f90: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
1fa0: 20 0a 20 20 43 4f 4e 53 54 20 63 68 61 72 20 2a   .  CONST char *
1fb0: 62 75 66 2c 20 0a 20 20 69 6e 74 20 74 6f 57 72  buf, .  int toWr
1fc0: 69 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f  ite,.  int *erro
1fd0: 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e  rCodePtr.){.  In
1fe0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1ff0: 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e   = (IncrblobChan
2000: 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61  nel *)instanceDa
2010: 74 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65  ta;.  int nWrite
2020: 20 3d 20 74 6f 57 72 69 74 65 3b 20 20 20 20 20   = toWrite;     
2030: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2040: 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a  bytes to write *
2050: 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20  /.  int nBlob;  
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
2080: 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20  f the blob */.  
2090: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b0: 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
20c0: 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20  e */..  nBlob = 
20d0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
20e0: 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  es(p->pBlob);.  
20f0: 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 57  if( (p->iSeek+nW
2100: 72 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20  rite)>nBlob ){. 
2110: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
2120: 20 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20 20 72   = EINVAL;.    r
2130: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
2140: 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29 7b  if( nWrite<=0 ){
2150: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2160: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
2170: 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 2d  e3_blob_write(p-
2180: 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29  >pBlob, (void *)
2190: 62 75 66 2c 20 6e 57 72 69 74 65 2c 20 70 2d 3e  buf, nWrite, p->
21a0: 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72 63  iSeek);.  if( rc
21b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21c0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
21d0: 20 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65 74 75   = EIO;.    retu
21e0: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d  rn -1;.  }..  p-
21f0: 3e 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69 74 65  >iSeek += nWrite
2200: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 57 72 69 74  ;.  return nWrit
2210: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  e;.}../*.** Seek
2220: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
2230: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f  blob channel..*/
2240: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
2250: 62 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c 69 65  blobSeek(.  Clie
2260: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
2270: 61 74 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f 66 66  ata, .  long off
2280: 73 65 74 2c 0a 20 20 69 6e 74 20 73 65 65 6b 4d  set,.  int seekM
2290: 6f 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f  ode,.  int *erro
22a0: 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e  rCodePtr.){.  In
22b0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
22c0: 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e   = (IncrblobChan
22d0: 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61  nel *)instanceDa
22e0: 74 61 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 73  ta;..  switch( s
22f0: 65 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63  eekMode ){.    c
2300: 61 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a 20 20  ase SEEK_SET:.  
2310: 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 6f      p->iSeek = o
2320: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65  ffset;.      bre
2330: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45  ak;.    case SEE
2340: 4b 5f 43 55 52 3a 0a 20 20 20 20 20 20 70 2d 3e  K_CUR:.      p->
2350: 69 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65 74 3b  iSeek += offset;
2360: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2370: 20 20 63 61 73 65 20 53 45 45 4b 5f 45 4e 44 3a    case SEEK_END:
2380: 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20  .      p->iSeek 
2390: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62  = sqlite3_blob_b
23a0: 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 20 2b  ytes(p->pBlob) +
23b0: 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62   offset;.      b
23c0: 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
23d0: 6c 74 3a 20 61 73 73 65 72 74 28 21 22 42 61 64  lt: assert(!"Bad
23e0: 20 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20 20 7d   seekMode");.  }
23f0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 53  ..  return p->iS
2400: 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20  eek;.}...static 
2410: 76 6f 69 64 20 69 6e 63 72 62 6c 6f 62 57 61 74  void incrblobWat
2420: 63 68 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  ch(ClientData in
2430: 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20  stanceData, int 
2440: 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a 20 4e 4f 2d  mode){ .  /* NO-
2450: 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61 74 69 63 20  OP */ .}.static 
2460: 69 6e 74 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64  int incrblobHand
2470: 6c 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  le(ClientData in
2480: 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20  stanceData, int 
2490: 64 69 72 2c 20 43 6c 69 65 6e 74 44 61 74 61 20  dir, ClientData 
24a0: 2a 68 50 74 72 29 7b 0a 20 20 72 65 74 75 72 6e  *hPtr){.  return
24b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73   TCL_ERROR;.}..s
24c0: 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65  tatic Tcl_Channe
24d0: 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62 43 68  lType IncrblobCh
24e0: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20  annelType = {.  
24f0: 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20  "incrblob",     
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65 20 20     /* typeName  
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2530: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2540: 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53  TCL_CHANNEL_VERS
2550: 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20 20 20  ION_2,          
2560: 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20 20 20     /* version   
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2590: 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c 20 20  incrblobClose,  
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f 63 20     /* closeProc 
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
25e0: 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c 20 20  incrblobInput,  
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f 63 20     /* inputProc 
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2630: 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 2c 20  incrblobOutput, 
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72 6f 63     /* outputProc
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2680: 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20 20 20  incrblobSeek,   
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63 20 20     /* seekProc  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
26d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f 6e 50     /* setOptionP
2700: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2710: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2720: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 20 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f 6e 50     /* getOptionP
2750: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2760: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2770: 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c 20 20  incrblobWatch,  
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f 63 20     /* watchProc 
27a0: 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70  (this is a no-op
27b0: 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )          */.  
27c0: 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 2c 20  incrblobHandle, 
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c 65 50     /* getHandleP
27f0: 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65 74 75  roc (always retu
2800: 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a 20 20  rns error) */.  
2810: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2830: 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72 6f 63     /* close2Proc
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2860: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50     /* blockModeP
2890: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
28a0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
28b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f 63 20     /* flushProc 
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2900: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50 72 6f     /* handlerPro
2930: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2940: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2950: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 2f 2a 20 77 69 64 65 53 65 65 6b 50 72     /* wideSeekPr
2980: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2990: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 7d 3b             */.};
29a0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
29b0: 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20 63 68   new incrblob ch
29c0: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
29d0: 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63 72 62   int createIncrb
29e0: 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 54 63  lobChannel(.  Tc
29f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2a00: 2c 20 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  , .  SqliteDb *p
2a10: 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  Db, .  const cha
2a20: 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20  r *zDb,.  const 
2a30: 63 68 61 72 20 2a 7a 54 61 62 6c 65 2c 20 0a 20  char *zTable, . 
2a40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
2a50: 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c 69 74 65 5f  lumn, .  sqlite_
2a60: 69 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20 69 6e  int64 iRow,.  in
2a70: 74 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a  t isReadonly.){.
2a80: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
2a90: 6c 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  l *p;.  sqlite3 
2aa0: 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b 0a 20  *db = pDb->db;. 
2ab0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
2ac0: 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Blob;.  int rc;.
2ad0: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 54 43    int flags = TC
2ae0: 4c 5f 52 45 41 44 41 42 4c 45 7c 28 69 73 52 65  L_READABLE|(isRe
2af0: 61 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54 43 4c  adonly ? 0 : TCL
2b00: 5f 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20 20 2f  _WRITABLE);..  /
2b10: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
2b20: 69 73 20 75 73 65 64 20 74 6f 20 6e 61 6d 65 20  is used to name 
2b30: 74 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20 22 69  the channels: "i
2b40: 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f  ncrblob_[incr co
2b50: 75 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61 74 69  unt]" */.  stati
2b60: 63 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b  c int count = 0;
2b70: 0a 20 20 63 68 61 72 20 7a 43 68 61 6e 6e 65 6c  .  char zChannel
2b80: 5b 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20 73 71  [64];..  rc = sq
2b90: 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
2ba0: 64 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c  db, zDb, zTable,
2bb0: 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20   zColumn, iRow, 
2bc0: 21 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26 70 42  !isReadonly, &pB
2bd0: 6c 6f 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  lob);.  if( rc!=
2be0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bf0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
2c00: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
2c10: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
2c20: 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41  b->db), TCL_VOLA
2c30: 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72  TILE);.    retur
2c40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2c50: 0a 0a 20 20 70 20 3d 20 28 49 6e 63 72 62 6c 6f  ..  p = (Incrblo
2c60: 62 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41  bChannel *)Tcl_A
2c70: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e 63 72  lloc(sizeof(Incr
2c80: 62 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b 0a 20  blobChannel));. 
2c90: 20 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b 0a 20   p->iSeek = 0;. 
2ca0: 20 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42 6c 6f   p->pBlob = pBlo
2cb0: 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  b;..  sqlite3_sn
2cc0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43  printf(sizeof(zC
2cd0: 68 61 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e 6e 65  hannel), zChanne
2ce0: 6c 2c 20 22 69 6e 63 72 62 6c 6f 62 5f 25 64 22  l, "incrblob_%d"
2cf0: 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20 70 2d  , ++count);.  p-
2d00: 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43  >channel = Tcl_C
2d10: 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26 49 6e  reateChannel(&In
2d20: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70  crblobChannelTyp
2d30: 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 70 2c 20  e, zChannel, p, 
2d40: 66 6c 61 67 73 29 3b 0a 20 20 54 63 6c 5f 52 65  flags);.  Tcl_Re
2d50: 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e  gisterChannel(in
2d60: 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c  terp, p->channel
2d70: 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  );..  /* Link th
2d80: 65 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20 69 6e  e new channel in
2d90: 74 6f 20 74 68 65 20 53 71 6c 69 74 65 44 62 2e  to the SqliteDb.
2da0: 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20  pIncrblob list. 
2db0: 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  */.  p->pNext = 
2dc0: 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a  pDb->pIncrblob;.
2dd0: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
2de0: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
2df0: 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
2e00: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20  pPrev = p;.  }. 
2e10: 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20   pDb->pIncrblob 
2e20: 3d 20 70 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20  = p;.  p->pDb = 
2e30: 70 44 62 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 52  pDb;..  Tcl_SetR
2e40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
2e50: 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 43 68 61  har *)Tcl_GetCha
2e60: 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e 63 68 61 6e  nnelName(p->chan
2e70: 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  nel), TCL_VOLATI
2e80: 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  LE);.  return TC
2e90: 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f  L_OK;.}.#else  /
2ea0: 2a 20 65 6c 73 65 20 63 6c 61 75 73 65 20 66 6f  * else clause fo
2eb0: 72 20 22 23 69 66 6e 64 65 66 20 53 51 4c 49 54  r "#ifndef SQLIT
2ec0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 22  E_OMIT_INCRBLOB"
2ed0: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 63 6c   */.  #define cl
2ee0: 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  oseIncrblobChann
2ef0: 65 6c 73 28 70 44 62 29 0a 23 65 6e 64 69 66 0a  els(pDb).#endif.
2f00: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74  ./*.** Look at t
2f10: 68 65 20 73 63 72 69 70 74 20 70 72 65 66 69 78  he script prefix
2f20: 20 69 6e 20 70 43 6d 64 2e 20 20 57 65 20 77 69   in pCmd.  We wi
2f30: 6c 6c 20 62 65 20 65 78 65 63 75 74 69 6e 67 20  ll be executing 
2f40: 74 68 69 73 20 73 63 72 69 70 74 0a 2a 2a 20 61  this script.** a
2f50: 66 74 65 72 20 66 69 72 73 74 20 61 70 70 65 6e  fter first appen
2f60: 64 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ding one or more
2f70: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69   arguments.  Thi
2f80: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
2f90: 65 73 0a 2a 2a 20 74 68 65 20 73 63 72 69 70 74  es.** the script
2fa0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73   to see if it is
2fb0: 20 73 61 66 65 20 74 6f 20 75 73 65 20 54 63 6c   safe to use Tcl
2fc0: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74  _EvalObjv() on t
2fd0: 68 65 20 73 63 72 69 70 74 0a 2a 2a 20 72 61 74  he script.** rat
2fe0: 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d 6f 72  her than the mor
2ff0: 65 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76  e general Tcl_Ev
3000: 61 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45 76 61  alEx().  Tcl_Eva
3010: 6c 4f 62 6a 76 28 29 20 69 73 20 6d 75 63 68 0a  lObjv() is much.
3020: 2a 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ** faster..**.**
3030: 20 53 63 72 69 70 74 73 20 74 68 61 74 20 61 72   Scripts that ar
3040: 65 20 73 61 66 65 20 74 6f 20 75 73 65 20 77 69  e safe to use wi
3050: 74 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  th Tcl_EvalObjv(
3060: 29 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a  ) consists of a.
3070: 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20  ** command name 
3080: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f  followed by zero
3090: 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e   or more argumen
30a0: 74 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d  ts with no [...]
30b0: 20 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e   or $.** or {...
30c0: 7d 20 6f 72 20 3b 20 74 6f 20 62 65 20 73 65 65  } or ; to be see
30d0: 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73  n anywhere.  Mos
30e0: 74 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70  t callback scrip
30f0: 74 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66  ts consist.** of
3100: 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 70   just a single p
3110: 72 6f 63 65 64 75 72 65 20 6e 61 6d 65 20 61 6e  rocedure name an
3120: 64 20 74 68 65 79 20 6d 65 65 74 20 74 68 69 73  d they meet this
3130: 20 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f   requirement..*/
3140: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 66 65  .static int safe
3150: 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 54 63  ToUseEvalObjv(Tc
3160: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3170: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29  , Tcl_Obj *pCmd)
3180: 7b 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20  {.  /* We could 
3190: 74 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68  try to do someth
31a0: 69 6e 67 20 77 69 74 68 20 54 63 6c 5f 50 61 72  ing with Tcl_Par
31b0: 73 65 28 29 2e 20 20 42 75 74 20 77 65 20 77 69  se().  But we wi
31c0: 6c 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20  ll instead.  ** 
31d0: 6a 75 73 74 20 64 6f 20 61 20 73 65 61 72 63 68  just do a search
31e0: 20 66 6f 72 20 66 6f 72 62 69 64 64 65 6e 20 63   for forbidden c
31f0: 68 61 72 61 63 74 65 72 73 2e 20 20 49 66 20 61  haracters.  If a
3200: 6e 79 20 6f 66 20 74 68 65 20 66 6f 72 62 69 64  ny of the forbid
3210: 64 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63 74  den.  ** charact
3220: 65 72 73 20 61 70 70 65 61 72 20 69 6e 20 70 43  ers appear in pC
3230: 6d 64 2c 20 77 65 20 77 69 6c 6c 20 72 65 70 6f  md, we will repo
3240: 72 74 20 74 68 65 20 73 74 72 69 6e 67 20 61 73  rt the string as
3250: 20 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20   unsafe..  */.  
3260: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
3270: 20 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63   int n;.  z = Tc
3280: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
3290: 62 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20  bj(pCmd, &n);.  
32a0: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
32b0: 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 28  {.    int c = *(
32c0: 7a 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  z++);.    if( c=
32d0: 3d 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c  ='$' || c=='[' |
32e0: 7c 20 63 3d 3d 27 3b 27 20 29 20 72 65 74 75 72  | c==';' ) retur
32f0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
3300: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  n 1;.}../*.** Fi
3310: 6e 64 20 61 6e 20 53 71 6c 46 75 6e 63 20 73 74  nd an SqlFunc st
3320: 72 75 63 74 75 72 65 20 77 69 74 68 20 74 68 65  ructure with the
3330: 20 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72   given name.  Or
3340: 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a   create a new.**
3350: 20 6f 6e 65 20 69 66 20 61 6e 20 65 78 69 73 74   one if an exist
3360: 69 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62  ing one cannot b
3370: 65 20 66 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e  e found.  Return
3380: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3390: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  e.** structure..
33a0: 2a 2f 0a 73 74 61 74 69 63 20 53 71 6c 46 75 6e  */.static SqlFun
33b0: 63 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28 53  c *findSqlFunc(S
33c0: 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 63 6f  qliteDb *pDb, co
33d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
33e0: 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20  {.  SqlFunc *p, 
33f0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
3400: 20 20 70 4e 65 77 20 3d 20 28 53 71 6c 46 75 6e    pNew = (SqlFun
3410: 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  c*)Tcl_Alloc( si
3420: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 73 74  zeof(*pNew) + st
3430: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2b 20  rlen30(zName) + 
3440: 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61  1 );.  pNew->zNa
3450: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
3460: 77 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  w[1];.  for(i=0;
3470: 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b   zName[i]; i++){
3480: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20   pNew->zName[i] 
3490: 3d 20 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b  = tolower(zName[
34a0: 69 5d 29 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a  i]); }.  pNew->z
34b0: 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 66  Name[i] = 0;.  f
34c0: 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b  or(p=pDb->pFunc;
34d0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
34e0: 20 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70   .    if( strcmp
34f0: 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d  (p->zName, pNew-
3500: 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  >zName)==0 ){.  
3510: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3520: 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20 20  ar*)pNew);.     
3530: 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 7d   return p;.    }
3540: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e 74  .  }.  pNew->int
3550: 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72  erp = pDb->inter
3560: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 63 72 69  p;.  pNew->pScri
3570: 70 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  pt = 0;.  pNew->
3580: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 46 75  pNext = pDb->pFu
3590: 6e 63 3b 0a 20 20 70 44 62 2d 3e 70 46 75 6e 63  nc;.  pDb->pFunc
35a0: 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
35b0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
35c0: 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72   Finalize and fr
35d0: 65 65 20 61 20 6c 69 73 74 20 6f 66 20 70 72 65  ee a list of pre
35e0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
35f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3600: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
3610: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 29 7b  SqliteDb *pDb ){
3620: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
3630: 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 0a 0a 20  mt *pPreStmt;.. 
3640: 20 77 68 69 6c 65 28 20 20 70 44 62 2d 3e 73 74   while(  pDb->st
3650: 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 71  mtList ){.    sq
3660: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 20  lite3_finalize( 
3670: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
3680: 53 74 6d 74 20 29 3b 0a 20 20 20 20 70 50 72 65  Stmt );.    pPre
3690: 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Stmt = pDb->stmt
36a0: 4c 69 73 74 3b 0a 20 20 20 20 70 44 62 2d 3e 73  List;.    pDb->s
36b0: 74 6d 74 4c 69 73 74 20 3d 20 70 44 62 2d 3e 73  tmtList = pDb->s
36c0: 74 6d 74 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  tmtList->pNext;.
36d0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 20 28 63      Tcl_Free( (c
36e0: 68 61 72 2a 29 70 50 72 65 53 74 6d 74 20 29 3b  har*)pPreStmt );
36f0: 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e 53 74 6d  .  }.  pDb->nStm
3700: 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74  t = 0;.  pDb->st
3710: 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  mtLast = 0;.}../
3720: 2a 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74  *.** TCL calls t
3730: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 68  his procedure wh
3740: 65 6e 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61  en an sqlite3 da
3750: 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69  tabase command i
3760: 73 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  s.** deleted..*/
3770: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 44  .static void DbD
3780: 65 6c 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64  eleteCmd(void *d
3790: 62 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  b){.  SqliteDb *
37a0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
37b0: 29 64 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74  )db;.  flushStmt
37c0: 43 61 63 68 65 28 70 44 62 29 3b 0a 20 20 63 6c  Cache(pDb);.  cl
37d0: 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  oseIncrblobChann
37e0: 65 6c 73 28 70 44 62 29 3b 0a 20 20 73 71 6c 69  els(pDb);.  sqli
37f0: 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64  te3_close(pDb->d
3800: 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62  b);.  while( pDb
3810: 2d 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53  ->pFunc ){.    S
3820: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20  qlFunc *pFunc = 
3830: 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  pDb->pFunc;.    
3840: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  pDb->pFunc = pFu
3850: 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54  nc->pNext;.    T
3860: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3870: 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b  pFunc->pScript);
3880: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
3890: 68 61 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d  har*)pFunc);.  }
38a0: 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70  .  while( pDb->p
38b0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53  Collate ){.    S
38c0: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c  qlCollate *pColl
38d0: 61 74 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c  ate = pDb->pColl
38e0: 61 74 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43  ate;.    pDb->pC
38f0: 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74  ollate = pCollat
3900: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  e->pNext;.    Tc
3910: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 43  l_Free((char*)pC
3920: 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69  ollate);.  }.  i
3930: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
3940: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
3950: 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20  b->zBusy);.  }. 
3960: 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
3970: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
3980: 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20  (pDb->zTrace);. 
3990: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 50   }.  if( pDb->zP
39a0: 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 54 63  rofile ){.    Tc
39b0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f  l_Free(pDb->zPro
39c0: 66 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  file);.  }.  if(
39d0: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
39e0: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
39f0: 3e 7a 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69  >zAuth);.  }.  i
3a00: 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b  f( pDb->zNull ){
3a10: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
3a20: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  b->zNull);.  }. 
3a30: 20 69 66 28 20 70 44 62 2d 3e 70 55 70 64 61 74   if( pDb->pUpdat
3a40: 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c  eHook ){.    Tcl
3a50: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
3a60: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b  b->pUpdateHook);
3a70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3a80: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b  pRollbackHook ){
3a90: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3aa0: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c  Count(pDb->pRoll
3ab0: 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20  backHook);.  }. 
3ac0: 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61   if( pDb->pColla
3ad0: 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  teNeeded ){.    
3ae0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3af0: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
3b00: 65 64 65 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  eded);.  }.  Tcl
3b10: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62  _Free((char*)pDb
3b20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
3b30: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
3b40: 65 64 20 77 68 65 6e 20 61 20 64 61 74 61 62 61  ed when a databa
3b50: 73 65 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65  se file is locke
3b60: 64 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  d while trying.*
3b70: 2a 20 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c  * to execute SQL
3b80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3b90: 44 62 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  DbBusyHandler(vo
3ba0: 69 64 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69  id *cd, int nTri
3bb0: 65 73 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  es){.  SqliteDb 
3bc0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
3bd0: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)cd;.  int rc;.
3be0: 20 20 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b    char zVal[30];
3bf0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
3c00: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 56 61 6c  intf(sizeof(zVal
3c10: 29 2c 20 7a 56 61 6c 2c 20 22 25 64 22 2c 20 6e  ), zVal, "%d", n
3c20: 54 72 69 65 73 29 3b 0a 20 20 72 63 20 3d 20 54  Tries);.  rc = T
3c30: 63 6c 5f 56 61 72 45 76 61 6c 28 70 44 62 2d 3e  cl_VarEval(pDb->
3c40: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75  interp, pDb->zBu
3c50: 73 79 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20 28  sy, " ", zVal, (
3c60: 63 68 61 72 2a 29 30 29 3b 0a 20 20 69 66 28 20  char*)0);.  if( 
3c70: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
3c80: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
3c90: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
3ca0: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
3cb0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
3cc0: 72 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 1;.}..#ifndef
3cd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
3ce0: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f  GRESS_CALLBACK./
3cf0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3d00: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20  e is invoked as 
3d10: 74 68 65 20 27 70 72 6f 67 72 65 73 73 20 63 61  the 'progress ca
3d20: 6c 6c 62 61 63 6b 27 20 66 6f 72 20 74 68 65 20  llback' for the 
3d30: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
3d40: 74 69 63 20 69 6e 74 20 44 62 50 72 6f 67 72 65  tic int DbProgre
3d50: 73 73 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  ssHandler(void *
3d60: 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  cd){.  SqliteDb 
3d70: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
3d80: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)cd;.  int rc;.
3d90: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
3da0: 7a 50 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72  zProgress );.  r
3db0: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  c = Tcl_Eval(pDb
3dc0: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  ->interp, pDb->z
3dd0: 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 69 66 28  Progress);.  if(
3de0: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
3df0: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
3e00: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
3e10: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
3e20: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
3e30: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
3e40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3e50: 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  OMIT_TRACE./*.**
3e60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3e70: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53   called by the S
3e80: 51 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e 64  QLite trace hand
3e90: 6c 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e  ler whenever a n
3ea0: 65 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53  ew.** block of S
3eb0: 51 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  QL is executed. 
3ec0: 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   The TCL script 
3ed0: 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69  in pDb->zTrace i
3ee0: 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73  s executed..*/.s
3ef0: 74 61 74 69 63 20 76 6f 69 64 20 44 62 54 72 61  tatic void DbTra
3f00: 63 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  ceHandler(void *
3f10: 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  cd, const char *
3f20: 7a 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44  zSql){.  SqliteD
3f30: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
3f40: 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53  Db*)cd;.  Tcl_DS
3f50: 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63  tring str;..  Tc
3f60: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
3f70: 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr);.  Tcl_DStri
3f80: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70  ngAppend(&str, p
3f90: 44 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b  Db->zTrace, -1);
3fa0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
3fb0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
3fc0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45  , zSql);.  Tcl_E
3fd0: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
3fe0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
3ff0: 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f  e(&str));.  Tcl_
4000: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
4010: 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65  );.  Tcl_ResetRe
4020: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
4030: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
4040: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4050: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  _TRACE./*.** Thi
4060: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4070: 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74  led by the SQLit
4080: 65 20 70 72 6f 66 69 6c 65 20 68 61 6e 64 6c 65  e profile handle
4090: 72 20 61 66 74 65 72 20 61 20 73 74 61 74 65 6d  r after a statem
40a0: 65 6e 74 0a 2a 2a 20 53 51 4c 20 68 61 73 20 65  ent.** SQL has e
40b0: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43  xecuted.  The TC
40c0: 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d  L script in pDb-
40d0: 3e 7a 50 72 6f 66 69 6c 65 20 69 73 20 65 76 61  >zProfile is eva
40e0: 6c 75 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  luated..*/.stati
40f0: 63 20 76 6f 69 64 20 44 62 50 72 6f 66 69 6c 65  c void DbProfile
4100: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
4110: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
4120: 71 6c 2c 20 73 71 6c 69 74 65 5f 75 69 6e 74 36  ql, sqlite_uint6
4130: 34 20 74 6d 29 7b 0a 20 20 53 71 6c 69 74 65 44  4 tm){.  SqliteD
4140: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
4150: 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53  Db*)cd;.  Tcl_DS
4160: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 63 68 61  tring str;.  cha
4170: 72 20 7a 54 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73  r zTm[100];..  s
4180: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4190: 73 69 7a 65 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a  sizeof(zTm)-1, z
41a0: 54 6d 2c 20 22 25 6c 6c 64 22 2c 20 74 6d 29 3b  Tm, "%lld", tm);
41b0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
41c0: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
41d0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
41e0: 74 72 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  tr, pDb->zProfil
41f0: 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  e, -1);.  Tcl_DS
4200: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
4210: 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a  nt(&str, zSql);.
4220: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
4230: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
4240: 20 7a 54 6d 29 3b 0a 20 20 54 63 6c 5f 45 76 61   zTm);.  Tcl_Eva
4250: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
4260: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
4270: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
4280: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
4290: 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
42a0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
42b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
42c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
42d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
42e0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
42f0: 6d 6d 69 74 74 65 64 2e 20 20 54 68 65 0a 2a 2a  mmitted.  The.**
4300: 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70   TCL script in p
4310: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73 20 65  Db->zCommit is e
4320: 78 65 63 75 74 65 64 2e 20 20 49 66 20 69 74 20  xecuted.  If it 
4330: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
4340: 20 6f 72 0a 2a 2a 20 69 66 20 69 74 20 74 68 72   or.** if it thr
4350: 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
4360: 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
4370: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
4380: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62   instead.** of b
4390: 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  eing committed..
43a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
43b0: 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 28 76 6f  CommitHandler(vo
43c0: 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74  id *cd){.  Sqlit
43d0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
43e0: 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20  teDb*)cd;.  int 
43f0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f  rc;..  rc = Tcl_
4400: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
4410: 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b  , pDb->zCommit);
4420: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
4430: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
4440: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
4450: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
4460: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
4470: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4480: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 52 6f  static void DbRo
4490: 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 28 76 6f  llbackHandler(vo
44a0: 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 7b  id *clientData){
44b0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
44c0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c   = (SqliteDb*)cl
44d0: 69 65 6e 74 44 61 74 61 3b 0a 20 20 61 73 73 65  ientData;.  asse
44e0: 72 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  rt(pDb->pRollbac
44f0: 6b 48 6f 6f 6b 29 3b 0a 20 20 69 66 28 20 54 43  kHook);.  if( TC
4500: 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62  L_OK!=Tcl_EvalOb
4510: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
4520: 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48   pDb->pRollbackH
4530: 6f 6f 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 54  ook, 0) ){.    T
4540: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
4550: 6f 72 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  or(pDb->interp);
4560: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
4570: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
4580: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4590: 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
45a0: 5f 4e 4f 54 49 46 59 29 0a 73 74 61 74 69 63 20  _NOTIFY).static 
45b0: 76 6f 69 64 20 73 65 74 54 65 73 74 55 6e 6c 6f  void setTestUnlo
45c0: 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 54 63 6c  ckNotifyVars(Tcl
45d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
45e0: 20 69 6e 74 20 69 41 72 67 2c 20 69 6e 74 20 6e   int iArg, int n
45f0: 41 72 67 29 7b 0a 20 20 63 68 61 72 20 7a 42 75  Arg){.  char zBu
4600: 66 5b 36 34 5d 3b 0a 20 20 73 70 72 69 6e 74 66  f[64];.  sprintf
4610: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 69 41 72  (zBuf, "%d", iAr
4620: 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  g);.  Tcl_SetVar
4630: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
4640: 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61  _unlock_notify_a
4650: 72 67 22 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47  rg", zBuf, TCL_G
4660: 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 73  LOBAL_ONLY);.  s
4670: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64  printf(zBuf, "%d
4680: 22 2c 20 6e 41 72 67 29 3b 0a 20 20 54 63 6c 5f  ", nArg);.  Tcl_
4690: 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
46a0: 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f  sqlite_unlock_no
46b0: 74 69 66 79 5f 61 72 67 63 6f 75 6e 74 22 2c 20  tify_argcount", 
46c0: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
46d0: 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65 6c 73 65 0a  _ONLY);.}.#else.
46e0: 23 20 64 65 66 69 6e 65 20 73 65 74 54 65 73 74  # define setTest
46f0: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73  UnlockNotifyVars
4700: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  (x,y,z).#endif..
4710: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4720: 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
4730: 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  FY.static void D
4740: 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 28 76 6f  bUnlockNotify(vo
4750: 69 64 20 2a 2a 61 70 41 72 67 2c 20 69 6e 74 20  id **apArg, int 
4760: 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nArg){.  int i;.
4770: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
4780: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  g; i++){.    con
4790: 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  st int flags = (
47a0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c  TCL_EVAL_GLOBAL|
47b0: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
47c0: 3b 0a 20 20 20 20 53 71 6c 69 74 65 44 62 20 2a  ;.    SqliteDb *
47d0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
47e0: 2a 29 61 70 41 72 67 5b 69 5d 3b 0a 20 20 20 20  *)apArg[i];.    
47f0: 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74  setTestUnlockNot
4800: 69 66 79 56 61 72 73 28 70 44 62 2d 3e 69 6e 74  ifyVars(pDb->int
4810: 65 72 70 2c 20 69 2c 20 6e 41 72 67 29 3b 0a 20  erp, i, nArg);. 
4820: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
4830: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a  pUnlockNotify);.
4840: 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45      Tcl_EvalObjE
4850: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
4860: 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
4870: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 54  y, flags);.    T
4880: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4890: 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
48a0: 66 79 29 3b 0a 20 20 20 20 70 44 62 2d 3e 70 55  fy);.    pDb->pU
48b0: 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b  nlockNotify = 0;
48c0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73  .  }.}.#endif..s
48d0: 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 70 64  tatic void DbUpd
48e0: 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f  ateHandler(.  vo
48f0: 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70  id *p, .  int op
4900: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
4910: 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  zDb, .  const ch
4920: 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c  ar *zTbl, .  sql
4930: 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 0a  ite_int64 rowid.
4940: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
4950: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a  Db = (SqliteDb *
4960: 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  )p;.  Tcl_Obj *p
4970: 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Cmd;..  assert( 
4980: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
4990: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
49a0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  ==SQLITE_INSERT 
49b0: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50  || op==SQLITE_UP
49c0: 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49  DATE || op==SQLI
49d0: 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20  TE_DELETE );..  
49e0: 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  pCmd = Tcl_Dupli
49f0: 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55 70  cateObj(pDb->pUp
4a00: 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c  dateHook);.  Tcl
4a10: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
4a20: 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  md);.  Tcl_ListO
4a30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4a40: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
4a50: 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20 28  StringObj(.    (
4a60: 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53   (op==SQLITE_INS
4a70: 45 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28 6f  ERT)?"INSERT":(o
4a80: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
4a90: 29 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c 45  )?"UPDATE":"DELE
4aa0: 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  TE"), -1));.  Tc
4ab0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4ac0: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4ad0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4ae0: 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63  (zDb, -1));.  Tc
4af0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4b00: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4b10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4b20: 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54  (zTbl, -1));.  T
4b30: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4b40: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
4b50: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
4b60: 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63  bj(rowid));.  Tc
4b70: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
4b80: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
4b90: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
4ba0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
4bb0: 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  tclCollateNeeded
4bc0: 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a  (.  void *pCtx,.
4bd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
4be0: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73   int enc,.  cons
4bf0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4c00: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
4c10: 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70   = (SqliteDb *)p
4c20: 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Ctx;.  Tcl_Obj *
4c30: 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75  pScript = Tcl_Du
4c40: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
4c50: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
4c60: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
4c70: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
4c80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4c90: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
4ca0: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
4cb0: 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29  ngObj(zName, -1)
4cc0: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
4cd0: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
4ce0: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54  pScript, 0);.  T
4cf0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4d00: 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a  pScript);.}../*.
4d10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4d20: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61  is called to eva
4d30: 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c  luate an SQL col
4d40: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
4d50: 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75  implemented.** u
4d60: 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e  sing TCL script.
4d70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
4d80: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20  clSqlCollate(.  
4d90: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e  void *pCtx,.  in
4da0: 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  t nA,.  const vo
4db0: 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42  id *zA,.  int nB
4dc0: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
4dd0: 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61  zB.){.  SqlColla
4de0: 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c  te *p = (SqlColl
4df0: 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63  ate *)pCtx;.  Tc
4e00: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20  l_Obj *pCmd;..  
4e10: 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pCmd = Tcl_NewSt
4e20: 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69  ringObj(p->zScri
4e30: 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  pt, -1);.  Tcl_I
4e40: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
4e50: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
4e60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
4e70: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
4e80: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4e90: 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f  zA, nA));.  Tcl_
4ea0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4eb0: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
4ec0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
4ed0: 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b  ingObj(zB, nB));
4ee0: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
4ef0: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
4f00: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
4f10: 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  T);.  Tcl_DecrRe
4f20: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4f30: 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63 6c  return (atoi(Tcl
4f40: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
4f50: 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d  (p->interp)));.}
4f60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4f70: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
4f80: 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51  o evaluate an SQ
4f90: 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  L function imple
4fa0: 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  mented.** using 
4fb0: 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73  TCL script..*/.s
4fc0: 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53 71  tatic void tclSq
4fd0: 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  lFunc(sqlite3_co
4fe0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
4ff0: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
5000: 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a  3_value**argv){.
5010: 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73    SqlFunc *p = s
5020: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
5030: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c  (context);.  Tcl
5040: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e  _Obj *pCmd;.  in
5050: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t i;.  int rc;..
5060: 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 7b    if( argc==0 ){
5070: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
5080: 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74   are no argument
5090: 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
50a0: 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c  n, call Tcl_Eval
50b0: 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20 20  ObjEx on the.   
50c0: 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63   ** script objec
50d0: 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  t directly.  Thi
50e0: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c  s allows the TCL
50f0: 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e   compiler to gen
5100: 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79 74  erate.    ** byt
5110: 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63 6f  ecode for the co
5120: 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69 72  mmand on the fir
5130: 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e  st invocation an
5140: 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20 20  d thus make.    
5150: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  ** subsequent in
5160: 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20 66  vocations much f
5170: 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43  aster. */.    pC
5180: 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b  md = p->pScript;
5190: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
51a0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
51b0: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
51c0: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
51d0: 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  Cmd, 0);.    Tcl
51e0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
51f0: 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  md);.  }else{.  
5200: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
5210: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
5220: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b  he function, mak
5230: 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79  e a shallow copy
5240: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   of the.    ** s
5250: 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61  cript object, la
5260: 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65  ppend the argume
5270: 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75 61  nts, then evalua
5280: 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20  te the copy..   
5290: 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22 73   **.    ** By "s
52a0: 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65  hallow" copy, we
52b0: 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68 65   mean a only the
52c0: 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f   outer list Tcl_
52d0: 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65  Obj is duplicate
52e0: 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65  d..    ** The ne
52f0: 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69  w Tcl_Obj contai
5300: 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  ns pointers to t
5310: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74  he original list
5320: 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20   elements. .    
5330: 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68 65  ** That way, whe
5340: 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  n Tcl_EvalObjv()
5350: 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69 6d   is run and shim
5360: 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20 65  mers the first e
5370: 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66  lement.    ** of
5380: 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63 6c   the list to tcl
5390: 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68 61  CmdNameType, tha
53a0: 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70 72  t alternate repr
53b0: 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a  esentation will.
53c0: 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65 72      ** be preser
53d0: 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20 6f  ved and reused o
53e0: 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f 63  n the next invoc
53f0: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
5400: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67    Tcl_Obj **aArg
5410: 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  ;.    int nArg;.
5420: 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73 74      if( Tcl_List
5430: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 70  ObjGetElements(p
5440: 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63  ->interp, p->pSc
5450: 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61 41  ript, &nArg, &aA
5460: 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  rg) ){.      sql
5470: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5480: 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47  r(context, Tcl_G
5490: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
54a0: 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20  ->interp), -1); 
54b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
54c0: 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70 43     }     .    pC
54d0: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  md = Tcl_NewList
54e0: 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b  Obj(nArg, aArg);
54f0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
5500: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
5510: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
5520: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
5530: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e  lite3_value *pIn
5540: 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20   = argv[i];.    
5550: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
5560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
5570: 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20      /* Set pVal 
5580: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69  to contain the i
5590: 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'th column of th
55a0: 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  is row. */.     
55b0: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
55c0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e 29  _value_type(pIn)
55d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
55e0: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
55f0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79            int by
5600: 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
5610: 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a  lue_bytes(pIn);.
5620: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
5630: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
5640: 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c  yObj(sqlite3_val
5650: 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79  ue_blob(pIn), by
5660: 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tes);.          
5670: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5680: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
5690: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
56a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
56b0: 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74  _int64 v = sqlit
56c0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70  e3_value_int64(p
56d0: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  In);.          i
56e0: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
56f0: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
5700: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  47 ){.          
5710: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
5720: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
5730: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5740: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
5750: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
5760: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
5770: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5780: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5790: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
57a0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
57b0: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
57c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
57d0: 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  le(pIn);.       
57e0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
57f0: 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20  wDoubleObj(r);. 
5800: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5810: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5820: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
5830: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  LL: {.          
5840: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
5850: 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b 0a  ringObj("", 0);.
5860: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5870: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5880: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5890: 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65          int byte
58a0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
58b0: 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20  e_bytes(pIn);.  
58c0: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
58d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
58e0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
58f0: 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c  value_text(pIn),
5900: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20   bytes);.       
5910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5920: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5930: 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f    rc = Tcl_ListO
5940: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5950: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
5960: 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66   pVal);.      if
5970: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
5980: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5990: 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20  (pCmd);.        
59a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
59b0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63  rror(context, Tc
59c0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
59d0: 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31  t(p->interp), -1
59e0: 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65 74 75  ); .        retu
59f0: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
5a00: 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73  }.    if( !p->us
5a10: 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20  eEvalObjv ){.   
5a20: 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62     /* Tcl_EvalOb
5a30: 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d  jEx() will autom
5a40: 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63  atically call Tc
5a50: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 66 20  l_EvalObjv() if 
5a60: 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69 73  pCmd.      ** is
5a70: 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75 74 20   a list without 
5a80: 61 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  a string represe
5a90: 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65  ntation.  To pre
5aa0: 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20  vent this from. 
5ab0: 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e       ** happenin
5ac0: 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 43 6d  g, make sure pCm
5ad0: 64 20 68 61 73 20 61 20 76 61 6c 69 64 20 73 74  d has a valid st
5ae0: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
5af0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c  ion */.      Tcl
5b00: 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d 64 29  _GetString(pCmd)
5b10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
5b20: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
5b30: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
5b40: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
5b50: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
5b60: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
5b70: 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20 72  }..  if( rc && r
5b80: 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b  c!=TCL_RETURN ){
5b90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
5ba0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
5bb0: 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  t, Tcl_GetString
5bc0: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5bd0: 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65  ), -1); .  }else
5be0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
5bf0: 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  Var = Tcl_GetObj
5c00: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5c10: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  );.    int n;.  
5c20: 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20    u8 *data;.    
5c30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
5c40: 65 20 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50  e = (pVar->typeP
5c50: 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50  tr ? pVar->typeP
5c60: 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a  tr->name : "");.
5c70: 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79      char c = zTy
5c80: 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63  pe[0];.    if( c
5c90: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
5ca0: 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61 79  zType,"bytearray
5cb0: 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62  ")==0 && pVar->b
5cc0: 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ytes==0 ){.     
5cd0: 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20   /* Only return 
5ce0: 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74  a BLOB type if t
5cf0: 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20  he Tcl variable 
5d00: 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61  is a bytearray a
5d10: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  nd.      ** has 
5d20: 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  no string repres
5d30: 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  entation. */.   
5d40: 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65     data = Tcl_Ge
5d50: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
5d60: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
5d70: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5d80: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
5d90: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
5da0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
5db0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27  }else if( c=='b'
5dc0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
5dd0: 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29  ,"boolean")==0 )
5de0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49  {.      Tcl_GetI
5df0: 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  ntFromObj(0, pVa
5e00: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71  r, &n);.      sq
5e10: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
5e20: 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20  (context, n);.  
5e30: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
5e40: 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  d' && strcmp(zTy
5e50: 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20  pe,"double")==0 
5e60: 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  ){.      double 
5e70: 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  r;.      Tcl_Get
5e80: 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c  DoubleFromObj(0,
5e90: 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20   pVar, &r);.    
5ea0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5eb0: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
5ec0: 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   r);.    }else i
5ed0: 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74  f( (c=='w' && st
5ee0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65  rcmp(zType,"wide
5ef0: 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20  Int")==0) ||.   
5f00: 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26         (c=='i' &
5f10: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
5f20: 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20  int")==0) ){.   
5f30: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
5f40: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57  ;.      Tcl_GetW
5f50: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  ideIntFromObj(0,
5f60: 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20   pVar, &v);.    
5f70: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5f80: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
5f90: 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
5fa0: 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73       data = (uns
5fb0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
5fc0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
5fd0: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
5fe0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5ff0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6000: 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c  (char *)data, n,
6010: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
6020: 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  T);.    }.  }.}.
6030: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6040: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
6050: 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ON./*.** This is
6060: 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74   the authenticat
6070: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  ion function.  I
6080: 74 20 61 70 70 65 6e 64 73 20 74 68 65 20 61 75  t appends the au
6090: 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20  thentication.** 
60a0: 74 79 70 65 20 63 6f 64 65 20 61 6e 64 20 74 68  type code and th
60b0: 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20  e two arguments 
60c0: 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20 69  to zCmd[] then i
60d0: 6e 76 6f 6b 65 73 20 74 68 65 20 72 65 73 75 6c  nvokes the resul
60e0: 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74 65  t.** on the inte
60f0: 72 70 72 65 74 65 72 2e 20 20 54 68 65 20 72 65  rpreter.  The re
6100: 70 6c 79 20 69 73 20 65 78 61 6d 69 6e 65 64 20  ply is examined 
6110: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
6120: 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69 63  the.** authentic
6130: 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 73  ation fails or s
6140: 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61 74  ucceeds..*/.stat
6150: 69 63 20 69 6e 74 20 61 75 74 68 5f 63 61 6c 6c  ic int auth_call
6160: 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41  back(.  void *pA
6170: 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c 0a  rg,.  int code,.
6180: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
6190: 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg1,.  const cha
61a0: 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e 73  r *zArg2,.  cons
61b0: 74 20 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a 20  t char *zArg3,. 
61c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
61d0: 67 34 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  g4.){.  char *zC
61e0: 6f 64 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ode;.  Tcl_DStri
61f0: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
6200: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6210: 7a 52 65 70 6c 79 3b 0a 20 20 53 71 6c 69 74 65  zReply;.  Sqlite
6220: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
6230: 65 44 62 2a 29 70 41 72 67 3b 0a 20 20 69 66 28  eDb*)pArg;.  if(
6240: 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
6250: 68 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  h ) return SQLIT
6260: 45 5f 4f 4b 3b 0a 0a 20 20 73 77 69 74 63 68 28  E_OK;..  switch(
6270: 20 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73   code ){.    cas
6280: 65 20 53 51 4c 49 54 45 5f 43 4f 50 59 20 20 20  e SQLITE_COPY   
6290: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
62a0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59 22  de="SQLITE_COPY"
62b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
62c0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
62d0: 49 4e 44 45 58 20 20 20 20 20 20 3a 20 7a 43 6f  INDEX      : zCo
62e0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
62f0: 45 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  E_INDEX"; break;
6300: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6310: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20  _CREATE_TABLE   
6320: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6330: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 22  TE_CREATE_TABLE"
6340: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6350: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6360: 54 45 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f  TEMP_INDEX : zCo
6370: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
6380: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62  E_TEMP_INDEX"; b
6390: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
63a0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
63b0: 50 5f 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d  P_TABLE : zCode=
63c0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
63d0: 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  EMP_TABLE"; brea
63e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
63f0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
6400: 52 49 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53  RIGGER: zCode="S
6410: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
6420: 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  P_TRIGGER"; brea
6430: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6440: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
6450: 49 45 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  IEW  : zCode="SQ
6460: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
6470: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
6480: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6490: 52 45 41 54 45 5f 54 52 49 47 47 45 52 20 20 20  REATE_TRIGGER   
64a0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
64b0: 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 22  _CREATE_TRIGGER"
64c0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
64d0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
64e0: 56 49 45 57 20 20 20 20 20 20 20 3a 20 7a 43 6f  VIEW       : zCo
64f0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
6500: 45 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  E_VIEW"; break;.
6510: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6520: 44 45 4c 45 54 45 20 20 20 20 20 20 20 20 20 20  DELETE          
6530: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6540: 45 5f 44 45 4c 45 54 45 22 3b 20 62 72 65 61 6b  E_DELETE"; break
6550: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6560: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 20 20 20 20  E_DROP_INDEX    
6570: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6580: 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b  ITE_DROP_INDEX";
6590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
65a0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
65b0: 4c 45 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  LE        : zCod
65c0: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
65d0: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
65e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
65f0: 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20  OP_TEMP_INDEX   
6600: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6610: 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22  DROP_TEMP_INDEX"
6620: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6630: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
6640: 4d 50 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f  MP_TABLE   : zCo
6650: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6660: 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  TEMP_TABLE"; bre
6670: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6680: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
6690: 49 47 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53  IGGER : zCode="S
66a0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
66b0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
66c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
66d0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20  _DROP_TEMP_VIEW 
66e0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
66f0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
6700: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
6710: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
6720: 54 52 49 47 47 45 52 20 20 20 20 20 20 3a 20 7a  TRIGGER      : z
6730: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
6740: 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  P_TRIGGER"; brea
6750: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6760: 54 45 5f 44 52 4f 50 5f 56 49 45 57 20 20 20 20  TE_DROP_VIEW    
6770: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6780: 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b  LITE_DROP_VIEW";
6790: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
67a0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 20   SQLITE_INSERT  
67b0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
67c0: 65 3d 22 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e="SQLITE_INSERT
67d0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
67e0: 73 65 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  se SQLITE_PRAGMA
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
6800: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 50 52 41 47  ode="SQLITE_PRAG
6810: 4d 41 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  MA"; break;.    
6820: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
6840: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45  zCode="SQLITE_RE
6850: 41 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  AD"; break;.    
6860: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45  case SQLITE_SELE
6870: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  CT            : 
6880: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 45  zCode="SQLITE_SE
6890: 4c 45 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LECT"; break;.  
68a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
68b0: 41 4e 53 41 43 54 49 4f 4e 20 20 20 20 20 20 20  ANSACTION       
68c0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
68d0: 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72  TRANSACTION"; br
68e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
68f0: 4c 49 54 45 5f 55 50 44 41 54 45 20 20 20 20 20  LITE_UPDATE     
6900: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6910: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 22 3b 20  SQLITE_UPDATE"; 
6920: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6930: 53 51 4c 49 54 45 5f 41 54 54 41 43 48 20 20 20  SQLITE_ATTACH   
6940: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
6950: 3d 22 53 51 4c 49 54 45 5f 41 54 54 41 43 48 22  ="SQLITE_ATTACH"
6960: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6970: 65 20 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20  e SQLITE_DETACH 
6980: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
6990: 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 54 41 43  de="SQLITE_DETAC
69a0: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  H"; break;.    c
69b0: 61 73 65 20 53 51 4c 49 54 45 5f 41 4c 54 45 52  ase SQLITE_ALTER
69c0: 5f 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a  _TABLE       : z
69d0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54  Code="SQLITE_ALT
69e0: 45 52 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  ER_TABLE"; break
69f0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6a00: 45 5f 52 45 49 4e 44 45 58 20 20 20 20 20 20 20  E_REINDEX       
6a10: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6a20: 49 54 45 5f 52 45 49 4e 44 45 58 22 3b 20 62 72  ITE_REINDEX"; br
6a30: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6a40: 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20  LITE_ANALYZE    
6a50: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6a60: 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b  SQLITE_ANALYZE";
6a70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6a80: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
6a90: 54 41 42 4c 45 20 20 20 20 20 3a 20 7a 43 6f 64  TABLE     : zCod
6aa0: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
6ab0: 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  _VTABLE"; break;
6ac0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6ad0: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 20 20 20 20  _DROP_VTABLE    
6ae0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6af0: 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 22 3b  TE_DROP_VTABLE";
6b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6b10: 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e   SQLITE_FUNCTION
6b20: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6b30: 65 3d 22 53 51 4c 49 54 45 5f 46 55 4e 43 54 49  e="SQLITE_FUNCTI
6b40: 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ON"; break;.    
6b50: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 41 56 45  case SQLITE_SAVE
6b60: 50 4f 49 4e 54 20 20 20 20 20 20 20 20 20 3a 20  POINT         : 
6b70: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 41  zCode="SQLITE_SA
6b80: 56 45 50 4f 49 4e 54 22 3b 20 62 72 65 61 6b 3b  VEPOINT"; break;
6b90: 0a 20 20 20 20 64 65 66 61 75 6c 74 20 20 20 20  .    default    
6ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bb0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f     : zCode="????
6bc0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  "; break;.  }.  
6bd0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
6be0: 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74  &str);.  Tcl_DSt
6bf0: 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c  ringAppend(&str,
6c00: 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29   pDb->zAuth, -1)
6c10: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
6c20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
6c30: 72 2c 20 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c  r, zCode);.  Tcl
6c40: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
6c50: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
6c60: 31 20 3f 20 7a 41 72 67 31 20 3a 20 22 22 29 3b  1 ? zArg1 : "");
6c70: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
6c80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
6c90: 2c 20 7a 41 72 67 32 20 3f 20 7a 41 72 67 32 20  , zArg2 ? zArg2 
6ca0: 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74  : "");.  Tcl_DSt
6cb0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
6cc0: 74 28 26 73 74 72 2c 20 7a 41 72 67 33 20 3f 20  t(&str, zArg3 ? 
6cd0: 7a 41 72 67 33 20 3a 20 22 22 29 3b 0a 20 20 54  zArg3 : "");.  T
6ce0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
6cf0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
6d00: 72 67 34 20 3f 20 7a 41 72 67 34 20 3a 20 22 22  rg4 ? zArg4 : ""
6d10: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c  );.  rc = Tcl_Gl
6d20: 6f 62 61 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e  obalEval(pDb->in
6d30: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
6d40: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
6d50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
6d60: 28 26 73 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79  (&str);.  zReply
6d70: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
6d80: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
6d90: 72 70 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  rp);.  if( strcm
6da0: 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45  p(zReply,"SQLITE
6db0: 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _OK")==0 ){.    
6dc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6dd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
6de0: 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54  mp(zReply,"SQLIT
6df0: 45 5f 44 45 4e 59 22 29 3d 3d 30 20 29 7b 0a 20  E_DENY")==0 ){. 
6e00: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
6e10: 45 4e 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ENY;.  }else if(
6e20: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
6e30: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 22 29 3d  SQLITE_IGNORE")=
6e40: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
6e50: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 3b 0a 20 20  QLITE_IGNORE;.  
6e60: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
6e70: 39 39 39 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  999;.  }.  retur
6e80: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
6e90: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
6ea0: 54 48 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  THORIZATION */..
6eb0: 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20 69 73 20 61  /*.** zText is a
6ec0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 65 78 74   pointer to text
6ed0: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 61 6e   obtained via an
6ee0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6ef0: 74 65 78 74 28 29 0a 2a 2a 20 6f 72 20 73 69 6d  text().** or sim
6f00: 69 6c 61 72 20 69 6e 74 65 72 66 61 63 65 2e 20  ilar interface. 
6f10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
6f20: 75 72 6e 73 20 61 20 54 63 6c 20 73 74 72 69 6e  urns a Tcl strin
6f30: 67 20 6f 62 6a 65 63 74 2c 20 0a 2a 2a 20 72 65  g object, .** re
6f40: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 73 65  ference count se
6f50: 74 20 74 6f 20 30 2c 20 63 6f 6e 74 61 69 6e 69  t to 0, containi
6f60: 6e 67 20 74 68 65 20 74 65 78 74 2e 20 49 66 20  ng the text. If 
6f70: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a  a translation.**
6f80: 20 62 65 74 77 65 65 6e 20 69 73 6f 38 38 35 39   between iso8859
6f90: 20 61 6e 64 20 55 54 46 2d 38 20 69 73 20 72 65   and UTF-8 is re
6fa0: 71 75 69 72 65 64 2c 20 69 74 20 69 73 20 70 72  quired, it is pr
6fb0: 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74  eformed..*/.stat
6fc0: 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 54 65  ic Tcl_Obj *dbTe
6fd0: 78 74 54 6f 4f 62 6a 28 63 68 61 72 20 63 6f 6e  xtToObj(char con
6fe0: 73 74 20 2a 7a 54 65 78 74 29 7b 0a 20 20 54 63  st *zText){.  Tc
6ff0: 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 23 69 66  l_Obj *pVal;.#if
7000: 64 65 66 20 55 54 46 5f 54 52 41 4e 53 4c 41 54  def UTF_TRANSLAT
7010: 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 54 63 6c  ION_NEEDED.  Tcl
7020: 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20  _DString dCol;. 
7030: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
7040: 28 26 64 43 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45  (&dCol);.  Tcl_E
7050: 78 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74 72  xternalToUtfDStr
7060: 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c  ing(NULL, zText,
7070: 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 70   -1, &dCol);.  p
7080: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Val = Tcl_NewStr
7090: 69 6e 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69  ingObj(Tcl_DStri
70a0: 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20  ngValue(&dCol), 
70b0: 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  -1);.  Tcl_DStri
70c0: 6e 67 46 72 65 65 28 26 64 43 6f 6c 29 3b 0a 23  ngFree(&dCol);.#
70d0: 65 6c 73 65 0a 20 20 70 56 61 6c 20 3d 20 54 63  else.  pVal = Tc
70e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
70f0: 54 65 78 74 2c 20 2d 31 29 3b 0a 23 65 6e 64 69  Text, -1);.#endi
7100: 66 0a 20 20 72 65 74 75 72 6e 20 70 56 61 6c 3b  f.  return pVal;
7110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7120: 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c  outine reads a l
7130: 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d  ine of text from
7140: 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73   FILE in, stores
7150: 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20  .** the text in 
7160: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
7170: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
7180: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
7190: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65  ter.** to the te
71a0: 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  xt.  NULL is ret
71b0: 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20  urned at end of 
71c0: 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c  file, or if mall
71d0: 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  oc().** fails..*
71e0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
71f0: 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64  ce is like "read
7200: 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d  line" but no com
7210: 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e  mand-line editin
7220: 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  g.** is done..**
7230: 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  .** copied from 
7240: 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69  shell.c from '.i
7250: 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a  mport' command.*
7260: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
7270: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
7280: 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45  r *zPrompt, FILE
7290: 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   *in){.  char *z
72a0: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e  Line;.  int nLin
72b0: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  e;.  int n;.  in
72c0: 74 20 65 6f 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20  t eol;..  nLine 
72d0: 3d 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d  = 100;.  zLine =
72e0: 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29   malloc( nLine )
72f0: 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30  ;.  if( zLine==0
7300: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
7310: 20 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b   = 0;.  eol = 0;
7320: 0a 20 20 77 68 69 6c 65 28 20 21 65 6f 6c 20 29  .  while( !eol )
7330: 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e  {.    if( n+100>
7340: 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e  nLine ){.      n
7350: 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b  Line = nLine*2 +
7360: 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e   100;.      zLin
7370: 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e  e = realloc(zLin
7380: 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20  e, nLine);.     
7390: 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20   if( zLine==0 ) 
73a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
73b0: 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a      if( fgets(&z
73c0: 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d  Line[n], nLine -
73d0: 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20   n, in)==0 ){.  
73e0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
73f0: 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69          free(zLi
7400: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ne);.        ret
7410: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
7420: 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20       zLine[n] = 
7430: 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31  0;.      eol = 1
7440: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7450: 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
7460: 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b  zLine[n] ){ n++;
7470: 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
7480: 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c  & zLine[n-1]=='\
7490: 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b  n' ){.      n--;
74a0: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20  .      zLine[n] 
74b0: 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d  = 0;.      eol =
74c0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
74d0: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
74e0: 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20   zLine, n+1 );. 
74f0: 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d   return zLine;.}
7500: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
7510: 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  nction is part o
7520: 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  f the implementa
7530: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d  tion of the comm
7540: 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62  and:.**.**   $db
7550: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64   transaction [-d
7560: 65 66 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61  eferred|-immedia
7570: 74 65 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53  te|-exclusive] S
7580: 43 52 49 50 54 0a 2a 2a 0a 2a 2a 20 49 74 20 69  CRIPT.**.** It i
7590: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
75a0: 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 73  evaluating the s
75b0: 63 72 69 70 74 20 53 43 52 49 50 54 20 74 6f 20  cript SCRIPT to 
75c0: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
75d0: 63 6b 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  ck.** the transa
75e0: 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69  ction or savepoi
75f0: 6e 74 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  nt opened by the
7600: 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d 20 63   [transaction] c
7610: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
7620: 63 20 69 6e 74 20 44 62 54 72 61 6e 73 50 6f 73  c int DbTransPos
7630: 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  tCmd(.  ClientDa
7640: 74 61 20 64 61 74 61 5b 5d 2c 20 20 20 20 20 20  ta data[],      
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7660: 64 61 74 61 5b 30 5d 20 69 73 20 74 68 65 20 53  data[0] is the S
7670: 71 6c 69 74 65 33 44 62 2a 20 66 6f 72 20 24 64  qlite3Db* for $d
7680: 62 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  b */.  Tcl_Inter
7690: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20  p *interp,      
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
76b0: 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  cl interpreter *
76c0: 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20 20  /.  int result  
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
76f0: 6c 74 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67  lt of evaluating
7700: 20 53 43 52 49 50 54 20 2a 2f 0a 29 7b 0a 20 20   SCRIPT */.){.  
7710: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7720: 72 20 2a 61 7a 45 6e 64 5b 5d 20 3d 20 7b 0a 20  r *azEnd[] = {. 
7730: 20 20 20 22 52 45 4c 45 41 53 45 20 5f 74 63 6c     "RELEASE _tcl
7740: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20  _transaction",  
7750: 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c        /* rc==TCL
7760: 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63  _ERROR, nTransac
7770: 74 69 6f 6e 21 3d 30 20 2a 2f 0a 20 20 20 20 22  tion!=0 */.    "
7780: 43 4f 4d 4d 49 54 22 2c 20 20 20 20 20 20 20 20  COMMIT",        
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77a0: 20 20 2f 2a 20 72 63 21 3d 54 43 4c 5f 45 52 52    /* rc!=TCL_ERR
77b0: 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e  OR, nTransaction
77c0: 3d 3d 30 20 2a 2f 0a 20 20 20 20 22 52 4f 4c 4c  ==0 */.    "ROLL
77d0: 42 41 43 4b 20 54 4f 20 5f 74 63 6c 5f 74 72 61  BACK TO _tcl_tra
77e0: 6e 73 61 63 74 69 6f 6e 20 3b 20 52 45 4c 45 41  nsaction ; RELEA
77f0: 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74  SE _tcl_transact
7800: 69 6f 6e 22 2c 0a 20 20 20 20 22 52 4f 4c 4c 42  ion",.    "ROLLB
7810: 41 43 4b 22 20 20 20 20 20 20 20 20 20 20 20 20  ACK"            
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7830: 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e  rc==TCL_ERROR, n
7840: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a  Transaction==0 *
7850: 2f 0a 20 20 7d 3b 0a 20 20 53 71 6c 69 74 65 44  /.  };.  SqliteD
7860: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
7870: 44 62 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 69  Db*)data[0];.  i
7880: 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74 3b 0a  nt rc = result;.
7890: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
78a0: 6e 64 3b 0a 0a 20 20 70 44 62 2d 3e 6e 54 72 61  nd;..  pDb->nTra
78b0: 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 7a 45  nsaction--;.  zE
78c0: 6e 64 20 3d 20 61 7a 45 6e 64 5b 28 72 63 3d 3d  nd = azEnd[(rc==
78d0: 54 43 4c 5f 45 52 52 4f 52 29 2a 32 20 2b 20 28  TCL_ERROR)*2 + (
78e0: 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pDb->nTransactio
78f0: 6e 3d 3d 30 29 5d 3b 0a 0a 20 20 70 44 62 2d 3e  n==0)];..  pDb->
7900: 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20  disableAuth++;. 
7910: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 65 78 65   if( sqlite3_exe
7920: 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c  c(pDb->db, zEnd,
7930: 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20   0, 0, 0) ){.   
7940: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
7950: 74 72 69 63 6b 79 20 73 63 65 6e 61 72 69 6f 20  tricky scenario 
7960: 74 6f 20 68 61 6e 64 6c 65 2e 20 54 68 65 20 6d  to handle. The m
7970: 6f 73 74 20 6c 69 6b 65 6c 79 20 63 61 75 73 65  ost likely cause
7980: 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   of an.      ** 
7990: 65 72 72 6f 72 20 69 73 20 74 68 61 74 20 74 68  error is that th
79a0: 65 20 65 78 65 63 28 29 20 61 62 6f 76 65 20 77  e exec() above w
79b0: 61 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  as an attempt to
79c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 0a 20 20 20   commit the .   
79d0: 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20     ** top-level 
79e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
79f0: 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45   returned SQLITE
7a00: 5f 42 55 53 59 2e 20 4f 72 2c 20 6c 65 73 73 20  _BUSY. Or, less 
7a10: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 20 20 2a 2a  likely,.      **
7a20: 20 74 68 61 74 20 61 6e 20 49 4f 2d 65 72 72 6f   that an IO-erro
7a30: 72 20 68 61 73 20 6f 63 63 75 72 65 64 2e 20 49  r has occured. I
7a40: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74  n either case, t
7a50: 68 72 6f 77 20 61 20 54 63 6c 20 65 78 63 65 70  hrow a Tcl excep
7a60: 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6e  tion.      ** an
7a70: 64 20 74 72 79 20 74 6f 20 72 6f 6c 6c 62 61 63  d try to rollbac
7a80: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
7a90: 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
7aa0: 20 20 2a 2a 20 42 75 74 20 69 74 20 63 6f 75 6c    ** But it coul
7ab0: 64 20 61 6c 73 6f 20 62 65 20 74 68 61 74 20 74  d also be that t
7ac0: 68 65 20 75 73 65 72 20 65 78 65 63 75 74 65 64  he user executed
7ad0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 42 45 47   one or more BEG
7ae0: 49 4e 2c 20 0a 20 20 20 20 20 20 2a 2a 20 43 4f  IN, .      ** CO
7af0: 4d 4d 49 54 2c 20 53 41 56 45 50 4f 49 4e 54 2c  MMIT, SAVEPOINT,
7b00: 20 52 45 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c   RELEASE or ROLL
7b10: 42 41 43 4b 20 63 6f 6d 6d 61 6e 64 73 20 74 68  BACK commands th
7b20: 61 74 20 61 72 65 20 63 6f 6e 66 75 73 69 6e 67  at are confusing
7b30: 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 6d  .      ** this m
7b40: 65 74 68 6f 64 27 73 20 6c 6f 67 69 63 2e 20 4e  ethod's logic. N
7b50: 6f 74 20 63 6c 65 61 72 20 68 6f 77 20 74 68 69  ot clear how thi
7b60: 73 20 77 6f 75 6c 64 20 62 65 20 62 65 73 74 20  s would be best 
7b70: 68 61 6e 64 6c 65 64 2e 0a 20 20 20 20 20 20 2a  handled..      *
7b80: 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54 43  /.    if( rc!=TC
7b90: 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  L_ERROR ){.     
7ba0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7bb0: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
7bc0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
7bd0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20  ), 0);.      rc 
7be0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
7bf0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65   }.    sqlite3_e
7c00: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 52 4f  xec(pDb->db, "RO
7c10: 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30  LLBACK", 0, 0, 0
7c20: 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 64 69  );.  }.  pDb->di
7c30: 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 0a 20 20  sableAuth--;..  
7c40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7c50: 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 63  .** Search the c
7c60: 61 63 68 65 20 66 6f 72 20 61 20 70 72 65 70 61  ache for a prepa
7c70: 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62  red-statement ob
7c80: 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
7c90: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  ents the.** firs
7ca0: 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  t SQL statement 
7cb0: 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
7cc0: 69 6e 74 65 64 20 74 6f 20 62 79 20 70 61 72 61  inted to by para
7cd0: 6d 65 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a  meter zIn. If.**
7ce0: 20 6e 6f 20 73 75 63 68 20 70 72 65 70 61 72 65   no such prepare
7cf0: 64 2d 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20  d-statement can 
7d00: 62 65 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61  be found, alloca
7d10: 74 65 20 61 6e 64 20 70 72 65 70 61 72 65 20 61  te and prepare a
7d20: 20 6e 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20   new.** one. In 
7d30: 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 69 6e  either case, bin
7d40: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
7d50: 6c 75 65 73 20 6f 66 20 74 68 65 20 72 65 6c 65  lues of the rele
7d60: 76 61 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72 69  vant Tcl.** vari
7d70: 61 62 6c 65 73 20 74 6f 20 61 6e 79 20 24 76 61  ables to any $va
7d80: 72 2c 20 3a 76 61 72 20 6f 72 20 40 76 61 72 20  r, :var or @var 
7d90: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65  variables in the
7da0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 42 65 66 6f   statement. Befo
7db0: 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c  re.** returning,
7dc0: 20 73 65 74 20 2a 70 70 50 72 65 53 74 6d 74 20   set *ppPreStmt 
7dd0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
7de0: 70 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65  prepared-stateme
7df0: 6e 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  nt object..**.**
7e00: 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   Output paramete
7e10: 72 20 2a 70 7a 4f 75 74 20 69 73 20 73 65 74 20  r *pzOut is set 
7e20: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
7e30: 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65  next SQL stateme
7e40: 6e 74 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72 20  nt in.** buffer 
7e50: 7a 49 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20 27  zIn, or to the '
7e60: 5c 30 27 20 62 79 74 65 20 61 74 20 74 68 65 20  \0' byte at the 
7e70: 65 6e 64 20 6f 66 20 7a 49 6e 20 69 66 20 74 68  end of zIn if th
7e80: 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78  ere is no.** nex
7e90: 74 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  t statement..**.
7ea0: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
7eb0: 2c 20 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74 75  , TCL_OK is retu
7ec0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
7ed0: 20 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65   TCL_ERROR is re
7ee0: 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  turned.** and an
7ef0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c   error message l
7f00: 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72  oaded into inter
7f10: 70 72 65 74 65 72 20 70 44 62 2d 3e 69 6e 74 65  preter pDb->inte
7f20: 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rp..*/.static in
7f30: 74 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69  t dbPrepareAndBi
7f40: 6e 64 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  nd(.  SqliteDb *
7f50: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
7f60: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
7f70: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  e object */.  ch
7f80: 61 72 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20  ar const *zIn,  
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7fa0: 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20   SQL to compile 
7fb0: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
7fc0: 2a 2a 70 7a 4f 75 74 2c 20 20 20 20 20 20 20 20  **pzOut,        
7fd0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
7fe0: 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c  nter to next SQL
7ff0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
8000: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
8010: 2a 2a 70 70 50 72 65 53 74 6d 74 20 20 20 20 20  **ppPreStmt     
8020: 2f 2a 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20 75  /* OUT: Object u
8030: 73 65 64 20 74 6f 20 63 61 63 68 65 20 73 74 61  sed to cache sta
8040: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  tement */.){.  c
8050: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
8060: 3d 20 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f  = zIn;         /
8070: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72  * Pointer to fir
8080: 73 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  st SQL statement
8090: 20 69 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c   in zIn */.  sql
80a0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
80b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
80c0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
80d0: 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53  nt object */.  S
80e0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
80f0: 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f  pPreStmt;      /
8100: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 61 63  * Pointer to cac
8110: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  hed statement */
8120: 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20  .  int nSql;    
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8140: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
8150: 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f  zSql in bytes */
8160: 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20  .  int nVar;    
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8180: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8190: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 73 74 61  variables in sta
81a0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
81b0: 69 50 61 72 6d 20 3d 20 30 3b 20 20 20 20 20 20  iParm = 0;      
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
81d0: 65 78 74 20 66 72 65 65 20 65 6e 74 72 79 20 69  ext free entry i
81e0: 6e 20 61 70 50 61 72 6d 20 2a 2f 0a 20 20 69 6e  n apParm */.  in
81f0: 74 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  t i;.  Tcl_Inter
8200: 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d  p *interp = pDb-
8210: 3e 69 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50  >interp;..  *ppP
8220: 72 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f  reStmt = 0;..  /
8230: 2a 20 54 72 69 6d 20 73 70 61 63 65 73 20 66 72  * Trim spaces fr
8240: 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
8250: 7a 53 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61  zSql and calcula
8260: 74 65 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  te the remaining
8270: 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68   length. */.  wh
8280: 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a 53 71  ile( isspace(zSq
8290: 6c 5b 30 5d 29 20 29 7b 20 7a 53 71 6c 2b 2b 3b  l[0]) ){ zSql++;
82a0: 20 7d 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c   }.  nSql = strl
82b0: 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66  en30(zSql);..  f
82c0: 6f 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44  or(pPreStmt = pD
82d0: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72  b->stmtList; pPr
82e0: 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d  eStmt; pPreStmt=
82f0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29  pPreStmt->pNext)
8300: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50  {.    int n = pP
8310: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20  reStmt->nSql;.  
8320: 20 20 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20    if( nSql>=n . 
8330: 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
8340: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
8350: 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20   zSql, n)==0.   
8360: 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d       && (zSql[n]
8370: 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d  ==0 || zSql[n-1]
8380: 3d 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20 20  ==';').    ){.  
8390: 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65      pStmt = pPre
83a0: 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  Stmt->pStmt;.   
83b0: 20 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53 71     *pzOut = &zSq
83c0: 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  l[pPreStmt->nSql
83d0: 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  ];..      /* Whe
83e0: 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  n a prepared sta
83f0: 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c  tement is found,
8400: 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20   unlink it from 
8410: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
8420: 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  he list.  It wil
8430: 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64  l later be added
8440: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
8450: 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
8460: 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73  of the cache lis
8470: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d  t in order to im
8480: 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c  plement LRU repl
8490: 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  acement..      *
84a0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  /.      if( pPre
84b0: 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Stmt->pPrev ){. 
84c0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
84d0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
84e0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
84f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8500: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
8510: 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ist = pPreStmt->
8520: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
8530: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
8540: 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  t->pNext ){.    
8550: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e      pPreStmt->pN
8560: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72  ext->pPrev = pPr
8570: 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20  eStmt->pPrev;.  
8580: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8590: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
85a0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
85b0: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
85c0: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a    pDb->nStmt--;.
85d0: 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c        nVar = sql
85e0: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
85f0: 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ter_count(pStmt)
8600: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8610: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
8620: 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20   If no prepared 
8630: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f  statement was fo
8640: 75 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65  und. Compile the
8650: 20 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20   SQL text. Also 
8660: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20  allocate.  ** a 
8670: 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53  new SqlPreparedS
8680: 74 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  tmt structure.  
8690: 2a 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d  */.  if( pPreStm
86a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
86b0: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20  nByte;..    if( 
86c0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
86d0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 44  e3_prepare_v2(pD
86e0: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
86f0: 20 26 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20   &pStmt, pzOut) 
8700: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
8710: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
8720: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  , dbTextToObj(sq
8730: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
8740: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 72  ->db)));.      r
8750: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8760: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8770: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
8780: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
8790: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
87a0: 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  pDb->db) ){.    
87b0: 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65      /* A compile
87c0: 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74  -time error in t
87d0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  he statement. */
87e0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
87f0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
8800: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  , dbTextToObj(sq
8810: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
8820: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20  ->db)));.       
8830: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8840: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
8850: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
8860: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e  tatement was a n
8870: 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20  o-op.  Continue 
8880: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  to the next stat
8890: 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  ement.        **
88a0: 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69   in the SQL stri
88b0: 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ng..        */. 
88c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
88d0: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  L_OK;.      }.  
88e0: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
88f0: 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a   pPreStmt==0 );.
8900: 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74      nVar = sqlit
8910: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
8920: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
8930: 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65      nByte = size
8940: 6f 66 28 53 71 6c 50 72 65 70 61 72 65 64 53 74  of(SqlPreparedSt
8950: 6d 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f  mt) + nVar*sizeo
8960: 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20 20  f(Tcl_Obj *);.  
8970: 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71    pPreStmt = (Sq
8980: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54  lPreparedStmt*)T
8990: 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  cl_Alloc(nByte);
89a0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72 65  .    memset(pPre
89b0: 53 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b  Stmt, 0, nByte);
89c0: 0a 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  ..    pPreStmt->
89d0: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
89e0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71     pPreStmt->nSq
89f0: 6c 20 3d 20 28 2a 70 7a 4f 75 74 20 2d 20 7a 53  l = (*pzOut - zS
8a00: 71 6c 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  ql);.    pPreStm
8a10: 74 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  t->zSql = sqlite
8a20: 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20  3_sql(pStmt);.  
8a30: 20 20 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61    pPreStmt->apPa
8a40: 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a  rm = (Tcl_Obj **
8a50: 29 26 70 50 72 65 53 74 6d 74 5b 31 5d 3b 0a 20  )&pPreStmt[1];. 
8a60: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 72   }.  assert( pPr
8a70: 65 53 74 6d 74 20 29 3b 0a 20 20 61 73 73 65 72  eStmt );.  asser
8a80: 74 28 20 73 74 72 6c 65 6e 33 30 28 70 50 72 65  t( strlen30(pPre
8a90: 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d 70 50 72  Stmt->zSql)==pPr
8aa0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 29 3b 0a 20  eStmt->nSql );. 
8ab0: 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63   assert( 0==memc
8ac0: 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71  mp(pPreStmt->zSq
8ad0: 6c 2c 20 7a 53 71 6c 2c 20 70 50 72 65 53 74 6d  l, zSql, pPreStm
8ae0: 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a 0a 20 20 2f  t->nSql) );..  /
8af0: 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20 74 6f  * Bind values to
8b00: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
8b10: 20 62 65 67 69 6e 20 77 69 74 68 20 24 20 6f 72   begin with $ or
8b20: 20 3a 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d   : */  .  for(i=
8b30: 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29  1; i<=nVar; i++)
8b40: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
8b50: 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74 65 33   *zVar = sqlite3
8b60: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
8b70: 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  name(pStmt, i);.
8b80: 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30 20      if( zVar!=0 
8b90: 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27  && (zVar[0]=='$'
8ba0: 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27   || zVar[0]==':'
8bb0: 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27   || zVar[0]=='@'
8bc0: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  ) ){.      Tcl_O
8bd0: 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47  bj *pVar = Tcl_G
8be0: 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c  etVar2Ex(interp,
8bf0: 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29   &zVar[1], 0, 0)
8c00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56 61 72  ;.      if( pVar
8c10: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
8c20: 6e 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 64  n;.        u8 *d
8c30: 61 74 61 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ata;.        con
8c40: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  st char *zType =
8c50: 20 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20   (pVar->typePtr 
8c60: 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d  ? pVar->typePtr-
8c70: 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20 20  >name : "");.   
8c80: 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54       char c = zT
8c90: 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ype[0];.        
8ca0: 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27  if( zVar[0]=='@'
8cb0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 28   ||.           (
8cc0: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
8cd0: 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61  (zType,"bytearra
8ce0: 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e  y")==0 && pVar->
8cf0: 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20 20 20  bytes==0) ){.   
8d00: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 61         /* Load a
8d10: 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68   BLOB type if th
8d20: 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69  e Tcl variable i
8d30: 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61 6e  s a bytearray an
8d40: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  d.          ** i
8d50: 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20  t has no string 
8d60: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
8d70: 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20 20  r the host.     
8d80: 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
8d90: 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69  r name begins wi
8da0: 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20 20  th "@". */.     
8db0: 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f       data = Tcl_
8dc0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
8dd0: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
8de0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8df0: 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74  _bind_blob(pStmt
8e00: 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51  , i, data, n, SQ
8e10: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
8e20: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
8e30: 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a  RefCount(pVar);.
8e40: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
8e50: 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72 6d  mt->apParm[iParm
8e60: 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20  ++] = pVar;.    
8e70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
8e80: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
8e90: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
8ea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8eb0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
8ec0: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
8ed0: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  &n);.          s
8ee0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
8ef0: 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20  pStmt, i, n);.  
8f00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8f10: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70  c=='d' && strcmp
8f20: 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29  (zType,"double")
8f30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8f40: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20   double r;.     
8f50: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
8f60: 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
8f70: 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20  , pVar, &r);.   
8f80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
8f90: 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  ind_double(pStmt
8fa0: 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  , i, r);.       
8fb0: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
8fc0: 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  w' && strcmp(zTy
8fd0: 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30  pe,"wideInt")==0
8fe0: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
8ff0: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
9000: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
9010: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )==0) ){.       
9020: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
9030: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
9040: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
9050: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
9060: 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  &v);.          s
9070: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
9080: 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b 0a  4(pStmt, i, v);.
9090: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
90a0: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
90b0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
90c0: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
90d0: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
90e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
90f0: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
9100: 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29 64  mt, i, (char *)d
9110: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
9120: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
9130: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
9140: 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20  nt(pVar);.      
9150: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61 70      pPreStmt->ap
9160: 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20  Parm[iParm++] = 
9170: 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pVar;.        }.
9180: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9190: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
91a0: 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29  d_null(pStmt, i)
91b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
91c0: 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d 3e    }.  pPreStmt->
91d0: 6e 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  nParm = iParm;. 
91e0: 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 70 50   *ppPreStmt = pP
91f0: 72 65 53 74 6d 74 3b 0a 0a 20 20 72 65 74 75 72  reStmt;..  retur
9200: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
9210: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 73 74  .** Release a st
9220: 61 74 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  atement referenc
9230: 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61  e obtained by ca
9240: 6c 6c 69 6e 67 20 64 62 50 72 65 70 61 72 65 41  lling dbPrepareA
9250: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20 54 68 65  ndBind()..** The
9260: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78 61  re should be exa
9270: 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  ctly one call to
9280: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
9290: 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 0a  or each call to.
92a0: 2a 2a 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  ** dbPrepareAndB
92b0: 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ind()..**.** If 
92c0: 74 68 65 20 64 69 73 63 61 72 64 20 70 61 72 61  the discard para
92d0: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
92e0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  o, then the stat
92f0: 65 6d 65 6e 74 20 69 73 20 64 65 6c 65 74 65 64  ement is deleted
9300: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  .** immediately.
9310: 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 69 73   Otherwise it is
9320: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
9330: 55 20 6c 69 73 74 20 61 6e 64 20 6d 61 79 20 62  U list and may b
9340: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79  e returned.** by
9350: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
9360: 6c 6c 20 74 6f 20 64 62 50 72 65 70 61 72 65 41  ll to dbPrepareA
9370: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61  ndBind()..*/.sta
9380: 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61  tic void dbRelea
9390: 73 65 53 74 6d 74 28 0a 20 20 53 71 6c 69 74 65  seStmt(.  Sqlite
93a0: 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  Db *pDb,        
93b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
93c0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
93d0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
93e0: 74 20 2a 70 50 72 65 53 74 6d 74 2c 20 20 20 20  t *pPreStmt,    
93f0: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
9400: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74  atement handle t
9410: 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  o release */.  i
9420: 6e 74 20 64 69 73 63 61 72 64 20 20 20 20 20 20  nt discard      
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9440: 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65  * True to delete
9450: 20 28 6e 6f 74 20 63 61 63 68 65 29 20 74 68 65   (not cache) the
9460: 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a 29 7b 0a   pPreStmt */.){.
9470: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46    int i;..  /* F
9480: 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74  ree the bound st
9490: 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61  ring and blob pa
94a0: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 66 6f  rameters */.  fo
94b0: 72 28 69 3d 30 3b 20 69 3c 70 50 72 65 53 74 6d  r(i=0; i<pPreStm
94c0: 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a  t->nParm; i++){.
94d0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
94e0: 6f 75 6e 74 28 70 50 72 65 53 74 6d 74 2d 3e 61  ount(pPreStmt->a
94f0: 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20  pParm[i]);.  }. 
9500: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d   pPreStmt->nParm
9510: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 62   = 0;..  if( pDb
9520: 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 7c 7c 20  ->maxStmt<=0 || 
9530: 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 2f  discard ){.    /
9540: 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69  * If the cache i
9550: 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64 65  s turned off, de
9560: 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73 74  allocated the st
9570: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
9580: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
9590: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29  pPreStmt->pStmt)
95a0: 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  ;.    Tcl_Free((
95b0: 63 68 61 72 20 2a 29 70 50 72 65 53 74 6d 74 29  char *)pPreStmt)
95c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
95d0: 2a 20 41 64 64 20 74 68 65 20 70 72 65 70 61 72  * Add the prepar
95e0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ed statement to 
95f0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
9600: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e   the cache list.
9610: 20 2a 2f 0a 20 20 20 20 70 50 72 65 53 74 6d 74   */.    pPreStmt
9620: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73  ->pNext = pDb->s
9630: 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 70 50 72  tmtList;.    pPr
9640: 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30  eStmt->pPrev = 0
9650: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73  ;.    if( pDb->s
9660: 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  tmtList ){.     
9670: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
9680: 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b  Prev = pPreStmt;
9690: 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e  .    }.    pDb->
96a0: 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53  stmtList = pPreS
96b0: 74 6d 74 3b 0a 20 20 20 20 69 66 28 20 70 44 62  tmt;.    if( pDb
96c0: 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b  ->stmtLast==0 ){
96d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
96e0: 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a  Db->nStmt==0 );.
96f0: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
9700: 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a  ast = pPreStmt;.
9710: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9720: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
9730: 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20  tmt>0 );.    }. 
9740: 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b     pDb->nStmt++;
9750: 0a 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 77  .   .    /* If w
9760: 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20  e have too many 
9770: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63 61 63  statement in cac
9780: 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 73  he, remove the s
9790: 75 72 70 6c 75 73 20 66 72 6f 6d 20 0a 20 20 20  urplus from .   
97a0: 20 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74   ** the end of t
97b0: 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20  he cache list.  
97c0: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44  */.    while( pD
97d0: 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61  b->nStmt>pDb->ma
97e0: 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 73  xStmt ){.      s
97f0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
9800: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
9810: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 70 44 62  Stmt);.      pDb
9820: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 44 62  ->stmtLast = pDb
9830: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65  ->stmtLast->pPre
9840: 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f 46 72 65  v;.      Tcl_Fre
9850: 65 28 28 63 68 61 72 2a 29 70 44 62 2d 3e 73 74  e((char*)pDb->st
9860: 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 29 3b 0a  mtLast->pNext);.
9870: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
9880: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ast->pNext = 0;.
9890: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
98a0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  --;.    }.  }.}.
98b0: 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
98c0: 20 75 73 65 64 20 77 69 74 68 20 64 62 45 76 61   used with dbEva
98d0: 6c 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  lXXX() functions
98e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 64 62 45 76 61 6c  :.**.**   dbEval
98f0: 49 6e 69 74 28 29 0a 2a 2a 20 20 20 64 62 45 76  Init().**   dbEv
9900: 61 6c 53 74 65 70 28 29 0a 2a 2a 20 20 20 64 62  alStep().**   db
9910: 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 29 0a 2a  EvalFinalize().*
9920: 2a 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66  *   dbEvalRowInf
9930: 6f 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 43  o().**   dbEvalC
9940: 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 0a 2a 2f 0a  olumnValue().*/.
9950: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 44  typedef struct D
9960: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 44 62 45  bEvalContext DbE
9970: 76 61 6c 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  valContext;.stru
9980: 63 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ct DbEvalContext
9990: 20 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70   {.  SqliteDb *p
99a0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
99b0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
99c0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c   handle */.  Tcl
99d0: 5f 4f 62 6a 20 2a 70 53 71 6c 3b 20 20 20 20 20  _Obj *pSql;     
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
99f0: 4f 62 6a 65 63 74 20 68 6f 6c 64 69 6e 67 20 73  Object holding s
9a00: 74 72 69 6e 67 20 7a 53 71 6c 20 2a 2f 0a 20 20  tring zSql */.  
9a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
9a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9a30: 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20 53 51 4c  /* Remaining SQL
9a40: 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20   to execute */. 
9a50: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
9a60: 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20   *pPreStmt;     
9a70: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74   /* Current stat
9a80: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ement */.  int n
9a90: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
9aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9ab0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9ac0: 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d  returned by pStm
9ad0: 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  t */.  Tcl_Obj *
9ae0: 70 41 72 72 61 79 3b 20 20 20 20 20 20 20 20 20  pArray;         
9af0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
9b00: 66 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65  f array variable
9b10: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a   */.  Tcl_Obj **
9b20: 61 70 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20 20  apColName;      
9b30: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
9b40: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  f column names *
9b50: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  /.};../*.** Rele
9b60: 61 73 65 20 61 6e 79 20 63 61 63 68 65 20 6f 66  ase any cache of
9b70: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 75   column names cu
9b80: 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 61 73 20  rrently held as 
9b90: 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 44  part of.** the D
9ba0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72  bEvalContext str
9bb0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
9bc0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
9bd0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
9be0: 6f 69 64 20 64 62 52 65 6c 65 61 73 65 43 6f 6c  oid dbReleaseCol
9bf0: 75 6d 6e 4e 61 6d 65 73 28 44 62 45 76 61 6c 43  umnNames(DbEvalC
9c00: 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 69 66  ontext *p){.  if
9c10: 28 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29  ( p->apColName )
9c20: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
9c30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
9c40: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
9c50: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
9c60: 74 28 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 5b 69  t(p->apColName[i
9c70: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ]);.    }.    Tc
9c80: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
9c90: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  ->apColName);.  
9ca0: 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d    p->apColName =
9cb0: 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f   0;.  }.  p->nCo
9cc0: 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l = 0;.}../*.** 
9cd0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 44 62 45  Initialize a DbE
9ce0: 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63  valContext struc
9cf0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
9d00: 41 72 72 61 79 20 69 73 20 6e 6f 74 20 4e 55 4c  Array is not NUL
9d10: 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f 6e 74 61  L, then it conta
9d20: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
9d30: 61 20 54 63 6c 20 61 72 72 61 79 0a 2a 2a 20 76  a Tcl array.** v
9d40: 61 72 69 61 62 6c 65 2e 20 54 68 65 20 22 2a 22  ariable. The "*"
9d50: 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 69 73 20   member of this 
9d60: 61 72 72 61 79 20 69 73 20 73 65 74 20 74 6f 20  array is set to 
9d70: 61 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  a list containin
9d80: 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f  g.** the names o
9d90: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 72 65  f the columns re
9da0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 74  turned by the st
9db0: 61 74 65 6d 65 6e 74 20 61 73 20 70 61 72 74 20  atement as part 
9dc0: 6f 66 20 65 61 63 68 0a 2a 2a 20 63 61 6c 6c 20  of each.** call 
9dd0: 74 6f 20 64 62 45 76 61 6c 53 74 65 70 28 29 2c  to dbEvalStep(),
9de0: 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6c   in order from l
9df0: 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20 65 2e  eft to right. e.
9e00: 67 2e 20 69 66 20 74 68 65 20 6e 61 6d 65 73 20  g. if the names 
9e10: 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72  .** of the retur
9e20: 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ned columns are 
9e30: 61 2c 20 62 20 61 6e 64 20 63 2c 20 69 74 20 64  a, b and c, it d
9e40: 6f 65 73 20 74 68 65 20 65 71 75 69 76 61 6c 65  oes the equivale
9e50: 6e 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 74 63  nt of the .** tc
9e60: 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a  l command:.**.**
9e70: 20 20 20 20 20 73 65 74 20 24 7b 70 41 72 72 61       set ${pArra
9e80: 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a 2f  y}(*) {a b c}.*/
9e90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 45  .static void dbE
9ea0: 76 61 6c 49 6e 69 74 28 0a 20 20 44 62 45 76 61  valInit(.  DbEva
9eb0: 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20  lContext *p,    
9ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
9ed0: 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63 74 75  inter to structu
9ee0: 72 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  re to initialize
9ef0: 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a   */.  SqliteDb *
9f00: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
9f10: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
9f20: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63  e handle */.  Tc
9f30: 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c 20 20 20 20  l_Obj *pSql,    
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9f50: 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69   Object containi
9f60: 6e 67 20 53 51 4c 20 73 63 72 69 70 74 20 2a 2f  ng SQL script */
9f70: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72  .  Tcl_Obj *pArr
9f80: 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ay              
9f90: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 54 63     /* Name of Tc
9fa0: 6c 20 61 72 72 61 79 20 74 6f 20 73 65 74 20 28  l array to set (
9fb0: 2a 29 20 65 6c 65 6d 65 6e 74 20 6f 66 20 2a 2f  *) element of */
9fc0: 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  .){.  memset(p, 
9fd0: 30 2c 20 73 69 7a 65 6f 66 28 44 62 45 76 61 6c  0, sizeof(DbEval
9fe0: 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 2d 3e  Context));.  p->
9ff0: 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 2d 3e  pDb = pDb;.  p->
a000: 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
a010: 72 69 6e 67 28 70 53 71 6c 29 3b 0a 20 20 70 2d  ring(pSql);.  p-
a020: 3e 70 53 71 6c 20 3d 20 70 53 71 6c 3b 0a 20 20  >pSql = pSql;.  
a030: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
a040: 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70 41  (pSql);.  if( pA
a050: 72 72 61 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70  rray ){.    p->p
a060: 41 72 72 61 79 20 3d 20 70 41 72 72 61 79 3b 0a  Array = pArray;.
a070: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
a080: 6f 75 6e 74 28 70 41 72 72 61 79 29 3b 0a 20 20  ount(pArray);.  
a090: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  }.}../*.** Obtai
a0a0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  n information ab
a0b0: 6f 75 74 20 74 68 65 20 72 6f 77 20 74 68 61 74  out the row that
a0c0: 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65   the DbEvalConte
a0d0: 78 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  xt passed as the
a0e0: 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
a0f0: 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  nt currently poi
a100: 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  nts to..*/.stati
a110: 63 20 76 6f 69 64 20 64 62 45 76 61 6c 52 6f 77  c void dbEvalRow
a120: 49 6e 66 6f 28 0a 20 20 44 62 45 76 61 6c 43 6f  Info(.  DbEvalCo
a130: 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20 20  ntext *p,       
a140: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
a150: 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f  ation context */
a160: 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20  .  int *pnCol,  
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65     /* OUT: Numbe
a190: 72 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  r of column name
a1a0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
a1b0: 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 20 20 20  **papColName    
a1c0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41         /* OUT: A
a1d0: 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  rray of column n
a1e0: 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20  ames */.){.  /* 
a1f0: 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e  Compute column n
a200: 61 6d 65 73 20 2a 2f 0a 20 20 69 66 28 20 30 3d  ames */.  if( 0=
a210: 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29 7b  =p->apColName ){
a220: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
a230: 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70 50  t *pStmt = p->pP
a240: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20  reStmt->pStmt;. 
a250: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a270: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
a280: 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  iable */.    int
a290: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
a2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a2b0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
a2c0: 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d  returned by pStm
a2d0: 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  t */.    Tcl_Obj
a2e0: 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30   **apColName = 0
a2f0: 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  ;      /* Array 
a300: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
a310: 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20  */..    p->nCol 
a320: 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  = nCol = sqlite3
a330: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
a340: 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  tmt);.    if( nC
a350: 6f 6c 3e 30 20 26 26 20 28 70 61 70 43 6f 6c 4e  ol>0 && (papColN
a360: 61 6d 65 20 7c 7c 20 70 2d 3e 70 41 72 72 61 79  ame || p->pArray
a370: 29 20 29 7b 0a 20 20 20 20 20 20 61 70 43 6f 6c  ) ){.      apCol
a380: 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a  Name = (Tcl_Obj*
a390: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
a3a0: 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43  eof(Tcl_Obj*)*nC
a3b0: 6f 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ol );.      for(
a3c0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
a3d0: 29 7b 0a 20 20 20 20 20 20 20 20 61 70 43 6f 6c  ){.        apCol
a3e0: 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78 74  Name[i] = dbText
a3f0: 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ToObj(sqlite3_co
a400: 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
a410: 69 29 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  i));.        Tcl
a420: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70  _IncrRefCount(ap
a430: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
a440: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61 70     }.      p->ap
a450: 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f 6c 4e  ColName = apColN
a460: 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ame;.    }..    
a470: 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61 72  /* If results ar
a480: 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20 69  e being stored i
a490: 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61  n an array varia
a4a0: 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ble, then create
a4b0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61  .    ** the arra
a4c0: 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74  y(*) entry for t
a4d0: 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2f  hat array.    */
a4e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72 72  .    if( p->pArr
a4f0: 61 79 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ay ){.      Tcl_
a500: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
a510: 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65 72 70 3b   p->pDb->interp;
a520: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
a530: 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e  pColList = Tcl_N
a540: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54  ewObj();.      T
a550: 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20  cl_Obj *pStar = 
a560: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
a570: 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  ("*", -1);..    
a580: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
a590: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
a5a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
a5b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
a5c0: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f  , pColList, apCo
a5d0: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20  lName[i]);.     
a5e0: 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63   }.      Tcl_Inc
a5f0: 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29  rRefCount(pStar)
a600: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53  ;.      Tcl_ObjS
a610: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
a620: 2d 3e 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c  ->pArray, pStar,
a630: 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a 20   pColList, 0);. 
a640: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
a650: 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20  Count(pStar);.  
a660: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
a670: 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  apColName ){.   
a680: 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 70   *papColName = p
a690: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d  ->apColName;.  }
a6a0: 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20 29 7b 0a  .  if( pnCol ){.
a6b0: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d 3e      *pnCol = p->
a6c0: 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nCol;.  }.}../*.
a6d0: 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66  ** Return one of
a6e0: 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52 45   TCL_OK, TCL_BRE
a6f0: 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 2e  AK or TCL_ERROR.
a700: 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20 69 73   If TCL_ERROR is
a710: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20 74 68  .** returned, th
a720: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  en an error mess
a730: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
a740: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
a750: 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
a760: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  ning..**.** A re
a770: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 43  turn value of TC
a780: 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68 65 72 65  L_OK means there
a790: 20 69 73 20 61 20 72 6f 77 20 6f 66 20 64 61 74   is a row of dat
a7a0: 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  a available. The
a7b0: 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
a7c0: 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20 64  accessed using d
a7d0: 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 20 61  bEvalRowInfo() a
a7e0: 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  nd dbEvalColumnV
a7f0: 61 6c 75 65 28 29 2e 20 54 68 69 73 0a 2a 2a 20  alue(). This.** 
a800: 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f 20  is analogous to 
a810: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
a820: 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73 71 6c 69  TE_ROW from sqli
a830: 74 65 33 5f 73 74 65 70 28 29 2e 20 49 66 20 54  te3_step(). If T
a840: 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69 73 20 72  CL_BREAK.** is r
a850: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 74 68  eturned, then th
a860: 65 20 53 51 4c 20 73 63 72 69 70 74 20 68 61 73  e SQL script has
a870: 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75 74   finished execut
a880: 69 6e 67 20 61 6e 64 20 74 68 65 72 65 20 61 72  ing and there ar
a890: 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68 65 72 20  e.** no further 
a8a0: 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  rows available. 
a8b0: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
a8c0: 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  to SQLITE_DONE..
a8d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
a8e0: 45 76 61 6c 53 74 65 70 28 44 62 45 76 61 6c 43  EvalStep(DbEvalC
a8f0: 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 77 68  ontext *p){.  wh
a900: 69 6c 65 28 20 70 2d 3e 7a 53 71 6c 5b 30 5d 20  ile( p->zSql[0] 
a910: 7c 7c 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29  || p->pPreStmt )
a920: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
a930: 20 20 69 66 28 20 70 2d 3e 70 50 72 65 53 74 6d    if( p->pPreStm
a940: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
a950: 20 3d 20 64 62 50 72 65 70 61 72 65 41 6e 64 42   = dbPrepareAndB
a960: 69 6e 64 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 7a  ind(p->pDb, p->z
a970: 53 71 6c 2c 20 26 70 2d 3e 7a 53 71 6c 2c 20 26  Sql, &p->zSql, &
a980: 70 2d 3e 70 50 72 65 53 74 6d 74 29 3b 0a 20 20  p->pPreStmt);.  
a990: 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f      if( rc!=TCL_
a9a0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
a9b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a9c0: 20 69 6e 74 20 72 63 73 3b 0a 20 20 20 20 20 20   int rcs;.      
a9d0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
a9e0: 70 2d 3e 70 44 62 3b 0a 20 20 20 20 20 20 53 71  p->pDb;.      Sq
a9f0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
aa00: 50 72 65 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72  PreStmt = p->pPr
aa10: 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c  eStmt;.      sql
aa20: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
aa30: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74   = pPreStmt->pSt
aa40: 6d 74 3b 0a 0a 20 20 20 20 20 20 72 63 73 20 3d  mt;..      rcs =
aa50: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
aa60: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
aa70: 72 63 73 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  rcs==SQLITE_ROW 
aa80: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
aa90: 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20  n TCL_OK;.      
aaa0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  }.      if( p->p
aab0: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20 20  Array ){.       
aac0: 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 70   dbEvalRowInfo(p
aad0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
aae0: 0a 20 20 20 20 20 20 72 63 73 20 3d 20 73 71 6c  .      rcs = sql
aaf0: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
ab00: 29 3b 0a 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e  );..      pDb->n
ab10: 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 73  Step = sqlite3_s
ab20: 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74  tmt_status(pStmt
ab30: 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54  ,SQLITE_STMTSTAT
ab40: 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
ab50: 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ,1);.      pDb->
ab60: 6e 53 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 5f  nSort = sqlite3_
ab70: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
ab80: 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  t,SQLITE_STMTSTA
ab90: 54 55 53 5f 53 4f 52 54 2c 31 29 3b 0a 20 20 20  TUS_SORT,1);.   
aba0: 20 20 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75     dbReleaseColu
abb0: 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a 20 20 20 20  mnNames(p);.    
abc0: 20 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20    p->pPreStmt = 
abd0: 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63  0;..      if( rc
abe0: 73 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  s!=SQLITE_OK ){.
abf0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
ac00: 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f  run-time error o
ac10: 63 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68  ccurs, report th
ac20: 65 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70  e error and stop
ac30: 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20   reading.       
ac40: 20 2a 2a 20 74 68 65 20 53 51 4c 2e 20 20 2a 2f   ** the SQL.  */
ac50: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
ac60: 4f 62 6a 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ObjResult(pDb->i
ac70: 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f  nterp, dbTextToO
ac80: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  bj(sqlite3_errms
ac90: 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  g(pDb->db)));.  
aca0: 20 20 20 20 20 20 64 62 52 65 6c 65 61 73 65 53        dbReleaseS
acb0: 74 6d 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d  tmt(pDb, pPreStm
acc0: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 72  t, 1);.        r
acd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ace0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
acf0: 20 20 20 20 20 20 64 62 52 65 6c 65 61 73 65 53        dbReleaseS
ad00: 74 6d 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d  tmt(pDb, pPreStm
ad10: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
ad20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
ad30: 69 6e 69 73 68 65 64 20 2a 2f 0a 20 20 72 65 74  inished */.  ret
ad40: 75 72 6e 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 7d  urn TCL_BREAK;.}
ad50: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
ad60: 20 72 65 73 6f 75 72 63 65 73 20 63 75 72 72 65   resources curre
ad70: 6e 74 6c 79 20 68 65 6c 64 20 62 79 20 74 68 65  ntly held by the
ad80: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73   DbEvalContext s
ad90: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 0a  tructure passed.
ada0: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
adb0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 72 65 20  argument. There 
adc0: 73 68 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c  should be exactl
add0: 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68  y one call to th
ade0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  is function.** f
adf0: 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20  or each call to 
ae00: 64 62 45 76 61 6c 49 6e 69 74 28 29 2e 0a 2a 2f  dbEvalInit()..*/
ae10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 45  .static void dbE
ae20: 76 61 6c 46 69 6e 61 6c 69 7a 65 28 44 62 45 76  valFinalize(DbEv
ae30: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  alContext *p){. 
ae40: 20 69 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74   if( p->pPreStmt
ae50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ae60: 72 65 73 65 74 28 70 2d 3e 70 50 72 65 53 74 6d  reset(p->pPreStm
ae70: 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 64  t->pStmt);.    d
ae80: 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70 2d 3e  bReleaseStmt(p->
ae90: 70 44 62 2c 20 70 2d 3e 70 50 72 65 53 74 6d 74  pDb, p->pPreStmt
aea0: 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72  , 0);.    p->pPr
aeb0: 65 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  eStmt = 0;.  }. 
aec0: 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29   if( p->pArray )
aed0: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
aee0: 66 43 6f 75 6e 74 28 70 2d 3e 70 41 72 72 61 79  fCount(p->pArray
aef0: 29 3b 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79  );.    p->pArray
af00: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f   = 0;.  }.  Tcl_
af10: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
af20: 70 53 71 6c 29 3b 0a 20 20 64 62 52 65 6c 65 61  pSql);.  dbRelea
af30: 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29  seColumnNames(p)
af40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
af50: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
af60: 20 54 63 6c 5f 4f 62 6a 20 73 74 72 75 63 74 75   Tcl_Obj structu
af70: 72 65 20 77 69 74 68 20 72 65 66 2d 63 6f 75 6e  re with ref-coun
af80: 74 20 30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  t 0 that contain
af90: 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66  s.** the value f
afa0: 6f 72 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63  or the iCol'th c
afb0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 6f 77  olumn of the row
afc0: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
afd0: 65 64 20 74 6f 20 62 79 0a 2a 2a 20 74 68 65 20  ed to by.** the 
afe0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74  DbEvalContext st
aff0: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
b000: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
b010: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
b020: 54 63 6c 5f 4f 62 6a 20 2a 64 62 45 76 61 6c 43  Tcl_Obj *dbEvalC
b030: 6f 6c 75 6d 6e 56 61 6c 75 65 28 44 62 45 76 61  olumnValue(DbEva
b040: 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74  lContext *p, int
b050: 20 69 43 6f 6c 29 7b 0a 20 20 73 71 6c 69 74 65   iCol){.  sqlite
b060: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
b070: 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74  p->pPreStmt->pSt
b080: 6d 74 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71  mt;.  switch( sq
b090: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
b0a0: 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 20 29  e(pStmt, iCol) )
b0b0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
b0c0: 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
b0d0: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
b0e0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
b0f0: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
b100: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
b110: 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33  *zBlob = sqlite3
b120: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
b130: 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  mt, iCol);.     
b140: 20 69 66 28 20 21 7a 42 6c 6f 62 20 29 20 62 79   if( !zBlob ) by
b150: 74 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  tes = 0;.      r
b160: 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 42 79 74  eturn Tcl_NewByt
b170: 65 41 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a  eArrayObj((u8*)z
b180: 42 6c 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20  Blob, bytes);.  
b190: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
b1a0: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
b1b0: 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36       sqlite_int6
b1c0: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  4 v = sqlite3_co
b1d0: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
b1e0: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  , iCol);.      i
b1f0: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
b200: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
b210: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  47 ){.        re
b220: 74 75 72 6e 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  turn Tcl_NewIntO
b230: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  bj(v);.      }el
b240: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
b250: 72 6e 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  rn Tcl_NewWideIn
b260: 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 7d  tObj(v);.      }
b270: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b280: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
b290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
b2a0: 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 73 71  _NewDoubleObj(sq
b2b0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
b2c0: 62 6c 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  ble(pStmt, iCol)
b2d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
b2e0: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
b2f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 62  .      return db
b300: 54 65 78 74 54 6f 4f 62 6a 28 70 2d 3e 70 44 62  TextToObj(p->pDb
b310: 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  ->zNull);.    }.
b320: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 64 62    }..  return db
b330: 54 65 78 74 54 6f 4f 62 6a 28 28 63 68 61 72 20  TextToObj((char 
b340: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
b350: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f  _text(pStmt, iCo
b360: 6c 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  l));.}../*.** If
b370: 20 75 73 69 6e 67 20 54 63 6c 20 76 65 72 73 69   using Tcl versi
b380: 6f 6e 20 38 2e 36 20 6f 72 20 67 72 65 61 74 65  on 8.6 or greate
b390: 72 2c 20 75 73 65 20 74 68 65 20 4e 52 20 66 75  r, use the NR fu
b3a0: 6e 63 74 69 6f 6e 73 20 74 6f 20 61 76 6f 69 64  nctions to avoid
b3b0: 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 20 65 76  .** recursive ev
b3c0: 61 6c 75 74 69 6f 6e 20 6f 66 20 73 63 72 69 70  alution of scrip
b3d0: 74 73 20 62 79 20 74 68 65 20 5b 64 62 20 65 76  ts by the [db ev
b3e0: 61 6c 5d 20 61 6e 64 20 5b 64 62 20 74 72 61 6e  al] and [db tran
b3f0: 73 5d 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 73 2e 20  s].** commands. 
b400: 45 76 65 6e 20 69 66 20 74 68 65 20 68 65 61 64  Even if the head
b410: 65 72 73 20 75 73 65 64 20 77 68 69 6c 65 20 63  ers used while c
b420: 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 65 78 74  ompiling the ext
b430: 65 6e 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 38 2e  ension.** are 8.
b440: 36 20 6f 72 20 6e 65 77 65 72 2c 20 74 68 65 20  6 or newer, the 
b450: 63 6f 64 65 20 73 74 69 6c 6c 20 74 65 73 74 73  code still tests
b460: 20 74 68 65 20 54 63 6c 20 76 65 72 73 69 6f 6e   the Tcl version
b470: 20 61 74 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a 20   at runtime..** 
b480: 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 74 75 62  This allows stub
b490: 73 2d 65 6e 61 62 6c 65 64 20 62 75 69 6c 64 73  s-enabled builds
b4a0: 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
b4b0: 20 6f 6c 64 65 72 20 54 63 6c 20 6c 69 62 72 61   older Tcl libra
b4c0: 72 69 65 73 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c  ries..*/.#if TCL
b4d0: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3e 38  _MAJOR_VERSION>8
b4e0: 20 7c 7c 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56   || (TCL_MAJOR_V
b4f0: 45 52 53 49 4f 4e 3d 3d 38 20 26 26 20 54 43 4c  ERSION==8 && TCL
b500: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 3e 3d  _MINOR_VERSION>=
b510: 36 29 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  6).# define SQLI
b520: 54 45 5f 54 43 4c 5f 4e 52 45 20 31 0a 73 74 61  TE_TCL_NRE 1.sta
b530: 74 69 63 20 69 6e 74 20 44 62 55 73 65 4e 72 65  tic int DbUseNre
b540: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6d 61  (void){.  int ma
b550: 6a 6f 72 2c 20 6d 69 6e 6f 72 3b 0a 20 20 54 63  jor, minor;.  Tc
b560: 6c 5f 47 65 74 56 65 72 73 69 6f 6e 28 26 6d 61  l_GetVersion(&ma
b570: 6a 6f 72 2c 20 26 6d 69 6e 6f 72 2c 20 30 2c 20  jor, &minor, 0, 
b580: 30 29 3b 0a 20 20 72 65 74 75 72 6e 28 20 28 6d  0);.  return( (m
b590: 61 6a 6f 72 3d 3d 38 20 26 26 20 6d 69 6e 6f 72  ajor==8 && minor
b5a0: 3e 3d 36 29 20 7c 7c 20 6d 61 6a 6f 72 3e 38 20  >=6) || major>8 
b5b0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 0a 2a  );.}.#else./* .*
b5c0: 2a 20 43 6f 6d 70 69 6c 69 6e 67 20 75 73 69 6e  * Compiling usin
b5d0: 67 20 68 65 61 64 65 72 73 20 65 61 72 6c 69 65  g headers earlie
b5e0: 72 20 74 68 61 6e 20 38 2e 36 2e 20 49 6e 20 74  r than 8.6. In t
b5f0: 68 69 73 20 63 61 73 65 20 4e 52 20 63 61 6e 6e  his case NR cann
b600: 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 73  ot be.** used, s
b610: 6f 20 44 62 55 73 65 4e 72 65 28 29 20 74 6f 20  o DbUseNre() to 
b620: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65  always return ze
b630: 72 6f 2e 20 41 64 64 20 23 64 65 66 69 6e 65 73  ro. Add #defines
b640: 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 0a 2a   for the other.*
b650: 2a 20 54 63 6c 5f 4e 52 78 78 78 28 29 20 66 75  * Tcl_NRxxx() fu
b660: 6e 63 74 69 6f 6e 73 20 74 6f 20 70 72 65 76 65  nctions to preve
b670: 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 63 61 75  nt them from cau
b680: 73 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e  sing compilation
b690: 20 65 72 72 6f 72 73 2c 0a 2a 2a 20 65 76 65 6e   errors,.** even
b6a0: 20 74 68 6f 75 67 68 20 74 68 65 20 6f 6e 6c 79   though the only
b6b0: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6f 66 20   invocations of 
b6c0: 74 68 65 6d 20 61 72 65 20 77 69 74 68 69 6e 20  them are within 
b6d0: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 62 6c 6f 63  conditional bloc
b6e0: 6b 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  ks .** of the fo
b6f0: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  rm:.**.**   if( 
b700: 44 62 55 73 65 4e 72 65 28 29 20 29 20 7b 20 2e  DbUseNre() ) { .
b710: 2e 2e 20 7d 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  .. }.*/.# define
b720: 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20   SQLITE_TCL_NRE 
b730: 30 0a 23 20 64 65 66 69 6e 65 20 44 62 55 73 65  0.# define DbUse
b740: 4e 72 65 28 29 20 30 0a 23 20 64 65 66 69 6e 65  Nre() 0.# define
b750: 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61   Tcl_NRAddCallba
b760: 63 6b 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  ck(a,b,c,d,e,f) 
b770: 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e  0.# define Tcl_N
b780: 52 45 76 61 6c 4f 62 6a 28 61 2c 62 2c 63 29 20  REvalObj(a,b,c) 
b790: 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e  0.# define Tcl_N
b7a0: 52 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 61  RCreateCommand(a
b7b0: 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 30 0a 23 65  ,b,c,d,e,f) 0.#e
b7c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
b7d0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72   function is par
b7e0: 74 20 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65  t of the impleme
b7f0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ntation of the c
b800: 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  ommand:.**.**   
b810: 24 64 62 20 65 76 61 6c 20 53 51 4c 20 3f 41 52  $db eval SQL ?AR
b820: 52 41 59 4e 41 4d 45 3f 20 53 43 52 49 50 54 0a  RAYNAME? SCRIPT.
b830: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
b840: 45 76 61 6c 4e 65 78 74 43 6d 64 28 0a 20 20 43  EvalNextCmd(.  C
b850: 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d  lientData data[]
b860: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b870: 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69      /* data[0] i
b880: 73 20 74 68 65 20 28 44 62 45 76 61 6c 43 6f 6e  s the (DbEvalCon
b890: 74 65 78 74 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f  text*) */.  Tcl_
b8a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8c0: 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65   /* Tcl interpre
b8d0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ter */.  int res
b8e0: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b900: 20 52 65 73 75 6c 74 20 73 6f 20 66 61 72 20 2a   Result so far *
b910: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
b920: 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  result;         
b930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b940: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
b950: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c   /* The first el
b960: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 64 61 74  ement of the dat
b970: 61 5b 5d 20 61 72 72 61 79 20 69 73 20 61 20 70  a[] array is a p
b980: 6f 69 6e 74 65 72 20 74 6f 20 61 20 44 62 45 76  ointer to a DbEv
b990: 61 6c 43 6f 6e 74 65 78 74 0a 20 20 2a 2a 20 73  alContext.  ** s
b9a0: 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
b9b0: 65 64 20 75 73 69 6e 67 20 54 63 6c 5f 41 6c 6c  ed using Tcl_All
b9c0: 6f 63 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  oc(). The second
b9d0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 64 61 74 61   element of data
b9e0: 5b 5d 0a 20 20 2a 2a 20 69 73 20 61 20 70 6f 69  [].  ** is a poi
b9f0: 6e 74 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62  nter to a Tcl_Ob
ba00: 6a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  j containing the
ba10: 20 73 63 72 69 70 74 20 74 6f 20 72 75 6e 20 66   script to run f
ba20: 6f 72 20 65 61 63 68 20 72 6f 77 0a 20 20 2a 2a  or each row.  **
ba30: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
ba40: 20 71 75 65 72 69 65 73 20 65 6e 63 61 70 73 75   queries encapsu
ba50: 6c 61 74 65 64 20 69 6e 20 64 61 74 61 5b 30 5d  lated in data[0]
ba60: 2e 20 2a 2f 0a 20 20 44 62 45 76 61 6c 43 6f 6e  . */.  DbEvalCon
ba70: 74 65 78 74 20 2a 70 20 3d 20 28 44 62 45 76 61  text *p = (DbEva
ba80: 6c 43 6f 6e 74 65 78 74 20 2a 29 64 61 74 61 5b  lContext *)data[
ba90: 30 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  0];.  Tcl_Obj *p
baa0: 53 63 72 69 70 74 20 3d 20 28 54 63 6c 5f 4f 62  Script = (Tcl_Ob
bab0: 6a 20 2a 29 64 61 74 61 5b 31 5d 3b 0a 20 20 54  j *)data[1];.  T
bac0: 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d  cl_Obj *pArray =
bad0: 20 70 2d 3e 70 41 72 72 61 79 3b 0a 0a 20 20 77   p->pArray;..  w
bae0: 68 69 6c 65 28 20 28 72 63 3d 3d 54 43 4c 5f 4f  hile( (rc==TCL_O
baf0: 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e  K || rc==TCL_CON
bb00: 54 49 4e 55 45 29 20 26 26 20 54 43 4c 5f 4f 4b  TINUE) && TCL_OK
bb10: 3d 3d 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74  ==(rc = dbEvalSt
bb20: 65 70 28 70 29 29 20 29 7b 0a 20 20 20 20 69 6e  ep(p)) ){.    in
bb30: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  t i;.    int nCo
bb40: 6c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  l;.    Tcl_Obj *
bb50: 2a 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20  *apColName;.    
bb60: 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c  dbEvalRowInfo(p,
bb70: 20 26 6e 43 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61   &nCol, &apColNa
bb80: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  me);.    for(i=0
bb90: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
bba0: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
bbb0: 56 61 6c 20 3d 20 64 62 45 76 61 6c 43 6f 6c 75  Val = dbEvalColu
bbc0: 6d 6e 56 61 6c 75 65 28 70 2c 20 69 29 3b 0a 20  mnValue(p, i);. 
bbd0: 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79 3d       if( pArray=
bbe0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =0 ){.        Tc
bbf0: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
bc00: 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  erp, apColName[i
bc10: 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a  ], 0, pVal, 0);.
bc20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bc30: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56       Tcl_ObjSetV
bc40: 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72  ar2(interp, pArr
bc50: 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d  ay, apColName[i]
bc60: 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20  , pVal, 0);.    
bc70: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
bc80: 2a 20 54 68 65 20 72 65 71 75 69 72 65 64 20 69  * The required i
bc90: 6e 74 65 72 70 72 65 74 65 72 20 76 61 72 69 61  nterpreter varia
bca0: 62 6c 65 73 20 61 72 65 20 6e 6f 77 20 70 6f 70  bles are now pop
bcb0: 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ulated with the 
bcc0: 64 61 74 61 20 0a 20 20 20 20 2a 2a 20 66 72 6f  data .    ** fro
bcd0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  m the current ro
bce0: 77 2e 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c  w. If using NRE,
bcf0: 20 73 63 68 65 64 75 6c 65 20 63 61 6c 6c 62 61   schedule callba
bd00: 63 6b 73 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  cks to evaluate.
bd10: 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 70 53      ** script pS
bd20: 63 72 69 70 74 2c 20 74 68 65 6e 20 74 6f 20 69  cript, then to i
bd30: 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74  nvoke this funct
bd40: 69 6f 6e 20 61 67 61 69 6e 20 74 6f 20 66 65 74  ion again to fet
bd50: 63 68 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  ch the next.    
bd60: 2a 2a 20 72 6f 77 20 28 6f 72 20 63 6c 65 61 6e  ** row (or clean
bd70: 20 75 70 20 69 66 20 74 68 65 72 65 20 69 73 20   up if there is 
bd80: 6e 6f 20 6e 65 78 74 20 72 6f 77 20 6f 72 20 74  no next row or t
bd90: 68 65 20 73 63 72 69 70 74 20 74 68 72 6f 77 73  he script throws
bda0: 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 63 65 70   an.    ** excep
bdb0: 74 69 6f 6e 29 2e 20 41 66 74 65 72 20 73 63 68  tion). After sch
bdc0: 65 64 75 6c 69 6e 67 20 74 68 65 20 63 61 6c 6c  eduling the call
bdd0: 62 61 63 6b 73 2c 20 72 65 74 75 72 6e 20 63 6f  backs, return co
bde0: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 0a 20 20  ntrol to the .  
bdf0: 20 20 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20 20 20    ** caller..   
be00: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f   **.    ** If no
be10: 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61  t using NRE, eva
be20: 6c 75 61 74 65 20 70 53 63 72 69 70 74 20 64 69  luate pScript di
be30: 72 65 63 74 6c 79 20 61 6e 64 20 63 6f 6e 74 69  rectly and conti
be40: 6e 75 65 20 77 69 74 68 20 74 68 65 0a 20 20 20  nue with the.   
be50: 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69   ** next iterati
be60: 6f 6e 20 6f 66 20 74 68 69 73 20 77 68 69 6c 65  on of this while
be70: 28 2e 2e 2e 29 20 6c 6f 6f 70 2e 20 20 2a 2f 0a  (...) loop.  */.
be80: 20 20 20 20 69 66 28 20 44 62 55 73 65 4e 72 65      if( DbUseNre
be90: 28 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  () ){.      Tcl_
bea0: 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e  NRAddCallback(in
beb0: 74 65 72 70 2c 20 44 62 45 76 61 6c 4e 65 78 74  terp, DbEvalNext
bec0: 43 6d 64 2c 20 28 76 6f 69 64 2a 29 70 2c 20 28  Cmd, (void*)p, (
bed0: 76 6f 69 64 2a 29 70 53 63 72 69 70 74 2c 20 30  void*)pScript, 0
bee0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
bef0: 72 6e 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a  rn Tcl_NREvalObj
bf00: 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
bf10: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
bf20: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  .      rc = Tcl_
bf30: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
bf40: 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
bf50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f     }.  }..  Tcl_
bf60: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  DecrRefCount(pSc
bf70: 72 69 70 74 29 3b 0a 20 20 64 62 45 76 61 6c 46  ript);.  dbEvalF
bf80: 69 6e 61 6c 69 7a 65 28 70 29 3b 0a 20 20 54 63  inalize(p);.  Tc
bf90: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
bfa0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 54 43  );..  if( rc==TC
bfb0: 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f  L_OK || rc==TCL_
bfc0: 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 54 63 6c  BREAK ){.    Tcl
bfd0: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
bfe0: 65 72 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  erp);.    rc = T
bff0: 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  CL_OK;.  }.  ret
c000: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c010: 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f   The "sqlite" co
c020: 6d 6d 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61  mmand below crea
c030: 74 65 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f  tes a new Tcl co
c040: 6d 6d 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a  mmand for each.*
c050: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20  * connection it 
c060: 6f 70 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69  opens to an SQLi
c070: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  te database.  Th
c080: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
c090: 76 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65  voked.** wheneve
c0a0: 72 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63  r one of those c
c0b0: 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66  onnection-specif
c0c0: 69 63 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65  ic commands is e
c0d0: 78 65 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63  xecuted.** in Tc
c0e0: 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
c0f0: 20 69 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20   if you run Tcl 
c100: 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a  code like this:.
c110: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69  **.**       sqli
c120: 74 65 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74  te3 db1  "my_dat
c130: 61 62 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20  abase".**       
c140: 64 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20  db1 close.**.** 
c150: 54 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e  The first comman
c160: 64 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63  d opens a connec
c170: 74 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f  tion to the "my_
c180: 64 61 74 61 62 61 73 65 22 20 64 61 74 61 62 61  database" databa
c190: 73 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20  se.** and calls 
c1a0: 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  that connection 
c1b0: 22 64 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f  "db1".  The seco
c1c0: 6e 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65  nd command cause
c1d0: 73 20 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75  s this.** subrou
c1e0: 74 69 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tine to be invok
c1f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
c200: 74 20 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20  t DbObjCmd(void 
c210: 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  *cd, Tcl_Interp 
c220: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
c230: 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  c,Tcl_Obj *const
c240: 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65  *objv){.  Sqlite
c250: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
c260: 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63  eDb*)cd;.  int c
c270: 68 6f 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20  hoice;.  int rc 
c280: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74  = TCL_OK;.  stat
c290: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44  ic const char *D
c2a0: 42 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  B_strs[] = {.   
c2b0: 20 22 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20   "authorizer",  
c2c0: 20 20 20 20 20 20 20 22 62 61 63 6b 75 70 22 2c         "backup",
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 62 75 73              "bus
c2e0: 79 22 2c 0a 20 20 20 20 22 63 61 63 68 65 22 2c  y",.    "cache",
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
c300: 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
c310: 20 20 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20     "close",.    
c320: 22 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20  "collate",      
c330: 20 20 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e        "collation
c340: 5f 6e 65 65 64 65 64 22 2c 20 20 22 63 6f 6d 6d  _needed",  "comm
c350: 69 74 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 63  it_hook",.    "c
c360: 6f 6d 70 6c 65 74 65 22 2c 20 20 20 20 20 20 20  omplete",       
c370: 20 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20      "copy",     
c380: 20 20 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65           "enable
c390: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22  _load_extension"
c3a0: 2c 0a 20 20 20 20 22 65 72 72 6f 72 63 6f 64 65  ,.    "errorcode
c3b0: 22 2c 20 20 20 20 20 20 20 20 20 20 22 65 76 61  ",          "eva
c3c0: 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
c3d0: 20 22 65 78 69 73 74 73 22 2c 0a 20 20 20 20 22   "exists",.    "
c3e0: 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  function",      
c3f0: 20 20 20 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c       "incrblob",
c400: 20 20 20 20 20 20 20 20 20 20 22 69 6e 74 65 72            "inter
c410: 72 75 70 74 22 2c 0a 20 20 20 20 22 6c 61 73 74  rupt",.    "last
c420: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20  _insert_rowid", 
c430: 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20   "nullvalue",   
c440: 20 20 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e        "onecolumn
c450: 22 2c 0a 20 20 20 20 22 70 72 6f 66 69 6c 65 22  ",.    "profile"
c460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 70 72  ,            "pr
c470: 6f 67 72 65 73 73 22 2c 20 20 20 20 20 20 20 20  ogress",        
c480: 20 20 22 72 65 6b 65 79 22 2c 0a 20 20 20 20 22    "rekey",.    "
c490: 72 65 73 74 6f 72 65 22 2c 20 20 20 20 20 20 20  restore",       
c4a0: 20 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68       "rollback_h
c4b0: 6f 6f 6b 22 2c 20 20 20 20 20 22 73 74 61 74 75  ook",     "statu
c4c0: 73 22 2c 0a 20 20 20 20 22 74 69 6d 65 6f 75 74  s",.    "timeout
c4d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 74  ",            "t
c4e0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c 20 20  otal_changes",  
c4f0: 20 20 20 22 74 72 61 63 65 22 2c 0a 20 20 20 20     "trace",.    
c500: 22 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20  "transaction",  
c510: 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f        "unlock_no
c520: 74 69 66 79 22 2c 20 20 20 20 20 22 75 70 64 61  tify",     "upda
c530: 74 65 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 76  te_hook",.    "v
c540: 65 72 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  ersion",        
c550: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
c560: 20 20 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20           .  };. 
c570: 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a   enum DB_enum {.
c580: 20 20 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45      DB_AUTHORIZE
c590: 52 2c 20 20 20 20 20 20 20 20 44 42 5f 42 41 43  R,        DB_BAC
c5a0: 4b 55 50 2c 20 20 20 20 20 20 20 20 20 20 20 44  KUP,           D
c5b0: 42 5f 42 55 53 59 2c 0a 20 20 20 20 44 42 5f 43  B_BUSY,.    DB_C
c5c0: 41 43 48 45 2c 20 20 20 20 20 20 20 20 20 20 20  ACHE,           
c5d0: 20 20 44 42 5f 43 48 41 4e 47 45 53 2c 20 20 20    DB_CHANGES,   
c5e0: 20 20 20 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c         DB_CLOSE,
c5f0: 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c  .    DB_COLLATE,
c600: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f             DB_CO
c610: 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20  LLATION_NEEDED, 
c620: 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a  DB_COMMIT_HOOK,.
c630: 20 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c      DB_COMPLETE,
c640: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 50            DB_COP
c650: 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44  Y,             D
c660: 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58  B_ENABLE_LOAD_EX
c670: 54 45 4e 53 49 4f 4e 2c 0a 20 20 20 20 44 42 5f  TENSION,.    DB_
c680: 45 52 52 4f 52 43 4f 44 45 2c 20 20 20 20 20 20  ERRORCODE,      
c690: 20 20 20 44 42 5f 45 56 41 4c 2c 20 20 20 20 20     DB_EVAL,     
c6a0: 20 20 20 20 20 20 20 20 44 42 5f 45 58 49 53 54          DB_EXIST
c6b0: 53 2c 0a 20 20 20 20 44 42 5f 46 55 4e 43 54 49  S,.    DB_FUNCTI
c6c0: 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f  ON,          DB_
c6d0: 49 4e 43 52 42 4c 4f 42 2c 20 20 20 20 20 20 20  INCRBLOB,       
c6e0: 20 20 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 0a    DB_INTERRUPT,.
c6f0: 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45      DB_LAST_INSE
c700: 52 54 5f 52 4f 57 49 44 2c 20 44 42 5f 4e 55 4c  RT_ROWID, DB_NUL
c710: 4c 56 41 4c 55 45 2c 20 20 20 20 20 20 20 20 44  LVALUE,        D
c720: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 0a 20 20 20  B_ONECOLUMN,.   
c730: 20 44 42 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20   DB_PROFILE,    
c740: 20 20 20 20 20 20 20 44 42 5f 50 52 4f 47 52 45         DB_PROGRE
c750: 53 53 2c 20 20 20 20 20 20 20 20 20 44 42 5f 52  SS,         DB_R
c760: 45 4b 45 59 2c 0a 20 20 20 20 44 42 5f 52 45 53  EKEY,.    DB_RES
c770: 54 4f 52 45 2c 20 20 20 20 20 20 20 20 20 20 20  TORE,           
c780: 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b  DB_ROLLBACK_HOOK
c790: 2c 20 20 20 20 44 42 5f 53 54 41 54 55 53 2c 0a  ,    DB_STATUS,.
c7a0: 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20      DB_TIMEOUT, 
c7b0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 4f 54            DB_TOT
c7c0: 41 4c 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 44  AL_CHANGES,    D
c7d0: 42 5f 54 52 41 43 45 2c 0a 20 20 20 20 44 42 5f  B_TRACE,.    DB_
c7e0: 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20  TRANSACTION,    
c7f0: 20 20 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54     DB_UNLOCK_NOT
c800: 49 46 59 2c 20 20 20 20 44 42 5f 55 50 44 41 54  IFY,    DB_UPDAT
c810: 45 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 56  E_HOOK,.    DB_V
c820: 45 52 53 49 4f 4e 2c 0a 20 20 7d 3b 0a 20 20 2f  ERSION,.  };.  /
c830: 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20 74 72  * don't leave tr
c840: 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e  ailing commas on
c850: 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f 6e   DB_enum, it con
c860: 66 75 73 65 73 20 74 68 65 20 41 49 58 20 78 6c  fuses the AIX xl
c870: 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20  c compiler */.. 
c880: 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20   if( objc<2 ){. 
c890: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
c8a0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
c8b0: 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44  bjv, "SUBCOMMAND
c8c0: 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75   ...");.    retu
c8d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c8e0: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
c8f0: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
c900: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f  rp, objv[1], DB_
c910: 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20  strs, "option", 
c920: 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a 20  0, &choice) ){. 
c930: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
c940: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  ROR;.  }..  swit
c950: 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75  ch( (enum DB_enu
c960: 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f  m)choice ){..  /
c970: 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f 72 69  *    $db authori
c980: 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  zer ?CALLBACK?. 
c990: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
c9a0: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
c9b0: 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65 20  ck to authorize 
c9c0: 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74 69  each SQL operati
c9d0: 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a 2a  on as it is.  **
c9e0: 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61 72   compiled.  5 ar
c9f0: 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70 65  guments are appe
ca00: 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  nded to the call
ca10: 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20 69  back before it i
ca20: 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a  s.  ** invoked:.
ca30: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20    **.  **   (1) 
ca40: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
ca50: 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c 49  n type (ex: SQLI
ca60: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c  TE_CREATE_TABLE,
ca70: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
ca80: 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29 20  ...).  **   (2) 
ca90: 46 69 72 73 74 20 64 65 73 63 72 69 70 74 69 76  First descriptiv
caa0: 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73 20  e name (depends 
cab0: 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  on authorization
cac0: 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28 33   type).  **   (3
cad0: 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69 70  ) Second descrip
cae0: 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20  tive name.  **  
caf0: 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68 65   (4) Name of the
cb00: 20 64 61 74 61 62 61 73 65 20 28 65 78 3a 20 22   database (ex: "
cb10: 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20  main", "temp"). 
cb20: 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20 6f   **   (5) Name o
cb30: 66 20 74 72 69 67 67 65 72 20 74 68 61 74 20 69  f trigger that i
cb40: 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63 65  s doing the acce
cb50: 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ss.  **.  ** The
cb60: 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64   callback should
cb70: 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68   return on of th
cb80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69  e following stri
cb90: 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a  ngs: SQLITE_OK,.
cba0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f    ** SQLITE_IGNO
cbb0: 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  RE, or SQLITE_DE
cbc0: 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  NY.  Any other r
cbd0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
cbe0: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20  n error..  **.  
cbf0: 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68 6f  ** If this metho
cc00: 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74  d is invoked wit
cc10: 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20  h no arguments, 
cc20: 74 68 65 20 63 75 72 72 65 6e 74 20 61 75 74 68  the current auth
cc30: 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63  orization.  ** c
cc40: 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20 69  allback string i
cc50: 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  s returned..  */
cc60: 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54 48 4f  .  case DB_AUTHO
cc70: 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66 20  RIZER: {.#ifdef 
cc80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
cc90: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54 63  ORIZATION.    Tc
cca0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ccb0: 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72 69 7a  nterp, "authoriz
ccc0: 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c 61  ation not availa
ccd0: 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c  ble in this buil
cce0: 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  d", 0);.    retu
ccf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
cd00: 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lse.    if( objc
cd10: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
cd20: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
cd30: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
cd40: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
cd50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
cd60: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
cd70: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
cd80: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
cd90: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  th ){.        Tc
cda0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
cdb0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74  nterp, pDb->zAut
cdc0: 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  h, 0);.      }. 
cdd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cde0: 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20  char *zAuth;.   
cdf0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
ce00: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
ce10: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
ce20: 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29  Free(pDb->zAuth)
ce30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ce40: 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74 53  zAuth = Tcl_GetS
ce50: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
ce60: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
ce70: 20 20 20 69 66 28 20 7a 41 75 74 68 20 26 26 20     if( zAuth && 
ce80: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
ce90: 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63   pDb->zAuth = Tc
cea0: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
ceb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
cec0: 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a  py(pDb->zAuth, z
ced0: 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  Auth, len+1);.  
cee0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cef0: 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20     pDb->zAuth = 
cf00: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
cf10: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
cf20: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
cf30: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
cf40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cf50: 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
cf60: 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f 63 61  pDb->db, auth_ca
cf70: 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a 20 20  llback, pDb);.  
cf80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cf90: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
cfa0: 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
cfb0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
cfc0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
cfd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
cfe0: 20 2f 2a 20 20 20 20 24 64 62 20 62 61 63 6b 75   /*    $db backu
cff0: 70 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c  p ?DATABASE? FIL
d000: 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ENAME.  **.  ** 
d010: 4f 70 65 6e 20 6f 72 20 63 72 65 61 74 65 20 61  Open or create a
d020: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
d030: 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20  amed FILENAME.  
d040: 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20 2a  Transfer the.  *
d050: 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6c 6f 63  * content of loc
d060: 61 6c 20 64 61 74 61 62 61 73 65 20 44 41 54 41  al database DATA
d070: 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22  BASE (default: "
d080: 6d 61 69 6e 22 29 20 69 6e 74 6f 20 74 68 65 0a  main") into the.
d090: 20 20 2a 2a 20 46 49 4c 45 4e 41 4d 45 20 64 61    ** FILENAME da
d0a0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
d0b0: 61 73 65 20 44 42 5f 42 41 43 4b 55 50 3a 20 7b  ase DB_BACKUP: {
d0c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d0d0: 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20  *zDestFile;.    
d0e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
d0f0: 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
d100: 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69  *pDest;.    sqli
d110: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
d120: 6b 75 70 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  kup;..    if( ob
d130: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a  jc==3 ){.      z
d140: 53 72 63 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a  SrcDb = "main";.
d150: 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20        zDestFile 
d160: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
d170: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65  objv[2]);.    }e
d180: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
d190: 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62 20  ){.      zSrcDb 
d1a0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
d1b0: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20  objv[2]);.      
d1c0: 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f  zDestFile = Tcl_
d1d0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
d1e0: 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
d1f0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
d200: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
d210: 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53   objv, "?DATABAS
d220: 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20  E? FILENAME");. 
d230: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
d240: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
d250: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
d260: 65 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70  en(zDestFile, &p
d270: 44 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Dest);.    if( r
d280: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d290: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
d2a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d2b0: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 61 72 67  cannot open targ
d2c0: 65 74 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a  et database: ",.
d2d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d2e0: 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
d2f0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
d300: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
d310: 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72  (pDest);.      r
d320: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d330: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b  .    }.    pBack
d340: 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
d350: 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20  kup_init(pDest, 
d360: 22 6d 61 69 6e 22 2c 20 70 44 62 2d 3e 64 62 2c  "main", pDb->db,
d370: 20 7a 53 72 63 44 62 29 3b 0a 20 20 20 20 69 66   zSrcDb);.    if
d380: 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
d390: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
d3a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d3b0: 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22  backup failed: "
d3c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
d3d0: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
d3e0: 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  t), (char*)0);. 
d3f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
d400: 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  se(pDest);.     
d410: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d420: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  R;.    }.    whi
d430: 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74  le(  (rc = sqlit
d440: 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70  e3_backup_step(p
d450: 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51  Backup,100))==SQ
d460: 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20  LITE_OK ){}.    
d470: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66  sqlite3_backup_f
d480: 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a  inish(pBackup);.
d490: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d4a0: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
d4b0: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
d4c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
d4d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d4e0: 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70 20  interp, "backup 
d4f0: 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20  failed: ",.     
d500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
d510: 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68  rmsg(pDest), (ch
d520: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63  ar*)0);.      rc
d530: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
d540: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
d550: 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20  close(pDest);.  
d560: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
d570: 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79 20 3f  /*    $db busy ?
d580: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
d590: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
d5a0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 69 66  iven callback if
d5b0: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
d5c0: 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  t attempts to op
d5d0: 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 65 64  en.  ** a locked
d5e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
d5f0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42    */.  case DB_B
d600: 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  USY: {.    if( o
d610: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
d620: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
d630: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
d640: 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20   "CALLBACK");.  
d650: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d660: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
d670: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
d680: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
d690: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
d6a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d6b0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75  interp, pDb->zBu
d6c0: 73 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  sy, 0);.      }.
d6d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d6e0: 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20   char *zBusy;.  
d6f0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
d700: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73     if( pDb->zBus
d710: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  y ){.        Tcl
d720: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79  _Free(pDb->zBusy
d730: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d740: 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47 65 74   zBusy = Tcl_Get
d750: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
d760: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
d770: 20 20 20 20 69 66 28 20 7a 42 75 73 79 20 26 26      if( zBusy &&
d780: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
d790: 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54    pDb->zBusy = T
d7a0: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
d7b0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
d7c0: 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20  cpy(pDb->zBusy, 
d7d0: 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20  zBusy, len+1);. 
d7e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d7f0: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
d800: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
d810: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
d820: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
d830: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
d840: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d850: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
d860: 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48 61  Db->db, DbBusyHa
d870: 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
d880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d890: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
d8a0: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
d8b0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
d8c0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
d8d0: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64    }..  /*     $d
d8e0: 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20 20  b cache flush.  
d8f0: 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65  **     $db cache
d900: 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a   size n.  **.  *
d910: 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72 65 70  * Flush the prep
d920: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63  ared statement c
d930: 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74 68 65  ache, or set the
d940: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
d950: 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64 20 73  of.  ** cached s
d960: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
d970: 20 20 63 61 73 65 20 44 42 5f 43 41 43 48 45 3a    case DB_CACHE:
d980: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 75 62   {.    char *sub
d990: 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  Cmd;.    int n;.
d9a0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 3d 32  .    if( objc<=2
d9b0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
d9c0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
d9d0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 61 63  p, 1, objv, "cac
d9e0: 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22  he option ?arg?"
d9f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
da00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
da10: 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20 54 63  .    subCmd = Tc
da20: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
da30: 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30 20 29  bj( objv[2], 0 )
da40: 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62 43 6d  ;.    if( *subCm
da50: 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63 6d 70  d=='f' && strcmp
da60: 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68 22 29  (subCmd,"flush")
da70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
da80: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
da90: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
daa0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
dab0: 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29 3b 0a  objv, "flush");.
dac0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
dad0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
dae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
daf0: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70  lushStmtCache( p
db00: 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Db );.      }.  
db10: 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73 75 62    }else if( *sub
db20: 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74 72 63  Cmd=='s' && strc
db30: 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a 65 22  mp(subCmd,"size"
db40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
db50: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
db60: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
db70: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
db80: 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e 22 29   objv, "size n")
db90: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
dba0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
dbb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dbc0: 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52 3d 3d   if( TCL_ERROR==
dbd0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
dbe0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
dbf0: 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20  ], &n) ){.      
dc00: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
dc10: 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 63  sult( interp, "c
dc20: 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20 5c 22  annot convert \"
dc30: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
dc40: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
dc50: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
dc60: 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74 65 67  0), "\" to integ
dc70: 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  er", 0);.       
dc80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
dc90: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ROR;.        }el
dca0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
dcb0: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( n<0 ){.       
dcc0: 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61       flushStmtCa
dcd0: 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20  che( pDb );.    
dce0: 20 20 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20          n = 0;. 
dcf0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
dd00: 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50 41 52 45  f( n>MAX_PREPARE
dd10: 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20 20 20 20  D_STMTS ){.     
dd20: 20 20 20 20 20 20 20 6e 20 3d 20 4d 41 58 5f 50         n = MAX_P
dd30: 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20  REPARED_STMTS;. 
dd40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
dd50: 20 20 20 20 20 70 44 62 2d 3e 6d 61 78 53 74 6d       pDb->maxStm
dd60: 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d  t = n;.        }
dd70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
dd80: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
dd90: 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65  pendResult( inte
dda0: 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20  rp, "bad option 
ddb0: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \"", .          
ddc0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ddd0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 30 29 2c  mObj(objv[2],0),
dde0: 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20 66 6c   "\": must be fl
ddf0: 75 73 68 20 6f 72 20 73 69 7a 65 22 2c 20 30 29  ush or size", 0)
de00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
de10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
de20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
de30: 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 68 61    /*     $db cha
de40: 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  nges.  **.  ** R
de50: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
de60: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65   of rows that we
de70: 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73  re modified, ins
de80: 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65  erted, or delete
de90: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f  d by.  ** the mo
dea0: 73 74 20 72 65 63 65 6e 74 20 49 4e 53 45 52 54  st recent INSERT
deb0: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
dec0: 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f  TE statement, no
ded0: 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a 20 20 2a  t including .  *
dee0: 2a 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61  * any changes ma
def0: 64 65 20 62 79 20 74 72 69 67 67 65 72 20 70 72  de by trigger pr
df00: 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63  ograms..  */.  c
df10: 61 73 65 20 44 42 5f 43 48 41 4e 47 45 53 3a 20  ase DB_CHANGES: 
df20: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
df30: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
df40: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
df50: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
df60: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
df70: 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
df80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
df90: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
dfa0: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
dfb0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
dfc0: 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
dfd0: 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
dfe0: 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62  _changes(pDb->db
dff0: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
e000: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
e010: 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  close.  **.  ** 
e020: 53 68 75 74 64 6f 77 6e 20 74 68 65 20 64 61 74  Shutdown the dat
e030: 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73  abase.  */.  cas
e040: 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20  e DB_CLOSE: {.  
e050: 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d    Tcl_DeleteComm
e060: 61 6e 64 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  and(interp, Tcl_
e070: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
e080: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20  (objv[0], 0));. 
e090: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
e0a0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
e0b0: 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43   collate NAME SC
e0c0: 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
e0d0: 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
e0e0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
e0f0: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
e100: 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74   Whenever.  ** t
e110: 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  hat function is 
e120: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
e130: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
e140: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
e150: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
e160: 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 53 71  OLLATE: {.    Sq
e170: 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61  lCollate *pColla
e180: 74 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  te;.    char *zN
e190: 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ame;.    char *z
e1a0: 53 63 72 69 70 74 3b 0a 20 20 20 20 69 6e 74 20  Script;.    int 
e1b0: 6e 53 63 72 69 70 74 3b 0a 20 20 20 20 69 66 28  nScript;.    if(
e1c0: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
e1d0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
e1e0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
e1f0: 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54  jv, "NAME SCRIPT
e200: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
e210: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e220: 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  }.    zName = Tc
e230: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
e240: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
e250: 20 20 20 20 7a 53 63 72 69 70 74 20 3d 20 54 63      zScript = Tc
e260: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
e270: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63  bj(objv[3], &nSc
e280: 72 69 70 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  ript);.    pColl
e290: 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74  ate = (SqlCollat
e2a0: 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  e*)Tcl_Alloc( si
e2b0: 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20  zeof(*pCollate) 
e2c0: 2b 20 6e 53 63 72 69 70 74 20 2b 20 31 20 29 3b  + nScript + 1 );
e2d0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 61 74  .    if( pCollat
e2e0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  e==0 ) return TC
e2f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f  L_ERROR;.    pCo
e300: 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20  llate->interp = 
e310: 69 6e 74 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c  interp;.    pCol
e320: 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44  late->pNext = pD
e330: 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  b->pCollate;.   
e340: 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69   pCollate->zScri
e350: 70 74 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f  pt = (char*)&pCo
e360: 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44  llate[1];.    pD
e370: 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43  b->pCollate = pC
e380: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d 65 6d 63  ollate;.    memc
e390: 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63  py(pCollate->zSc
e3a0: 72 69 70 74 2c 20 7a 53 63 72 69 70 74 2c 20 6e  ript, zScript, n
e3b0: 53 63 72 69 70 74 2b 31 29 3b 0a 20 20 20 20 69  Script+1);.    i
e3c0: 66 28 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  f( sqlite3_creat
e3d0: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70 44 62 2d  e_collation(pDb-
e3e0: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  >db, zName, SQLI
e3f0: 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
e400: 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63 6c 53    pCollate, tclS
e410: 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20  qlCollate) ){.  
e420: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
e430: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
e440: 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
e450: 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
e460: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 20 20  OLATILE);.      
e470: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
e490: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
e4a0: 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74  *     $db collat
e4b0: 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52 49 50  ion_needed SCRIP
e4c0: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
e4d0: 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c  te a new SQL col
e4e0: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
e4f0: 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
e500: 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74  enever.  ** that
e510: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
e520: 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
e530: 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
e540: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
e550: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c  /.  case DB_COLL
e560: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a  ATION_NEEDED: {.
e570: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
e580: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
e590: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
e5a0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49  , 2, objv, "SCRI
e5b0: 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
e5c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e5d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d    }.    if( pDb-
e5e0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
e5f0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
e600: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
e610: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
e620: 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70      }.    pDb->p
e630: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 3d 20  CollateNeeded = 
e640: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
e650: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 54  (objv[2]);.    T
e660: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
e670: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
e680: 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ded);.    sqlite
e690: 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
e6a0: 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44 62 2c  ed(pDb->db, pDb,
e6b0: 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
e6c0: 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  d);.    break;. 
e6d0: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
e6e0: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c  commit_hook ?CAL
e6f0: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
e700: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
e710: 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74 20  n callback just 
e720: 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
e730: 67 20 65 76 65 72 79 20 53 51 4c 20 74 72 61 6e  g every SQL tran
e740: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66  saction..  ** If
e750: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 74 68   the callback th
e760: 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f  rows an exceptio
e770: 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e  n or returns non
e780: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a  -zero, then the.
e790: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
e7a0: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20 49 66   is aborted.  If
e7b0: 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61 6e 20   CALLBACK is an 
e7c0: 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
e7d0: 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  e callback.  ** 
e7e0: 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20 20 2a  is disabled..  *
e7f0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 4d  /.  case DB_COMM
e800: 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69  IT_HOOK: {.    i
e810: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
e820: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
e830: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
e840: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
e850: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
e860: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e870: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
e880: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
e890: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
e8a0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
e8b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e8c0: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 30 29  pDb->zCommit, 0)
e8d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
e8e0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
e8f0: 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20  *zCommit;.      
e900: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
e910: 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  f( pDb->zCommit 
e920: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
e930: 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  ree(pDb->zCommit
e940: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e950: 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 47   zCommit = Tcl_G
e960: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
e970: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
e980: 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69        if( zCommi
e990: 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  t && len>0 ){.  
e9a0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d        pDb->zComm
e9b0: 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  it = Tcl_Alloc( 
e9c0: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
e9d0: 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
e9e0: 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74 2c  Commit, zCommit,
e9f0: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
ea00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
ea10: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a  b->zCommit = 0;.
ea20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ea30: 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
ea40: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
ea50: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
ea60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ea70: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d  commit_hook(pDb-
ea80: 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e  >db, DbCommitHan
ea90: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
eaa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
eab0: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
eac0: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c  hook(pDb->db, 0,
ead0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
eae0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
eaf0: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63  }..  /*    $db c
eb00: 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a  omplete SQL.  **
eb10: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  .  ** Return TRU
eb20: 45 20 69 66 20 53 51 4c 20 69 73 20 61 20 63 6f  E if SQL is a co
eb30: 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
eb40: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 46 41  ment.  Return FA
eb50: 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64 64 69  LSE if.  ** addi
eb60: 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20  tional lines of 
eb70: 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64 65 64  input are needed
eb80: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
eb90: 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62  ar to the.  ** b
eba0: 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f  uilt-in "info co
ebb0: 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20  mplete" command 
ebc0: 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63  of Tcl..  */.  c
ebd0: 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a  ase DB_COMPLETE:
ebe0: 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
ebf0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a  E_OMIT_COMPLETE.
ec00: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
ec10: 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  sult;.    int is
ec20: 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69 66  Complete;.    if
ec30: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
ec40: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
ec50: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
ec60: 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
ec70: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ec80: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
ec90: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69  sComplete = sqli
eca0: 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63  te3_complete( Tc
ecb0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
ecc0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29  bj(objv[2], 0) )
ecd0: 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  ;.    pResult = 
ece0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
ecf0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
ed00: 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_SetBooleanObj(
ed10: 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c  pResult, isCompl
ed20: 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ete);.#endif.   
ed30: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
ed40: 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20 63 6f  *    $db copy co
ed50: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
ed60: 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20   table filename 
ed70: 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c  ?SEPARATOR? ?NUL
ed80: 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a  LINDICATOR?.  **
ed90: 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  .  ** Copy data 
eda0: 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20  into table from 
edb0: 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e  filename, option
edc0: 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50 41 52  ally using SEPAR
edd0: 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c  ATOR.  ** as col
ede0: 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 2e 20  umn separators. 
edf0: 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e   If a column con
ee00: 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72  tains a null str
ee10: 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a  ing, or the.  **
ee20: 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e   value of NULLIN
ee30: 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20  DICATOR, a NULL 
ee40: 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20  is inserted for 
ee50: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a  the column..  **
ee60: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
ee70: 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  thm is one of th
ee80: 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63  e sqlite conflic
ee90: 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20  t algorithms:.  
eea0: 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20  **    rollback, 
eeb0: 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e  abort, fail, ign
eec0: 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a  ore, replace.  *
eed0: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
eee0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
eef0: 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73  of lines process
ef00: 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  ed, not necessar
ef10: 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73  ily same.  ** as
ef20: 20 27 64 62 20 63 68 61 6e 67 65 73 27 20 64 75   'db changes' du
ef30: 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  e to conflict-al
ef40: 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74 65 64  gorithm selected
ef50: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
ef60: 20 63 6f 64 65 20 69 73 20 62 61 73 69 63 61 6c   code is basical
ef70: 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ly an implementa
ef80: 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74  tion/enhancement
ef90: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
efa0: 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69  ite3 shell.c ".i
efb0: 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a  mport" command..
efc0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
efd0: 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69 73 20  ommand usage is 
efe0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
eff0: 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f 50 59  e sqlite2.x COPY
f000: 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a   statement,.  **
f010: 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73 20 66   which imports f
f020: 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20 61 20  ile data into a 
f030: 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  table using the 
f040: 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50 59 20  PostgreSQL COPY 
f050: 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a  file format:.  *
f060: 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24 63 6f  *   $db copy $co
f070: 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c  nflit_algo $tabl
f080: 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65  e_name $filename
f090: 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63   \t \\N.  */.  c
f0a0: 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20  ase DB_COPY: {. 
f0b0: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b     char *zTable;
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f0d0: 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
f0e0: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
f0f0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  .    char *zFile
f100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f110: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f   /* The file fro
f120: 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72 61  m which to extra
f130: 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 63  ct data */.    c
f140: 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20  har *zConflict; 
f150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f160: 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
f170: 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ithm to use */. 
f180: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
f190: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 2f  *pStmt;        /
f1a0: 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  * A statement */
f1b0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
f1e0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
f1f0: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  le */.    int nB
f200: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
f210: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f220: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53  of bytes in an S
f230: 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  QL string */.   
f240: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f260: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
f270: 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20  .    int nSep;  
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f290: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
f2a0: 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f  tes in zSep[] */
f2b0: 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20  .    int nNull; 
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
f2e0: 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a  tes in zNull[] *
f2f0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  /.    char *zSql
f300: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f310: 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74    /* An SQL stat
f320: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61  ement */.    cha
f330: 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20  r *zLine;       
f340: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
f350: 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70  ngle line of inp
f360: 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ut from the file
f370: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   */.    char **a
f380: 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zCol;           
f390: 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62      /* zLine[] b
f3a0: 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f  roken up into co
f3b0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61  lumns */.    cha
f3c0: 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20  r *zCommit;     
f3d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
f3e0: 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65  to commit change
f3f0: 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69  s */.    FILE *i
f400: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
f410: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75       /* The inpu
f420: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  t file */.    in
f430: 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20  t lineno = 0;   
f440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
f450: 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  e number of inpu
f460: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68  t file */.    ch
f470: 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b  ar zLineNum[80];
f480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
f490: 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74 20 62  e number print b
f4a0: 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c  uffer */.    Tcl
f4b0: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20  _Obj *pResult;  
f4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 74 65           /* inte
f4d0: 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  rp result */..  
f4e0: 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20    char *zSep;.  
f4f0: 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20    char *zNull;. 
f500: 20 20 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c     if( objc<5 ||
f510: 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20   objc>7 ){.     
f520: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f530: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
f540: 76 2c 20 0a 20 20 20 20 20 20 20 20 20 22 43 4f  v, .         "CO
f550: 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d  NFLICT-ALGORITHM
f560: 20 54 41 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20   TABLE FILENAME 
f570: 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c  ?SEPARATOR? ?NUL
f580: 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20  LINDICATOR?");. 
f590: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f5a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
f5b0: 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a   if( objc>=6 ){.
f5c0: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 54 63 6c        zSep = Tcl
f5d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
f5e0: 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20  j(objv[5], 0);. 
f5f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f600: 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20  zSep = "\t";.   
f610: 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   }.    if( objc>
f620: 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c  =7 ){.      zNul
f630: 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
f640: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d  gFromObj(objv[6]
f650: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
f660: 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22  .      zNull = "
f670: 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f  ";.    }.    zCo
f680: 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f 47 65 74  nflict = Tcl_Get
f690: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f6a0: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a  jv[2], 0);.    z
f6b0: 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  Table = Tcl_GetS
f6c0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
f6d0: 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46  v[3], 0);.    zF
f6e0: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
f6f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f700: 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70  4], 0);.    nSep
f710: 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 65 70   = strlen30(zSep
f720: 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73  );.    nNull = s
f730: 74 72 6c 65 6e 33 30 28 7a 4e 75 6c 6c 29 3b 0a  trlen30(zNull);.
f740: 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
f750: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
f760: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f770: 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c  ,"Error: non-nul
f780: 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75  l separator requ
f790: 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 30  ired for copy",0
f7a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f7b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
f7c0: 0a 20 20 20 20 69 66 28 73 74 72 63 6d 70 28 7a  .    if(strcmp(z
f7d0: 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c 6c 62  Conflict, "rollb
f7e0: 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a 20 20  ack") != 0 &&.  
f7f0: 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e       strcmp(zCon
f800: 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22 20 20  flict, "abort"  
f810: 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20   ) != 0 &&.     
f820: 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69    strcmp(zConfli
f830: 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20 29 20  ct, "fail"    ) 
f840: 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
f850: 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
f860: 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20   "ignore"  ) != 
f870: 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63  0 &&.       strc
f880: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72  mp(zConflict, "r
f890: 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30 20 29  eplace" ) != 0 )
f8a0: 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70   {.      Tcl_App
f8b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f8c0: 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c 20 7a  , "Error: \"", z
f8d0: 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20 20 20  Conflict, .     
f8e0: 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f 6e 66         "\", conf
f8f0: 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 6d  lict-algorithm m
f900: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 20 72  ust be one of: r
f910: 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20 20 20  ollback, ".     
f920: 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c 20 66         "abort, f
f930: 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f 72 20  ail, ignore, or 
f940: 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a 20 20  replace", 0);.  
f950: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f960: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
f970: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
f980: 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a  printf("SELECT *
f990: 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61   FROM '%q'", zTa
f9a0: 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  ble);.    if( zS
f9b0: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ql==0 ){.      T
f9c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f9d0: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
f9e0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22  no such table: "
f9f0: 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , zTable, 0);.  
fa00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fa10: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
fa20: 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30  nByte = strlen30
fa30: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
fa40: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
fa50: 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
fa60: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
fa70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
fa80: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
fa90: 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
faa0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fab0: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
fac0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
fad0: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
fae0: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
faf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43   }else{.      nC
fb00: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
fb10: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
fb20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
fb30: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
fb40: 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  mt);.    if( nCo
fb50: 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72  l==0 ) {.      r
fb60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fb70: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
fb80: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
fb90: 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 50 + nCol*2 );
fba0: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
fbb0: 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
fbc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
fbd0: 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27  rp, "Error: can'
fbe0: 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b  t malloc()", 0);
fbf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
fc00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
fc10: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
fc20: 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53  ntf(nByte+50, zS
fc30: 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25  ql, "INSERT OR %
fc40: 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55  q INTO '%q' VALU
fc50: 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20  ES(?",.         
fc60: 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c  zConflict, zTabl
fc70: 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  e);.    j = strl
fc80: 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20  en30(zSql);.    
fc90: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b  for(i=1; i<nCol;
fca0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71   i++){.      zSq
fcb0: 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  l[j++] = ',';.  
fcc0: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
fcd0: 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  '?';.    }.    z
fce0: 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a  Sql[j++] = ')';.
fcf0: 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b      zSql[j] = 0;
fd00: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
fd10: 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
fd20: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
fd30: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65  tmt, 0);.    fre
fd40: 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
fd50: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
fd60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fd70: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c  terp, "Error: ",
fd80: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
fd90: 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
fda0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
fdb0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
fdc0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
fdd0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
fde0: 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  n = fopen(zFile,
fdf0: 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "rb");.    if( 
fe00: 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  in==0 ){.      T
fe10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
fe20: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
fe30: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
fe40: 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c  : ", zFile, NULL
fe50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fe60: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
fe70: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
fe80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
fe90: 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c      azCol = mall
fea0: 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c  oc( sizeof(azCol
feb0: 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b  [0])*(nCol+1) );
fec0: 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  .    if( azCol==
fed0: 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
fee0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fef0: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  erp, "Error: can
ff00: 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29  't malloc()", 0)
ff10: 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69  ;.      fclose(i
ff20: 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
ff30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ff40: 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  }.    (void)sqli
ff50: 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
ff60: 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c  , "BEGIN", 0, 0,
ff70: 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74   0);.    zCommit
ff80: 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20   = "COMMIT";.   
ff90: 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d   while( (zLine =
ffa0: 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30   local_getline(0
ffb0: 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20  , in))!=0 ){.   
ffc0: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
ffd0: 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c    i = 0;.      l
ffe0: 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61  ineno++;.      a
fff0: 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b  zCol[0] = zLine;
10000 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
10010 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b  z=zLine; *z; z++
10020 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  ){.        if( *
10030 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74  z==zSep[0] && st
10040 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e  rncmp(z, zSep, n
10050 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Sep)==0 ){.     
10060 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20       *z = 0;.   
10070 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
10080 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c        if( i<nCol
10090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
100a0 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53  azCol[i] = &z[nS
100b0 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ep];.           
100c0 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20   z += nSep-1;.  
100d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
100e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
100f0 20 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20    if( i+1!=nCol 
10100 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
10110 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69  *zErr;.        i
10120 6e 74 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e  nt nErr = strlen
10130 33 30 28 7a 46 69 6c 65 29 20 2b 20 32 30 30 3b  30(zFile) + 200;
10140 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
10150 6d 61 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20 20  malloc(nErr);.  
10160 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29        if( zErr )
10170 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10180 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45 72  te3_snprintf(nEr
10190 72 2c 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 20  r, zErr,.       
101a0 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 25 73        "Error: %s
101b0 20 6c 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74   line %d: expect
101c0 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66  ed %d columns of
101d0 20 64 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20   data but found 
101e0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
101f0 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c    zFile, lineno,
10200 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20   nCol, i+1);.   
10210 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
10220 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10230 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  zErr, 0);.      
10240 20 20 20 20 66 72 65 65 28 7a 45 72 72 29 3b 0a      free(zErr);.
10250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10260 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c    zCommit = "ROL
10270 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20  LBACK";.        
10280 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
10290 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
102a0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
102b0 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 66 6f 72      /* check for
102c0 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66 20 73   null data, if s
102d0 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c 6c 20  o, bind as null 
102e0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
102f0 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72 63 6d  nNull>0 && strcm
10300 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c  p(azCol[i], zNul
10310 6c 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  l)==0).         
10320 20 7c 7c 20 73 74 72 6c 65 6e 33 30 28 61 7a 43   || strlen30(azC
10330 6f 6c 5b 69 5d 29 3d 3d 30 20 0a 20 20 20 20 20  ol[i])==0 .     
10340 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
10350 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
10360 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20  l(pStmt, i+1);. 
10370 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
10380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10390 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
103a0 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20   i+1, azCol[i], 
103b0 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
103c0 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  C);.        }.  
103d0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
103e0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
103f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
10400 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
10410 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69  ;.      free(zLi
10420 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ne);.      if( r
10430 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10440 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
10450 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10460 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74  "Error: ", sqlit
10470 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
10480 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b), 0);.        
10490 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42  zCommit = "ROLLB
104a0 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72  ACK";.        br
104b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
104c0 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a 43 6f   }.    free(azCo
104d0 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69  l);.    fclose(i
104e0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
104f0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
10500 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
10510 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
10520 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20   zCommit, 0, 0, 
10530 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f  0);..    if( zCo
10540 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29  mmit[0] == 'C' )
10550 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65  {.      /* succe
10560 73 73 2c 20 73 65 74 20 72 65 73 75 6c 74 20 61  ss, set result a
10570 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65  s number of line
10580 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  s processed */. 
10590 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54       pResult = T
105a0 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
105b0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 54  interp);.      T
105c0 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
105d0 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20  sult, lineno);. 
105e0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
105f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10600 20 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61     /* failure, a
10610 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65  ppend lineno whe
10620 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  re failed */.   
10630 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
10640 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ntf(sizeof(zLine
10650 4e 75 6d 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22  Num), zLineNum,"
10660 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  %d",lineno);.   
10670 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10680 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20 66 61  ult(interp,", fa
10690 69 6c 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65  iled while proce
106a0 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c  ssing line: ",zL
106b0 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20 20 20 20  ineNum,0);.     
106c0 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
106d0 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
106e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
106f0 20 20 20 20 24 64 62 20 65 6e 61 62 6c 65 5f 6c      $db enable_l
10700 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 42 4f  oad_extension BO
10710 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OLEAN.  **.  ** 
10720 54 75 72 6e 20 74 68 65 20 65 78 74 65 6e 73 69  Turn the extensi
10730 6f 6e 20 6c 6f 61 64 69 6e 67 20 66 65 61 74 75  on loading featu
10740 72 65 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49  re on or off.  I
10750 74 20 69 66 20 6f 66 66 20 62 79 0a 20 20 2a 2a  t if off by.  **
10760 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20   default..  */. 
10770 20 63 61 73 65 20 44 42 5f 45 4e 41 42 4c 45 5f   case DB_ENABLE_
10780 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 3a 20  LOAD_EXTENSION: 
10790 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
107a0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
107b0 53 49 4f 4e 0a 20 20 20 20 69 6e 74 20 6f 6e 6f  SION.    int ono
107c0 66 66 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ff;.    if( objc
107d0 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
107e0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
107f0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
10800 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 20  BOOLEAN");.     
10810 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10820 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
10830 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
10840 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
10850 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20  bjv[2], &onoff) 
10860 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10870 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10880 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61  .    sqlite3_ena
10890 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
108a0 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66  on(pDb->db, onof
108b0 66 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 23  f);.    break;.#
108c0 65 6c 73 65 0a 20 20 20 20 54 63 6c 5f 41 70 70  else.    Tcl_App
108d0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
108e0 2c 20 22 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61  , "extension loa
108f0 64 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f  ding is turned o
10900 66 66 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ff at compile-ti
10910 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me",.           
10920 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20            0);.  
10930 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10940 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  OR;.#endif.  }..
10950 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
10960 20 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a   errorcode.  **.
10970 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
10980 6e 75 6d 65 72 69 63 20 65 72 72 6f 72 20 63 6f  numeric error co
10990 64 65 20 74 68 61 74 20 77 61 73 20 72 65 74 75  de that was retu
109a0 72 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74  rned by the most
109b0 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c   recent.  ** cal
109c0 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
109d0 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  c()..  */.  case
109e0 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b   DB_ERRORCODE: {
109f0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
10a00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
10a10 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
10a20 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d  te3_errcode(pDb-
10a30 3e 64 62 29 29 29 3b 0a 20 20 20 20 62 72 65 61  >db)));.    brea
10a40 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
10a50 2a 20 20 20 20 24 64 62 20 65 78 69 73 74 73 20  *    $db exists 
10a60 24 73 71 6c 0a 20 20 2a 2a 20 20 20 20 24 64 62  $sql.  **    $db
10a70 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a   onecolumn $sql.
10a80 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e    **.  ** The on
10a90 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69  ecolumn method i
10aa0 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  s the equivalent
10ab0 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69   of:.  **     li
10ac0 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24  ndex [$db eval $
10ad0 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61  sql] 0.  */.  ca
10ae0 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20 0a 20  se DB_EXISTS: . 
10af0 20 63 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55   case DB_ONECOLU
10b00 4d 4e 3a 20 7b 0a 20 20 20 20 44 62 45 76 61 6c  MN: {.    DbEval
10b10 43 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20  Context sEval;. 
10b20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
10b30 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
10b40 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10b50 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29   2, objv, "SQL")
10b60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10b70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10b80 0a 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28  .    dbEvalInit(
10b90 26 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a  &sEval, pDb, obj
10ba0 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 72 63  v[2], 0);.    rc
10bb0 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 26 73   = dbEvalStep(&s
10bc0 45 76 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 63  Eval);.    if( c
10bd0 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c  hoice==DB_ONECOL
10be0 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  UMN ){.      if(
10bf0 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc==TCL_OK ){. 
10c00 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
10c10 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
10c20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
10c30 65 28 26 73 45 76 61 6c 2c 20 30 29 29 3b 0a 20  e(&sEval, 0));. 
10c40 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
10c50 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
10c60 41 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b  AK || rc==TCL_OK
10c70 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
10c80 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10c90 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
10ca0 6e 4f 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29  nObj(rc==TCL_OK)
10cb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 45  );.    }.    dbE
10cc0 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76  valFinalize(&sEv
10cd0 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  al);..    if( rc
10ce0 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
10cf0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
10d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
10d10 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a  k;.  }.   .  /*.
10d20 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c    **    $db eval
10d30 20 24 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b   $sql ?array? ?{
10d40 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a    ...code... }?.
10d50 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
10d60 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24  L statement in $
10d70 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64  sql is evaluated
10d80 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c  .  For each row,
10d90 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a   the values are.
10da0 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65    ** placed in e
10db0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61  lements of the a
10dc0 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61  rray named "arra
10dd0 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e  y" and ...code..
10de0 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  . is executed.. 
10df0 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61   ** If "array" a
10e00 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d  nd "code" are om
10e10 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63  itted, then no c
10e20 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79  allback is every
10e30 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49   invoked..  ** I
10e40 66 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20  f "array" is an 
10e50 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
10e60 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  en the values ar
10e70 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69  e placed in vari
10e80 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  ables.  ** that 
10e90 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61  have the same na
10ea0 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73  me as the fields
10eb0 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68   extracted by th
10ec0 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
10ed0 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a  case DB_EVAL: {.
10ee0 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c      if( objc<3 |
10ef0 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20  | objc>5 ){.    
10f00 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10f10 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
10f20 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d  jv, "SQL ?ARRAY-
10f30 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29  NAME? ?SCRIPT?")
10f40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10f50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10f60 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
10f70 20 29 7b 0a 20 20 20 20 20 20 44 62 45 76 61 6c   ){.      DbEval
10f80 43 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20  Context sEval;. 
10f90 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52       Tcl_Obj *pR
10fa0 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
10fb0 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  );.      Tcl_Inc
10fc0 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
10fd0 0a 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69  .      dbEvalIni
10fe0 74 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f  t(&sEval, pDb, o
10ff0 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
11000 20 20 77 68 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d    while( TCL_OK=
11010 3d 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65  =(rc = dbEvalSte
11020 70 28 26 73 45 76 61 6c 29 29 20 29 7b 0a 20 20  p(&sEval)) ){.  
11030 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
11040 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
11050 20 20 20 20 20 20 20 64 62 45 76 61 6c 52 6f 77         dbEvalRow
11060 49 6e 66 6f 28 26 73 45 76 61 6c 2c 20 26 6e 43  Info(&sEval, &nC
11070 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ol, 0);.        
11080 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
11090 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
110a0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
110b0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
110c0 2c 20 70 52 65 74 2c 20 64 62 45 76 61 6c 43 6f  , pRet, dbEvalCo
110d0 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c  lumnValue(&sEval
110e0 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  , i));.        }
110f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
11100 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73  bEvalFinalize(&s
11110 45 76 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  Eval);.      if(
11120 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29   rc==TCL_BREAK )
11130 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
11140 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11150 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20  p, pRet);.      
11160 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
11170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c       }.      Tcl
11180 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
11190 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  et);.    }else{.
111a0 20 20 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61        ClientData
111b0 20 63 64 5b 32 5d 3b 0a 20 20 20 20 20 20 44 62   cd[2];.      Db
111c0 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 3b 0a  EvalContext *p;.
111d0 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
111e0 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20  Array = 0;.     
111f0 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
11200 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 62  t;..      if( ob
11210 6a 63 3d 3d 35 20 26 26 20 2a 28 63 68 61 72 20  jc==5 && *(char 
11220 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  *)Tcl_GetString(
11230 6f 62 6a 76 5b 33 5d 29 20 29 7b 0a 20 20 20 20  objv[3]) ){.    
11240 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a      pArray = obj
11250 76 5b 33 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  v[3];.      }.  
11260 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
11270 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20  jv[objc-1];.    
11280 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
11290 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20  nt(pScript);.   
112a0 20 20 20 0a 20 20 20 20 20 20 70 20 3d 20 28 44     .      p = (D
112b0 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 54  bEvalContext *)T
112c0 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  cl_Alloc(sizeof(
112d0 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b  DbEvalContext));
112e0 0a 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69  .      dbEvalIni
112f0 74 28 70 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32  t(p, pDb, objv[2
11300 5d 2c 20 70 41 72 72 61 79 29 3b 0a 0a 20 20 20  ], pArray);..   
11310 20 20 20 63 64 5b 30 5d 20 3d 20 28 76 6f 69 64     cd[0] = (void
11320 20 2a 29 70 3b 0a 20 20 20 20 20 20 63 64 5b 31   *)p;.      cd[1
11330 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 53 63 72  ] = (void *)pScr
11340 69 70 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ipt;.      rc = 
11350 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28 63 64  DbEvalNextCmd(cd
11360 2c 20 69 6e 74 65 72 70 2c 20 54 43 4c 5f 4f 4b  , interp, TCL_OK
11370 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
11380 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
11390 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63 74  **     $db funct
113a0 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61 72 67 63 6f  ion NAME [-argco
113b0 75 6e 74 20 4e 5d 20 53 43 52 49 50 54 0a 20 20  unt N] SCRIPT.  
113c0 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
113d0 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f   new SQL functio
113e0 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  n called NAME.  
113f0 57 68 65 6e 65 76 65 72 20 74 68 61 74 20 66 75  Whenever that fu
11400 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  nction is.  ** c
11410 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43  alled, invoke SC
11420 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65  RIPT to evaluate
11430 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
11440 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55   */.  case DB_FU
11450 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71  NCTION: {.    Sq
11460 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  lFunc *pFunc;.  
11470 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
11480 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  pt;.    char *zN
11490 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ame;.    int nAr
114a0 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
114b0 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 20  objc==6 ){.     
114c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
114d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
114e0 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69  bjv[3]);.      i
114f0 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  nt n = strlen30(
11500 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  z);.      if( n>
11510 32 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20  2 && strncmp(z, 
11520 22 2d 61 72 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d  "-argcount",n)==
11530 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
11540 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
11550 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
11560 34 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74  4], &nArg) ) ret
11570 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11580 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c         if( nArg<
11590 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  0 ){.          T
115a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
115b0 69 6e 74 65 72 70 2c 20 22 6e 75 6d 62 65 72 20  interp, "number 
115c0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 75 73  of arguments mus
115d0 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t be non-negativ
115e0 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11600 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
11610 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11620 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
11630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
11640 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 35 5d 3b  cript = objv[5];
11650 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
11660 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
11670 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11680 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
11690 2c 20 22 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75  , "NAME [-argcou
116a0 6e 74 20 4e 5d 20 53 43 52 49 50 54 22 29 3b 0a  nt N] SCRIPT");.
116b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
116c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
116d0 65 7b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74  e{.      pScript
116e0 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
116f0 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  }.    zName = Tc
11700 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
11710 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
11720 20 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64      pFunc = find
11730 53 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61  SqlFunc(pDb, zNa
11740 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75  me);.    if( pFu
11750 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54  nc==0 ) return T
11760 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66  CL_ERROR;.    if
11770 28 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74  ( pFunc->pScript
11780 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65   ){.      Tcl_De
11790 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63  crRefCount(pFunc
117a0 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  ->pScript);.    
117b0 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63  }.    pFunc->pSc
117c0 72 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a  ript = pScript;.
117d0 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
117e0 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
117f0 20 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61     pFunc->useEva
11800 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73  lObjv = safeToUs
11810 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70  eEvalObjv(interp
11820 2c 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  , pScript);.    
11830 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
11840 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62  ate_function(pDb
11850 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  ->db, zName, nAr
11860 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
11870 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74          pFunc, t
11880 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29  clSqlFunc, 0, 0)
11890 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
118a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
118b0 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
118c0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
118d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
118e0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
118f0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
11900 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
11910 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
11920 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
11930 20 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d   $db incrblob ?-
11940 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54  readonly? ?DB? T
11950 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49  ABLE COLUMN ROWI
11960 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  D.  */.  case DB
11970 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66  _INCRBLOB: {.#if
11980 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11990 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c  INCRBLOB.    Tcl
119a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
119b0 74 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20  terp, "incrblob 
119c0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
119d0 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29   this build", 0)
119e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
119f0 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
11a00 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
11a10 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
11a20 63 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69  char *zDb = "mai
11a30 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  n";.    const ch
11a40 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20  ar *zTable;.    
11a50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
11a60 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f  umn;.    sqlite_
11a70 69 6e 74 36 34 20 69 52 6f 77 3b 0a 0a 20 20 20  int64 iRow;..   
11a80 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
11a90 65 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69  e -readonly opti
11aa0 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62  on */.    if( ob
11ab0 6a 63 3e 33 20 26 26 20 73 74 72 63 6d 70 28 54  jc>3 && strcmp(T
11ac0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
11ad0 76 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c  v[2]), "-readonl
11ae0 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
11af0 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  isReadonly = 1;.
11b00 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f      }..    if( o
11b10 62 6a 63 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e  bjc!=(5+isReadon
11b20 6c 79 29 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b  ly) && objc!=(6+
11b30 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20  isReadonly) ){. 
11b40 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
11b50 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
11b60 20 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e   objv, "?-readon
11b70 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43  ly? ?DB? TABLE C
11b80 4f 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20  OLUMN ROWID");. 
11b90 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
11ba0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
11bb0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69    if( objc==(6+i
11bc0 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20  sReadonly) ){.  
11bd0 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65      zDb = Tcl_Ge
11be0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
11bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54 61 62  ;.    }.    zTab
11c00 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
11c10 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29  ng(objv[objc-3])
11c20 3b 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20  ;.    zColumn = 
11c30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11c40 6a 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20  jv[objc-2]);.   
11c50 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64   rc = Tcl_GetWid
11c60 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
11c70 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d  rp, objv[objc-1]
11c80 2c 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69  , &iRow);..    i
11c90 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  f( rc==TCL_OK ){
11ca0 0a 20 20 20 20 20 20 72 63 20 3d 20 63 72 65 61  .      rc = crea
11cb0 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  teIncrblobChanne
11cc0 6c 28 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  l(.          int
11cd0 65 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a  erp, pDb, zDb, z
11ce0 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20  Table, zColumn, 
11cf0 69 52 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79  iRow, isReadonly
11d00 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
11d10 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
11d20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
11d30 20 20 20 20 20 24 64 62 20 69 6e 74 65 72 72 75       $db interru
11d40 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74  pt.  **.  ** Int
11d50 65 72 72 75 70 74 20 74 68 65 20 65 78 65 63 75  errupt the execu
11d60 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65  tion of the inne
11d70 72 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65 72  r-most SQL inter
11d80 70 72 65 74 65 72 2e 20 20 54 68 69 73 0a 20 20  preter.  This.  
11d90 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 53 51  ** causes the SQ
11da0 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72  L statement to r
11db0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f  eturn an error o
11dc0 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  f SQLITE_INTERRU
11dd0 50 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  PT..  */.  case 
11de0 44 42 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a  DB_INTERRUPT: {.
11df0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65      sqlite3_inte
11e00 72 72 75 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a  rrupt(pDb->db);.
11e10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
11e20 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
11e30 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52  b nullvalue ?STR
11e40 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ING?.  **.  ** C
11e50 68 61 6e 67 65 20 74 65 78 74 20 75 73 65 64 20  hange text used 
11e60 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65  when a NULL come
11e70 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
11e80 64 61 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54  database. If ?ST
11e90 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f  RING?.  ** is no
11ea0 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
11eb0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 72 69  the current stri
11ec0 6e 67 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c  ng used for NULL
11ed0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
11ee0 2a 2a 20 49 66 20 53 54 52 49 4e 47 20 69 73 20  ** If STRING is 
11ef0 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54  present, then ST
11f00 52 49 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64  RING is returned
11f10 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61  ..  **.  */.  ca
11f20 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a  se DB_NULLVALUE:
11f30 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21   {.    if( objc!
11f40 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
11f50 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
11f60 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11f70 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41  2, objv, "NULLVA
11f80 4c 55 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  LUE");.      ret
11f90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11fa0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
11fb0 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e  c==3 ){.      in
11fc0 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61  t len;.      cha
11fd0 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47  r *zNull = Tcl_G
11fe0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
11ff0 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
12000 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
12010 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
12020 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e  Tcl_Free(pDb->zN
12030 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
12040 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26      if( zNull &&
12050 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
12060 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54    pDb->zNull = T
12070 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
12080 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
12090 6e 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  ncpy(pDb->zNull,
120a0 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20   zNull, len);.  
120b0 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
120c0 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
120d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
120e0 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20     pDb->zNull = 
120f0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
12100 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
12110 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
12120 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a  TextToObj(pDb->z
12130 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62 72 65 61  Null));.    brea
12140 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
12150 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69  *     $db last_i
12160 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a  nsert_rowid .  *
12170 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e  *.  ** Return an
12180 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
12190 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20  s the ROWID for 
121a0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
121b0 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63  insert..  */.  c
121c0 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45  ase DB_LAST_INSE
121d0 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20  RT_ROWID: {.    
121e0 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
121f0 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e  ;.    Tcl_WideIn
12200 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28  t rowid;.    if(
12210 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
12220 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
12230 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
12240 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
12250 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12260 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64  .    }.    rowid
12270 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f   = sqlite3_last_
12280 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62  insert_rowid(pDb
12290 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75  ->db);.    pResu
122a0 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
122b0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
122c0 20 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49 6e     Tcl_SetWideIn
122d0 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f  tObj(pResult, ro
122e0 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  wid);.    break;
122f0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
12300 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  The DB_ONECOLUMN
12310 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65   method is imple
12320 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20  mented together 
12330 77 69 74 68 20 44 42 5f 45 58 49 53 54 53 2e 0a  with DB_EXISTS..
12340 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64    */..  /*    $d
12350 62 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41  b progress ?N CA
12360 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20  LLBACK?.  ** .  
12370 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
12380 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65  ven callback eve
12390 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63  ry N virtual mac
123a0 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69  hine opcodes whi
123b0 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a  le executing.  *
123c0 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
123d0 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45    case DB_PROGRE
123e0 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  SS: {.    if( ob
123f0 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
12400 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  f( pDb->zProgres
12410 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  s ){.        Tcl
12420 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12430 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67  terp, pDb->zProg
12440 72 65 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  ress, 0);.      
12450 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
12460 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
12470 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73   char *zProgress
12480 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
12490 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20  .      int N;.  
124a0 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d      if( TCL_OK!=
124b0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
124c0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
124d0 5d 2c 20 26 4e 29 20 29 7b 0a 20 20 20 20 20 20  ], &N) ){.      
124e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
124f0 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  OR;.      };.   
12500 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
12510 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
12520 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
12530 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20  Progress);.     
12540 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65   }.      zProgre
12550 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ss = Tcl_GetStri
12560 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
12570 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
12580 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26  if( zProgress &&
12590 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
125a0 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73    pDb->zProgress
125b0 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
125c0 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
125d0 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72   memcpy(pDb->zPr
125e0 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73  ogress, zProgres
125f0 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  s, len+1);.     
12600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12610 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
12620 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
12630 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12640 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
12650 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  K.      if( pDb-
12660 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
12670 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
12680 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
12690 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67      sqlite3_prog
126a0 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62  ress_handler(pDb
126b0 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72  ->db, N, DbProgr
126c0 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  essHandler, pDb)
126d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
126e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
126f0 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
12700 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30  pDb->db, 0, 0, 0
12710 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
12720 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
12730 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
12740 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
12750 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b  bjv, "N CALLBACK
12760 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
12770 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12780 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
12790 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72  ..  /*    $db pr
127a0 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  ofile ?CALLBACK?
127b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
127c0 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
127d0 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
127e0 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65  ACK routine afte
127f0 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
12800 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68  ment.  ** that h
12810 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78  as run.  The tex
12820 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64  t of the SQL and
12830 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65   the amount of e
12840 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20  lapse time are. 
12850 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20   ** appended to 
12860 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20  CALLBACK before 
12870 74 68 65 20 73 63 72 69 70 74 20 69 73 20 72 75  the script is ru
12880 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
12890 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20  B_PROFILE: {.   
128a0 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
128b0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
128c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
128d0 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
128e0 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
128f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12900 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
12910 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
12920 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
12930 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
12940 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12950 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  p, pDb->zProfile
12960 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
12970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
12980 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20  har *zProfile;. 
12990 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
129a0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
129b0 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
129c0 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
129d0 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20  Profile);.      
129e0 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65  }.      zProfile
129f0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
12a00 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
12a10 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
12a20 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65  ( zProfile && le
12a30 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
12a40 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54  Db->zProfile = T
12a50 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
12a60 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
12a70 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  cpy(pDb->zProfil
12a80 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e  e, zProfile, len
12a90 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
12aa0 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
12ab0 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20  Profile = 0;.   
12ac0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
12ad0 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
12ae0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
12af0 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
12b00 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
12b10 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
12b20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
12b30 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69  pDb->db, DbProfi
12b40 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  leHandler, pDb);
12b50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
12b70 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30  ofile(pDb->db, 0
12b80 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
12b90 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62  ndif.    }.    b
12ba0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
12bb0 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b    **     $db rek
12bc0 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a  ey KEY.  **.  **
12bd0 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72   Change the encr
12be0 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68  yption key on th
12bf0 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
12c00 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
12c10 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a    case DB_REKEY:
12c20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b   {.    int nKey;
12c30 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b  .    void *pKey;
12c40 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
12c50 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
12c60 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
12c70 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59  p, 2, objv, "KEY
12c80 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
12c90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12ca0 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c  }.    pKey = Tcl
12cb0 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
12cc0 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e  mObj(objv[2], &n
12cd0 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Key);.#ifdef SQL
12ce0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
12cf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
12d00 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b  ekey(pDb->db, pK
12d10 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69  ey, nKey);.    i
12d20 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
12d30 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12d40 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
12d50 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20  rrStr(rc), 0);. 
12d60 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
12d70 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ROR;.    }.#endi
12d80 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
12d90 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 72 65  ..  /*    $db re
12da0 73 74 6f 72 65 20 3f 44 41 54 41 42 41 53 45 3f  store ?DATABASE?
12db0 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20   FILENAME.  **. 
12dc0 20 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62   ** Open a datab
12dd0 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 46  ase file named F
12de0 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66  ILENAME.  Transf
12df0 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 0a  er the content .
12e00 20 20 2a 2a 20 6f 66 20 46 49 4c 45 4e 41 4d 45    ** of FILENAME
12e10 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
12e20 64 61 74 61 62 61 73 65 20 44 41 54 41 42 41 53  database DATABAS
12e30 45 20 28 64 65 66 61 75 6c 74 3a 20 22 6d 61 69  E (default: "mai
12e40 6e 22 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  n")..  */.  case
12e50 20 44 42 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20   DB_RESTORE: {. 
12e60 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
12e70 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e  SrcFile;.    con
12e80 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 44 62  st char *zDestDb
12e90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  ;.    sqlite3 *p
12ea0 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Src;.    sqlite3
12eb0 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
12ec0 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f  ;.    int nTimeo
12ed0 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ut = 0;..    if(
12ee0 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
12ef0 20 20 7a 44 65 73 74 44 62 20 3d 20 22 6d 61 69    zDestDb = "mai
12f00 6e 22 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69  n";.      zSrcFi
12f10 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
12f20 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
12f30 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
12f40 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 44 65 73  =4 ){.      zDes
12f50 74 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  tDb = Tcl_GetStr
12f60 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
12f70 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 54      zSrcFile = T
12f80 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
12f90 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[3]);.    }else
12fa0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
12fb0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
12fc0 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41   2, objv, "?DATA
12fd0 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29  BASE? FILENAME")
12fe0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
12ff0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13000 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13010 5f 6f 70 65 6e 5f 76 32 28 7a 53 72 63 46 69 6c  _open_v2(zSrcFil
13020 65 2c 20 26 70 53 72 63 2c 20 53 51 4c 49 54 45  e, &pSrc, SQLITE
13030 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20  _OPEN_READONLY, 
13040 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
13050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13060 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13070 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e  ult(interp, "can
13080 6e 6f 74 20 6f 70 65 6e 20 73 6f 75 72 63 65 20  not open source 
13090 64 61 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20  database: ",.   
130a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
130b0 65 72 72 6d 73 67 28 70 53 72 63 29 2c 20 28 63  errmsg(pSrc), (c
130c0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73  har*)0);.      s
130d0 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72  qlite3_close(pSr
130e0 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
130f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13100 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20  }.    pBackup = 
13110 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69  sqlite3_backup_i
13120 6e 69 74 28 70 44 62 2d 3e 64 62 2c 20 7a 44 65  nit(pDb->db, zDe
13130 73 74 44 62 2c 20 70 53 72 63 2c 20 22 6d 61 69  stDb, pSrc, "mai
13140 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61  n");.    if( pBa
13150 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ckup==0 ){.     
13160 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13170 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f  t(interp, "resto
13180 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20  re failed: ",.  
13190 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
131a0 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
131b0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
131c0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
131d0 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65  (pSrc);.      re
131e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
131f0 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
13200 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62   (rc = sqlite3_b
13210 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b  ackup_step(pBack
13220 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45  up,100))==SQLITE
13230 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _OK.            
13240 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f    || rc==SQLITE_
13250 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 69 66  BUSY ){.      if
13260 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
13270 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  Y ){.        if(
13280 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33   nTimeout++ >= 3
13290 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
132a0 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28    sqlite3_sleep(
132b0 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  100);.      }.  
132c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
132d0 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42  backup_finish(pB
132e0 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20  ackup);.    if( 
132f0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
13300 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  ){.      rc = TC
13310 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  L_OK;.    }else 
13320 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
13330 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  USY || rc==SQLIT
13340 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  E_LOCKED ){.    
13350 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13360 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74  lt(interp, "rest
13370 6f 72 65 20 66 61 69 6c 65 64 3a 20 73 6f 75 72  ore failed: sour
13380 63 65 20 64 61 74 61 62 61 73 65 20 62 75 73 79  ce database busy
13390 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
133a0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
133b0 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  )0);.      rc = 
133c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
133d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
133e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
133f0 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61  erp, "restore fa
13400 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20  iled: ",.       
13410 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
13420 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68  sg(pDb->db), (ch
13430 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63  ar*)0);.      rc
13440 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
13450 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
13460 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
13470 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
13480 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 73  *.  **     $db s
13490 74 61 74 75 73 20 28 73 74 65 70 7c 73 6f 72 74  tatus (step|sort
134a0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70  ).  **.  ** Disp
134b0 6c 61 79 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  lay SQLITE_STMTS
134c0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
134d0 54 45 50 20 6f 72 20 0a 20 20 2a 2a 20 53 51 4c  TEP or .  ** SQL
134e0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53  ITE_STMTSTATUS_S
134f0 4f 52 54 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  ORT for the most
13500 20 72 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20   recent eval..  
13510 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 53 54 41  */.  case DB_STA
13520 54 55 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76  TUS: {.    int v
13530 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
13540 20 2a 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f   *zOp;.    if( o
13550 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
13560 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
13570 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
13580 2c 20 22 28 73 74 65 70 7c 73 6f 72 74 29 22 29  , "(step|sort)")
13590 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
135a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
135b0 20 20 20 20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65      zOp = Tcl_Ge
135c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
135d0 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
135e0 28 7a 4f 70 2c 20 22 73 74 65 70 22 29 3d 3d 30  (zOp, "step")==0
135f0 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44   ){.      v = pD
13600 62 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d 65  b->nStep;.    }e
13610 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
13620 4f 70 2c 20 22 73 6f 72 74 22 29 3d 3d 30 20 29  Op, "sort")==0 )
13630 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d  {.      v = pDb-
13640 3e 6e 53 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73  >nSort;.    }els
13650 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  e{.      Tcl_App
13660 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13670 2c 20 22 62 61 64 20 61 72 67 75 6d 65 6e 74 3a  , "bad argument:
13680 20 73 68 6f 75 6c 64 20 62 65 20 73 74 65 70 20   should be step 
13690 6f 72 20 73 6f 72 74 22 2c 20 0a 20 20 20 20 20  or sort", .     
136a0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
136b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
136c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
136d0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
136e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
136f0 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a  _NewIntObj(v));.
13700 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
13710 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20   .  /*.  **     
13720 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c  $db timeout MILL
13730 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20  ESECONDS.  **.  
13740 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65  ** Delay for the
13750 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
13760 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65  seconds specifie
13770 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73  d when a file is
13780 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20   locked..  */.  
13790 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a  case DB_TIMEOUT:
137a0 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20   {.    int ms;. 
137b0 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
137c0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
137d0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
137e0 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49   2, objv, "MILLI
137f0 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20  SECONDS");.     
13800 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13810 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
13820 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
13830 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
13840 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72  2], &ms) ) retur
13850 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13860 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
13870 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d  meout(pDb->db, m
13880 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  s);.    break;. 
13890 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20   }.  .  /*.  ** 
138a0 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68      $db total_ch
138b0 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  anges.  **.  ** 
138c0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
138d0 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
138e0 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e  ere modified, in
138f0 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74  serted, or delet
13900 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
13910 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
13920 6c 65 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  le was created..
13930 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
13940 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a  OTAL_CHANGES: {.
13950 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
13960 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  sult;.    if( ob
13970 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
13980 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
13990 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
139a0 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
139b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
139c0 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20    }.    pResult 
139d0 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
139e0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
139f0 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
13a00 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74  esult, sqlite3_t
13a10 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62  otal_changes(pDb
13a20 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61  ->db));.    brea
13a30 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
13a40 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42  $db trace ?CALLB
13a50 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ACK?.  **.  ** M
13a60 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73  ake arrangements
13a70 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43   to invoke the C
13a80 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20  ALLBACK routine 
13a90 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73 74 61  for each SQL sta
13aa0 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74  tement.  ** that
13ab0 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54   is executed.  T
13ac0 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53  he text of the S
13ad0 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  QL is appended t
13ae0 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72  o CALLBACK befor
13af0 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65  e.  ** it is exe
13b00 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  cuted..  */.  ca
13b10 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20  se DB_TRACE: {. 
13b20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
13b30 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
13b40 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
13b50 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
13b60 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
13b70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13b80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
13b90 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
13ba0 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
13bb0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
13bc0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13bd0 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20  p, pDb->zTrace, 
13be0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
13c00 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20  r *zTrace;.     
13c10 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
13c20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
13c30 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
13c40 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29  ree(pDb->zTrace)
13c50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13c60 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74  zTrace = Tcl_Get
13c70 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
13c80 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
13c90 20 20 20 20 69 66 28 20 7a 54 72 61 63 65 20 26      if( zTrace &
13ca0 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
13cb0 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d     pDb->zTrace =
13cc0 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
13cd0 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
13ce0 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63  emcpy(pDb->zTrac
13cf0 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31  e, zTrace, len+1
13d00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
13d10 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72          pDb->zTr
13d20 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ace = 0;.      }
13d30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13d40 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20  OMIT_TRACE.     
13d50 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
13d60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
13d70 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
13d80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13d90 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
13da0 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c   DbTraceHandler,
13db0 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
13dc0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
13dd0 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
13de0 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
13df0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
13e00 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
13e10 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73   /*    $db trans
13e20 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65  action [-deferre
13e30 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78  d|-immediate|-ex
13e40 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a  clusive] SCRIPT.
13e50 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20    **.  ** Start 
13e60 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
13e70 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74  n (if we are not
13e80 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
13e90 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20  midst of a.  ** 
13ea0 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64  transaction) and
13eb0 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43 4c   execute the TCL
13ec0 20 73 63 72 69 70 74 20 53 43 52 49 50 54 2e 20   script SCRIPT. 
13ed0 20 41 66 74 65 72 20 53 43 52 49 50 54 0a 20 20   After SCRIPT.  
13ee0 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69  ** completes, ei
13ef0 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20  ther commit the 
13f00 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72  transaction or r
13f10 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53  oll it back if S
13f20 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77  CRIPT.  ** throw
13f30 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  s an exception. 
13f40 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72   Or if no new tr
13f50 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61  ansation was sta
13f60 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  rted, do nothing
13f70 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20  ..  ** pass the 
13f80 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20  exception on up 
13f90 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
13fa0 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
13fb0 64 20 77 61 73 20 69 6e 73 70 69 72 65 64 20 62  d was inspired b
13fc0 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20  y Dave Thomas's 
13fd0 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20  talk on Ruby at 
13fe0 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27  the.  ** 2005 O'
13ff0 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72  Reilly Open Sour
14000 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f  ce Convention (O
14010 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  SCON)..  */.  ca
14020 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f  se DB_TRANSACTIO
14030 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  N: {.    Tcl_Obj
14040 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63   *pScript;.    c
14050 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69  onst char *zBegi
14060 6e 20 3d 20 22 53 41 56 45 50 4f 49 4e 54 20 5f  n = "SAVEPOINT _
14070 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  tcl_transaction"
14080 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
14090 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a  3 && objc!=4 ){.
140a0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
140b0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
140c0 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20  , objv, "[TYPE] 
140d0 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
140e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
140f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
14100 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pDb->nTransacti
14110 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d 3d 34  on==0 && objc==4
14120 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63   ){.      static
14130 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59   const char *TTY
14140 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20  PE_strs[] = {.  
14150 20 20 20 20 20 20 22 64 65 66 65 72 72 65 64 22        "deferred"
14160 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65 22 2c  ,   "exclusive",
14170 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c 20 30    "immediate", 0
14180 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
14190 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20  enum TTYPE_enum 
141a0 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50 45 5f  {.        TTYPE_
141b0 44 45 46 45 52 52 45 44 2c 20 54 54 59 50 45 5f  DEFERRED, TTYPE_
141c0 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59 50 45  EXCLUSIVE, TTYPE
141d0 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 20  _IMMEDIATE.     
141e0 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 74   };.      int tt
141f0 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 54  ype;.      if( T
14200 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
14210 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
14220 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20  2], TTYPE_strs, 
14230 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79 70  "transaction typ
14240 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14260 20 20 30 2c 20 26 74 74 79 70 65 29 20 29 7b 0a    0, &ttype) ){.
14270 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
14280 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
14290 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  }.      switch( 
142a0 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d  (enum TTYPE_enum
142b0 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  )ttype ){.      
142c0 20 20 63 61 73 65 20 54 54 59 50 45 5f 44 45 46    case TTYPE_DEF
142d0 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d  ERRED:    /* no-
142e0 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20 20 20  op */;          
142f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14300 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
14310 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20 7a 42  _EXCLUSIVE:   zB
14320 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 45 58  egin = "BEGIN EX
14330 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65 61 6b  CLUSIVE";  break
14340 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
14350 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20  TYPE_IMMEDIATE: 
14360 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
14370 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20 20 62  N IMMEDIATE";  b
14380 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
14390 20 20 7d 0a 20 20 20 20 70 53 63 72 69 70 74 20    }.    pScript 
143a0 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
143b0 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20  .    /* Run the 
143c0 53 51 4c 69 74 65 20 42 45 47 49 4e 20 63 6f 6d  SQLite BEGIN com
143d0 6d 61 6e 64 20 74 6f 20 6f 70 65 6e 20 61 20 74  mand to open a t
143e0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61  ransaction or sa
143f0 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20  vepoint. */.    
14400 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68  pDb->disableAuth
14410 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ++;.    rc = sql
14420 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
14430 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c  b, zBegin, 0, 0,
14440 20 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e 64 69   0);.    pDb->di
14450 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20 20  sableAuth--;.   
14460 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14470 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
14480 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
14490 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
144a0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
144b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
144c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
144d0 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61      pDb->nTransa
144e0 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  ction++;..    /*
144f0 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73   If using NRE, s
14500 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c 62 61  chedule a callba
14510 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ck to invoke the
14520 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74 2c   script pScript,
14530 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 20 73   then.    ** a s
14540 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b 20 74  econd callback t
14550 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c  o commit (or rol
14560 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61 6e 73  lback) the trans
14570 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f  action or savepo
14580 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65  int.    ** opene
14590 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f 74 20  d above. If not 
145a0 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75  using NRE, evalu
145b0 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20 64  ate the script d
145c0 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a 20 20  irectly, then.  
145d0 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63 74 69    ** call functi
145e0 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d  on DbTransPostCm
145f0 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f  d() to commit (o
14600 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20  r rollback) the 
14610 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
14620 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
14630 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44 62  .  */.    if( Db
14640 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20  UseNre() ){.    
14650 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62    Tcl_NRAddCallb
14660 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 54 72  ack(interp, DbTr
14670 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c 20  ansPostCmd, cd, 
14680 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
14690 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e  Tcl_NREvalObj(in
146a0 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
146b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
146c0 20 20 20 20 72 63 20 3d 20 44 62 54 72 61 6e 73      rc = DbTrans
146d0 50 6f 73 74 43 6d 64 28 26 63 64 2c 20 69 6e 74  PostCmd(&cd, int
146e0 65 72 70 2c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  erp, Tcl_EvalObj
146f0 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
14700 70 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  pt, 0));.    }. 
14710 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
14720 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
14730 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 3f 73  unlock_notify ?s
14740 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61  cript?.  */.  ca
14750 73 65 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  se DB_UNLOCK_NOT
14760 49 46 59 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  IFY: {.#ifndef S
14770 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
14780 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 54  OCK_NOTIFY.    T
14790 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
147a0 69 6e 74 65 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f  interp, "unlock_
147b0 6e 6f 74 69 66 79 20 6e 6f 74 20 61 76 61 69 6c  notify not avail
147c0 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
147d0 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  ld", 0);.    rc 
147e0 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  = TCL_ERROR;.#el
147f0 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  se.    if( objc!
14800 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
14810 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
14820 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
14830 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50  2, objv, "?SCRIP
14840 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  T?");.      rc =
14850 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 6f 69  }else{.      voi
14870 64 20 28 2a 78 4e 6f 74 69 66 79 29 28 76 6f 69  d (*xNotify)(voi
14880 64 20 2a 2a 2c 20 69 6e 74 29 20 3d 20 30 3b 0a  d **, int) = 0;.
14890 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4e 6f 74        void *pNot
148a0 69 66 79 41 72 67 20 3d 20 30 3b 0a 0a 20 20 20  ifyArg = 0;..   
148b0 20 20 20 69 66 28 20 70 44 62 2d 3e 70 55 6e 6c     if( pDb->pUnl
148c0 6f 63 6b 4e 6f 74 69 66 79 20 29 7b 0a 20 20 20  ockNotify ){.   
148d0 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
148e0 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f  Count(pDb->pUnlo
148f0 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20  ckNotify);.     
14900 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e     pDb->pUnlockN
14910 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 20 20 20  otify = 0;.     
14920 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
14930 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
14940 20 20 20 78 4e 6f 74 69 66 79 20 3d 20 44 62 55     xNotify = DbU
14950 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20 20 20  nlockNotify;.   
14960 20 20 20 20 20 70 4e 6f 74 69 66 79 41 72 67 20       pNotifyArg 
14970 3d 20 28 76 6f 69 64 20 2a 29 70 44 62 3b 0a 20  = (void *)pDb;. 
14980 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c         pDb->pUnl
14990 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 6f 62 6a 76  ockNotify = objv
149a0 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  [2];.        Tcl
149b0 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _IncrRefCount(pD
149c0 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
149d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  );.      }.  .  
149e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
149f0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 70 44  unlock_notify(pD
14a00 62 2d 3e 64 62 2c 20 78 4e 6f 74 69 66 79 2c 20  b->db, xNotify, 
14a10 70 4e 6f 74 69 66 79 41 72 67 29 20 29 7b 0a 20  pNotifyArg) ){. 
14a20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
14a30 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14a40 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
14a50 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
14a60 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
14a70 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
14a80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
14a90 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
14aa0 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61 74   **    $db updat
14ab0 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a  e_hook ?script?.
14ac0 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c    **    $db roll
14ad0 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70  back_hook ?scrip
14ae0 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
14af0 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a  B_UPDATE_HOOK: .
14b00 20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41    case DB_ROLLBA
14b10 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20  CK_HOOK: {..    
14b20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f  /* set ppHook to
14b30 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74   point at pUpdat
14b40 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61  eHook or pRollba
14b50 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e  ckHook, dependin
14b60 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65  g on .    ** whe
14b70 74 68 65 72 20 5b 24 64 62 20 75 70 64 61 74 65  ther [$db update
14b80 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72  _hook] or [$db r
14b90 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61  ollback_hook] wa
14ba0 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a  s invoked..    *
14bb0 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  /.    Tcl_Obj **
14bc0 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28  ppHook; .    if(
14bd0 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41   choice==DB_UPDA
14be0 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20  TE_HOOK ){.     
14bf0 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
14c00 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20  pUpdateHook;.   
14c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
14c20 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f  Hook = &pDb->pRo
14c30 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20  llbackHook;.    
14c40 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  }..    if( objc!
14c50 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
14c60 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  .       Tcl_Wron
14c70 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
14c80 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49   2, objv, "?SCRI
14c90 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72 65  PT?");.       re
14ca0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14cb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 70      }.    if( *p
14cc0 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 54  pHook ){.      T
14cd0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
14ce0 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29  interp, *ppHook)
14cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ;.      if( objc
14d00 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ==3 ){.        T
14d10 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
14d20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20  *ppHook);.      
14d30 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20    *ppHook = 0;. 
14d40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14d50 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
14d60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
14d70 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20  *ppHook) );.    
14d80 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43 68 61    if( Tcl_GetCha
14d90 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d 29  rLength(objv[2])
14da0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  >0 ){.        *p
14db0 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b  pHook = objv[2];
14dc0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
14dd0 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f  rRefCount(*ppHoo
14de0 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
14df0 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75  }..    sqlite3_u
14e00 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e  pdate_hook(pDb->
14e10 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74  db, (pDb->pUpdat
14e20 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61  eHook?DbUpdateHa
14e30 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a  ndler:0), pDb);.
14e40 20 20 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c      sqlite3_roll
14e50 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  back_hook(pDb->d
14e60 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  b,(pDb->pRollbac
14e70 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b  kHook?DbRollback
14e80 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29 3b  Handler:0),pDb);
14e90 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ..    break;.  }
14ea0 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65  ..  /*    $db ve
14eb0 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rsion.  **.  ** 
14ec0 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69  Return the versi
14ed0 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  on string for th
14ee0 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  is database..  *
14ef0 2f 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52 53  /.  case DB_VERS
14f00 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ION: {.    Tcl_S
14f10 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
14f20 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
14f30 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54  _libversion(), T
14f40 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
14f50 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d  break;.  }...  }
14f60 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53   /* End of the S
14f70 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20  WITCH statement 
14f80 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
14f90 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 43  }..#if SQLITE_TC
14fa0 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a 20 41 64 61 70  L_NRE./*.** Adap
14fb0 74 6f 72 20 74 68 61 74 20 70 72 6f 76 69 64 65  tor that provide
14fc0 73 20 61 6e 20 6f 62 6a 43 6d 64 20 69 6e 74 65  s an objCmd inte
14fd0 72 66 61 63 65 20 74 6f 20 74 68 65 20 4e 52 45  rface to the NRE
14fe0 2d 65 6e 61 62 6c 65 64 0a 2a 2a 20 69 6e 74 65  -enabled.** inte
14ff0 72 66 61 63 65 20 69 6d 70 6c 65 6d 65 6e 74 61  rface implementa
15000 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
15010 69 6e 74 20 44 62 4f 62 6a 43 6d 64 41 64 61 70  int DbObjCmdAdap
15020 74 6f 72 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c  tor(.  void *cd,
15030 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
15040 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
15050 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  c,.  Tcl_Obj *co
15060 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 72 65  nst*objv.){.  re
15070 74 75 72 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c 4f  turn Tcl_NRCallO
15080 62 6a 50 72 6f 63 28 69 6e 74 65 72 70 2c 20 44  bjProc(interp, D
15090 62 4f 62 6a 43 6d 64 2c 20 63 64 2c 20 6f 62 6a  bObjCmd, cd, obj
150a0 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 23 65 6e 64  c, objv);.}.#end
150b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 43 4c  if /* SQLITE_TCL
150c0 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20  _NRE */../*.**  
150d0 20 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45 20   sqlite3 DBNAME 
150e0 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56  FILENAME ?-vfs V
150f0 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b 45  FSNAME? ?-key KE
15100 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f  Y? ?-readonly BO
15110 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20 20 20 20 20  OLEAN?.**       
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15130 20 20 20 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f      ?-create BOO
15140 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74 65 78 20  LEAN? ?-nomutex 
15150 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54  BOOLEAN?.**.** T
15160 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
15170 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68  Tcl command.  Wh
15180 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22 20  en the "sqlite" 
15190 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  Tcl command is.*
151a0 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20  * invoked, this 
151b0 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20  routine runs to 
151c0 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d  process that com
151d0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mand..**.** The 
151e0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20  first argument, 
151f0 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72  DBNAME, is an ar
15200 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72  bitrary name for
15210 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61   a new.** databa
15220 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  se connection.  
15230 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65  This command cre
15240 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61  ates a new comma
15250 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41  nd named.** DBNA
15260 4d 45 20 74 68 61 74 20 69 73 20 75 73 65 64 20  ME that is used 
15270 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20  to control that 
15280 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65  connection.  The
15290 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
152a0 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74  nection is delet
152b0 65 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41  ed when the DBNA
152c0 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65  ME command is de
152d0 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
152e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
152f0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
15300 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15310 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  e..**.*/.static 
15320 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64 20  int DbMain(void 
15330 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  *cd, Tcl_Interp 
15340 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
15350 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  c,Tcl_Obj *const
15360 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65  *objv){.  Sqlite
15370 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a 70  Db *p;.  void *p
15380 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Key = 0;.  int n
15390 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  Key = 0;.  const
153a0 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63   char *zArg;.  c
153b0 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20  har *zErrMsg;.  
153c0 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63  int i;.  const c
153d0 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 6f  har *zFile;.  co
153e0 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
153f0 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   0;.  int flags;
15400 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74  .  Tcl_DString t
15410 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d  ranslatedFilenam
15420 65 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d  e;..  /* In norm
15430 61 6c 20 75 73 65 2c 20 65 61 63 68 20 54 43 4c  al use, each TCL
15440 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 75 6e   interpreter run
15450 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 74 68  s in a single th
15460 72 65 61 64 2e 20 20 53 6f 0a 20 20 2a 2a 20 62  read.  So.  ** b
15470 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 63 61  y default, we ca
15480 6e 20 74 75 72 6e 20 6f 66 20 6d 75 74 65 78 69  n turn of mutexi
15490 6e 67 20 6f 6e 20 53 51 4c 69 74 65 20 64 61 74  ng on SQLite dat
154a0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
154b0 73 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c  s..  ** However,
154c0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
154d0 70 6f 73 65 73 20 69 74 20 69 73 20 75 73 65 66  poses it is usef
154e0 75 6c 20 74 6f 20 68 61 76 65 20 6d 75 74 65 78  ul to have mutex
154f0 65 73 20 74 75 72 6e 65 64 0a 20 20 2a 2a 20 6f  es turned.  ** o
15500 6e 2e 20 20 53 6f 2c 20 62 79 20 64 65 66 61 75  n.  So, by defau
15510 6c 74 2c 20 6d 75 74 65 78 65 73 20 64 65 66 61  lt, mutexes defa
15520 75 6c 74 20 6f 66 66 2e 20 20 42 75 74 20 69 66  ult off.  But if
15530 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20   compiled with. 
15540 20 2a 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44   ** SQLITE_TCL_D
15550 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58  EFAULT_FULLMUTEX
15560 20 74 68 65 6e 20 6d 75 74 65 78 65 73 20 64 65   then mutexes de
15570 66 61 75 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23  fault on..  */.#
15580 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 43 4c  ifdef SQLITE_TCL
15590 5f 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54  _DEFAULT_FULLMUT
155a0 45 58 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c  EX.  flags = SQL
155b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
155c0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
155d0 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45  _CREATE | SQLITE
155e0 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b  _OPEN_FULLMUTEX;
155f0 0a 23 65 6c 73 65 0a 20 20 66 6c 61 67 73 20 3d  .#else.  flags =
15600 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
15610 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
15620 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51  OPEN_CREATE | SQ
15630 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
15640 58 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  X;.#endif..  if(
15650 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
15660 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
15670 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
15680 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  [1], 0);.    if(
15690 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76   strcmp(zArg,"-v
156a0 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20  ersion")==0 ){. 
156b0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
156c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c  esult(interp,sql
156d0 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b  ite3_version,0);
156e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
156f0 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
15700 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
15710 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30  "-has-codec")==0
15720 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
15730 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
15740 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
15750 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29  lt(interp,"1",0)
15760 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63  ;.#else.      Tc
15770 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
15780 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65  nterp,"0",0);.#e
15790 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
157a0 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
157b0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69    }.  for(i=3; i
157c0 2b 31 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a  +1<objc; i+=2){.
157d0 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47      zArg = Tcl_G
157e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d  etString(objv[i]
157f0 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
15800 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d  p(zArg,"-key")==
15810 30 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 20  0 ){.      pKey 
15820 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
15830 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69  ayFromObj(objv[i
15840 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20  +1], &nKey);.   
15850 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
15860 70 28 7a 41 72 67 2c 20 22 2d 76 66 73 22 29 3d  p(zArg, "-vfs")=
15870 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  =0 ){.      i++;
15880 0a 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63  .      zVfs = Tc
15890 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
158a0 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [i]);.    }else 
158b0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
158c0 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30   "-readonly")==0
158d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
158e0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
158f0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
15900 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b  (interp, objv[i+
15910 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  1], &b) ) return
15920 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15930 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20    if( b ){.     
15940 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
15950 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
15960 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
15970 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20  CREATE);.       
15980 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
15990 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
159a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
159b0 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
159c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
159d0 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  NLY;.        fla
159e0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
159f0 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
15a00 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
15a10 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
15a20 22 2d 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b  "-create")==0 ){
15a30 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
15a40 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
15a50 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
15a60 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
15a70 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
15a80 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
15a90 66 28 20 62 20 26 26 20 28 66 6c 61 67 73 20 26  f( b && (flags &
15aa0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
15ab0 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  DONLY)==0 ){.   
15ac0 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
15ad0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
15ae0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15af0 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
15b00 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  ~SQLITE_OPEN_CRE
15b10 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ATE;.      }.   
15b20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
15b30 70 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65  p(zArg, "-nomute
15b40 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
15b50 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
15b60 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
15b70 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
15b80 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
15b90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15ba0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
15bb0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
15bc0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  = SQLITE_OPEN_NO
15bd0 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66  MUTEX;.        f
15be0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
15bf0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a  OPEN_FULLMUTEX;.
15c00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15c10 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
15c20 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
15c30 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 7d  EX;.      }.   }
15c40 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
15c50 7a 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65  zArg, "-fullmute
15c60 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
15c70 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
15c80 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
15c90 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
15ca0 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
15cb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15cc0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
15cd0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
15ce0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  = SQLITE_OPEN_FU
15cf0 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20  LLMUTEX;.       
15d00 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
15d10 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a  E_OPEN_NOMUTEX;.
15d20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15d30 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
15d40 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
15d50 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTEX;.      }.  
15d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
15d70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15d80 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e  interp, "unknown
15d90 20 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67   option: ", zArg
15da0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
15db0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15dc0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
15dd0 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28   if( objc<3 || (
15de0 6f 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20 20  objc&1)!=1 ){.  
15df0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
15e00 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
15e10 6a 76 2c 20 0a 20 20 20 20 20 20 22 48 41 4e 44  jv, .      "HAND
15e20 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66  LE FILENAME ?-vf
15e30 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61  s VFSNAME? ?-rea
15e40 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f  donly BOOLEAN? ?
15e50 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f  -create BOOLEAN?
15e60 22 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75  ".      " ?-nomu
15e70 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66  tex BOOLEAN? ?-f
15e80 75 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  ullmutex BOOLEAN
15e90 3f 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ?".#ifdef SQLITE
15ea0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20  _HAS_CODEC.     
15eb0 20 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45   " ?-key CODECKE
15ec0 59 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  Y?".#endif.    )
15ed0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
15ee0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45  _ERROR;.  }.  zE
15ef0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d  rrMsg = 0;.  p =
15f00 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f   (SqliteDb*)Tcl_
15f10 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
15f20 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
15f30 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
15f40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61  sult(interp, "ma
15f50 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43  lloc failed", TC
15f60 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
15f70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15f80 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c  .  }.  memset(p,
15f90 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
15fa0 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47  .  zFile = Tcl_G
15fb0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
15fc0 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a  objv[2], 0);.  z
15fd0 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73  File = Tcl_Trans
15fe0 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74  lateFileName(int
15ff0 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61  erp, zFile, &tra
16000 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29  nslatedFilename)
16010 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ;.  sqlite3_open
16020 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64  _v2(zFile, &p->d
16030 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b  b, flags, zVfs);
16040 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
16050 65 65 28 26 74 72 61 6e 73 6c 61 74 65 64 46 69  ee(&translatedFi
16060 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 53  lename);.  if( S
16070 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
16080 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  3_errcode(p->db)
16090 20 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20   ){.    zErrMsg 
160a0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
160b0 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
160c0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
160d0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
160e0 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d  e(p->db);.    p-
160f0 3e 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66  >db = 0;.  }.#if
16100 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16110 4f 44 45 43 0a 20 20 69 66 28 20 70 2d 3e 64 62  ODEC.  if( p->db
16120 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
16130 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c  key(p->db, pKey,
16140 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64   nKey);.  }.#end
16150 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  if.  if( p->db==
16160 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
16170 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
16180 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41  ErrMsg, TCL_VOLA
16190 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46  TILE);.    Tcl_F
161a0 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20  ree((char*)p);. 
161b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
161c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65  zErrMsg);.    re
161d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
161e0 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74    }.  p->maxStmt
161f0 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f   = NUM_PREPARED_
16200 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e 74 65  STMTS;.  p->inte
16210 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a  rp = interp;.  z
16220 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
16230 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
16240 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 44 62  1], 0);.  if( Db
16250 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20  UseNre() ){.    
16260 54 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d  Tcl_NRCreateComm
16270 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67  and(interp, zArg
16280 2c 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f  , DbObjCmdAdapto
16290 72 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20 20 20  r, DbObjCmd,.   
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162b0 20 20 20 20 20 28 63 68 61 72 2a 29 70 2c 20 44       (char*)p, D
162c0 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d  bDeleteCmd);.  }
162d0 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 43 72  else{.    Tcl_Cr
162e0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
162f0 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f  nterp, zArg, DbO
16300 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c  bjCmd, (char*)p,
16310 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20   DbDeleteCmd);. 
16320 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
16330 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  OK;.}../*.** Pro
16340 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c  vide a dummy Tcl
16350 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65  _InitStubs if we
16360 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
16370 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c  as a static.** l
16380 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  ibrary..*/.#ifnd
16390 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
163a0 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e  .# undef  Tcl_In
163b0 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65  itStubs.# define
163c0 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61   Tcl_InitStubs(a
163d0 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
163e0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
163f0 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f   have a PACKAGE_
16400 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65  VERSION macro de
16410 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c  fined.  This wil
16420 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20  l be.** defined 
16430 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
16440 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c   the TEA makefil
16450 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61  e.  But other ma
16460 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f  kefiles.** do no
16470 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a  t define it..*/.
16480 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f  #ifndef PACKAGE_
16490 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65  VERSION.# define
164a0 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
164b0 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a   SQLITE_VERSION.
164c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
164d0 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
164e0 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dule..**.** This
164f0 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74   Tcl module cont
16500 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  ains only a sing
16510 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61  le new Tcl comma
16520 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65  nd named "sqlite
16530 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65  "..** (Hence the
16540 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61  re is no namespa
16550 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ce.  There is no
16560 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20   point in using 
16570 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  a namespace.** i
16580 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  f the extension 
16590 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e  only supplies on
165a0 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68  e new name!)  Th
165b0 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61  e "sqlite" comma
165c0 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  nd is.** used to
165d0 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69   open a new SQLi
165e0 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65  te database.  Se
165f0 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72  e the DbMain() r
16600 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20  outine above.** 
16610 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
16620 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 45  nformation..*/.E
16630 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
16640 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
16650 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63  p *interp){.  Tc
16660 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65  l_InitStubs(inte
16670 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20  rp, "8.4", 0);. 
16680 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
16690 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
166a0 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62  qlite3", (Tcl_Ob
166b0 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e  jCmdProc*)DbMain
166c0 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50  , 0, 0);.  Tcl_P
166d0 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
166e0 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43  , "sqlite3", PAC
166f0 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  KAGE_VERSION);. 
16700 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
16710 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
16720 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a  qlite", (Tcl_Obj
16730 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
16740 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b   0, 0);.  Tcl_Pk
16750 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
16760 20 22 73 71 6c 69 74 65 22 2c 20 50 41 43 4b 41   "sqlite", PACKA
16770 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 72  GE_VERSION);.  r
16780 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
16790 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
167a0 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49  lite3_Init(Tcl_I
167b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
167c0 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
167d0 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45  nit(interp); }.E
167e0 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
167f0 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  3_SafeInit(Tcl_I
16800 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
16810 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
16820 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
16830 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28  qlite3_SafeInit(
16840 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
16850 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
16860 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
16870 20 53 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28   Sqlite3_Unload(
16880 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
16890 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
168a0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
168b0 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
168c0 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63  qlite3_Unload(Tc
168d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
168e0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
168f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
16900 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
16910 33 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c  3_SafeUnload(Tcl
16920 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16930 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
16940 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58  urn TCL_OK; }.EX
16950 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
16960 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54  te3_SafeUnload(T
16970 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
16980 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
16990 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 7d 0a 0a  eturn TCL_OK;}..
169a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
169b0 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 45 58  3_SUFFIX_ONLY.EX
169c0 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f  TERN int Sqlite_
169d0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
169e0 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
169f0 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
16a00 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20  terp); }.EXTERN 
16a10 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e  int Tclsqlite_In
16a20 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
16a30 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
16a40 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
16a50 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  rp); }.EXTERN in
16a60 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49 6e 69  t Sqlite_SafeIni
16a70 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
16a80 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
16a90 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
16aa0 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53 61 66  nt Tclsqlite_Saf
16ab0 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
16ac0 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
16ad0 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45  n TCL_OK; }.EXTE
16ae0 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 55 6e  RN int Sqlite_Un
16af0 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
16b00 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
16b10 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
16b20 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
16b30 20 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61   Tclsqlite_Unloa
16b40 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
16b50 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
16b60 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
16b70 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71   }.EXTERN int Sq
16b80 6c 69 74 65 5f 53 61 66 65 55 6e 6c 6f 61 64 28  lite_SafeUnload(
16b90 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
16ba0 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
16bb0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
16bc0 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
16bd0 71 6c 69 74 65 5f 53 61 66 65 55 6e 6c 6f 61 64  qlite_SafeUnload
16be0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
16bf0 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
16c00 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 7d   return TCL_OK;}
16c10 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
16c20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  TCLSH./*********
16c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c70 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ****.** All of t
16c80 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c  he code that fol
16c90 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f 20  lows is used to 
16ca0 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65  build standalone
16cb0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
16cc0 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74  s.** that are st
16cd0 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20  atically linked 
16ce0 77 69 74 68 20 53 51 4c 69 74 65 2e 20 20 45 6e  with SQLite.  En
16cf0 61 62 6c 65 20 74 68 65 73 65 20 62 79 20 63 6f  able these by co
16d00 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20  mpiling.** with 
16d10 2d 44 54 43 4c 53 48 3d 6e 20 77 68 65 72 65 20  -DTCLSH=n where 
16d20 6e 20 63 61 6e 20 62 65 20 31 20 6f 72 20 32 2e  n can be 1 or 2.
16d30 20 20 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e 65    An n of 1 gene
16d40 72 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  rates a standard
16d50 0a 2a 2a 20 74 63 6c 73 68 20 62 75 74 20 77 69  .** tclsh but wi
16d60 74 68 20 53 51 4c 69 74 65 20 62 75 69 6c 74 20  th SQLite built 
16d70 69 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20 67  in.  An n of 2 g
16d80 65 6e 65 72 61 74 65 73 20 74 68 65 20 53 51 4c  enerates the SQL
16d90 69 74 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e 61  ite space.** ana
16da0 6c 79 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a  lysis program..*
16db0 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  /..#if defined(S
16dc0 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64  QLITE_TEST) || d
16dd0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43  efined(SQLITE_TC
16de0 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69 73  LMD5)./*. * This
16df0 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73   code implements
16e00 20 74 68 65 20 4d 44 35 20 6d 65 73 73 61 67 65   the MD5 message
16e10 2d 64 69 67 65 73 74 20 61 6c 67 6f 72 69 74 68  -digest algorith
16e20 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72 69  m.. * The algori
16e30 74 68 6d 20 69 73 20 64 75 65 20 74 6f 20 52 6f  thm is due to Ro
16e40 6e 20 52 69 76 65 73 74 2e 20 20 54 68 69 73 20  n Rivest.  This 
16e50 63 6f 64 65 20 77 61 73 0a 20 2a 20 77 72 69 74  code was. * writ
16e60 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c 75  ten by Colin Plu
16e70 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20 63  mb in 1993, no c
16e80 6f 70 79 72 69 67 68 74 20 69 73 20 63 6c 61 69  opyright is clai
16e90 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64  med.. * This cod
16ea0 65 20 69 73 20 69 6e 20 74 68 65 20 70 75 62 6c  e is in the publ
16eb0 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77 69  ic domain; do wi
16ec0 74 68 20 69 74 20 77 68 61 74 20 79 6f 75 20 77  th it what you w
16ed0 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69 76  ish.. *. * Equiv
16ee0 61 6c 65 6e 74 20 63 6f 64 65 20 69 73 20 61 76  alent code is av
16ef0 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53 41  ailable from RSA
16f00 20 44 61 74 61 20 53 65 63 75 72 69 74 79 2c 20   Data Security, 
16f10 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64  Inc.. * This cod
16f20 65 20 68 61 73 20 62 65 65 6e 20 74 65 73 74 65  e has been teste
16f30 64 20 61 67 61 69 6e 73 74 20 74 68 61 74 2c 20  d against that, 
16f40 61 6e 64 20 69 73 20 65 71 75 69 76 61 6c 65 6e  and is equivalen
16f50 74 2c 0a 20 2a 20 65 78 63 65 70 74 20 74 68 61  t,. * except tha
16f60 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65 64  t you don't need
16f70 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f 20   to include two 
16f80 70 61 67 65 73 20 6f 66 20 6c 65 67 61 6c 65 73  pages of legales
16f90 65 0a 20 2a 20 77 69 74 68 20 65 76 65 72 79 20  e. * with every 
16fa0 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20 63  copy.. *. * To c
16fb0 6f 6d 70 75 74 65 20 74 68 65 20 6d 65 73 73 61  ompute the messa
16fc0 67 65 20 64 69 67 65 73 74 20 6f 66 20 61 20 63  ge digest of a c
16fd0 68 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20 64  hunk of bytes, d
16fe0 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44 35  eclare an. * MD5
16ff0 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
17000 65 2c 20 70 61 73 73 20 69 74 20 74 6f 20 4d 44  e, pass it to MD
17010 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35 55  5Init, call MD5U
17020 70 64 61 74 65 20 61 73 0a 20 2a 20 6e 65 65 64  pdate as. * need
17030 65 64 20 6f 6e 20 62 75 66 66 65 72 73 20 66 75  ed on buffers fu
17040 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20 61 6e 64  ll of bytes, and
17050 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46 69   then call MD5Fi
17060 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77 69  nal, which. * wi
17070 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70 70 6c 69  ll fill a suppli
17080 65 64 20 31 36 2d 62 79 74 65 20 61 72 72 61 79  ed 16-byte array
17090 20 77 69 74 68 20 74 68 65 20 64 69 67 65 73 74   with the digest
170a0 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66 20  .. */../*. * If 
170b0 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61  compiled on a ma
170c0 63 68 69 6e 65 20 74 68 61 74 20 64 6f 65 73 6e  chine that doesn
170d0 27 74 20 68 61 76 65 20 61 20 33 32 2d 62 69 74  't have a 32-bit
170e0 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75   integer,. * you
170f0 20 6a 75 73 74 20 73 65 74 20 22 75 69 6e 74 33   just set "uint3
17100 32 22 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  2" to the approp
17110 72 69 61 74 65 20 64 61 74 61 74 79 70 65 20 66  riate datatype f
17120 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65  or an. * unsigne
17130 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
17140 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
17150 20 2a 0a 20 2a 20 20 20 20 20 20 20 63 63 20 2d   *. *       cc -
17160 44 75 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65  Duint32='unsigne
17170 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a  d long' md5.c. *
17180 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e  . */.#ifndef uin
17190 74 33 32 0a 23 20 20 64 65 66 69 6e 65 20 75 69  t32.#  define ui
171a0 6e 74 33 32 20 75 6e 73 69 67 6e 65 64 20 69 6e  nt32 unsigned in
171b0 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74  t.#endif..struct
171c0 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20 20   MD5Context {.  
171d0 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75 69  int isInit;.  ui
171e0 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75  nt32 buf[4];.  u
171f0 69 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20  int32 bits[2];. 
17200 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
17210 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65  n[64];.};.typede
17220 66 20 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74  f struct MD5Cont
17230 65 78 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a  ext MD5Context;.
17240 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69  ./*. * Note: thi
17250 73 20 63 6f 64 65 20 69 73 20 68 61 72 6d 6c 65  s code is harmle
17260 73 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64  ss on little-end
17270 69 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a  ian machines.. *
17280 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 79  /.static void by
17290 74 65 52 65 76 65 72 73 65 20 28 75 6e 73 69 67  teReverse (unsig
172a0 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75  ned char *buf, u
172b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a  nsigned longs){.
172c0 20 20 20 20 20 20 20 20 75 69 6e 74 33 32 20 74          uint32 t
172d0 3b 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0a 20  ;.        do {. 
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
172f0 20 3d 20 28 75 69 6e 74 33 32 29 28 28 75 6e 73   = (uint32)((uns
17300 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38 20  igned)buf[3]<<8 
17310 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36 20  | buf[2]) << 16 
17320 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
17340 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 31 5d 3c  unsigned)buf[1]<
17350 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20 20  <8 | buf[0]);.  
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 28                *(
17370 75 69 6e 74 33 32 20 2a 29 62 75 66 20 3d 20 74  uint32 *)buf = t
17380 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17390 20 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20    buf += 4;.    
173a0 20 20 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6c      } while (--l
173b0 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65 20  ongs);.}./* The 
173c0 66 6f 75 72 20 63 6f 72 65 20 66 75 6e 63 74 69  four core functi
173d0 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f 70 74 69  ons - F1 is opti
173e0 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61 74 20 2a  mized somewhat *
173f0 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46 31  /../* #define F1
17400 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 26 20 79  (x, y, z) (x & y
17410 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23 64   | ~x & z) */.#d
17420 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a  efine F1(x, y, z
17430 29 20 28 7a 20 5e 20 28 78 20 26 20 28 79 20 5e  ) (z ^ (x & (y ^
17440 20 7a 29 29 29 0a 23 64 65 66 69 6e 65 20 46 32   z))).#define F2
17450 28 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c 20  (x, y, z) F1(z, 
17460 78 2c 20 79 29 0a 23 64 65 66 69 6e 65 20 46 33  x, y).#define F3
17470 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20 79  (x, y, z) (x ^ y
17480 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20 46 34   ^ z).#define F4
17490 28 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20 28  (x, y, z) (y ^ (
174a0 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68 69  x | ~z))../* Thi
174b0 73 20 69 73 20 74 68 65 20 63 65 6e 74 72 61 6c  s is the central
174c0 20 73 74 65 70 20 69 6e 20 74 68 65 20 4d 44 35   step in the MD5
174d0 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 23   algorithm. */.#
174e0 64 65 66 69 6e 65 20 4d 44 35 53 54 45 50 28 66  define MD5STEP(f
174f0 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64 61  , w, x, y, z, da
17500 74 61 2c 20 73 29 20 5c 0a 20 20 20 20 20 20 20  ta, s) \.       
17510 20 28 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20   ( w += f(x, y, 
17520 7a 29 20 2b 20 64 61 74 61 2c 20 20 77 20 3d 20  z) + data,  w = 
17530 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29  w<<s | w>>(32-s)
17540 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a  ,  w += x )../*.
17550 20 2a 20 54 68 65 20 63 6f 72 65 20 6f 66 20 74   * The core of t
17560 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d  he MD5 algorithm
17570 2c 20 74 68 69 73 20 61 6c 74 65 72 73 20 61 6e  , this alters an
17580 20 65 78 69 73 74 69 6e 67 20 4d 44 35 20 68 61   existing MD5 ha
17590 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74  sh to. * reflect
175a0 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66   the addition of
175b0 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66   16 longwords of
175c0 20 6e 65 77 20 64 61 74 61 2e 20 20 4d 44 35 55   new data.  MD5U
175d0 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20  pdate blocks. * 
175e0 74 68 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e  the data and con
175f0 76 65 72 74 73 20 62 79 74 65 73 20 69 6e 74 6f  verts bytes into
17600 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20 74   longwords for t
17610 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f  his routine.. */
17620 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35  .static void MD5
17630 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32  Transform(uint32
17640 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75   buf[4], const u
17650 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20  int32 in[16]){. 
17660 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20         register 
17670 75 69 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c 20  uint32 a, b, c, 
17680 64 3b 0a 0a 20 20 20 20 20 20 20 20 61 20 3d 20  d;..        a = 
17690 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  buf[0];.        
176a0 62 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  b = buf[1];.    
176b0 20 20 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b 0a      c = buf[2];.
176c0 20 20 20 20 20 20 20 20 64 20 3d 20 62 75 66 5b          d = buf[
176d0 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  3];..        MD5
176e0 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
176f0 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64 37  , d, in[ 0]+0xd7
17700 36 61 61 34 37 38 2c 20 20 37 29 3b 0a 20 20 20  6aa478,  7);.   
17710 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
17720 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
17730 20 31 5d 2b 30 78 65 38 63 37 62 37 35 36 2c 20   1]+0xe8c7b756, 
17740 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
17750 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
17760 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34  , b, in[ 2]+0x24
17770 32 30 37 30 64 62 2c 20 31 37 29 3b 0a 20 20 20  2070db, 17);.   
17780 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
17790 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
177a0 20 33 5d 2b 30 78 63 31 62 64 63 65 65 65 2c 20   3]+0xc1bdceee, 
177b0 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  22);.        MD5
177c0 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
177d0 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 35  , d, in[ 4]+0xf5
177e0 37 63 30 66 61 66 2c 20 20 37 29 3b 0a 20 20 20  7c0faf,  7);.   
177f0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
17800 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
17810 20 35 5d 2b 30 78 34 37 38 37 63 36 32 61 2c 20   5]+0x4787c62a, 
17820 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
17830 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
17840 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38  , b, in[ 6]+0xa8
17850 33 30 34 36 31 33 2c 20 31 37 29 3b 0a 20 20 20  304613, 17);.   
17860 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
17870 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
17880 20 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c 20   7]+0xfd469501, 
17890 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  22);.        MD5
178a0 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
178b0 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39  , d, in[ 8]+0x69
178c0 38 30 39 38 64 38 2c 20 20 37 29 3b 0a 20 20 20  8098d8,  7);.   
178d0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
178e0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
178f0 20 39 5d 2b 30 78 38 62 34 34 66 37 61 66 2c 20   9]+0x8b44f7af, 
17900 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
17910 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
17920 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66  , b, in[10]+0xff
17930 66 66 35 62 62 31 2c 20 31 37 29 3b 0a 20 20 20  ff5bb1, 17);.   
17940 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
17950 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
17960 31 31 5d 2b 30 78 38 39 35 63 64 37 62 65 2c 20  11]+0x895cd7be, 
17970 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  22);.        MD5
17980 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
17990 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 62  , d, in[12]+0x6b
179a0 39 30 31 31 32 32 2c 20 20 37 29 3b 0a 20 20 20  901122,  7);.   
179b0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
179c0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
179d0 31 33 5d 2b 30 78 66 64 39 38 37 31 39 33 2c 20  13]+0xfd987193, 
179e0 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
179f0 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
17a00 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 36  , b, in[14]+0xa6
17a10 37 39 34 33 38 65 2c 20 31 37 29 3b 0a 20 20 20  79438e, 17);.   
17a20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
17a30 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
17a40 31 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c 20  15]+0x49b40821, 
17a50 32 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  22);..        MD
17a60 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
17a70 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 66  c, d, in[ 1]+0xf
17a80 36 31 65 32 35 36 32 2c 20 20 35 29 3b 0a 20 20  61e2562,  5);.  
17a90 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
17aa0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
17ab0 5b 20 36 5d 2b 30 78 63 30 34 30 62 33 34 30 2c  [ 6]+0xc040b340,
17ac0 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
17ad0 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
17ae0 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32  a, b, in[11]+0x2
17af0 36 35 65 35 61 35 31 2c 20 31 34 29 3b 0a 20 20  65e5a51, 14);.  
17b00 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
17b10 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
17b20 5b 20 30 5d 2b 30 78 65 39 62 36 63 37 61 61 2c  [ 0]+0xe9b6c7aa,
17b30 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   20);.        MD
17b40 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
17b50 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 64  c, d, in[ 5]+0xd
17b60 36 32 66 31 30 35 64 2c 20 20 35 29 3b 0a 20 20  62f105d,  5);.  
17b70 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
17b80 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
17b90 5b 31 30 5d 2b 30 78 30 32 34 34 31 34 35 33 2c  [10]+0x02441453,
17ba0 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
17bb0 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
17bc0 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64  a, b, in[15]+0xd
17bd0 38 61 31 65 36 38 31 2c 20 31 34 29 3b 0a 20 20  8a1e681, 14);.  
17be0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
17bf0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
17c00 5b 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38 2c  [ 4]+0xe7d3fbc8,
17c10 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   20);.        MD
17c20 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
17c30 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32  c, d, in[ 9]+0x2
17c40 31 65 31 63 64 65 36 2c 20 20 35 29 3b 0a 20 20  1e1cde6,  5);.  
17c50 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
17c60 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
17c70 5b 31 34 5d 2b 30 78 63 33 33 37 30 37 64 36 2c  [14]+0xc33707d6,
17c80 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
17c90 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
17ca0 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66  a, b, in[ 3]+0xf
17cb0 34 64 35 30 64 38 37 2c 20 31 34 29 3b 0a 20 20  4d50d87, 14);.  
17cc0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
17cd0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
17ce0 5b 20 38 5d 2b 30 78 34 35 35 61 31 34 65 64 2c  [ 8]+0x455a14ed,
17cf0 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   20);.        MD
17d00 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
17d10 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 61  c, d, in[13]+0xa
17d20 39 65 33 65 39 30 35 2c 20 20 35 29 3b 0a 20 20  9e3e905,  5);.  
17d30 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
17d40 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
17d50 5b 20 32 5d 2b 30 78 66 63 65 66 61 33 66 38 2c  [ 2]+0xfcefa3f8,
17d60 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
17d70 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
17d80 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 36  a, b, in[ 7]+0x6
17d90 37 36 66 30 32 64 39 2c 20 31 34 29 3b 0a 20 20  76f02d9, 14);.  
17da0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
17db0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
17dc0 5b 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61 2c  [12]+0x8d2a4c8a,
17dd0 20 32 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d   20);..        M
17de0 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
17df0 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78   c, d, in[ 5]+0x
17e00 66 66 66 61 33 39 34 32 2c 20 20 34 29 3b 0a 20  fffa3942,  4);. 
17e10 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
17e20 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
17e30 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66 36 38 31  n[ 8]+0x8771f681
17e40 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
17e50 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
17e60 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78   a, b, in[11]+0x
17e70 36 64 39 64 36 31 32 32 2c 20 31 36 29 3b 0a 20  6d9d6122, 16);. 
17e80 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
17e90 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
17ea0 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33 38 30 63  n[14]+0xfde5380c
17eb0 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 23);.        M
17ec0 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
17ed0 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78   c, d, in[ 1]+0x
17ee0 61 34 62 65 65 61 34 34 2c 20 20 34 29 3b 0a 20  a4beea44,  4);. 
17ef0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
17f00 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
17f10 6e 5b 20 34 5d 2b 30 78 34 62 64 65 63 66 61 39  n[ 4]+0x4bdecfa9
17f20 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
17f30 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
17f40 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78   a, b, in[ 7]+0x
17f50 66 36 62 62 34 62 36 30 2c 20 31 36 29 3b 0a 20  f6bb4b60, 16);. 
17f60 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
17f70 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
17f80 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37 30  n[10]+0xbebfbc70
17f90 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 23);.        M
17fa0 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
17fb0 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78   c, d, in[13]+0x
17fc0 32 38 39 62 37 65 63 36 2c 20 20 34 29 3b 0a 20  289b7ec6,  4);. 
17fd0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
17fe0 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
17ff0 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32 37 66 61  n[ 0]+0xeaa127fa
18000 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
18010 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
18020 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78   a, b, in[ 3]+0x
18030 64 34 65 66 33 30 38 35 2c 20 31 36 29 3b 0a 20  d4ef3085, 16);. 
18040 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18050 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
18060 6e 5b 20 36 5d 2b 30 78 30 34 38 38 31 64 30 35  n[ 6]+0x04881d05
18070 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 23);.        M
18080 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
18090 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78   c, d, in[ 9]+0x
180a0 64 39 64 34 64 30 33 39 2c 20 20 34 29 3b 0a 20  d9d4d039,  4);. 
180b0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
180c0 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
180d0 6e 5b 31 32 5d 2b 30 78 65 36 64 62 39 39 65 35  n[12]+0xe6db99e5
180e0 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
180f0 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
18100 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78   a, b, in[15]+0x
18110 31 66 61 32 37 63 66 38 2c 20 31 36 29 3b 0a 20  1fa27cf8, 16);. 
18120 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18130 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
18140 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36 35  n[ 2]+0xc4ac5665
18150 2c 20 32 33 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 23);..        
18160 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
18170 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30  , c, d, in[ 0]+0
18180 78 66 34 32 39 32 32 34 34 2c 20 20 36 29 3b 0a  xf4292244,  6);.
18190 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
181a0 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
181b0 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66 66 39  in[ 7]+0x432aff9
181c0 37 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  7, 10);.        
181d0 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
181e0 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30  , a, b, in[14]+0
181f0 78 61 62 39 34 32 33 61 37 2c 20 31 35 29 3b 0a  xab9423a7, 15);.
18200 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18210 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
18220 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61 30 33  in[ 5]+0xfc93a03
18230 39 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20  9, 21);.        
18240 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
18250 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30  , c, d, in[12]+0
18260 78 36 35 35 62 35 39 63 33 2c 20 20 36 29 3b 0a  x655b59c3,  6);.
18270 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18280 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
18290 69 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63 63 39  in[ 3]+0x8f0ccc9
182a0 32 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  2, 10);.        
182b0 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
182c0 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30  , a, b, in[10]+0
182d0 78 66 66 65 66 66 34 37 64 2c 20 31 35 29 3b 0a  xffeff47d, 15);.
182e0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
182f0 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
18300 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64 64  in[ 1]+0x85845dd
18310 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20  1, 21);.        
18320 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
18330 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30  , c, d, in[ 8]+0
18340 78 36 66 61 38 37 65 34 66 2c 20 20 36 29 3b 0a  x6fa87e4f,  6);.
18350 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18360 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
18370 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65 36 65  in[15]+0xfe2ce6e
18380 30 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  0, 10);.        
18390 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
183a0 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30  , a, b, in[ 6]+0
183b0 78 61 33 30 31 34 33 31 34 2c 20 31 35 29 3b 0a  xa3014314, 15);.
183c0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
183d0 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
183e0 69 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31 31 61  in[13]+0x4e0811a
183f0 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20  1, 21);.        
18400 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
18410 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30  , c, d, in[ 4]+0
18420 78 66 37 35 33 37 65 38 32 2c 20 20 36 29 3b 0a  xf7537e82,  6);.
18430 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18440 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
18450 69 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66 32 33  in[11]+0xbd3af23
18460 35 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  5, 10);.        
18470 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
18480 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30  , a, b, in[ 2]+0
18490 78 32 61 64 37 64 32 62 62 2c 20 31 35 29 3b 0a  x2ad7d2bb, 15);.
184a0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
184b0 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
184c0 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33 39  in[ 9]+0xeb86d39
184d0 31 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20 20 20  1, 21);..       
184e0 20 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20 20   buf[0] += a;.  
184f0 20 20 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d 20        buf[1] += 
18500 62 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 32  b;.        buf[2
18510 5d 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  ] += c;.        
18520 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a 0a  buf[3] += d;.}..
18530 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44 35 20  /*. * Start MD5 
18540 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20 53  accumulation.  S
18550 65 74 20 62 69 74 20 63 6f 75 6e 74 20 74 6f 20  et bit count to 
18560 30 20 61 6e 64 20 62 75 66 66 65 72 20 74 6f 20  0 and buffer to 
18570 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a 20 69 6e  mysterious. * in
18580 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e  itialization con
18590 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61 74  stants.. */.stat
185a0 69 63 20 76 6f 69 64 20 4d 44 35 49 6e 69 74 28  ic void MD5Init(
185b0 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29  MD5Context *ctx)
185c0 7b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 69  {.        ctx->i
185d0 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  sInit = 1;.     
185e0 20 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d     ctx->buf[0] =
185f0 20 30 78 36 37 34 35 32 33 30 31 3b 0a 20 20 20   0x67452301;.   
18600 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 31 5d       ctx->buf[1]
18610 20 3d 20 30 78 65 66 63 64 61 62 38 39 3b 0a 20   = 0xefcdab89;. 
18620 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b         ctx->buf[
18630 32 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65 3b  2] = 0x98badcfe;
18640 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75  .        ctx->bu
18650 66 5b 33 5d 20 3d 20 30 78 31 30 33 32 35 34 37  f[3] = 0x1032547
18660 36 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  6;.        ctx->
18670 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  bits[0] = 0;.   
18680 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31       ctx->bits[1
18690 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  ] = 0;.}../*. * 
186a0 55 70 64 61 74 65 20 63 6f 6e 74 65 78 74 20 74  Update context t
186b0 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 6f  o reflect the co
186c0 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61  ncatenation of a
186d0 6e 6f 74 68 65 72 20 62 75 66 66 65 72 20 66 75  nother buffer fu
186e0 6c 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a  ll. * of bytes..
186f0 20 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69 64   */.static .void
18700 20 4d 44 35 55 70 64 61 74 65 28 4d 44 35 43 6f   MD5Update(MD5Co
18710 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73  ntext *ctx, cons
18720 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
18730 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 69  *buf, unsigned i
18740 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20  nt len){.       
18750 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20   uint32 t;..    
18760 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 62 69      /* Update bi
18770 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  tcount */..     
18780 20 20 20 74 20 3d 20 63 74 78 2d 3e 62 69 74 73     t = ctx->bits
18790 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 20  [0];.        if 
187a0 28 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d  ((ctx->bits[0] =
187b0 20 74 20 2b 20 28 28 75 69 6e 74 33 32 29 6c 65   t + ((uint32)le
187c0 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20 20  n << 3)) < t).  
187d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
187e0 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a  x->bits[1]++; /*
187f0 20 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20   Carry from low 
18800 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20 20 20  to high */.     
18810 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20     ctx->bits[1] 
18820 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20  += len >> 29;.. 
18830 20 20 20 20 20 20 20 74 20 3d 20 28 74 20 3e 3e         t = (t >>
18840 20 33 29 20 26 20 30 78 33 66 3b 20 20 20 20 2f   3) & 0x3f;    /
18850 2a 20 42 79 74 65 73 20 61 6c 72 65 61 64 79 20  * Bytes already 
18860 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61  in shsInfo->data
18870 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
18880 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64 69  Handle any leadi
18890 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20 63 68 75  ng odd-sized chu
188a0 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  nks */..        
188b0 69 66 20 28 20 74 20 29 20 7b 0a 20 20 20 20 20  if ( t ) {.     
188c0 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67             unsig
188d0 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20 28 75  ned char *p = (u
188e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63  nsigned char *)c
188f0 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20  tx->in + t;..   
18900 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d               t =
18910 20 36 34 2d 74 3b 0a 20 20 20 20 20 20 20 20 20   64-t;.         
18920 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3c         if (len <
18930 20 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   t) {.          
18940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
18950 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e  mcpy(p, buf, len
18960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
18970 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
18980 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
18990 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
189a0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62       memcpy(p, b
189b0 75 66 2c 20 74 29 3b 0a 20 20 20 20 20 20 20 20  uf, t);.        
189c0 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
189d0 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29  rse(ctx->in, 16)
189e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
189f0 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63    MD5Transform(c
18a00 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32  tx->buf, (uint32
18a10 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20   *)ctx->in);.   
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66               buf
18a30 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20   += t;.         
18a40 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b         len -= t;
18a50 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
18a60 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 64      /* Process d
18a70 61 74 61 20 69 6e 20 36 34 2d 62 79 74 65 20 63  ata in 64-byte c
18a80 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20  hunks */..      
18a90 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20    while (len >= 
18aa0 36 34 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  64) {.          
18ab0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78        memcpy(ctx
18ac0 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a  ->in, buf, 64);.
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ae0 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
18af0 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20  >in, 16);.      
18b00 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61            MD5Tra
18b10 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
18b20 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
18b30 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
18b40 20 20 20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a       buf += 64;.
18b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b60 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20  len -= 64;.     
18b70 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
18b80 20 48 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61   Handle any rema
18b90 69 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64  ining bytes of d
18ba0 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ata. */..       
18bb0 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c   memcpy(ctx->in,
18bc0 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f   buf, len);.}../
18bd0 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70 75  *. * Final wrapu
18be0 70 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62 79  p - pad to 64-by
18bf0 74 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74 68  te boundary with
18c00 20 74 68 65 20 62 69 74 20 70 61 74 74 65 72 6e   the bit pattern
18c10 20 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62 69   . * 1 0* (64-bi
18c20 74 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73 20  t count of bits 
18c30 70 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d 66  processed, MSB-f
18c40 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63  irst). */.static
18c50 20 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75   void MD5Final(u
18c60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
18c70 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74  est[16], MD5Cont
18c80 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20  ext *ctx){.     
18c90 20 20 20 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e     unsigned coun
18ca0 74 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  t;.        unsig
18cb0 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20  ned char *p;..  
18cc0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65        /* Compute
18cd0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18ce0 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20   mod 64 */.     
18cf0 20 20 20 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d     count = (ctx-
18d00 3e 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26  >bits[0] >> 3) &
18d10 20 30 78 33 46 3b 0a 0a 20 20 20 20 20 20 20 20   0x3F;..        
18d20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74  /* Set the first
18d30 20 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e 67   char of padding
18d40 20 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73 20   to 0x80.  This 
18d50 69 73 20 73 61 66 65 20 73 69 6e 63 65 20 74 68  is safe since th
18d60 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
18d70 20 20 61 6c 77 61 79 73 20 61 74 20 6c 65 61 73    always at leas
18d80 74 20 6f 6e 65 20 62 79 74 65 20 66 72 65 65 20  t one byte free 
18d90 2a 2f 0a 20 20 20 20 20 20 20 20 70 20 3d 20 63  */.        p = c
18da0 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a  tx->in + count;.
18db0 20 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30          *p++ = 0
18dc0 78 38 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  x80;..        /*
18dd0 20 42 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   Bytes of paddin
18de0 67 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  g needed to make
18df0 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   64 bytes */.   
18e00 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 36 34 20       count = 64 
18e10 2d 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20  - 1 - count;..  
18e20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 6f 75 74        /* Pad out
18e30 20 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f   to 56 mod 64 */
18e40 0a 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 75  .        if (cou
18e50 6e 74 20 3c 20 38 29 20 7b 0a 20 20 20 20 20 20  nt < 8) {.      
18e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f            /* Two
18e70 20 6c 6f 74 73 20 6f 66 20 70 61 64 64 69 6e 67   lots of padding
18e80 3a 20 20 50 61 64 20 74 68 65 20 66 69 72 73 74  :  Pad the first
18e90 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79 74   block to 64 byt
18ea0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  es */.          
18eb0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20        memset(p, 
18ec0 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  0, count);.     
18ed0 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52             byteR
18ee0 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20  everse(ctx->in, 
18ef0 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  16);.           
18f00 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72       MD5Transfor
18f10 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e  m(ctx->buf, (uin
18f20 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a  t32 *)ctx->in);.
18f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18f40 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65   /* Now fill the
18f50 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69 74 68   next block with
18f60 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   56 bytes */.   
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
18f80 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20  set(ctx->in, 0, 
18f90 35 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  56);.        } e
18fa0 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
18fb0 20 20 20 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f        /* Pad blo
18fc0 63 6b 20 74 6f 20 35 36 20 62 79 74 65 73 20 2a  ck to 56 bytes *
18fd0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
18fe0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63    memset(p, 0, c
18ff0 6f 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20 20  ount-8);.       
19000 20 7d 0a 20 20 20 20 20 20 20 20 62 79 74 65 52   }.        byteR
19010 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20  everse(ctx->in, 
19020 31 34 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  14);..        /*
19030 20 41 70 70 65 6e 64 20 6c 65 6e 67 74 68 20 69   Append length i
19040 6e 20 62 69 74 73 20 61 6e 64 20 74 72 61 6e 73  n bits and trans
19050 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20  form */.        
19060 28 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e  ((uint32 *)ctx->
19070 69 6e 29 5b 20 31 34 20 5d 20 3d 20 63 74 78 2d  in)[ 14 ] = ctx-
19080 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20  >bits[0];.      
19090 20 20 28 28 75 69 6e 74 33 32 20 2a 29 63 74 78    ((uint32 *)ctx
190a0 2d 3e 69 6e 29 5b 20 31 35 20 5d 20 3d 20 63 74  ->in)[ 15 ] = ct
190b0 78 2d 3e 62 69 74 73 5b 31 5d 3b 0a 0a 20 20 20  x->bits[1];..   
190c0 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72       MD5Transfor
190d0 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e  m(ctx->buf, (uin
190e0 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a  t32 *)ctx->in);.
190f0 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
19100 72 73 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68  rse((unsigned ch
19110 61 72 20 2a 29 63 74 78 2d 3e 62 75 66 2c 20 34  ar *)ctx->buf, 4
19120 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
19130 79 28 64 69 67 65 73 74 2c 20 63 74 78 2d 3e 62  y(digest, ctx->b
19140 75 66 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  uf, 16);.       
19150 20 6d 65 6d 73 65 74 28 63 74 78 2c 20 30 2c 20   memset(ctx, 0, 
19160 73 69 7a 65 6f 66 28 63 74 78 29 29 3b 20 20 20  sizeof(ctx));   
19170 20 2f 2a 20 49 6e 20 63 61 73 65 20 69 74 20 69   /* In case it i
19180 73 20 73 65 6e 73 69 74 69 76 65 20 2a 2f 0a 7d  s sensitive */.}
19190 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
191a0 61 20 31 32 38 2d 62 69 74 20 4d 44 35 20 64 69  a 128-bit MD5 di
191b0 67 65 73 74 20 69 6e 74 6f 20 61 20 33 32 2d 64  gest into a 32-d
191c0 69 67 69 74 20 62 61 73 65 2d 31 36 20 6e 75 6d  igit base-16 num
191d0 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
191e0 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42  oid MD5DigestToB
191f0 61 73 65 31 36 28 75 6e 73 69 67 6e 65 64 20 63  ase16(unsigned c
19200 68 61 72 20 2a 64 69 67 65 73 74 2c 20 63 68 61  har *digest, cha
19210 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  r *zBuf){.  stat
19220 69 63 20 63 68 61 72 20 63 6f 6e 73 74 20 7a 45  ic char const zE
19230 6e 63 6f 64 65 5b 5d 20 3d 20 22 30 31 32 33 34  ncode[] = "01234
19240 35 36 37 38 39 61 62 63 64 65 66 22 3b 0a 20 20  56789abcdef";.  
19250 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72  int i, j;..  for
19260 28 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b 20 69 2b  (j=i=0; i<16; i+
19270 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20  +){.    int a = 
19280 64 69 67 65 73 74 5b 69 5d 3b 0a 20 20 20 20 7a  digest[i];.    z
19290 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f  Buf[j++] = zEnco
192a0 64 65 5b 28 61 3e 3e 34 29 26 30 78 66 5d 3b 0a  de[(a>>4)&0xf];.
192b0 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20      zBuf[j++] = 
192c0 7a 45 6e 63 6f 64 65 5b 61 20 26 20 30 78 66 5d  zEncode[a & 0xf]
192d0 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
192e0 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 0;.}.../*.** C
192f0 6f 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74  onvert a 128-bit
19300 20 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f   MD5 digest into
19310 20 73 65 71 75 65 6e 63 79 20 6f 66 20 65 69 67   sequency of eig
19320 68 74 20 35 2d 64 69 67 69 74 20 69 6e 74 65 67  ht 5-digit integ
19330 65 72 73 0a 2a 2a 20 65 61 63 68 20 72 65 70 72  ers.** each repr
19340 65 73 65 6e 74 69 6e 67 20 31 36 20 62 69 74 73  esenting 16 bits
19350 20 6f 66 20 74 68 65 20 64 69 67 65 73 74 20 61   of the digest a
19360 6e 64 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  nd separated fro
19370 6d 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 20  m each.** other 
19380 62 79 20 61 20 22 2d 22 20 63 68 61 72 61 63 74  by a "-" charact
19390 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
193a0 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61  id MD5DigestToBa
193b0 73 65 31 30 78 38 28 75 6e 73 69 67 6e 65 64 20  se10x8(unsigned 
193c0 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 2c  char digest[16],
193d0 20 63 68 61 72 20 7a 44 69 67 65 73 74 5b 35 30   char zDigest[50
193e0 5d 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ]){.  int i, j;.
193f0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
19400 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
19410 3c 31 36 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  <16; i+=2){.    
19420 78 20 3d 20 64 69 67 65 73 74 5b 69 5d 2a 32 35  x = digest[i]*25
19430 36 20 2b 20 64 69 67 65 73 74 5b 69 2b 31 5d 3b  6 + digest[i+1];
19440 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 7a  .    if( i>0 ) z
19450 44 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d 20 27 2d  Digest[j++] = '-
19460 27 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26  ';.    sprintf(&
19470 7a 44 69 67 65 73 74 5b 6a 5d 2c 20 22 25 30 35  zDigest[j], "%05
19480 75 22 2c 20 78 29 3b 0a 20 20 20 20 6a 20 2b 3d  u", x);.    j +=
19490 20 35 3b 0a 20 20 7d 0a 20 20 7a 44 69 67 65 73   5;.  }.  zDiges
194a0 74 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  t[j] = 0;.}../*.
194b0 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  ** A TCL command
194c0 20 66 6f 72 20 6d 64 35 2e 20 20 54 68 65 20 61   for md5.  The a
194d0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 74  rgument is the t
194e0 65 78 74 20 74 6f 20 62 65 20 68 61 73 68 65 64  ext to be hashed
194f0 2e 20 20 54 68 65 0a 2a 2a 20 52 65 73 75 6c 74  .  The.** Result
19500 20 69 73 20 74 68 65 20 68 61 73 68 20 69 6e 20   is the hash in 
19510 62 61 73 65 36 34 2e 20 20 0a 2a 2f 0a 73 74 61  base64.  .*/.sta
19520 74 69 63 20 69 6e 74 20 6d 64 35 5f 63 6d 64 28  tic int md5_cmd(
19530 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  void*cd, Tcl_Int
19540 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
19550 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
19560 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35  r **argv){.  MD5
19570 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 75  Context ctx;.  u
19580 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
19590 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20  est[16];.  char 
195a0 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 76 6f 69 64  zBuf[50];.  void
195b0 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e   (*converter)(un
195c0 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68  signed char*, ch
195d0 61 72 2a 29 3b 0a 0a 20 20 69 66 28 20 61 72 67  ar*);..  if( arg
195e0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
195f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
19600 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67  erp,"wrong # arg
19610 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
19620 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
19630 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c 20 30      " TEXT\"", 0
19640 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
19650 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d  L_ERROR;.  }.  M
19660 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20  D5Init(&ctx);.  
19670 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20  MD5Update(&ctx, 
19680 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
19690 61 72 67 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e  argv[1], (unsign
196a0 65 64 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31  ed)strlen(argv[1
196b0 5d 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28  ]));.  MD5Final(
196c0 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20  digest, &ctx);. 
196d0 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f   converter = (vo
196e0 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63  id(*)(unsigned c
196f0 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a  har*,char*))cd;.
19700 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65    converter(dige
19710 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c  st, zBuf);.  Tcl
19720 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19730 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61  terp, zBuf, (cha
19740 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r*)0);.  return 
19750 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
19760 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74   A TCL command t
19770 6f 20 74 61 6b 65 20 74 68 65 20 6d 64 35 20 68  o take the md5 h
19780 61 73 68 20 6f 66 20 61 20 66 69 6c 65 2e 20 20  ash of a file.  
19790 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
197a0 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74  the.** name of t
197b0 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
197c0 69 63 20 69 6e 74 20 6d 64 35 66 69 6c 65 5f 63  ic int md5file_c
197d0 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f  md(void*cd, Tcl_
197e0 49 6e 74 65 72 70 2a 69 6e 74 65 72 70 2c 20 69  Interp*interp, i
197f0 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
19800 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 46  har **argv){.  F
19810 49 4c 45 20 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f  ILE *in;.  MD5Co
19820 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 76 6f 69  ntext ctx;.  voi
19830 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75  d (*converter)(u
19840 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63  nsigned char*, c
19850 68 61 72 2a 29 3b 0a 20 20 75 6e 73 69 67 6e 65  har*);.  unsigne
19860 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36  d char digest[16
19870 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  ];.  char zBuf[1
19880 30 32 34 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  0240];..  if( ar
19890 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
198a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
198b0 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72  terp,"wrong # ar
198c0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
198d0 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
198e0 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c       " FILENAME\
198f0 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
19900 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19910 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61  }.  in = fopen(a
19920 72 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20  rgv[1],"rb");.  
19930 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
19940 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19950 74 28 69 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65  t(interp,"unable
19960 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22   to open file \"
19970 22 2c 20 61 72 67 76 5b 31 5d 2c 20 0a 20 20 20  ", argv[1], .   
19980 20 20 20 20 20 20 22 5c 22 20 66 6f 72 20 72 65        "\" for re
19990 61 64 69 6e 67 22 2c 20 30 29 3b 0a 20 20 20 20  ading", 0);.    
199a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
199b0 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28  ;.  }.  MD5Init(
199c0 26 63 74 78 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  &ctx);.  for(;;)
199d0 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
199e0 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c   n = fread(zBuf,
199f0 20 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29   1, sizeof(zBuf)
19a00 2c 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e  , in);.    if( n
19a10 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  <=0 ) break;.   
19a20 20 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c   MD5Update(&ctx,
19a30 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
19a40 29 7a 42 75 66 2c 20 28 75 6e 73 69 67 6e 65 64  )zBuf, (unsigned
19a50 29 6e 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73  )n);.  }.  fclos
19a60 65 28 69 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61  e(in);.  MD5Fina
19a70 6c 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b  l(digest, &ctx);
19a80 0a 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28  .  converter = (
19a90 76 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64  void(*)(unsigned
19aa0 20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64   char*,char*))cd
19ab0 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69  ;.  converter(di
19ac0 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54  gest, zBuf);.  T
19ad0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19ae0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63  interp, zBuf, (c
19af0 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72  har*)0);.  retur
19b00 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
19b10 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
19b20 66 6f 75 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d  four new TCL com
19b30 6d 61 6e 64 73 20 66 6f 72 20 67 65 6e 65 72 61  mands for genera
19b40 74 69 6e 67 20 4d 44 35 20 63 68 65 63 6b 73 75  ting MD5 checksu
19b50 6d 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 54  ms.** with the T
19b60 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  CL interpreter..
19b70 2a 2f 0a 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28  */.int Md5_Init(
19b80 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
19b90 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74  rp){.  Tcl_Creat
19ba0 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
19bb0 20 22 6d 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64   "md5", (Tcl_Cmd
19bc0 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20  Proc*)md5_cmd,. 
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19be0 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61     MD5DigestToBa
19bf0 73 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  se16, 0);.  Tcl_
19c00 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
19c10 74 65 72 70 2c 20 22 6d 64 35 2d 31 30 78 38 22  terp, "md5-10x8"
19c20 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29  , (Tcl_CmdProc*)
19c30 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20  md5_cmd,.       
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
19c50 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38  DigestToBase10x8
19c60 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  , 0);.  Tcl_Crea
19c70 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
19c80 2c 20 22 6d 64 35 66 69 6c 65 22 2c 20 28 54 63  , "md5file", (Tc
19c90 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69  l_CmdProc*)md5fi
19ca0 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20  le_cmd,.        
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44              MD5D
19cc0 69 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30  igestToBase16, 0
19cd0 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43  );.  Tcl_CreateC
19ce0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
19cf0 6d 64 35 66 69 6c 65 2d 31 30 78 38 22 2c 20 28  md5file-10x8", (
19d00 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35  Tcl_CmdProc*)md5
19d10 66 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20  file_cmd,.      
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44                MD
19d30 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78  5DigestToBase10x
19d40 38 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  8, 0);.  return 
19d50 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
19d60 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
19d70 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
19d80 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44  ned(SQLITE_TCLMD
19d90 35 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  5) */..#if defin
19da0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
19db0 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65 73  /*.** During tes
19dc0 74 69 6e 67 2c 20 74 68 65 20 73 70 65 63 69 61  ting, the specia
19dd0 6c 20 6d 64 35 73 75 6d 28 29 20 61 67 67 72 65  l md5sum() aggre
19de0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
19df0 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69   available..** i
19e00 6e 73 69 64 65 20 53 51 4c 69 74 65 2e 20 20 54  nside SQLite.  T
19e10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
19e20 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20  tines implement 
19e30 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  that function..*
19e40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64  /.static void md
19e50 35 73 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f  5step(sqlite3_co
19e60 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
19e70 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
19e80 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
19e90 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70  .  MD5Context *p
19ea0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
19eb0 20 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e   argc<1 ) return
19ec0 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
19ed0 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
19ee0 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
19ef0 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d  f(*p));.  if( p=
19f00 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
19f10 66 28 20 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b  f( !p->isInit ){
19f20 0a 20 20 20 20 4d 44 35 49 6e 69 74 28 70 29 3b  .    MD5Init(p);
19f30 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
19f40 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
19f50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
19f60 61 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ata = (char*)sql
19f70 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
19f80 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66  argv[i]);.    if
19f90 28 20 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( zData ){.     
19fa0 20 4d 44 35 55 70 64 61 74 65 28 70 2c 20 28 75   MD5Update(p, (u
19fb0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 44  nsigned char*)zD
19fc0 61 74 61 2c 20 73 74 72 6c 65 6e 28 7a 44 61 74  ata, strlen(zDat
19fd0 61 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  a));.    }.  }.}
19fe0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35  .static void md5
19ff0 66 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  finalize(sqlite3
1a000 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1a010 74 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74  t){.  MD5Context
1a020 20 2a 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   *p;.  unsigned 
1a030 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b  char digest[16];
1a040 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 33 5d  .  char zBuf[33]
1a050 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
1a060 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
1a070 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
1a080 66 28 2a 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e  f(*p));.  MD5Fin
1a090 61 6c 28 64 69 67 65 73 74 2c 70 29 3b 0a 20 20  al(digest,p);.  
1a0a0 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1a0b0 36 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b  6(digest, zBuf);
1a0c0 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
1a0d0 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
1a0e0 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zBuf, -1, SQLITE
1a0f0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69  _TRANSIENT);.}.i
1a100 6e 74 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28  nt Md5_Register(
1a110 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
1a120 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1a130 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1a140 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d  (db, "md5sum", -
1a150 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
1a160 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a180 20 20 20 20 20 20 20 20 6d 64 35 73 74 65 70 2c          md5step,
1a190 20 6d 64 35 66 69 6e 61 6c 69 7a 65 29 3b 0a 20   md5finalize);. 
1a1a0 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
1a1b0 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  d_function(db, "
1a1c0 6d 64 35 73 75 6d 22 2c 20 2d 31 29 3b 20 20 2f  md5sum", -1);  /
1a1d0 2a 20 54 6f 20 65 78 65 72 63 69 73 65 20 74 68  * To exercise th
1a1e0 69 73 20 41 50 49 20 2a 2f 0a 20 20 72 65 74 75  is API */.  retu
1a1f0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
1a200 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1a210 45 5f 54 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a  E_TEST) */.../*.
1a220 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20  ** If the macro 
1a230 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68  TCLSH is one, th
1a240 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74  en put in code t
1a250 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22  his for the.** "
1a260 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68  main" routine th
1a270 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69  at will initiali
1a280 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20  ze Tcl and take 
1a290 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74  input from.** st
1a2a0 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 72  andard input, or
1a2b0 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e 61   if a file is na
1a2c0 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  med on the comma
1a2d0 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54  nd line.** the T
1a2e0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72  CL interpreter r
1a2f0 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61 74  eads and evaluat
1a300 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f  es that file..*/
1a310 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74  .#if TCLSH==1.st
1a320 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c  atic char zMainl
1a330 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c  oop[] =.  "set l
1a340 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69  ine {}\n".  "whi
1a350 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d  le {![eof stdin]
1a360 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b  } {\n".    "if {
1a370 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  $line!=\"\"} {\n
1a380 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e  ".      "puts -n
1a390 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c  onewline \"> \"\
1a3a0 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  n".    "} else {
1a3b0 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20  \n".      "puts 
1a3c0 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c  -nonewline \"% \
1a3d0 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20  "\n".    "}\n". 
1a3e0 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74     "flush stdout
1a3f0 5c 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20  \n".    "append 
1a400 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e  line [gets stdin
1a410 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69  ]\n".    "if {[i
1a420 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69  nfo complete $li
1a430 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  ne]} {\n".      
1a440 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c  "if {[catch {upl
1a450 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72  evel #0 $line} r
1a460 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20  esult]} {\n".   
1a470 20 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72       "puts stder
1a480 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75  r \"Error: $resu
1a490 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d  lt\"\n".      "}
1a4a0 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74   elseif {$result
1a4b0 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
1a4c0 20 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75       "puts $resu
1a4d0 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e  lt\n".      "}\n
1a4e0 22 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e  ".      "set lin
1a4f0 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65  e {}\n".    "} e
1a500 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  lse {\n".      "
1a510 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c  append line \\n\
1a520 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22  n".    "}\n".  "
1a530 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23  }\n".;.#endif..#
1a540 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49  define TCLSH_MAI
1a550 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64  N main   /* Need
1a560 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d  ed to fake out m
1a570 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54  ktclapp */.int T
1a580 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72  CLSH_MAIN(int ar
1a590 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
1a5a0 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
1a5b0 69 6e 74 65 72 70 3b 0a 20 20 0a 20 20 2f 2a 20  interp;.  .  /* 
1a5c0 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75  Call sqlite3_shu
1a5d0 74 64 6f 77 6e 28 29 20 6f 6e 63 65 20 62 65 66  tdown() once bef
1a5e0 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
1a5f0 6e 67 20 65 6c 73 65 2e 20 54 68 69 73 20 69 73  ng else. This is
1a600 20 74 6f 0a 20 20 2a 2a 20 74 65 73 74 20 74 68   to.  ** test th
1a610 61 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  at sqlite3_shutd
1a620 6f 77 6e 28 29 20 63 61 6e 20 62 65 20 73 61 66  own() can be saf
1a630 65 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 61 20  ely called by a 
1a640 70 72 6f 63 65 73 73 20 62 65 66 6f 72 65 0a 20  process before. 
1a650 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74   ** sqlite3_init
1a660 69 61 6c 69 7a 65 28 29 20 69 73 2e 20 2a 2f 0a  ialize() is. */.
1a670 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f    sqlite3_shutdo
1a680 77 6e 28 29 3b 0a 0a 20 20 54 63 6c 5f 46 69 6e  wn();..  Tcl_Fin
1a690 64 45 78 65 63 75 74 61 62 6c 65 28 61 72 67 76  dExecutable(argv
1a6a0 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d  [0]);.  interp =
1a6b0 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72   Tcl_CreateInter
1a6c0 70 28 29 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49  p();.  Sqlite3_I
1a6d0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66  nit(interp);.#if
1a6e0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1a6f0 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
1a700 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 0a  (SQLITE_TCLMD5).
1a710 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72    Md5_Init(inter
1a720 70 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  p);.#endif.#ifde
1a730 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1a740 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
1a750 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e   Sqliteconfig_In
1a760 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1a770 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1a780 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
1a790 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1a7a0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1a7b0 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54  litetest2_Init(T
1a7c0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1a7d0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1a7e0 74 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c  tetest3_Init(Tcl
1a7f0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1a800 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1a810 74 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49  test4_Init(Tcl_I
1a820 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1a830 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1a840 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st5_Init(Tcl_Int
1a850 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1a860 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1a870 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  6_Init(Tcl_Inter
1a880 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1a890 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 37 5f  int Sqlitetest7_
1a8a0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1a8b0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1a8c0 74 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e  t Sqlitetest8_In
1a8d0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1a8e0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1a8f0 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74  Sqlitetest9_Init
1a900 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1a910 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1a920 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e  litetestasync_In
1a930 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1a940 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1a950 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65  Sqlitetest_autoe
1a960 78 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  xt_Init(Tcl_Inte
1a970 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1a980 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1a990 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  func_Init(Tcl_In
1a9a0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1a9b0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1a9c0 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54 63 6c  t_hexio_Init(Tcl
1a9d0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1a9e0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1a9f0 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28 54  test_init_Init(T
1aa00 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1aa10 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1aa20 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e  tetest_malloc_In
1aa30 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1aa40 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1aa50 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65 78  Sqlitetest_mutex
1aa60 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1aa70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1aa80 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 63 68  nt Sqlitetestsch
1aa90 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ema_Init(Tcl_Int
1aaa0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1aab0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1aac0 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  sse_Init(Tcl_Int
1aad0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1aae0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1aaf0 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f  tclvar_Init(Tcl_
1ab00 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1ab10 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1ab20 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 54  estThread_Init(T
1ab30 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1ab40 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1ab50 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e  tetestOnefile_In
1ab60 69 74 28 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  it();.    extern
1ab70 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 4f   int SqlitetestO
1ab80 73 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f 49  sinst_Init(Tcl_I
1ab90 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1aba0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1abb0 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 54 63  stbackup_Init(Tc
1abc0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20 20  l_Interp*);..   
1abd0 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e   Sqliteconfig_In
1abe0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1abf0 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
1ac00 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1ac10 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69  litetest2_Init(i
1ac20 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1ac30 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74  tetest3_Init(int
1ac40 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1ac50 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72  test4_Init(inter
1ac60 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1ac70 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st5_Init(interp)
1ac80 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1ac90 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  6_Init(interp);.
1aca0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f      Sqlitetest7_
1acb0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1acc0 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e    Sqlitetest8_In
1acd0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1ace0 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74  Sqlitetest9_Init
1acf0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1ad00 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e  litetestasync_In
1ad10 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1ad20 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65  Sqlitetest_autoe
1ad30 78 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  xt_Init(interp);
1ad40 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1ad50 66 75 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70  func_Init(interp
1ad60 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1ad70 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 69 6e 74  t_hexio_Init(int
1ad80 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1ad90 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28 69  test_init_Init(i
1ada0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1adb0 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e  tetest_malloc_In
1adc0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1add0 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65 78  Sqlitetest_mutex
1ade0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1adf0 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 63 68     Sqlitetestsch
1ae00 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ema_Init(interp)
1ae10 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1ae20 74 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74 65  tclvar_Init(inte
1ae30 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1ae40 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 69  estThread_Init(i
1ae50 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1ae60 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e  tetestOnefile_In
1ae70 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1ae80 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73 74  SqlitetestOsinst
1ae90 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1aea0 20 20 20 53 71 6c 69 74 65 74 65 73 74 62 61 63     Sqlitetestbac
1aeb0 6b 75 70 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  kup_Init(interp)
1aec0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1aed0 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65 74  _SSE.    Sqlitet
1aee0 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74 65  estsse_Init(inte
1aef0 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  rp);.#endif.  }.
1af00 23 65 6e 64 69 66 0a 20 20 69 66 28 20 61 72 67  #endif.  if( arg
1af10 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  c>=2 ){.    int 
1af20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 41 72 67  i;.    char zArg
1af30 63 5b 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74  c[32];.    sqlit
1af40 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1af50 6f 66 28 7a 41 72 67 63 29 2c 20 7a 41 72 67 63  of(zArgc), zArgc
1af60 2c 20 22 25 64 22 2c 20 61 72 67 63 2d 28 33 2d  , "%d", argc-(3-
1af70 54 43 4c 53 48 29 29 3b 0a 20 20 20 20 54 63 6c  TCLSH));.    Tcl
1af80 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
1af90 61 72 67 63 22 2c 20 7a 41 72 67 63 2c 20 54 43  argc", zArgc, TC
1afa0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
1afb0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
1afc0 6e 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72  nterp,"argv0",ar
1afd0 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c  gv[1],TCL_GLOBAL
1afe0 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f  _ONLY);.    Tcl_
1aff0 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61  SetVar(interp,"a
1b000 72 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c  rgv", "", TCL_GL
1b010 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  OBAL_ONLY);.    
1b020 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69  for(i=3-TCLSH; i
1b030 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1b040 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
1b050 74 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72  terp, "argv", ar
1b060 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  gv[i],.         
1b070 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
1b080 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d   | TCL_LIST_ELEM
1b090 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44  ENT | TCL_APPEND
1b0a0 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20  _VALUE);.    }. 
1b0b0 20 20 20 69 66 28 20 54 63 6c 5f 45 76 61 6c 46     if( Tcl_EvalF
1b0c0 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ile(interp, argv
1b0d0 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  [1])!=TCL_OK ){.
1b0e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1b0f0 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65   *zInfo = Tcl_Ge
1b100 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72  tVar(interp, "er
1b110 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c  rorInfo", TCL_GL
1b120 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  OBAL_ONLY);.    
1b130 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29    if( zInfo==0 )
1b140 20 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74   zInfo = Tcl_Get
1b150 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
1b160 65 72 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69  erp);.      fpri
1b170 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
1b180 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49  %s\n", *argv, zI
1b190 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  nfo);.      retu
1b1a0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b1b0 20 20 69 66 28 20 61 72 67 63 3c 3d 31 20 29 7b    if( argc<=1 ){
1b1c0 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  .    Tcl_GlobalE
1b1d0 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69  val(interp, zMai
1b1e0 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  nloop);.  }.  re
1b1f0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1b200 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a            /* TCLSH */.