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

Artifact 4f274fae3d4a1863451a553dd8e5015747a5d91d:


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 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 74  ite.**.** $Id: t
01a0: 63 6c 73 71 6c 69 74 65 2e 63 2c 76 20 31 2e 31  clsqlite.c,v 1.1
01b0: 33 33 20 32 30 30 35 2f 31 30 2f 30 35 20 31 30  33 2005/10/05 10
01c0: 3a 34 30 3a 31 35 20 64 72 68 20 45 78 70 20 24  :40:15 drh Exp $
01d0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 54  .*/.#ifndef NO_T
01e0: 43 4c 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 74  CL     /* Omit t
01f0: 68 69 73 20 77 68 6f 6c 65 20 66 69 6c 65 20 69  his whole file i
0200: 66 20 54 43 4c 20 69 73 20 75 6e 61 76 61 69 6c  f TCL is unavail
0210: 61 62 6c 65 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64  able */..#includ
0220: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0230: 23 69 6e 63 6c 75 64 65 20 22 68 61 73 68 2e 68  #include "hash.h
0240: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e  ".#include "tcl.
0250: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
0260: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0270: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0280: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0290: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
02a0: 3e 0a 0a 2f 2a 0a 20 2a 20 57 69 6e 64 6f 77 73  >../*. * Windows
02b0: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77   needs to know w
02c0: 68 69 63 68 20 73 79 6d 62 6f 6c 73 20 74 6f 20  hich symbols to 
02d0: 65 78 70 6f 72 74 2e 20 20 55 6e 69 78 20 64 6f  export.  Unix do
02e0: 65 73 20 6e 6f 74 2e 0a 20 2a 20 42 55 49 4c 44  es not.. * BUILD
02f0: 5f 73 71 6c 69 74 65 20 73 68 6f 75 6c 64 20 62  _sqlite should b
0300: 65 20 75 6e 64 65 66 69 6e 65 64 20 66 6f 72 20  e undefined for 
0310: 55 6e 69 78 2e 0a 20 2a 2f 0a 0a 23 69 66 64 65  Unix.. */..#ifde
0320: 66 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 0a 23  f BUILD_sqlite.#
0330: 75 6e 64 65 66 20 54 43 4c 5f 53 54 4f 52 41 47  undef TCL_STORAG
0340: 45 5f 43 4c 41 53 53 0a 23 64 65 66 69 6e 65 20  E_CLASS.#define 
0350: 54 43 4c 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53  TCL_STORAGE_CLAS
0360: 53 20 44 4c 4c 45 58 50 4f 52 54 0a 23 65 6e 64  S DLLEXPORT.#end
0370: 69 66 20 2f 2a 20 42 55 49 4c 44 5f 73 71 6c 69  if /* BUILD_sqli
0380: 74 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4e  te */..#define N
0390: 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  UM_PREPARED_STMT
03a0: 53 20 31 30 0a 23 64 65 66 69 6e 65 20 4d 41 58  S 10.#define MAX
03b0: 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20  _PREPARED_STMTS 
03c0: 31 30 30 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43  100../*.** If TC
03d0: 4c 20 75 73 65 73 20 55 54 46 2d 38 20 61 6e 64  L uses UTF-8 and
03e0: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 66 69   SQLite is confi
03f0: 67 75 72 65 64 20 74 6f 20 75 73 65 20 69 73 6f  gured to use iso
0400: 38 38 35 39 2c 20 74 68 65 6e 20 77 65 0a 2a 2a  8859, then we.**
0410: 20 68 61 76 65 20 74 6f 20 64 6f 20 61 20 74 72   have to do a tr
0420: 61 6e 73 6c 61 74 69 6f 6e 20 77 68 65 6e 20 67  anslation when g
0430: 6f 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65  oing between the
0440: 20 74 77 6f 2e 20 20 53 65 74 20 74 68 65 20 0a   two.  Set the .
0450: 2a 2a 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49  ** UTF_TRANSLATI
0460: 4f 4e 5f 4e 45 45 44 45 44 20 6d 61 63 72 6f 20  ON_NEEDED macro 
0470: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
0480: 20 77 65 20 6e 65 65 64 20 74 6f 20 64 6f 0a 2a   we need to do.*
0490: 2a 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69  * this translati
04a0: 6f 6e 2e 20 20 0a 2a 2f 0a 23 69 66 20 64 65 66  on.  .*/.#if def
04b0: 69 6e 65 64 28 54 43 4c 5f 55 54 46 5f 4d 41 58  ined(TCL_UTF_MAX
04c0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
04d0: 4c 49 54 45 5f 55 54 46 38 29 0a 23 20 64 65 66  LITE_UTF8).# def
04e0: 69 6e 65 20 55 54 46 5f 54 52 41 4e 53 4c 41 54  ine UTF_TRANSLAT
04f0: 49 4f 4e 5f 4e 45 45 44 45 44 20 31 0a 23 65 6e  ION_NEEDED 1.#en
0500: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53  dif../*.** New S
0510: 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  QL functions can
0520: 20 62 65 20 63 72 65 61 74 65 64 20 61 73 20 54   be created as T
0530: 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61 63  CL scripts.  Eac
0540: 68 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 0a  h such function.
0550: 2a 2a 20 69 73 20 64 65 73 63 72 69 62 65 64 20  ** is described 
0560: 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  by an instance o
0570: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0580: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
0590: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
05a0: 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a 73 74  Func SqlFunc;.st
05b0: 72 75 63 74 20 53 71 6c 46 75 6e 63 20 7b 0a 20  ruct SqlFunc {. 
05c0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
05d0: 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43  erp;   /* The TC
05e0: 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65  L interpret to e
05f0: 78 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74  xecute the funct
0600: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ion */.  Tcl_Obj
0610: 20 2a 70 53 63 72 69 70 74 3b 20 20 20 20 20 2f   *pScript;     /
0620: 2a 20 54 68 65 20 54 63 6c 5f 4f 62 6a 20 72 65  * The Tcl_Obj re
0630: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
0640: 74 68 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  the script */.  
0650: 69 6e 74 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b  int useEvalObjv;
0660: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0670: 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75   it is safe to u
0680: 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20  se Tcl_EvalObjv 
0690: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
06a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ;          /* Na
06b0: 6d 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  me of this funct
06c0: 69 6f 6e 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63  ion */.  SqlFunc
06d0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f   *pNext;       /
06e0: 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20  * Next function 
06f0: 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74  on the list of t
0700: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  hem all */.};../
0710: 2a 0a 2a 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69  *.** New collati
0720: 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 66 75 6e  on sequences fun
0730: 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 63 72 65  ction can be cre
0740: 61 74 65 64 20 61 73 20 54 43 4c 20 73 63 72 69  ated as TCL scri
0750: 70 74 73 2e 20 20 45 61 63 68 20 73 75 63 68 0a  pts.  Each such.
0760: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64  ** function is d
0770: 65 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69  escribed by an i
0780: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0790: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
07a0: 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  re..*/.typedef s
07b0: 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65  truct SqlCollate
07c0: 20 53 71 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72   SqlCollate;.str
07d0: 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b  uct SqlCollate {
07e0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
07f0: 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20  nterp;   /* The 
0800: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f  TCL interpret to
0810: 20 65 78 65 63 75 74 65 20 74 68 65 20 66 75 6e   execute the fun
0820: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  ction */.  char 
0830: 2a 7a 53 63 72 69 70 74 3b 20 20 20 20 20 20 20  *zScript;       
0840: 20 2f 2a 20 54 68 65 20 73 63 72 69 70 74 20 74   /* The script t
0850: 6f 20 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71  o be run */.  Sq
0860: 6c 43 6f 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b  lCollate *pNext;
0870: 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63      /* Next func
0880: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74  tion on the list
0890: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
08a0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  };../*.** Prepar
08b0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ed statements ar
08c0: 65 20 63 61 63 68 65 64 20 66 6f 72 20 66 61 73  e cached for fas
08d0: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
08e0: 45 61 63 68 20 70 72 65 70 61 72 65 64 0a 2a 2a  Each prepared.**
08f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65   statement is de
0900: 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e  scribed by an in
0910: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0920: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
0930: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0940: 72 75 63 74 20 53 71 6c 50 72 65 70 61 72 65 64  ruct SqlPrepared
0950: 53 74 6d 74 20 53 71 6c 50 72 65 70 61 72 65 64  Stmt SqlPrepared
0960: 53 74 6d 74 3b 0a 73 74 72 75 63 74 20 53 71 6c  Stmt;.struct Sql
0970: 50 72 65 70 61 72 65 64 53 74 6d 74 20 7b 0a 20  PreparedStmt {. 
0980: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0990: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
09a0: 74 20 69 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74  t in linked list
09b0: 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65   */.  SqlPrepare
09c0: 64 53 74 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f  dStmt *pPrev;  /
09d0: 2a 20 50 72 65 76 69 6f 75 73 20 6f 6e 20 74 68  * Previous on th
09e0: 65 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69  e list */.  sqli
09f0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
0a00: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
0a10: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
0a20: 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20  /.  int nSql;   
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0a40: 63 68 61 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20  chars in zSql[] 
0a50: 2a 2f 0a 20 20 63 68 61 72 20 7a 53 71 6c 5b 31  */.  char zSql[1
0a60: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
0a70: 20 54 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   Text of the SQL
0a80: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b   statement */.};
0a90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ../*.** There is
0aa0: 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
0ab0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0ac0: 66 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20  for each SQLite 
0ad0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74  database.** that
0ae0: 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64   has been opened
0af0: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54   by the SQLite T
0b00: 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  CL interface..*/
0b10: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0b20: 53 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44  SqliteDb SqliteD
0b30: 62 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65  b;.struct Sqlite
0b40: 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db {.  sqlite3 *
0b50: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
0b60: 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22 20    /* The "real" 
0b70: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
0b80: 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  re */.  Tcl_Inte
0b90: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20  rp *interp;     
0ba0: 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70     /* The interp
0bb0: 72 65 74 65 72 20 75 73 65 64 20 66 6f 72 20 74  reter used for t
0bc0: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
0bd0: 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20    char *zBusy;  
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0bf0: 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  The busy callbac
0c00: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0c10: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20  har *zCommit;   
0c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0c30: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c   commit hook cal
0c40: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
0c50: 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b  .  char *zTrace;
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0c70: 20 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62   The trace callb
0c80: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
0c90: 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b   char *zProfile;
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0cb0: 68 65 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62  he profile callb
0cc0: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
0cd0: 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73   char *zProgress
0ce0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
0cf0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
0d00: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
0d10: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20    char *zAuth;  
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0d30: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
0d40: 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  n callback routi
0d50: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ne */.  char *zN
0d60: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
0d70: 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 73 75     /* Text to su
0d80: 62 73 74 69 74 75 74 65 20 66 6f 72 20 61 6e 20  bstitute for an 
0d90: 53 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a  SQL NULL value *
0da0: 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75  /.  SqlFunc *pFu
0db0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nc;            /
0dc0: 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 66 75  * List of SQL fu
0dd0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 53 71 6c  nctions */.  Sql
0de0: 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74  Collate *pCollat
0df0: 65 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  e;      /* List 
0e00: 6f 66 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  of SQL collation
0e10: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
0e20: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
0e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
0e40: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 6d 6f 73  turn code of mos
0e50: 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
0e60: 5f 65 78 65 63 28 29 20 2a 2f 0a 20 20 54 63 6c  _exec() */.  Tcl
0e70: 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61 74 65 4e 65  _Obj *pCollateNe
0e80: 65 64 65 64 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61  eded;   /* Colla
0e90: 74 69 6f 6e 20 6e 65 65 64 65 64 20 73 63 72 69  tion needed scri
0ea0: 70 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61  pt */.  SqlPrepa
0eb0: 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c 69 73  redStmt *stmtLis
0ec0: 74 3b 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 72  t; /* List of pr
0ed0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
0ee0: 73 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65  s*/.  SqlPrepare
0ef0: 64 53 74 6d 74 20 2a 73 74 6d 74 4c 61 73 74 3b  dStmt *stmtLast;
0f00: 20 2f 2a 20 4c 61 73 74 20 73 74 61 74 65 6d 65   /* Last stateme
0f10: 6e 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  nt in the list *
0f20: 2f 0a 20 20 69 6e 74 20 6d 61 78 53 74 6d 74 3b  /.  int maxStmt;
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0f40: 2a 20 54 68 65 20 6e 65 78 74 20 6d 61 78 69 6d  * The next maxim
0f50: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 6d  um number of stm
0f60: 74 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  tList */.  int n
0f70: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
0f80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0f90: 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  of statements in
0fa0: 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 7d 3b 0a   stmtList */.};.
0fb0: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74  ./*.** Look at t
0fc0: 68 65 20 73 63 72 69 70 74 20 70 72 65 66 69 78  he script prefix
0fd0: 20 69 6e 20 70 43 6d 64 2e 20 20 57 65 20 77 69   in pCmd.  We wi
0fe0: 6c 6c 20 62 65 20 65 78 65 63 75 74 69 6e 67 20  ll be executing 
0ff0: 74 68 69 73 20 73 63 72 69 70 74 0a 2a 2a 20 61  this script.** a
1000: 66 74 65 72 20 66 69 72 73 74 20 61 70 70 65 6e  fter first appen
1010: 64 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ding one or more
1020: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69   arguments.  Thi
1030: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
1040: 65 73 0a 2a 2a 20 74 68 65 20 73 63 72 69 70 74  es.** the script
1050: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73   to see if it is
1060: 20 73 61 66 65 20 74 6f 20 75 73 65 20 54 63 6c   safe to use Tcl
1070: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74  _EvalObjv() on t
1080: 68 65 20 73 63 72 69 70 74 0a 2a 2a 20 72 61 74  he script.** rat
1090: 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d 6f 72  her than the mor
10a0: 65 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76  e general Tcl_Ev
10b0: 61 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45 76 61  alEx().  Tcl_Eva
10c0: 6c 4f 62 6a 76 28 29 20 69 73 20 6d 75 63 68 0a  lObjv() is much.
10d0: 2a 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ** faster..**.**
10e0: 20 53 63 72 69 70 74 73 20 74 68 61 74 20 61 72   Scripts that ar
10f0: 65 20 73 61 66 65 20 74 6f 20 75 73 65 20 77 69  e safe to use wi
1100: 74 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  th Tcl_EvalObjv(
1110: 29 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a  ) consists of a.
1120: 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20  ** command name 
1130: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f  followed by zero
1140: 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e   or more argumen
1150: 74 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d  ts with no [...]
1160: 20 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e   or $.** or {...
1170: 7d 20 6f 72 20 3b 20 74 6f 20 62 65 20 73 65 65  } or ; to be see
1180: 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73  n anywhere.  Mos
1190: 74 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70  t callback scrip
11a0: 74 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66  ts consist.** of
11b0: 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 70   just a single p
11c0: 72 6f 63 65 64 75 72 65 20 6e 61 6d 65 20 61 6e  rocedure name an
11d0: 64 20 74 68 65 79 20 6d 65 65 74 20 74 68 69 73  d they meet this
11e0: 20 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f   requirement..*/
11f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 66 65  .static int safe
1200: 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 54 63  ToUseEvalObjv(Tc
1210: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1220: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29  , Tcl_Obj *pCmd)
1230: 7b 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20  {.  /* We could 
1240: 74 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68  try to do someth
1250: 69 6e 67 20 77 69 74 68 20 54 63 6c 5f 50 61 72  ing with Tcl_Par
1260: 73 65 28 29 2e 20 20 42 75 74 20 77 65 20 77 69  se().  But we wi
1270: 6c 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20  ll instead.  ** 
1280: 6a 75 73 74 20 64 6f 20 61 20 73 65 61 72 63 68  just do a search
1290: 20 66 6f 72 20 66 6f 72 62 69 64 64 65 6e 20 63   for forbidden c
12a0: 68 61 72 61 63 74 65 72 73 2e 20 20 49 66 20 61  haracters.  If a
12b0: 6e 79 20 6f 66 20 74 68 65 20 66 6f 72 62 69 64  ny of the forbid
12c0: 64 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63 74  den.  ** charact
12d0: 65 72 73 20 61 70 70 65 61 72 20 69 6e 20 70 43  ers appear in pC
12e0: 6d 64 2c 20 77 65 20 77 69 6c 6c 20 72 65 70 6f  md, we will repo
12f0: 72 74 20 74 68 65 20 73 74 72 69 6e 67 20 61 73  rt the string as
1300: 20 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20   unsafe..  */.  
1310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
1320: 20 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63   int n;.  z = Tc
1330: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
1340: 62 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20  bj(pCmd, &n);.  
1350: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
1360: 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 28  {.    int c = *(
1370: 7a 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  z++);.    if( c=
1380: 3d 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c  ='$' || c=='[' |
1390: 7c 20 63 3d 3d 27 3b 27 20 29 20 72 65 74 75 72  | c==';' ) retur
13a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
13b0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  n 1;.}../*.** Fi
13c0: 6e 64 20 61 6e 20 53 71 6c 46 75 6e 63 20 73 74  nd an SqlFunc st
13d0: 72 75 63 74 75 72 65 20 77 69 74 68 20 74 68 65  ructure with the
13e0: 20 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72   given name.  Or
13f0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a   create a new.**
1400: 20 6f 6e 65 20 69 66 20 61 6e 20 65 78 69 73 74   one if an exist
1410: 69 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62  ing one cannot b
1420: 65 20 66 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e  e found.  Return
1430: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1440: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  e.** structure..
1450: 2a 2f 0a 73 74 61 74 69 63 20 53 71 6c 46 75 6e  */.static SqlFun
1460: 63 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28 53  c *findSqlFunc(S
1470: 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 63 6f  qliteDb *pDb, co
1480: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
1490: 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20  {.  SqlFunc *p, 
14a0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
14b0: 20 20 70 4e 65 77 20 3d 20 28 53 71 6c 46 75 6e    pNew = (SqlFun
14c0: 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  c*)Tcl_Alloc( si
14d0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 73 74  zeof(*pNew) + st
14e0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20  rlen(zName) + 1 
14f0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  );.  pNew->zName
1500: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
1510: 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a  1];.  for(i=0; z
1520: 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70  Name[i]; i++){ p
1530: 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20  New->zName[i] = 
1540: 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 69 5d  tolower(zName[i]
1550: 29 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61  ); }.  pNew->zNa
1560: 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72  me[i] = 0;.  for
1570: 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70  (p=pDb->pFunc; p
1580: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a  ; p=p->pNext){ .
1590: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
15a0: 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  ->zName, pNew->z
15b0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
15c0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
15d0: 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72  *)pNew);.      r
15e0: 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 7d 0a 20  eturn p;.    }. 
15f0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65 72   }.  pNew->inter
1600: 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b  p = pDb->interp;
1610: 0a 20 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74  .  pNew->pScript
1620: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1630: 65 78 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63  ext = pDb->pFunc
1640: 3b 0a 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d  ;.  pDb->pFunc =
1650: 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20   pNew;.  return 
1660: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
1670: 69 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72 65 65  inalize and free
1680: 20 61 20 6c 69 73 74 20 6f 66 20 70 72 65 70 61   a list of prepa
1690: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  red statements.*
16a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c  /.static void fl
16b0: 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 53 71  ushStmtCache( Sq
16c0: 6c 69 74 65 44 62 20 2a 70 44 62 20 29 7b 0a 20  liteDb *pDb ){. 
16d0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
16e0: 20 2a 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 77   *pPreStmt;..  w
16f0: 68 69 6c 65 28 20 20 70 44 62 2d 3e 73 74 6d 74  hile(  pDb->stmt
1700: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  List ){.    sqli
1710: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 20 70 44  te3_finalize( pD
1720: 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74  b->stmtList->pSt
1730: 6d 74 20 29 3b 0a 20 20 20 20 70 50 72 65 53 74  mt );.    pPreSt
1740: 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  mt = pDb->stmtLi
1750: 73 74 3b 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d  st;.    pDb->stm
1760: 74 4c 69 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d  tList = pDb->stm
1770: 74 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  tList->pNext;.  
1780: 20 20 54 63 6c 5f 46 72 65 65 28 20 28 63 68 61    Tcl_Free( (cha
1790: 72 2a 29 70 50 72 65 53 74 6d 74 20 29 3b 0a 20  r*)pPreStmt );. 
17a0: 20 7d 0a 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20   }.  pDb->nStmt 
17b0: 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74  = 0;.  pDb->stmt
17c0: 4c 61 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Last = 0;.}../*.
17d0: 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69  ** TCL calls thi
17e0: 73 20 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e  s procedure when
17f0: 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61   an sqlite3 data
1800: 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a  base command is.
1810: 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  ** deleted..*/.s
1820: 74 61 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c  tatic void DbDel
1830: 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29  eteCmd(void *db)
1840: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
1850: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64  b = (SqliteDb*)d
1860: 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61  b;.  flushStmtCa
1870: 63 68 65 28 70 44 62 29 3b 0a 20 20 73 71 6c 69  che(pDb);.  sqli
1880: 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64  te3_close(pDb->d
1890: 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62  b);.  while( pDb
18a0: 2d 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53  ->pFunc ){.    S
18b0: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20  qlFunc *pFunc = 
18c0: 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  pDb->pFunc;.    
18d0: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  pDb->pFunc = pFu
18e0: 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54  nc->pNext;.    T
18f0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1900: 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b  pFunc->pScript);
1910: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
1920: 68 61 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d  har*)pFunc);.  }
1930: 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70  .  while( pDb->p
1940: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53  Collate ){.    S
1950: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c  qlCollate *pColl
1960: 61 74 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c  ate = pDb->pColl
1970: 61 74 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43  ate;.    pDb->pC
1980: 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74  ollate = pCollat
1990: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  e->pNext;.    Tc
19a0: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 43  l_Free((char*)pC
19b0: 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69  ollate);.  }.  i
19c0: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
19d0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
19e0: 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20  b->zBusy);.  }. 
19f0: 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
1a00: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
1a10: 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20  (pDb->zTrace);. 
1a20: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 50   }.  if( pDb->zP
1a30: 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 54 63  rofile ){.    Tc
1a40: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f  l_Free(pDb->zPro
1a50: 66 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  file);.  }.  if(
1a60: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
1a70: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
1a80: 3e 7a 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69  >zAuth);.  }.  i
1a90: 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b  f( pDb->zNull ){
1aa0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
1ab0: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  b->zNull);.  }. 
1ac0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
1ad0: 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  )pDb);.}../*.** 
1ae0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1af0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 64 61  called when a da
1b00: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6c  tabase file is l
1b10: 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72 79 69  ocked while tryi
1b20: 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75 74 65  ng.** to execute
1b30: 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   SQL..*/.static 
1b40: 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64 6c 65  int DbBusyHandle
1b50: 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e 74 20  r(void *cd, int 
1b60: 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c 69 74  nTries){.  Sqlit
1b70: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
1b80: 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20  teDb*)cd;.  int 
1b90: 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61 6c 5b  rc;.  char zVal[
1ba0: 33 30 5d 3b 0a 0a 20 20 73 70 72 69 6e 74 66 28  30];..  sprintf(
1bb0: 7a 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69  zVal, "%d", nTri
1bc0: 65 73 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f  es);.  rc = Tcl_
1bd0: 56 61 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  VarEval(pDb->int
1be0: 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c  erp, pDb->zBusy,
1bf0: 20 22 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68 61   " ", zVal, (cha
1c00: 72 2a 29 30 29 3b 0a 20 20 69 66 28 20 72 63 21  r*)0);.  if( rc!
1c10: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
1c20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
1c30: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
1c40: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1c50: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1c60: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  1;.}../*.** This
1c70: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
1c80: 6b 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67  ked as the 'prog
1c90: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66  ress callback' f
1ca0: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  or the database.
1cb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
1cc0: 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72  bProgressHandler
1cd0: 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71  (void *cd){.  Sq
1ce0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
1cf0: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
1d00: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1d10: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
1d20: 20 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45   );.  rc = Tcl_E
1d30: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
1d40: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29   pDb->zProgress)
1d50: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
1d60: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
1d70: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
1d80: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
1d90: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1da0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1db0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1dc0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
1dd0: 20 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63   the SQLite trac
1de0: 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76  e handler whenev
1df0: 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63  er a new.** bloc
1e00: 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63  k of SQL is exec
1e10: 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73  uted.  The TCL s
1e20: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54  cript in pDb->zT
1e30: 72 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64  race is executed
1e40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e50: 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28   DbTraceHandler(
1e60: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
1e70: 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53  char *zSql){.  S
1e80: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
1e90: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
1ea0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
1eb0: 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ..  Tcl_DStringI
1ec0: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
1ed0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
1ee0: 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  str, pDb->zTrace
1ef0: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
1f00: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
1f10: 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20  t(&str, zSql);. 
1f20: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
1f30: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
1f40: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
1f50: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
1f60: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
1f70: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
1f80: 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  interp);.}../*.*
1f90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1fa0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
1fb0: 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20 68  SQLite profile h
1fc0: 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20 73  andler after a s
1fd0: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c 20  tatement.** SQL 
1fe0: 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20 54  has executed.  T
1ff0: 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  he TCL script in
2000: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 69   pDb->zProfile i
2010: 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a  s evaluated..*/.
2020: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50 72  static void DbPr
2030: 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f 69  ofileHandler(voi
2040: 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61  d *cd, const cha
2050: 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65 5f  r *zSql, sqlite_
2060: 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53 71  uint64 tm){.  Sq
2070: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
2080: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
2090: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
20a0: 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d 3b    char zTm[100];
20b0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
20c0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d 29  intf(sizeof(zTm)
20d0: 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22 2c  -1, zTm, "%lld",
20e0: 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   tm);.  Tcl_DStr
20f0: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
2100: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
2110: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 50  nd(&str, pDb->zP
2120: 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 54  rofile, -1);.  T
2130: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
2140: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53  Element(&str, zS
2150: 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ql);.  Tcl_DStri
2160: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
2170: 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54 63  &str, zTm);.  Tc
2180: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
2190: 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  rp, Tcl_DStringV
21a0: 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54  alue(&str));.  T
21b0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
21c0: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  str);.  Tcl_Rese
21d0: 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  tResult(pDb->int
21e0: 65 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  erp);.}../*.** T
21f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2200: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
2210: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2220: 69 74 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54  itted.  The.** T
2230: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
2240: 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78 65  ->zCommit is exe
2250: 63 75 74 65 64 2e 20 20 49 66 20 69 74 20 72 65  cuted.  If it re
2260: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  turns non-zero o
2270: 72 0a 2a 2a 20 69 66 20 69 74 20 74 68 72 6f 77  r.** if it throw
2280: 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20  s an exception, 
2290: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
22a0: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  is rolled back i
22b0: 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69  nstead.** of bei
22c0: 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  ng committed..*/
22d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 43 6f  .static int DbCo
22e0: 6d 6d 69 74 48 61 6e 64 6c 65 72 28 76 6f 69 64  mmitHandler(void
22f0: 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44   *cd){.  SqliteD
2300: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
2310: 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63  Db*)cd;.  int rc
2320: 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  ;..  rc = Tcl_Ev
2330: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
2340: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20  pDb->zCommit);. 
2350: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
2360: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
2370: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
2380: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
2390: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
23a0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
23b0: 61 74 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c  atic void tclCol
23c0: 6c 61 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f  lateNeeded(.  vo
23d0: 69 64 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69  id *pCtx,.  sqli
23e0: 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65  te3 *db,.  int e
23f0: 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  nc,.  const char
2400: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c   *zName.){.  Sql
2410: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
2420: 6c 69 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20  liteDb *)pCtx;. 
2430: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
2440: 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  t = Tcl_Duplicat
2450: 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  eObj(pDb->pColla
2460: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c  teNeeded);.  Tcl
2470: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _IncrRefCount(pS
2480: 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69  cript);.  Tcl_Li
2490: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
24a0: 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54  nt(0, pScript, T
24b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
24c0: 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54  zName, -1));.  T
24d0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
24e0: 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  ->interp, pScrip
24f0: 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  t, 0);.  Tcl_Dec
2500: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
2510: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
2520: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2530: 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20  led to evaluate 
2540: 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  an SQL collation
2550: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
2560: 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54  ented.** using T
2570: 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74  CL script..*/.st
2580: 61 74 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43  atic int tclSqlC
2590: 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a  ollate(.  void *
25a0: 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a  pCtx,.  int nA,.
25b0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41    const void *zA
25c0: 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f  ,.  int nB,.  co
25d0: 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a  nst void *zB.){.
25e0: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20    SqlCollate *p 
25f0: 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29  = (SqlCollate *)
2600: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
2610: 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d  *pCmd;..  pCmd =
2620: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2630: 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31  j(p->zScript, -1
2640: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
2650: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54  Count(pCmd);.  T
2660: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2670: 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72  Element(p->inter
2680: 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  p, pCmd, Tcl_New
2690: 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41  StringObj(zA, nA
26a0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
26b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
26c0: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
26d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
26e0: 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c  (zB, nB));.  Tcl
26f0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
2700: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f  terp, pCmd, TCL_
2710: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
2720: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2730: 28 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e  (pCmd);.  return
2740: 20 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74   (atoi(Tcl_GetSt
2750: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
2760: 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  terp)));.}../*.*
2770: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2780: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c  s called to eval
2790: 75 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63  uate an SQL func
27a0: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  tion implemented
27b0: 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63  .** using TCL sc
27c0: 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ript..*/.static 
27d0: 76 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28  void tclSqlFunc(
27e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
27f0: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
2800: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
2810: 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46  e**argv){.  SqlF
2820: 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  unc *p = sqlite3
2830: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
2840: 78 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  xt);.  Tcl_Obj *
2850: 70 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pCmd;.  int i;. 
2860: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
2870: 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  argc==0 ){.    /
2880: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
2890: 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  o arguments to t
28a0: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c  he function, cal
28b0: 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20  l Tcl_EvalObjEx 
28c0: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63  on the.    ** sc
28d0: 72 69 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65  ript object dire
28e0: 63 74 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f  ctly.  This allo
28f0: 77 73 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69  ws the TCL compi
2900: 6c 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a  ler to generate.
2910: 20 20 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20      ** bytecode 
2920: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  for the command 
2930: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76  on the first inv
2940: 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73  ocation and thus
2950: 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62   make.    ** sub
2960: 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
2970: 6f 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e  ons much faster.
2980: 20 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70   */.    pCmd = p
2990: 2d 3e 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54  ->pScript;.    T
29a0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
29b0: 70 43 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20  pCmd);.    rc = 
29c0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
29d0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30  >interp, pCmd, 0
29e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
29f0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
2a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2a10: 66 20 74 68 65 72 65 20 61 72 65 20 61 72 67 75  f there are argu
2a20: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e  ments to the fun
2a30: 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68  ction, make a sh
2a40: 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68  allow copy of th
2a50: 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20  e.    ** script 
2a60: 6f 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20  object, lappend 
2a70: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74  the arguments, t
2a80: 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65  hen evaluate the
2a90: 20 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20   copy..    **.  
2aa0: 20 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77    ** By "shallow
2ab0: 22 20 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20  " copy, we mean 
2ac0: 61 20 6f 6e 6c 79 20 74 68 65 20 6f 75 74 65 72  a only the outer
2ad0: 20 6c 69 73 74 20 54 63 6c 5f 4f 62 6a 20 69 73   list Tcl_Obj is
2ae0: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 20 20 20   duplicated..   
2af0: 20 2a 2a 20 54 68 65 20 6e 65 77 20 54 63 6c 5f   ** The new Tcl_
2b00: 4f 62 6a 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  Obj contains poi
2b10: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6f 72 69  nters to the ori
2b20: 67 69 6e 61 6c 20 6c 69 73 74 20 65 6c 65 6d 65  ginal list eleme
2b30: 6e 74 73 2e 20 0a 20 20 20 20 2a 2a 20 54 68 61  nts. .    ** Tha
2b40: 74 20 77 61 79 2c 20 77 68 65 6e 20 54 63 6c 5f  t way, when Tcl_
2b50: 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 72 75  EvalObjv() is ru
2b60: 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72 73 20 74  n and shimmers t
2b70: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
2b80: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c  .    ** of the l
2b90: 69 73 74 20 74 6f 20 74 63 6c 43 6d 64 4e 61 6d  ist to tclCmdNam
2ba0: 65 54 79 70 65 2c 20 74 68 61 74 20 61 6c 74 65  eType, that alte
2bb0: 72 6e 61 74 65 20 72 65 70 72 65 73 65 6e 74 61  rnate representa
2bc0: 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  tion will.    **
2bd0: 20 62 65 20 70 72 65 73 65 72 76 65 64 20 61 6e   be preserved an
2be0: 64 20 72 65 75 73 65 64 20 6f 6e 20 74 68 65 20  d reused on the 
2bf0: 6e 65 78 74 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  next invocation.
2c00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  .    */.    Tcl_
2c10: 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20 20 20 20  Obj **aArg;.    
2c20: 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 66  int nArg;.    if
2c30: 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74  ( Tcl_ListObjGet
2c40: 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69 6e 74 65  Elements(p->inte
2c50: 72 70 2c 20 70 2d 3e 70 53 63 72 69 70 74 2c 20  rp, p->pScript, 
2c60: 26 6e 41 72 67 2c 20 26 61 41 72 67 29 20 29 7b  &nArg, &aArg) ){
2c70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
2c80: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
2c90: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
2ca0: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
2cb0: 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20  rp), -1); .     
2cc0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 20 20   return;.    }  
2cd0: 20 20 20 0a 20 20 20 20 70 43 6d 64 20 3d 20 54     .    pCmd = T
2ce0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6e 41  cl_NewListObj(nA
2cf0: 72 67 2c 20 61 41 72 67 29 3b 0a 20 20 20 20 54  rg, aArg);.    T
2d00: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
2d10: 70 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28 69  pCmd);.    for(i
2d20: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
2d30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2d40: 76 61 6c 75 65 20 2a 70 49 6e 20 3d 20 61 72 67  value *pIn = arg
2d50: 76 5b 69 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f  v[i];.      Tcl_
2d60: 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20  Obj *pVal;.     
2d70: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a         .      /*
2d80: 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e   Set pVal to con
2d90: 74 61 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f  tain the i'th co
2da0: 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77  lumn of this row
2db0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63  . */.      switc
2dc0: 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  h( sqlite3_value
2dd0: 5f 74 79 70 65 28 70 49 6e 29 20 29 7b 0a 20 20  _type(pIn) ){.  
2de0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
2df0: 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
2e00: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
2e10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
2e20: 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  tes(pIn);.      
2e30: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
2e40: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73  ewByteArrayObj(s
2e50: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
2e60: 62 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a  b(pIn), bytes);.
2e70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2e80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
2ea0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
2eb0: 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34      sqlite_int64
2ec0: 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   v = sqlite3_val
2ed0: 75 65 5f 69 6e 74 36 34 28 70 49 6e 29 3b 0a 20  ue_int64(pIn);. 
2ee0: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d           if( v>=
2ef0: 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20 76  -2147483647 && v
2f00: 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a  <=2147483647 ){.
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
2f20: 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a   = Tcl_NewIntObj
2f30: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
2f40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2f50: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
2f60: 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  WideIntObj(v);. 
2f70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
2fa0: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
2fb0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75   {.          dou
2fc0: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
2fd0: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e  value_double(pIn
2fe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
2ff0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  l = Tcl_NewDoubl
3000: 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20  eObj(r);.       
3010: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3020: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
3030: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a   SQLITE_NULL: {.
3040: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
3050: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3060: 6a 28 22 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  j("", 0);.      
3070: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3080: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66     }.        def
3090: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
30a0: 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71    int bytes = sq
30b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
30c0: 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  s(pIn);.        
30d0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
30e0: 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
30f0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e  3_value_text(pIn
3100: 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20  ), bytes);.     
3110: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3120: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3130: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73      rc = Tcl_Lis
3140: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3150: 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  t(p->interp, pCm
3160: 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  d, pVal);.      
3170: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
3180: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
3190: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20  nt(pCmd);.      
31a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
31b0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
31c0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
31d0: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
31e0: 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65  -1); .        re
31f0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
3200: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e    }.    if( !p->
3210: 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20  useEvalObjv ){. 
3220: 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c       /* Tcl_Eval
3230: 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74  ObjEx() will aut
3240: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20  omatically call 
3250: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69  Tcl_EvalObjv() i
3260: 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20  f pCmd.      ** 
3270: 69 73 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75  is a list withou
3280: 74 20 61 20 73 74 72 69 6e 67 20 72 65 70 72 65  t a string repre
3290: 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70  sentation.  To p
32a0: 72 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d  revent this from
32b0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e  .      ** happen
32c0: 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70  ing, make sure p
32d0: 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69 64 20  Cmd has a valid 
32e0: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
32f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54  ation */.      T
3300: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d  cl_GetString(pCm
3310: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  d);.    }.    rc
3320: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
3330: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
3340: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
3350: 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  T);.    Tcl_Decr
3360: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
3370: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26    }..  if( rc &&
3380: 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20   rc!=TCL_RETURN 
3390: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
33a0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
33b0: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
33c0: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
33d0: 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c  rp), -1); .  }el
33e0: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  se{.    Tcl_Obj 
33f0: 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f  *pVar = Tcl_GetO
3400: 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  bjResult(p->inte
3410: 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  rp);.    int n;.
3420: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20      u8 *data;.  
3430: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
3440: 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20  pVar->typePtr ? 
3450: 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e  pVar->typePtr->n
3460: 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 63 68  ame : "";.    ch
3470: 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b  ar c = zType[0];
3480: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20  .    if( c=='b' 
3490: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
34a0: 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20  "bytearray")==0 
34b0: 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d  && pVar->bytes==
34c0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  0 ){.      /* On
34d0: 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42  ly return a BLOB
34e0: 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c   type if the Tcl
34f0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62   variable is a b
3500: 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20  ytearray and.   
3510: 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72     ** has no str
3520: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
3530: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74  on. */.      dat
3540: 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  a = Tcl_GetByteA
3550: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72  rrayFromObj(pVar
3560: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &n);.      sql
3570: 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
3580: 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20  (context, data, 
3590: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
35a0: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
35b0: 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20 73  if( (c=='b' && s
35c0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f  trcmp(zType,"boo
35d0: 6c 65 61 6e 22 29 3d 3d 30 29 20 7c 7c 0a 20 20  lean")==0) ||.  
35e0: 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20          (c=='i' 
35f0: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
3600: 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20  "int")==0) ){.  
3610: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72      Tcl_GetIntFr
3620: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
3630: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
3640: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
3650: 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  text, n);.    }e
3660: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26  lse if( c=='d' &
3670: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
3680: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
3690: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
36a0: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
36b0: 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  leFromObj(0, pVa
36c0: 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71  r, &r);.      sq
36d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
36e0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b  ble(context, r);
36f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
3700: 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28  =='w' && strcmp(
3710: 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29  zType,"wideInt")
3720: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
3730: 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20  _WideInt v;.    
3740: 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74    Tcl_GetWideInt
3750: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
3760: 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &v);.      sqli
3770: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
3780: 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20  (context, v);.  
3790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
37a0: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ata = Tcl_GetStr
37b0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  ingFromObj(pVar,
37c0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
37d0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
37e0: 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e  context, data, n
37f0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
3800: 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  NT);.    }.  }.}
3810: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3820: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
3830: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ION./*.** This i
3840: 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61  s the authentica
3850: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20  tion function.  
3860: 49 74 20 61 70 70 65 6e 64 73 20 74 68 65 20 61  It appends the a
3870: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a  uthentication.**
3880: 20 74 79 70 65 20 63 6f 64 65 20 61 6e 64 20 74   type code and t
3890: 68 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73  he two arguments
38a0: 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20   to zCmd[] then 
38b0: 69 6e 76 6f 6b 65 73 20 74 68 65 20 72 65 73 75  invokes the resu
38c0: 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74  lt.** on the int
38d0: 65 72 70 72 65 74 65 72 2e 20 20 54 68 65 20 72  erpreter.  The r
38e0: 65 70 6c 79 20 69 73 20 65 78 61 6d 69 6e 65 64  eply is examined
38f0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
3900: 20 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69   the.** authenti
3910: 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20  cation fails or 
3920: 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61  succeeds..*/.sta
3930: 74 69 63 20 69 6e 74 20 61 75 74 68 5f 63 61 6c  tic int auth_cal
3940: 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70  lback(.  void *p
3950: 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c  Arg,.  int code,
3960: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3970: 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg1,.  const ch
3980: 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e  ar *zArg2,.  con
3990: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a  st char *zArg3,.
39a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
39b0: 72 67 34 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  rg4.){.  char *z
39c0: 43 6f 64 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Code;.  Tcl_DStr
39d0: 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72  ing str;.  int r
39e0: 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c;.  const char 
39f0: 2a 7a 52 65 70 6c 79 3b 0a 20 20 53 71 6c 69 74  *zReply;.  Sqlit
3a00: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
3a10: 74 65 44 62 2a 29 70 41 72 67 3b 0a 0a 20 20 73  teDb*)pArg;..  s
3a20: 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20  witch( code ){. 
3a30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3a40: 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20 20  OPY             
3a50: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3a60: 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20  _COPY"; break;. 
3a70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3a80: 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20  REATE_INDEX     
3a90: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3aa0: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20  _CREATE_INDEX"; 
3ab0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3ac0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
3ad0: 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  BLE      : zCode
3ae0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
3af0: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
3b00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3b10: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
3b20: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3b30: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
3b40: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
3b50: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
3b60: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20  TE_TEMP_TABLE : 
3b70: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
3b80: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22  EATE_TEMP_TABLE"
3b90: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
3ba0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
3bb0: 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43  TEMP_TRIGGER: zC
3bc0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
3bd0: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  TE_TEMP_TRIGGER"
3be0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
3bf0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
3c00: 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f  TEMP_VIEW  : zCo
3c10: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
3c20: 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72  E_TEMP_VIEW"; br
3c30: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
3c40: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47  LITE_CREATE_TRIG
3c50: 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  GER    : zCode="
3c60: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
3c70: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
3c80: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3c90: 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20 20  REATE_VIEW      
3ca0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3cb0: 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62  _CREATE_VIEW"; b
3cc0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3cd0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20  QLITE_DELETE    
3ce0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
3cf0: 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b  "SQLITE_DELETE";
3d00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3d10: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
3d20: 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  EX        : zCod
3d30: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  e="SQLITE_DROP_I
3d40: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
3d50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
3d60: 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20  OP_TABLE        
3d70: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
3d80: 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  DROP_TABLE"; bre
3d90: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
3da0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
3db0: 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  DEX   : zCode="S
3dc0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
3dd0: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
3de0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
3df0: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20  ROP_TEMP_TABLE  
3e00: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3e10: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
3e20: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
3e30: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
3e40: 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43  EMP_TRIGGER : zC
3e50: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
3e60: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20  _TEMP_TRIGGER"; 
3e70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3e80: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
3e90: 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65  _VIEW    : zCode
3ea0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
3eb0: 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  MP_VIEW"; break;
3ec0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3ed0: 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20  _DROP_TRIGGER   
3ee0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
3ef0: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22  TE_DROP_TRIGGER"
3f00: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
3f10: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  e SQLITE_DROP_VI
3f20: 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  EW         : zCo
3f30: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
3f40: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
3f50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
3f60: 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20  SERT            
3f70: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
3f80: 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a  INSERT"; break;.
3f90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3fa0: 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20  PRAGMA          
3fb0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
3fc0: 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b  E_PRAGMA"; break
3fd0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
3fe0: 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  E_READ          
3ff0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
4000: 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b  ITE_READ"; break
4010: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
4020: 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20  E_SELECT        
4030: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
4040: 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65  ITE_SELECT"; bre
4050: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
4060: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20  ITE_TRANSACTION 
4070: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
4080: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
4090: 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  N"; break;.    c
40a0: 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ase SQLITE_UPDAT
40b0: 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  E            : z
40c0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44  Code="SQLITE_UPD
40d0: 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATE"; break;.   
40e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54   case SQLITE_ATT
40f0: 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a  ACH            :
4100: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
4110: 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20  TTACH"; break;. 
4120: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
4130: 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  ETACH           
4140: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
4150: 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _DETACH"; break;
4160: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4170: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20  _ALTER_TABLE    
4180: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4190: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b  TE_ALTER_TABLE";
41a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
41b0: 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20   SQLITE_REINDEX 
41c0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
41d0: 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e="SQLITE_REINDE
41e0: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
41f0: 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59  ase SQLITE_ANALY
4200: 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  ZE           : z
4210: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41  Code="SQLITE_ANA
4220: 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LYZE"; break;.  
4230: 20 20 64 65 66 61 75 6c 74 20 20 20 20 20 20 20    default       
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4250: 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20  : zCode="????"; 
4260: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c  break;.  }.  Tcl
4270: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
4280: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
4290: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
42a0: 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20  b->zAuth, -1);. 
42b0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
42c0: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
42d0: 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53  zCode);.  Tcl_DS
42e0: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
42f0: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f  nt(&str, zArg1 ?
4300: 20 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20   zArg1 : "");.  
4310: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
4320: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
4330: 41 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22  Arg2 ? zArg2 : "
4340: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
4350: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
4360: 73 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72  str, zArg3 ? zAr
4370: 67 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g3 : "");.  Tcl_
4380: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
4390: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34  ment(&str, zArg4
43a0: 20 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a   ? zArg4 : "");.
43b0: 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61    rc = Tcl_Globa
43c0: 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72  lEval(pDb->inter
43d0: 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  p, Tcl_DStringVa
43e0: 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63  lue(&str));.  Tc
43f0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73  l_DStringFree(&s
4400: 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20  tr);.  zReply = 
4410: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
4420: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
4430: 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ;.  if( strcmp(z
4440: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b  Reply,"SQLITE_OK
4450: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
4460: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
4470: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
4480: 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44  zReply,"SQLITE_D
4490: 45 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ENY")==0 ){.    
44a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59  rc = SQLITE_DENY
44b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
44c0: 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c  rcmp(zReply,"SQL
44d0: 49 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20  ITE_IGNORE")==0 
44e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
44f0: 54 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c  TE_IGNORE;.  }el
4500: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 39 39 39  se{.    rc = 999
4510: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4520: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
4530: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
4540: 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a  RIZATION */../*.
4550: 2a 2a 20 7a 54 65 78 74 20 69 73 20 61 20 70 6f  ** zText is a po
4560: 69 6e 74 65 72 20 74 6f 20 74 65 78 74 20 6f 62  inter to text ob
4570: 74 61 69 6e 65 64 20 76 69 61 20 61 6e 20 73 71  tained via an sq
4580: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4590: 74 28 29 0a 2a 2a 20 6f 72 20 73 69 6d 69 6c 61  t().** or simila
45a0: 72 20 69 6e 74 65 72 66 61 63 65 2e 20 54 68 69  r interface. Thi
45b0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
45c0: 73 20 61 20 54 63 6c 20 73 74 72 69 6e 67 20 6f  s a Tcl string o
45d0: 62 6a 65 63 74 2c 20 0a 2a 2a 20 72 65 66 65 72  bject, .** refer
45e0: 65 6e 63 65 20 63 6f 75 6e 74 20 73 65 74 20 74  ence count set t
45f0: 6f 20 30 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20  o 0, containing 
4600: 74 68 65 20 74 65 78 74 2e 20 49 66 20 61 20 74  the text. If a t
4610: 72 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65  ranslation.** be
4620: 74 77 65 65 6e 20 69 73 6f 38 38 35 39 20 61 6e  tween iso8859 an
4630: 64 20 55 54 46 2d 38 20 69 73 20 72 65 71 75 69  d UTF-8 is requi
4640: 72 65 64 2c 20 69 74 20 69 73 20 70 72 65 66 6f  red, it is prefo
4650: 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rmed..*/.static 
4660: 54 63 6c 5f 4f 62 6a 20 2a 64 62 54 65 78 74 54  Tcl_Obj *dbTextT
4670: 6f 4f 62 6a 28 63 68 61 72 20 63 6f 6e 73 74 20  oObj(char const 
4680: 2a 7a 54 65 78 74 29 7b 0a 20 20 54 63 6c 5f 4f  *zText){.  Tcl_O
4690: 62 6a 20 2a 70 56 61 6c 3b 0a 23 69 66 64 65 66  bj *pVal;.#ifdef
46a0: 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e   UTF_TRANSLATION
46b0: 5f 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f 44 53  _NEEDED.  Tcl_DS
46c0: 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 54 63  tring dCol;.  Tc
46d0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
46e0: 43 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45 78 74 65  Col);.  Tcl_Exte
46f0: 72 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e 67  rnalToUtfDString
4700: 28 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c 20 2d 31  (NULL, zText, -1
4710: 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 70 56 61 6c  , &dCol);.  pVal
4720: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
4730: 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67 56  Obj(Tcl_DStringV
4740: 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29  alue(&dCol), -1)
4750: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
4760: 72 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65 6c 73  ree(&dCol);.#els
4770: 65 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e  e.  pVal = Tcl_N
4780: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 65 78  ewStringObj(zTex
4790: 74 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20  t, -1);.#endif. 
47a0: 20 72 65 74 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a   return pVal;.}.
47b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
47c0: 69 6e 65 20 72 65 61 64 73 20 61 20 6c 69 6e 65  ine reads a line
47d0: 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 46 49   of text from FI
47e0: 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a  LE in, stores.**
47f0: 20 74 68 65 20 74 65 78 74 20 69 6e 20 6d 65 6d   the text in mem
4800: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
4810: 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72  m malloc() and r
4820: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
4830: 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65 78 74 2e  .** to the text.
4840: 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e    NULL is return
4850: 65 64 20 61 74 20 65 6e 64 20 6f 66 20 66 69 6c  ed at end of fil
4860: 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28  e, or if malloc(
4870: 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a  ).** fails..**.*
4880: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
4890: 69 73 20 6c 69 6b 65 20 22 72 65 61 64 6c 69 6e  is like "readlin
48a0: 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e  e" but no comman
48b0: 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67 0a 2a  d-line editing.*
48c0: 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  * is done..**.**
48d0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 68 65   copied from she
48e0: 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d 70 6f  ll.c from '.impo
48f0: 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73  rt' command.*/.s
4900: 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61  tatic char *loca
4910: 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a  l_getline(char *
4920: 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20 2a 69  zPrompt, FILE *i
4930: 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e  n){.  char *zLin
4940: 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a  e;.  int nLine;.
4950: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 65    int n;.  int e
4960: 6f 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31  ol;..  nLine = 1
4970: 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61  00;.  zLine = ma
4980: 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20  lloc( nLine );. 
4990: 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20   if( zLine==0 ) 
49a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20  return 0;.  n = 
49b0: 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a 20 20  0;.  eol = 0;.  
49c0: 77 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b 0a 20  while( !eol ){. 
49d0: 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69     if( n+100>nLi
49e0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e  ne ){.      nLin
49f0: 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30  e = nLine*2 + 10
4a00: 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d  0;.      zLine =
4a10: 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20   realloc(zLine, 
4a20: 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66  nLine);.      if
4a30: 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74  ( zLine==0 ) ret
4a40: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
4a50: 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e   if( fgets(&zLin
4a60: 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c  e[n], nLine - n,
4a70: 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   in)==0 ){.     
4a80: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
4a90: 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29       free(zLine)
4aa0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
4ab0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
4ac0: 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a    zLine[n] = 0;.
4ad0: 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20        eol = 1;. 
4ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4af0: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69  }.    while( zLi
4b00: 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  ne[n] ){ n++; }.
4b10: 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a      if( n>0 && z
4b20: 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20  Line[n-1]=='\n' 
4b30: 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  ){.      n--;.  
4b40: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
4b50: 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b  ;.      eol = 1;
4b60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69  .    }.  }.  zLi
4b70: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c  ne = realloc( zL
4b80: 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65  ine, n+1 );.  re
4b90: 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f  turn zLine;.}../
4ba0: 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69 74 65  *.** The "sqlite
4bb0: 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77 20  " command below 
4bc0: 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 54 63  creates a new Tc
4bd0: 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65 61  l command for ea
4be0: 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  ch.** connection
4bf0: 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e 20   it opens to an 
4c00: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
4c10: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
4c20: 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68 65  s invoked.** whe
4c30: 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68 6f  never one of tho
4c40: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70  se connection-sp
4c50: 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73 20  ecific commands 
4c60: 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 69  is executed.** i
4c70: 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78 61 6d  n Tcl.  For exam
4c80: 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75 6e 20  ple, if you run 
4c90: 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74 68  Tcl code like th
4ca0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
4cb0: 73 71 6c 69 74 65 33 20 64 62 31 20 20 22 6d 79  sqlite3 db1  "my
4cc0: 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20 20 20  _database".**   
4cd0: 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a 2a      db1 close.**
4ce0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f  .** The first co
4cf0: 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20 63 6f  mmand opens a co
4d00: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
4d10: 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20 64 61  "my_database" da
4d20: 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63 61  tabase.** and ca
4d30: 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65 63 74  lls that connect
4d40: 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68 65 20  ion "db1".  The 
4d50: 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20 63  second command c
4d60: 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20 73 75  auses this.** su
4d70: 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 20 69  broutine to be i
4d80: 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  nvoked..*/.stati
4d90: 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28 76  c int DbObjCmd(v
4da0: 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  oid *cd, Tcl_Int
4db0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
4dc0: 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63   objc,Tcl_Obj *c
4dd0: 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71  onst*objv){.  Sq
4de0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4df0: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
4e00: 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e 74  nt choice;.  int
4e10: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
4e20: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
4e30: 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20 7b  r *DB_strs[] = {
4e40: 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65 72  .    "authorizer
4e50: 22 2c 20 20 20 20 20 20 20 20 20 22 62 75 73 79  ",         "busy
4e60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4e70: 22 63 61 63 68 65 22 2c 0a 20 20 20 20 22 63 68  "cache",.    "ch
4e80: 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20  anges",         
4e90: 20 20 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20     "close",     
4ea0: 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74 65          "collate
4eb0: 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f  ",.    "collatio
4ec0: 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20 22 63 6f  n_needed",   "co
4ed0: 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20 20 20  mmit_hook",     
4ee0: 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 0a 20 20    "complete",.  
4ef0: 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20    "copy",       
4f00: 20 20 20 20 20 20 20 20 22 65 72 72 6f 72 63 6f          "errorco
4f10: 64 65 22 2c 20 20 20 20 20 20 20 20 20 22 65 76  de",         "ev
4f20: 61 6c 22 2c 0a 20 20 20 20 22 66 75 6e 63 74 69  al",.    "functi
4f30: 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  on",           "
4f40: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
4f50: 64 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c  d", "nullvalue",
4f60: 0a 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22  .    "onecolumn"
4f70: 2c 20 20 20 20 20 20 20 20 20 20 22 70 72 6f 66  ,          "prof
4f80: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
4f90: 22 70 72 6f 67 72 65 73 73 22 2c 0a 20 20 20 20  "progress",.    
4fa0: 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20  "rekey",        
4fb0: 20 20 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c        "timeout",
4fc0: 20 20 20 20 20 20 20 20 20 20 20 22 74 6f 74 61             "tota
4fd0: 6c 5f 63 68 61 6e 67 65 73 22 2c 0a 20 20 20 20  l_changes",.    
4fe0: 22 74 72 61 63 65 22 2c 20 20 20 20 20 20 20 20  "trace",        
4ff0: 20 20 20 20 20 20 22 74 72 61 6e 73 61 63 74 69        "transacti
5000: 6f 6e 22 2c 20 20 20 20 20 20 20 22 76 65 72 73  on",       "vers
5010: 69 6f 6e 22 2c 0a 20 20 20 20 30 20 20 20 20 20  ion",.    0     
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
5030: 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65    };.  enum DB_e
5040: 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54  num {.    DB_AUT
5050: 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20  HORIZER,        
5060: 44 42 5f 42 55 53 59 2c 20 20 20 20 20 20 20 20  DB_BUSY,        
5070: 20 20 20 20 20 44 42 5f 43 41 43 48 45 2c 0a 20       DB_CACHE,. 
5080: 20 20 20 44 42 5f 43 48 41 4e 47 45 53 2c 20 20     DB_CHANGES,  
5090: 20 20 20 20 20 20 20 20 20 44 42 5f 43 4c 4f 53           DB_CLOS
50a0: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 44 42  E,            DB
50b0: 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20 20 20 44 42  _COLLATE,.    DB
50c0: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
50d0: 44 2c 20 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f  D,  DB_COMMIT_HO
50e0: 4f 4b 2c 20 20 20 20 20 20 44 42 5f 43 4f 4d 50  OK,      DB_COMP
50f0: 4c 45 54 45 2c 0a 20 20 20 20 44 42 5f 43 4f 50  LETE,.    DB_COP
5100: 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,              
5110: 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20 20 20  DB_ERRORCODE,   
5120: 20 20 20 20 20 44 42 5f 45 56 41 4c 2c 0a 20 20       DB_EVAL,.  
5130: 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20    DB_FUNCTION,  
5140: 20 20 20 20 20 20 20 20 44 42 5f 4c 41 53 54 5f          DB_LAST_
5150: 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 44 42 5f  INSERT_ROWID,DB_
5160: 4e 55 4c 4c 56 41 4c 55 45 2c 0a 20 20 20 20 44  NULLVALUE,.    D
5170: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20 20  B_ONECOLUMN,    
5180: 20 20 20 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c       DB_PROFILE,
5190: 20 20 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f            DB_PRO
51a0: 47 52 45 53 53 2c 0a 20 20 20 20 44 42 5f 52 45  GRESS,.    DB_RE
51b0: 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  KEY,            
51c0: 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20 20 20 20   DB_TIMEOUT,    
51d0: 20 20 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43        DB_TOTAL_C
51e0: 48 41 4e 47 45 53 2c 0a 20 20 20 20 44 42 5f 54  HANGES,.    DB_T
51f0: 52 41 43 45 2c 20 20 20 20 20 20 20 20 20 20 20  RACE,           
5200: 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e    DB_TRANSACTION
5210: 2c 20 20 20 20 20 20 44 42 5f 56 45 52 53 49 4f  ,      DB_VERSIO
5220: 4e 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27  N.  };.  /* don'
5230: 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67  t leave trailing
5240: 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e   commas on DB_en
5250: 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20  um, it confuses 
5260: 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70  the AIX xlc comp
5270: 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  iler */..  if( o
5280: 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c  bjc<2 ){.    Tcl
5290: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
52a0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
52b0: 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29  SUBCOMMAND ...")
52c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
52d0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
52e0: 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
52f0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
5300: 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20  jv[1], DB_strs, 
5310: 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68  "option", 0, &ch
5320: 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74  oice) ){.    ret
5330: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5340: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65   }..  switch( (e
5350: 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69  num DB_enum)choi
5360: 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24  ce ){..  /*    $
5370: 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43  db authorizer ?C
5380: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
5390: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
53a0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  ven callback to 
53b0: 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53  authorize each S
53c0: 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20  QL operation as 
53d0: 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69  it is.  ** compi
53e0: 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74  led.  5 argument
53f0: 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74  s are appended t
5400: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62  o the callback b
5410: 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a  efore it is.  **
5420: 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20   invoked:.  **. 
5430: 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61 75   **   (1) The au
5440: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65  thorization type
5450: 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45   (ex: SQLITE_CRE
5460: 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54  ATE_TABLE, SQLIT
5470: 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20  E_INSERT, ...). 
5480: 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74 20   **   (2) First 
5490: 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65  descriptive name
54a0: 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74   (depends on aut
54b0: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29  horization type)
54c0: 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f  .  **   (3) Seco
54d0: 6e 64 20 64 65 73 63 72 69 70 74 69 76 65 20 6e  nd descriptive n
54e0: 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e  ame.  **   (4) N
54f0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
5500: 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c  ase (ex: "main",
5510: 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20   "temp").  **   
5520: 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67  (5) Name of trig
5530: 67 65 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e  ger that is doin
5540: 67 20 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a  g the access.  *
5550: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62  *.  ** The callb
5560: 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72  ack should retur
5570: 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c  n on of the foll
5580: 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53  owing strings: S
5590: 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53  QLITE_OK,.  ** S
55a0: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72  QLITE_IGNORE, or
55b0: 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41   SQLITE_DENY.  A
55c0: 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
55d0: 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f  value is an erro
55e0: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  r..  **.  ** If 
55f0: 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69  this method is i
5600: 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61  nvoked with no a
5610: 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75  rguments, the cu
5620: 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74  rrent authorizat
5630: 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63  ion.  ** callbac
5640: 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75  k string is retu
5650: 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  rned..  */.  cas
5660: 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a  e DB_AUTHORIZER:
5670: 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
5680: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
5690: 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  ION.    Tcl_Appe
56a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
56b0: 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20   "authorization 
56c0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
56d0: 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29   this build", 0)
56e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
56f0: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
5700: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
5710: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
5720: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
5730: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
5740: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
5750: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5760: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
5770: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
5780: 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
5790: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
57a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
57b0: 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b   pDb->zAuth, 0);
57c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
57d0: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
57e0: 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74  zAuth;.      int
57f0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
5800: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
5810: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
5820: 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20  Db->zAuth);.    
5830: 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20    }.      zAuth 
5840: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
5850: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
5860: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
5870: 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20   zAuth && len>0 
5880: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
5890: 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zAuth = Tcl_Allo
58a0: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
58b0: 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62        strcpy(pDb
58c0: 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 29 3b  ->zAuth, zAuth);
58d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
58e0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68        pDb->zAuth
58f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
5900: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
5910: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  th ){.        pD
5920: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
5930: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
5940: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
5950: 65 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68  er(pDb->db, auth
5960: 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b  _callback, pDb);
5970: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65        sqlite3_se
5990: 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62  t_authorizer(pDb
59a0: 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
59b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
59c0: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
59d0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75  ..  /*    $db bu
59e0: 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  sy ?CALLBACK?.  
59f0: 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  **.  ** Invoke t
5a00: 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  he given callbac
5a10: 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74  k if an SQL stat
5a20: 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74  ement attempts t
5a30: 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f  o open.  ** a lo
5a40: 63 6b 65 64 20 64 61 74 61 62 61 73 65 20 66 69  cked database fi
5a50: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  le..  */.  case 
5a60: 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69  DB_BUSY: {.    i
5a70: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
5a80: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
5a90: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
5aa0: 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29  bjv, "CALLBACK")
5ab0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
5ac0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
5ad0: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
5ae0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
5af0: 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20  ->zBusy ){.     
5b00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
5b10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
5b20: 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20  >zBusy, 0);.    
5b30: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
5b40: 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79       char *zBusy
5b50: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
5b60: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
5b70: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
5b80: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
5b90: 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Busy);.      }. 
5ba0: 20 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c       zBusy = Tcl
5bb0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
5bc0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
5bd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75 73  ;.      if( zBus
5be0: 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  y && len>0 ){.  
5bf0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79        pDb->zBusy
5c00: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
5c10: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
5c20: 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 42 75   strcpy(pDb->zBu
5c30: 73 79 2c 20 7a 42 75 73 79 29 3b 0a 20 20 20 20  sy, zBusy);.    
5c40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5c50: 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b   pDb->zBusy = 0;
5c60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5c70: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
5c80: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
5c90: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
5ca0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
5cb0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  usy_handler(pDb-
5cc0: 3e 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c  >db, DbBusyHandl
5cd0: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
5ce0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5cf0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
5d00: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ler(pDb->db, 0, 
5d10: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
5d20: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
5d30: 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63  ..  /*     $db c
5d40: 61 63 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20  ache flush.  ** 
5d50: 20 20 20 20 24 64 62 20 63 61 63 68 65 20 73 69      $db cache si
5d60: 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  ze n.  **.  ** F
5d70: 6c 75 73 68 20 74 68 65 20 70 72 65 70 61 72 65  lush the prepare
5d80: 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68  d statement cach
5d90: 65 2c 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61  e, or set the ma
5da0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a  ximum number of.
5db0: 20 20 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74    ** cached stat
5dc0: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63  ements..  */.  c
5dd0: 61 73 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a  ase DB_CACHE: {.
5de0: 20 20 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64      char *subCmd
5df0: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  ;.    int n;..  
5e00: 20 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b    if( objc<=2 ){
5e10: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
5e20: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
5e30: 31 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20  1, objv, "cache 
5e40: 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a  option ?arg?");.
5e50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
5e60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
5e70: 20 20 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47    subCmd = Tcl_G
5e80: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
5e90: 20 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20   objv[2], 0 );. 
5ea0: 20 20 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d     if( *subCmd==
5eb0: 27 66 27 20 26 26 20 73 74 72 63 6d 70 28 73 75  'f' && strcmp(su
5ec0: 62 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30  bCmd,"flush")==0
5ed0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
5ee0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc!=3 ){.       
5ef0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
5f00: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
5f10: 76 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20  v, "flush");.   
5f20: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
5f30: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
5f40: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73  se{.        flus
5f50: 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
5f60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5f70: 65 6c 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64  else if( *subCmd
5f80: 3d 3d 27 73 27 20 26 26 20 73 74 72 63 6d 70 28  =='s' && strcmp(
5f90: 73 75 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d  subCmd,"size")==
5fa0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  0 ){.      if( o
5fb0: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
5fc0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
5fd0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
5fe0: 6a 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20  jv, "size n");. 
5ff0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
6000: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
6010: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
6020: 28 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c  ( TCL_ERROR==Tcl
6030: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
6040: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
6050: 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  &n) ){.         
6060: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
6070: 74 28 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e  t( interp, "cann
6080: 6f 74 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20  ot convert \"", 
6090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
60a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
60b0: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c  mObj(objv[3],0),
60c0: 20 22 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22   "\" to integer"
60d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
60e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
60f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
6100: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
6110: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
6120: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
6130: 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20  ( pDb );.       
6140: 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20       n = 0;.    
6150: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6160: 6e 3e 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  n>MAX_PREPARED_S
6170: 54 4d 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20  TMTS ){.        
6180: 20 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50      n = MAX_PREP
6190: 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20  ARED_STMTS;.    
61a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
61b0: 20 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d    pDb->maxStmt =
61c0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   n;.        }.  
61d0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
61e0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
61f0: 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c  dResult( interp,
6200: 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22   "bad option \""
6210: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  , .          Tcl
6220: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6230: 6a 28 6f 62 6a 76 5b 30 5d 2c 30 29 2c 20 22 5c  j(objv[0],0), "\
6240: 22 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68  ": must be flush
6250: 20 6f 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20   or size", 0);. 
6260: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6270: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6280: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
6290: 2a 20 20 20 20 20 24 64 62 20 63 68 61 6e 67 65  *     $db change
62a0: 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  s.  **.  ** Retu
62b0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
62c0: 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20   rows that were 
62d0: 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74  modified, insert
62e0: 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62  ed, or deleted b
62f0: 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20  y.  ** the most 
6300: 72 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55  recent INSERT, U
6310: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
6320: 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69  statement, not i
6330: 6e 63 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61  ncluding .  ** a
6340: 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
6350: 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  by trigger progr
6360: 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ams..  */.  case
6370: 20 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20   DB_CHANGES: {. 
6380: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
6390: 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ult;.    if( obj
63a0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
63b0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
63c0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
63d0: 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
63e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
63f0: 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d   }.    pResult =
6400: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
6410: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
6420: 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
6430: 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68  sult, sqlite3_ch
6440: 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b  anges(pDb->db));
6450: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6460: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f  .  /*    $db clo
6470: 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75  se.  **.  ** Shu
6480: 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61  tdown the databa
6490: 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  se.  */.  case D
64a0: 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54  B_CLOSE: {.    T
64b0: 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64  cl_DeleteCommand
64c0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
64d0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
64e0: 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20  jv[0], 0));.    
64f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
6500: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f  .  **     $db co
6510: 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50  llate NAME SCRIP
6520: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
6530: 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c  te a new SQL col
6540: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
6550: 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
6560: 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74  enever.  ** that
6570: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
6580: 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
6590: 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
65a0: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
65b0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c  /.  case DB_COLL
65c0: 41 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f  ATE: {.    SqlCo
65d0: 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b  llate *pCollate;
65e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
65f0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72  ;.    char *zScr
6600: 69 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63  ipt;.    int nSc
6610: 72 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  ript;.    if( ob
6620: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54  jc!=4 ){.      T
6630: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
6640: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
6650: 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b   "NAME SCRIPT");
6660: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
6670: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
6680: 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47     zName = Tcl_G
6690: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
66a0: 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
66b0: 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47   zScript = Tcl_G
66c0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
66d0: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70  objv[3], &nScrip
66e0: 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  t);.    pCollate
66f0: 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29   = (SqlCollate*)
6700: 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
6710: 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e  f(*pCollate) + n
6720: 53 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20  Script + 1 );.  
6730: 20 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d    if( pCollate==
6740: 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
6750: 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  RROR;.    pColla
6760: 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  te->interp = int
6770: 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  erp;.    pCollat
6780: 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e  e->pNext = pDb->
6790: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43  pCollate;.    pC
67a0: 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20  ollate->zScript 
67b0: 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61  = (char*)&pColla
67c0: 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e  te[1];.    pDb->
67d0: 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c  pCollate = pColl
67e0: 61 74 65 3b 0a 20 20 20 20 73 74 72 63 70 79 28  ate;.    strcpy(
67f0: 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70  pCollate->zScrip
6800: 74 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 20  t, zScript);.   
6810: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72 65   if( sqlite3_cre
6820: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70 44  ate_collation(pD
6830: 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51  b->db, zName, SQ
6840: 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
6850: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63      pCollate, tc
6860: 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a  lSqlCollate) ){.
6870: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
6880: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
6890: 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
68a0: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c  sg(pDb->db), TCL
68b0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
68c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
68d0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
68e0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
68f0: 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c   **     $db coll
6900: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52  ation_needed SCR
6910: 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72  IPT.  **.  ** Cr
6920: 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63  eate a new SQL c
6930: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
6940: 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  n called NAME.  
6950: 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68  Whenever.  ** th
6960: 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  at function is c
6970: 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43  alled, invoke SC
6980: 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65  RIPT to evaluate
6990: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
69a0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
69b0: 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20  LLATION_NEEDED: 
69c0: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  {.    if( objc!=
69d0: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
69e0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
69f0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43  rp, 2, objv, "SC
6a00: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
6a10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6a20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44      }.    if( pD
6a30: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
6a40: 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  d ){.      Tcl_D
6a50: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
6a60: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
6a70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d  ;.    }.    pDb-
6a80: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
6a90: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
6aa0: 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  bj(objv[2]);.   
6ab0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
6ac0: 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  t(pDb->pCollateN
6ad0: 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  eeded);.    sqli
6ae0: 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
6af0: 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44  eded(pDb->db, pD
6b00: 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65  b, tclCollateNee
6b10: 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ded);.    break;
6b20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
6b30: 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43  b commit_hook ?C
6b40: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
6b50: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
6b60: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73  ven callback jus
6b70: 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
6b80: 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74 72  ing every SQL tr
6b90: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
6ba0: 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  If the callback 
6bb0: 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
6bc0: 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e  ion or returns n
6bd0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
6be0: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
6bf0: 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20  on is aborted.  
6c00: 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61  If CALLBACK is a
6c10: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  n empty string, 
6c20: 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a  the callback.  *
6c30: 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20  * is disabled.. 
6c40: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
6c50: 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20  MMIT_HOOK: {.   
6c60: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
6c70: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
6c80: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
6c90: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
6ca0: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
6cb0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6cc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
6cd0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
6ce0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b   pDb->zCommit ){
6cf0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
6d00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6d10: 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20  , pDb->zCommit, 
6d20: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
6d30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
6d40: 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20  r *zCommit;.    
6d50: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
6d60: 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
6d70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  t ){.        Tcl
6d80: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d  _Free(pDb->zComm
6d90: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
6da0: 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c     zCommit = Tcl
6db0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6dc0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
6dd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d  ;.      if( zCom
6de0: 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  mit && len>0 ){.
6df0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
6e00: 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  mmit = Tcl_Alloc
6e10: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
6e20: 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d       strcpy(pDb-
6e30: 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69  >zCommit, zCommi
6e40: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
6e50: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43  .        pDb->zC
6e60: 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  ommit = 0;.     
6e70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
6e80: 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  ->zCommit ){.   
6e90: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
6ea0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
6eb0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
6ec0: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
6ed0: 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c  DbCommitHandler,
6ee0: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
6ef0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
6f00: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
6f10: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
6f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6f30: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
6f40: 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65  /*    $db comple
6f50: 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a  te SQL.  **.  **
6f60: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
6f70: 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74  SQL is a complet
6f80: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
6f90: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
6fa0: 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61  f.  ** additiona
6fb0: 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74  l lines of input
6fc0: 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68   are needed.  Th
6fd0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
6fe0: 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d   the.  ** built-
6ff0: 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74  in "info complet
7000: 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63  e" command of Tc
7010: 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  l..  */.  case D
7020: 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69  B_COMPLETE: {.#i
7030: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7040: 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54  T_COMPLETE.    T
7050: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
7060: 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  .    int isCompl
7070: 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ete;.    if( obj
7080: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
7090: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
70a0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
70b0: 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65  "SQL");.      re
70c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
70d0: 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70      }.    isComp
70e0: 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lete = sqlite3_c
70f0: 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74  omplete( Tcl_Get
7100: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
7110: 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20  jv[2], 0) );.   
7120: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
7130: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
7140: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
7150: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75  BooleanObj(pResu
7160: 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b  lt, isComplete);
7170: 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
7180: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
7190: 24 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63  $db copy conflic
71a0: 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c  t-algorithm tabl
71b0: 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41  e filename ?SEPA
71c0: 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49  RATOR? ?NULLINDI
71d0: 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  CATOR?.  **.  **
71e0: 20 43 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20   Copy data into 
71f0: 74 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e  table from filen
7200: 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20  ame, optionally 
7210: 75 73 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a  using SEPARATOR.
7220: 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73    ** as column s
7230: 65 70 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61  eparators.  If a
7240: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
7250: 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20   a null string, 
7260: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75  or the.  ** valu
7270: 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54  e of NULLINDICAT
7280: 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e  OR, a NULL is in
7290: 73 65 72 74 65 64 20 66 6f 72 20 74 68 65 20 63  serted for the c
72a0: 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66  olumn..  ** conf
72b0: 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69  lict-algorithm i
72c0: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c  s one of the sql
72d0: 69 74 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  ite conflict alg
72e0: 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20  orithms:.  **   
72f0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74   rollback, abort
7300: 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20  , fail, ignore, 
7310: 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20  replace.  ** On 
7320: 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
7330: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69  the number of li
7340: 6e 65 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e  nes processed, n
7350: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73  ot necessarily s
7360: 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20  ame.  ** as 'db 
7370: 63 68 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20  changes' due to 
7380: 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
7390: 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a  hm selected..  *
73a0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65  *.  ** This code
73b0: 20 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e   is basically an
73c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f   implementation/
73d0: 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20  enhancement of. 
73e0: 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20   ** the sqlite3 
73f0: 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74  shell.c ".import
7400: 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a  " command..  **.
7410: 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
7420: 64 20 75 73 61 67 65 20 69 73 20 65 71 75 69 76  d usage is equiv
7430: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c  alent to the sql
7440: 69 74 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74  ite2.x COPY stat
7450: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63  ement,.  ** whic
7460: 68 20 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64  h imports file d
7470: 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ata into a table
7480: 20 75 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67   using the Postg
7490: 72 65 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20  reSQL COPY file 
74a0: 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24  format:.  **   $
74b0: 64 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74  db copy $conflit
74c0: 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d  _algo $table_nam
74d0: 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c  e $filename \t \
74e0: 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  \N.  */.  case D
74f0: 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68  B_COPY: {.    ch
7500: 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20  ar *zTable;     
7510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
7520: 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
7530: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  is table */.    
7540: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20  char *zFile;    
7550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7560: 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69  he file from whi
7570: 63 68 20 74 6f 20 65 78 74 72 61 63 74 20 64 61  ch to extract da
7580: 74 61 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  ta */.    char *
7590: 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20  zConflict;      
75a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
75b0: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20  flict algorithm 
75c0: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71  to use */.    sq
75d0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
75e0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  t;        /* A s
75f0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
7600: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
7610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
7620: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
7630: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7650: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
7660: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
7670: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
7680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7690: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
76a0: 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20  bytes in an SQL 
76b0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  string */.    in
76c0: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
76d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
76e0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
76f0: 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20    int nSep;     
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7710: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7720: 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20   in zSep[] */.  
7730: 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20    int nNull;    
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7750: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7760: 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20   in zNull[] */. 
7770: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20     char *zSql;  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7790: 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  * An SQL stateme
77a0: 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  nt */.    char *
77b0: 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  zLine;          
77c0: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
77d0: 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20  e line of input 
77e0: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f  from the file */
77f0: 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  .    char **azCo
7800: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7810: 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b   /* zLine[] brok
7820: 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d  en up into colum
7830: 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  ns */.    char *
7840: 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20  zCommit;        
7850: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
7860: 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a  commit changes *
7870: 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20  /.    FILE *in; 
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7890: 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66    /* The input f
78a0: 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ile */.    int l
78b0: 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20  ineno = 0;      
78c0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
78d0: 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66  umber of input f
78e0: 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ile */.    char 
78f0: 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20  zLineNum[80];   
7900: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
7910: 75 6d 62 65 72 20 70 72 69 6e 74 20 62 75 66 66  umber print buff
7920: 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  er */.    Tcl_Ob
7930: 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20  j *pResult;     
7940: 20 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20        /* interp 
7950: 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63  result */..    c
7960: 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63  har *zSep;.    c
7970: 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20  har *zNull;.    
7980: 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62  if( objc<5 || ob
7990: 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>7 ){.      Tc
79a0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
79b0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
79c0: 0a 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c  .         "CONFL
79d0: 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41  ICT-ALGORITHM TA
79e0: 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45  BLE FILENAME ?SE
79f0: 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e  PARATOR? ?NULLIN
7a00: 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20  DICATOR?");.    
7a10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7a20: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
7a30: 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20  ( objc>=6 ){.   
7a40: 20 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65     zSep = Tcl_Ge
7a50: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
7a60: 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[5], 0);.    
7a70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65  }else{.      zSe
7a80: 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a  p = "\t";.    }.
7a90: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20      if( objc>=7 
7aa0: 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d  ){.      zNull =
7ab0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
7ac0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30  omObj(objv[6], 0
7ad0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7ae0: 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a      zNull = "";.
7af0: 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c      }.    zConfl
7b00: 69 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ict = Tcl_GetStr
7b10: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
7b20: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62  2], 0);.    zTab
7b30: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
7b40: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
7b50: 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65  ], 0);.    zFile
7b60: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
7b70: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c  FromObj(objv[4],
7b80: 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20   0);.    nSep = 
7b90: 73 74 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20 20  strlen(zSep);.  
7ba0: 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e    nNull = strlen
7bb0: 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28  (zNull);.    if(
7bc0: 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20   nSep==0 ){.    
7bd0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
7be0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
7bf0: 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61  r: non-null sepa
7c00: 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66  rator required f
7c10: 6f 72 20 63 6f 70 79 22 2c 20 30 29 3b 0a 20 20  or copy", 0);.  
7c20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7c30: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
7c40: 69 66 28 73 71 6c 69 74 65 33 53 74 72 49 43 6d  if(sqlite3StrICm
7c50: 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f  p(zConflict, "ro
7c60: 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26  llback") != 0 &&
7c70: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  .       sqlite3S
7c80: 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  trICmp(zConflict
7c90: 2c 20 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d  , "abort"   ) !=
7ca0: 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c   0 &&.       sql
7cb0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e  ite3StrICmp(zCon
7cc0: 66 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20  flict, "fail"   
7cd0: 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20   ) != 0 &&.     
7ce0: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
7cf0: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e  (zConflict, "ign
7d00: 6f 72 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a  ore"  ) != 0 &&.
7d10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
7d20: 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  rICmp(zConflict,
7d30: 20 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20   "replace" ) != 
7d40: 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
7d50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7d60: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22  erp, "Error: \""
7d70: 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20  , zConflict, .  
7d80: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63            "\", c
7d90: 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
7da0: 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  m must be one of
7db0: 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20  : rollback, ".  
7dc0: 20 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74            "abort
7dd0: 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20  , fail, ignore, 
7de0: 6f 72 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b  or replace", 0);
7df0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
7e00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
7e10: 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
7e20: 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
7e30: 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20  T * FROM '%q'", 
7e40: 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  zTable);.    if(
7e50: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
7e60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
7e70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
7e80: 72 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  r: no such table
7e90: 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b  : ", zTable, 0);
7ea0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
7eb0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
7ec0: 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65     nByte = strle
7ed0: 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20  n(zSql);.    rc 
7ee0: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
7ef0: 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  e(pDb->db, zSql,
7f00: 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a   0, &pStmt, 0);.
7f10: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7f20: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
7f30: 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
7f40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7f50: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
7f60: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
7f70: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
7f80: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
7f90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43   }else{.      nC
7fa0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
7fb0: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
7fc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7fd0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
7fe0: 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  mt);.    if( nCo
7ff0: 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72  l==0 ) {.      r
8000: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8010: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
8020: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
8030: 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 50 + nCol*2 );
8040: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
8050: 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
8060: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8070: 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27  rp, "Error: can'
8080: 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b  t malloc()", 0);
8090: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
80a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
80b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
80c0: 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53  ntf(nByte+50, zS
80d0: 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25  ql, "INSERT OR %
80e0: 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55  q INTO '%q' VALU
80f0: 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20  ES(?",.         
8100: 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c  zConflict, zTabl
8110: 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  e);.    j = strl
8120: 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f  en(zSql);.    fo
8130: 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=1; i<nCol; i
8140: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ++){.      zSql[
8150: 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  j++] = ',';.    
8160: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f    zSql[j++] = '?
8170: 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ';.    }.    zSq
8180: 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  l[j++] = ')';.  
8190: 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
81a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
81b0: 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
81c0: 20 7a 53 71 6c 2c 20 30 2c 20 26 70 53 74 6d 74   zSql, 0, &pStmt
81d0: 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  , 0);.    free(z
81e0: 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
81f0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
8200: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8210: 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71  p, "Error: ", sq
8220: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
8230: 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20  ->db), 0);.     
8240: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
8250: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
8260: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8270: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d  ;.    }.    in =
8280: 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72   fopen(zFile, "r
8290: 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d  b");.    if( in=
82a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
82b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
82c0: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  erp, "Error: can
82d0: 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22  not open file: "
82e0: 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  , zFile, NULL);.
82f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
8300: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
8310: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8320: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8330: 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28   azCol = malloc(
8340: 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d   sizeof(azCol[0]
8350: 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20  )*(nCol+1) );.  
8360: 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29    if( azCol==0 )
8370: 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70   {.      Tcl_App
8380: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8390: 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20  , "Error: can't 
83a0: 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20  malloc()", 0);. 
83b0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
83c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
83d0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
83e0: 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20  b->db, "BEGIN", 
83f0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43  0, 0, 0);.    zC
8400: 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22  ommit = "COMMIT"
8410: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c  ;.    while( (zL
8420: 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c  ine = local_getl
8430: 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29  ine(0, in))!=0 )
8440: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b  {.      char *z;
8450: 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  .      i = 0;.  
8460: 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
8470: 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a      azCol[0] = z
8480: 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Line;.      for(
8490: 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a  i=0, z=zLine; *z
84a0: 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; z++){.        
84b0: 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20  if( *z==zSep[0] 
84c0: 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53  && strncmp(z, zS
84d0: 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a  ep, nSep)==0 ){.
84e0: 20 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30            *z = 0
84f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  ;.          i++;
8500: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
8510: 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  <nCol ){.       
8520: 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20       azCol[i] = 
8530: 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20  &z[nSep];.      
8540: 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d        z += nSep-
8550: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
8560: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8570: 0a 20 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d  .      if( i+1!=
8580: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
8590: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
85a0: 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f      zErr = mallo
85b0: 63 28 32 30 30 20 2b 20 73 74 72 6c 65 6e 28 7a  c(200 + strlen(z
85c0: 46 69 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  File));.        
85d0: 73 70 72 69 6e 74 66 28 7a 45 72 72 2c 22 45 72  sprintf(zErr,"Er
85e0: 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a  ror: %s line %d:
85f0: 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c   expected %d col
8600: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62 75 74  umns of data but
8610: 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20 20   found %d",.    
8620: 20 20 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69         zFile, li
8630: 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29  neno, nCol, i+1)
8640: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  ;.        Tcl_Ap
8650: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8660: 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20  p, zErr, 0);.   
8670: 20 20 20 20 20 66 72 65 65 28 7a 45 72 72 29 3b       free(zErr);
8680: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74  .        zCommit
8690: 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   = "ROLLBACK";. 
86a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
86b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
86c0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
86d0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68  ){.        /* ch
86e0: 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74  eck for null dat
86f0: 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61  a, if so, bind a
8700: 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  s null */.      
8710: 20 20 69 66 20 28 28 6e 4e 75 6c 6c 3e 30 20 26    if ((nNull>0 &
8720: 26 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69  & strcmp(azCol[i
8730: 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 20 7c 7c  ], zNull)==0) ||
8740: 20 73 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b 69 5d   strlen(azCol[i]
8750: 29 3d 3d 30 29 20 7b 0a 20 20 20 20 20 20 20 20  )==0) {.        
8760: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
8770: 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b  ull(pStmt, i+1);
8780: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
8790: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
87a0: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
87b0: 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d  t, i+1, azCol[i]
87c0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
87d0: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TIC);.        }.
87e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
87f0: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
8800: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
8810: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
8820: 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a  t);.      free(z
8830: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
8840: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8850: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
8860: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8870: 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  p,"Error: ", sql
8880: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
8890: 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
88a0: 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c    zCommit = "ROL
88b0: 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20  LBACK";.        
88c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
88d0: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a     }.    free(az
88e0: 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65  Col);.    fclose
88f0: 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (in);.    sqlite
8900: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
8910: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
8920: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f  xec(pDb->db, zCo
8930: 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  mmit, 0, 0, 0);.
8940: 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74  .    if( zCommit
8950: 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20  [0] == 'C' ){.  
8960: 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20      /* success, 
8970: 73 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75  set result as nu
8980: 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72  mber of lines pr
8990: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20  ocessed */.     
89a0: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
89b0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
89c0: 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  rp);.      Tcl_S
89d0: 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  etIntObj(pResult
89e0: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  , lineno);.     
89f0: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
8a00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
8a10: 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e  * failure, appen
8a20: 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66  d lineno where f
8a30: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  ailed */.      s
8a40: 70 72 69 6e 74 66 28 7a 4c 69 6e 65 4e 75 6d 2c  printf(zLineNum,
8a50: 22 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20  "%d",lineno);.  
8a60: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8a70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20 66  sult(interp,", f
8a80: 61 69 6c 65 64 20 77 68 69 6c 65 20 70 72 6f 63  ailed while proc
8a90: 65 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a  essing line: ",z
8aa0: 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20 20 20  LineNum,0);.    
8ab0: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
8ac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
8ad0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
8ae0: 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f  *    $db errorco
8af0: 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  de.  **.  ** Ret
8b00: 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20  urn the numeric 
8b10: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20  error code that 
8b20: 77 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  was returned by 
8b30: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
8b40: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c    ** call to sql
8b50: 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a  ite3_exec()..  *
8b60: 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f  /.  case DB_ERRO
8b70: 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c  RCODE: {.    Tcl
8b80: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
8b90: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
8ba0: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63  Obj(sqlite3_errc
8bb0: 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  ode(pDb->db)));.
8bc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
8bd0: 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20    .  /*.  **    
8be0: 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61  $db eval $sql ?a
8bf0: 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64  rray? ?{  ...cod
8c00: 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20 20  e... }?.  **    
8c10: 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73  $db onecolumn $s
8c20: 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ql.  **.  ** The
8c30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
8c40: 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61  n $sql is evalua
8c50: 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72  ted.  For each r
8c60: 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61  ow, the values a
8c70: 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69  re.  ** placed i
8c80: 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  n elements of th
8c90: 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61  e array named "a
8ca0: 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64  rray" and ...cod
8cb0: 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64  e... is executed
8cc0: 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79  ..  ** If "array
8cd0: 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65  " and "code" are
8ce0: 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e   omitted, then n
8cf0: 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76  o callback is ev
8d00: 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a  ery invoked..  *
8d10: 2a 20 49 66 20 22 61 72 72 61 79 22 20 69 73 20  * If "array" is 
8d20: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
8d30: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
8d40: 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76   are placed in v
8d50: 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68  ariables.  ** th
8d60: 61 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  at have the same
8d70: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69 65   name as the fie
8d80: 6c 64 73 20 65 78 74 72 61 63 74 65 64 20 62 79  lds extracted by
8d90: 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a   the query..  **
8da0: 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c  .  ** The onecol
8db0: 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68  umn method is th
8dc0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a  e equivalent of:
8dd0: 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78  .  **     lindex
8de0: 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d   [$db eval $sql]
8df0: 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44   0.  */.  case D
8e00: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63  B_ONECOLUMN:.  c
8e10: 61 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a 20  ase DB_EVAL: {. 
8e20: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
8e30: 53 71 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78  Sql;      /* Nex
8e40: 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  t SQL statement 
8e50: 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20  to execute */.  
8e60: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4c    char const *zL
8e70: 65 66 74 3b 20 20 20 20 20 2f 2a 20 57 68 61 74  eft;     /* What
8e80: 20 69 73 20 6c 65 66 74 20 61 66 74 65 72 20 66   is left after f
8e90: 69 72 73 74 20 73 74 6d 74 20 69 6e 20 7a 53 71  irst stmt in zSq
8ea0: 6c 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  l */.    sqlite3
8eb0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
8ec0: 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 53 51 4c 20  /* Compiled SQL 
8ed0: 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  statment */.    
8ee0: 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b  Tcl_Obj *pArray;
8ef0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
8f00: 66 20 61 72 72 61 79 20 69 6e 74 6f 20 77 68 69  f array into whi
8f10: 63 68 20 72 65 73 75 6c 74 73 20 61 72 65 20 77  ch results are w
8f20: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 54 63  ritten */.    Tc
8f30: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20  l_Obj *pScript; 
8f40: 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 74       /* Script t
8f50: 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68 20 72  o run for each r
8f60: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
8f70: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61 72   Tcl_Obj **apPar
8f80: 6d 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 61 6d  m;      /* Param
8f90: 65 74 65 72 73 20 74 68 61 74 20 6e 65 65 64 20  eters that need 
8fa0: 61 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  a Tcl_DecrRefCou
8fb0: 6e 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nt() */.    int 
8fc0: 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nParm;          
8fd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8fe0: 65 6e 74 72 69 65 73 20 75 73 65 64 20 69 6e 20  entries used in 
8ff0: 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20 20 20  apParm[] */.    
9000: 54 63 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d 5b 31  Tcl_Obj *aParm[1
9010: 30 5d 3b 20 20 20 20 2f 2a 20 53 74 61 74 69 63  0];    /* Static
9020: 20 73 70 61 63 65 20 66 6f 72 20 61 70 50 61 72   space for apPar
9030: 6d 5b 5d 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  m[] in the commo
9040: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 54 63  n case */.    Tc
9050: 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 20 20 20 20  l_Obj *pRet;    
9060: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
9070: 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a   be returned */.
9080: 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64 53      SqlPreparedS
9090: 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20  tmt *pPreStmt;  
90a0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
90b0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
90c0: 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  nt */.    int rc
90d0: 32 3b 0a 0a 20 20 20 20 69 66 28 20 63 68 6f 69  2;..    if( choi
90e0: 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ce==DB_ONECOLUMN
90f0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
9100: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc!=3 ){.       
9110: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
9120: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
9130: 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20  v, "SQL");.     
9140: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9150: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
9160: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
9170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
9180: 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63  ( objc<3 || objc
9190: 3e 35 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  >5 ){.        Tc
91a0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
91b0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
91c0: 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45  "SQL ?ARRAY-NAME
91d0: 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20  ? ?SCRIPT?");.  
91e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
91f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
9200: 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c        pRet = Tcl
9210: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20  _NewObj();.     
9220: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
9230: 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 20  t(pRet);.    }. 
9240: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
9250: 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20 3d  {.      pArray =
9260: 20 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20   pScript = 0;.  
9270: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
9280: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 70 41 72  ==4 ){.      pAr
9290: 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ray = 0;.      p
92a0: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d  Script = objv[3]
92b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
92c0: 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a 76     pArray = objv
92d0: 5b 33 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 54  [3];.      if( T
92e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 41 72  cl_GetString(pAr
92f0: 72 61 79 29 5b 30 5d 3d 3d 30 20 29 20 70 41 72  ray)[0]==0 ) pAr
9300: 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ray = 0;.      p
9310: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 34 5d  Script = objv[4]
9320: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
9330: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62  _IncrRefCount(ob
9340: 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7a 53 71 6c  jv[2]);.    zSql
9350: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
9360: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
9370: 20 30 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20   0);.    while( 
9380: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 7a 53  rc==TCL_OK && zS
9390: 71 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69  ql[0] ){.      i
93a0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
93b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
93c0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
93d0: 20 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20     int nVar;    
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
93f0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 69 6e 64 20   Number of bind 
9400: 70 61 72 61 6d 65 74 65 72 73 20 69 6e 20 74 68  parameters in th
9410: 65 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20 20  e pStmt */.     
9420: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
9430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9440: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9450: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
9460: 65 74 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f  et */.      Tcl_
9470: 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20  Obj **apColName 
9480: 3d 20 30 3b 20 20 20 2f 2a 20 41 72 72 61 79 20  = 0;   /* Array 
9490: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
94a0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  */.      int len
94b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
94c0: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c 65      /* String le
94d0: 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a  ngth of zSql */.
94e0: 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20    .      /* Try 
94f0: 74 6f 20 66 69 6e 64 20 61 20 53 51 4c 20 73 74  to find a SQL st
9500: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 68 61 73  atement that has
9510: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
9520: 6d 70 69 6c 65 64 20 61 6e 64 0a 20 20 20 20 20  mpiled and.     
9530: 20 2a 2a 20 77 68 69 63 68 20 6d 61 74 63 68 65   ** which matche
9540: 73 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  s the next seque
9550: 6e 63 65 20 6f 66 20 53 51 4c 2e 0a 20 20 20 20  nce of SQL..    
9560: 20 20 2a 2f 0a 20 20 20 20 20 20 70 53 74 6d 74    */.      pStmt
9570: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 72 65   = 0;.      pPre
9580: 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Stmt = pDb->stmt
9590: 4c 69 73 74 3b 0a 20 20 20 20 20 20 6c 65 6e 20  List;.      len 
95a0: 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a  = strlen(zSql);.
95b0: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
95c0: 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 65 78  mt && sqlite3_ex
95d0: 70 69 72 65 64 28 70 50 72 65 53 74 6d 74 2d 3e  pired(pPreStmt->
95e0: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
95f0: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
9600: 28 70 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70  (pDb);.        p
9610: 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  PreStmt = 0;.   
9620: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 3b     }.      for(;
9630: 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53   pPreStmt; pPreS
9640: 74 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e  tmt=pPreStmt->pN
9650: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ext){.        in
9660: 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  t n = pPreStmt->
9670: 6e 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  nSql;.        if
9680: 28 20 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20 20 20  ( len>=n .      
9690: 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28        && memcmp(
96a0: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
96b0: 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  zSql, n)==0.    
96c0: 20 20 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c          && (zSql
96d0: 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e  [n]==0 || zSql[n
96e0: 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 20 20  -1]==';').      
96f0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
9700: 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Stmt = pPreStmt-
9710: 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  >pStmt;.        
9720: 20 20 7a 4c 65 66 74 20 3d 20 26 7a 53 71 6c 5b    zLeft = &zSql[
9730: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b  pPreStmt->nSql];
9740: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ..          /* W
9750: 68 65 6e 20 61 20 70 72 65 70 61 72 65 64 20 73  hen a prepared s
9760: 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e  tatement is foun
9770: 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f  d, unlink it fro
9780: 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  m the.          
9790: 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20  ** cache list.  
97a0: 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65  It will later be
97b0: 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f 20 74   added back to t
97c0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  he beginning.   
97d0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
97e0: 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f   cache list in o
97f0: 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
9800: 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e  t LRU replacemen
9810: 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  t..          */.
9820: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
9830: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b  reStmt->pPrev ){
9840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72  .            pPr
9850: 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e  eStmt->pPrev->pN
9860: 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ext = pPreStmt->
9870: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
9880: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9890: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
98a0: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
98b0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
98c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
98d0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29  PreStmt->pNext )
98e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
98f0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70  reStmt->pNext->p
9900: 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d  Prev = pPreStmt-
9910: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20  >pPrev;.        
9920: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9930: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
9940: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  st = pPreStmt->p
9950: 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
9960: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  }.          pDb-
9970: 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20  >nStmt--;.      
9980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9990: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a     }.      }.  .
99a0: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70        /* If no p
99b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
99c0: 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 43 6f  t was found.  Co
99d0: 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 20 74 65  mpile the SQL te
99e0: 78 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xt.      */.    
99f0: 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29    if( pStmt==0 )
9a00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51  {.        if( SQ
9a10: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
9a20: 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
9a30: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
9a40: 6d 74 2c 20 26 7a 4c 65 66 74 29 20 29 7b 0a 20  mt, &zLeft) ){. 
9a50: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74           Tcl_Set
9a60: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
9a70: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  , dbTextToObj(sq
9a80: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
9a90: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20  ->db)));.       
9aa0: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
9ab0: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  R;.          bre
9ac0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
9ad0: 20 20 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d        if( pStmt=
9ae0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
9af0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
9b00: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
9b10: 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20  Db->db) ){.     
9b20: 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70         /* A comp
9b30: 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f 72 20 69  ile-time error i
9b40: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
9b60: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53             Tcl_S
9b70: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
9b80: 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  rp, dbTextToObj(
9b90: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
9ba0: 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20  Db->db)));.     
9bb0: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
9bc0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
9bd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9be0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9bf0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74         /* The st
9c00: 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f  atement was a no
9c10: 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  -op.  Continue t
9c20: 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65  o the next state
9c30: 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20  ment.           
9c40: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73   ** in the SQL s
9c50: 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 20  tring..         
9c60: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
9c70: 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a    zSql = zLeft;.
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
9c90: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
9ca0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
9cb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
9cc0: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt==0 );.     
9cd0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 42 69 6e   }..      /* Bin
9ce0: 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61  d values to para
9cf0: 6d 65 74 65 72 73 20 74 68 61 74 20 62 65 67 69  meters that begi
9d00: 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 0a 20 20  n with $ or :.  
9d10: 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 20 20 6e      */  .      n
9d20: 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  Var = sqlite3_bi
9d30: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
9d40: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  nt(pStmt);.     
9d50: 20 6e 50 61 72 6d 20 3d 20 30 3b 0a 20 20 20 20   nParm = 0;.    
9d60: 20 20 69 66 28 20 6e 56 61 72 3e 73 69 7a 65 6f    if( nVar>sizeo
9d70: 66 28 61 50 61 72 6d 29 2f 73 69 7a 65 6f 66 28  f(aParm)/sizeof(
9d80: 61 50 61 72 6d 5b 30 5d 29 20 29 7b 0a 20 20 20  aParm[0]) ){.   
9d90: 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 28 54       apParm = (T
9da0: 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c  cl_Obj**)Tcl_All
9db0: 6f 63 28 6e 56 61 72 2a 73 69 7a 65 6f 66 28 61  oc(nVar*sizeof(a
9dc0: 70 50 61 72 6d 5b 30 5d 29 29 3b 0a 20 20 20 20  pParm[0]));.    
9dd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9de0: 20 61 70 50 61 72 6d 20 3d 20 61 50 61 72 6d 3b   apParm = aParm;
9df0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
9e00: 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b  or(i=1; i<=nVar;
9e10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
9e20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20  onst char *zVar 
9e30: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
9e40: 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53  arameter_name(pS
9e50: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
9e60: 20 69 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20   if( zVar!=0 && 
9e70: 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c  (zVar[0]=='$' ||
9e80: 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 29 20 29   zVar[0]==':') )
9e90: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
9ea0: 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f  Obj *pVar = Tcl_
9eb0: 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
9ec0: 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30  , &zVar[1], 0, 0
9ed0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
9ee0: 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20   pVar ){.       
9ef0: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
9f00: 20 20 20 20 20 20 20 20 75 38 20 2a 64 61 74 61          u8 *data
9f10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
9f20: 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56 61 72  ar *zType = pVar
9f30: 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72  ->typePtr ? pVar
9f40: 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20  ->typePtr->name 
9f50: 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20  : "";.          
9f60: 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65    char c = zType
9f70: 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [0];.           
9f80: 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73   if( c=='b' && s
9f90: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74  trcmp(zType,"byt
9fa0: 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70  earray")==0 && p
9fb0: 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b  Var->bytes==0 ){
9fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
9fd0: 2a 20 4f 6e 6c 79 20 6c 6f 61 64 20 61 20 42 4c  * Only load a BL
9fe0: 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54  OB type if the T
9ff0: 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  cl variable is a
a000: 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20   bytearray and. 
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
a020: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
a030: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f  presentation. */
a040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
a050: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
a060: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56  eArrayFromObj(pV
a070: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  ar, &n);.       
a080: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
a090: 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
a0a0: 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49  i, data, n, SQLI
a0b0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
a0c0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
a0d0: 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29  crRefCount(pVar)
a0e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a0f0: 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20  apParm[nParm++] 
a100: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
a110: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63      }else if( (c
a120: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
a130: 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29  zType,"boolean")
a140: 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ==0) ||.        
a150: 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69            (c=='i
a160: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
a170: 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a  e,"int")==0) ){.
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
a190: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
a1a0: 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e  interp, pVar, &n
a1b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
a1c0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
a1d0: 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a  t(pStmt, i, n);.
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
a1f0: 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20  e if( c=='d' && 
a200: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f  strcmp(zType,"do
a210: 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  uble")==0 ){.   
a220: 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c             doubl
a230: 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e r;.           
a240: 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65     Tcl_GetDouble
a250: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
a260: 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20  pVar, &r);.     
a270: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a280: 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74  _bind_double(pSt
a290: 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20  mt, i, r);.     
a2a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
a2b0: 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d   c=='w' && strcm
a2c0: 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74  p(zType,"wideInt
a2d0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
a2e0: 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49         Tcl_WideI
a2f0: 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20  nt v;.          
a300: 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49      Tcl_GetWideI
a310: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
a320: 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20  , pVar, &v);.   
a330: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a340: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
a350: 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20  tmt, i, v);.    
a360: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
a380: 61 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  a = Tcl_GetStrin
a390: 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  gFromObj(pVar, &
a3a0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
a3b0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
a3c0: 65 78 74 28 70 53 74 6d 74 2c 20 69 2c 20 64 61  ext(pStmt, i, da
a3d0: 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54  ta, n, SQLITE_ST
a3e0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
a3f0: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
a400: 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20  Count(pVar);.   
a410: 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61 72             apPar
a420: 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61  m[nParm++] = pVa
a430: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  r;.            }
a440: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
a450: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
a460: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
a470: 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a 20 20 20   pStmt, i );.   
a480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a490: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
a4a0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
a4b0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  umn names */.   
a4c0: 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
a4d0: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
a4e0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
a4f0: 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20   pScript ){.    
a500: 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d 20      apColName = 
a510: 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41  (Tcl_Obj**)Tcl_A
a520: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c  lloc( sizeof(Tcl
a530: 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20  _Obj*)*nCol );. 
a540: 20 20 20 20 20 20 20 69 66 28 20 61 70 43 6f 6c         if( apCol
a550: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
a560: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
a570: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
a580: 20 20 20 20 20 20 20 20 20 20 61 70 43 6f 6c 4e            apColN
a590: 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78 74 54  ame[i] = dbTextT
a5a0: 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  oObj(sqlite3_col
a5b0: 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  umn_name(pStmt,i
a5c0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63  ));.          Tc
a5d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61  l_IncrRefCount(a
a5e0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
a5f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a600: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 73  .      /* If res
a610: 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20 73  ults are being s
a620: 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61  tored in an arra
a630: 79 20 76 61 72 69 61 62 6c 65 2c 20 74 68 65 6e  y variable, then
a640: 20 63 72 65 61 74 65 0a 20 20 20 20 20 20 2a 2a   create.      **
a650: 20 74 68 65 20 61 72 72 61 79 28 2a 29 20 65 6e   the array(*) en
a660: 74 72 79 20 66 6f 72 20 74 68 61 74 20 61 72 72  try for that arr
a670: 61 79 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ay.      */.    
a680: 20 20 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a    if( pArray ){.
a690: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
a6a0: 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f  *pColList = Tcl_
a6b0: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20  NewObj();.      
a6c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72    Tcl_Obj *pStar
a6d0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
a6e0: 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 20 20  Obj("*", -1);.  
a6f0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
a700: 66 43 6f 75 6e 74 28 70 43 6f 6c 4c 69 73 74 29  fCount(pColList)
a710: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
a720: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
a730: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  .          Tcl_L
a740: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
a750: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c  ent(interp, pCol
a760: 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  List, apColName[
a770: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
a780: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65         Tcl_ObjSe
a790: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41  tVar2(interp, pA
a7a0: 72 72 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f  rray, pStar, pCo
a7b0: 6c 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20  lList,0);.      
a7c0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
a7d0: 6e 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20  nt(pColList);.  
a7e0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
a7f0: 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20  fCount(pStar);. 
a800: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
a810: 20 45 78 65 63 75 74 65 20 74 68 65 20 53 51 4c   Execute the SQL
a820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a830: 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f  while( rc==TCL_O
a840: 4b 20 26 26 20 70 53 74 6d 74 20 26 26 20 53 51  K && pStmt && SQ
a850: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
a860: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
a870: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
a880: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
a890: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
a8a0: 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20  j *pVal;.       
a8b0: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a     .          /*
a8c0: 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e   Set pVal to con
a8d0: 74 61 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f  tain the i'th co
a8e0: 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77  lumn of this row
a8f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
a900: 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63  witch( sqlite3_c
a910: 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
a920: 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , i) ){.        
a930: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a940: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20  BLOB: {.        
a950: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
a960: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
a970: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 29  _bytes(pStmt, i)
a980: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a990: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  pVal = Tcl_NewBy
a9a0: 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74  teArrayObj(sqlit
a9b0: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
a9c0: 53 74 6d 74 2c 20 69 29 2c 20 62 79 74 65 73 29  Stmt, i), bytes)
a9d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a9e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
a9f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
aa00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
aa10: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  EGER: {.        
aa20: 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74        sqlite_int
aa30: 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 63  64 v = sqlite3_c
aa40: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
aa50: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
aa60: 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34       if( v>=-214
aa70: 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31  7483647 && v<=21
aa80: 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20  47483647 ){.    
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
aaa0: 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a   = Tcl_NewIntObj
aab0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
aac0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aad0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
aae0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
aaf0: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
ab00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ab10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ab20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ab30: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ab40: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
ab50: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
ab60: 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
ab70: 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c  mn_double(pStmt,
ab80: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
ab90: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
aba0: 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20  wDoubleObj(r);. 
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
abc0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
abd0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  }.            ca
abe0: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
abf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
ac00: 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f  pVal = dbTextToO
ac10: 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a  bj(pDb->zNull);.
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
ac30: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
ac40: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   }.            d
ac50: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
ac60: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 64          pVal = d
ac70: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
ac80: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
ac90: 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20 20 20 20  Stmt, i));.     
aca0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
acc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
acd0: 20 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69         if( pScri
ace0: 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pt ){.          
acf0: 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20    if( pArray==0 
ad00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
ad10: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
ad20: 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d  interp, apColNam
ad30: 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30  e[i], 0, pVal, 0
ad40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
ad50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ad60: 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
ad70: 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61  r2(interp, pArra
ad80: 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  y, apColName[i],
ad90: 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20   pVal, 0);.     
ada0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
adb0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68 6f     }else if( cho
adc0: 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d  ice==DB_ONECOLUM
add0: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
ade0: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a   if( pRet==0 ){.
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
ae00: 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20 20 20 20  et = pVal;.     
ae10: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
ae20: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
ae30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
ae40: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
ae50: 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20  TCL_BREAK;.     
ae60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ae70: 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74          Tcl_List
ae80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
ae90: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 70  (interp, pRet, p
aea0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Val);.          
aeb0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  }.        }.  . 
aec0: 20 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69         if( pScri
aed0: 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pt ){.          
aee0: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
aef0: 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
af00: 70 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pt, 0);.        
af10: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f    if( rc==TCL_CO
af20: 4e 54 49 4e 55 45 20 29 7b 0a 20 20 20 20 20 20  NTINUE ){.      
af30: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
af40: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
af50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
af60: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54  .      if( rc==T
af70: 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20  CL_BREAK ){.    
af80: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
af90: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
afa0: 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6c 75  /* Free the colu
afb0: 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65 63 74 73 20  mn name objects 
afc0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 63  */.      if( pSc
afd0: 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ript ){.        
afe0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
aff0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
b000: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
b010: 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b  t(apColName[i]);
b020: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b030: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
b040: 72 2a 29 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20  r*)apColName);. 
b050: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
b060: 20 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20   Free the bound 
b070: 73 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20  string and blob 
b080: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
b090: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
b0a0: 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Parm; i++){.    
b0b0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
b0c0: 6f 75 6e 74 28 61 70 50 61 72 6d 5b 69 5d 29 3b  ount(apParm[i]);
b0d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b0e0: 66 28 20 61 70 50 61 72 6d 21 3d 61 50 61 72 6d  f( apParm!=aParm
b0f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
b100: 46 72 65 65 28 28 63 68 61 72 2a 29 61 70 50 61  Free((char*)apPa
b110: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rm);.      }..  
b120: 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65      /* Reset the
b130: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20   statement.  If 
b140: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20  the result code 
b150: 69 73 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  is SQLITE_SCHEMA
b160: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
b170: 66 6c 75 73 68 20 74 68 65 20 73 74 61 74 65 6d  flush the statem
b180: 65 6e 74 20 63 61 63 68 65 20 61 6e 64 20 74 72  ent cache and tr
b190: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
b1a0: 61 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  again..      */.
b1b0: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
b1c0: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
b1d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
b1e0: 54 45 5f 53 43 48 45 4d 41 3d 3d 72 63 32 20 29  TE_SCHEMA==rc2 )
b1f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 66 74  {.        /* Aft
b200: 65 72 20 61 20 73 63 68 65 6d 61 20 63 68 61 6e  er a schema chan
b210: 67 65 2c 20 66 6c 75 73 68 20 74 68 65 20 63 61  ge, flush the ca
b220: 63 68 65 20 61 6e 64 20 74 72 79 20 74 6f 20 72  che and try to r
b230: 75 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  un the.        *
b240: 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69  * statement agai
b250: 6e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  n.        */.   
b260: 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61       flushStmtCa
b270: 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20  che( pDb );.    
b280: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
b290: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
b2a0: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
b2b0: 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68  t ) Tcl_Free((ch
b2c0: 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20  ar*)pPreStmt);. 
b2d0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
b2e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
b2f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 32 20   SQLITE_OK!=rc2 
b300: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
b310: 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f   a run-time erro
b320: 72 20 6f 63 63 75 72 73 2c 20 72 65 70 6f 72 74  r occurs, report
b330: 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64 20 73   the error and s
b340: 74 6f 70 20 72 65 61 64 69 6e 67 0a 20 20 20 20  top reading.    
b350: 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 0a 20      ** the SQL. 
b360: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
b370: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
b380: 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78  lt(interp, dbTex
b390: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  tToObj(sqlite3_e
b3a0: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29  rrmsg(pDb->db)))
b3b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b3c0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
b3d0: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
b3e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
b3f0: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20     if( pPreStmt 
b400: 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72  ) Tcl_Free((char
b410: 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20  *)pPreStmt);.   
b420: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b430: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 62 2d    }else if( pDb-
b440: 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 29 7b 0a 20  >maxStmt<=0 ){. 
b450: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
b460: 20 63 61 63 68 65 20 69 73 20 74 75 72 6e 65 64   cache is turned
b470: 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65   off, deallocate
b480: 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  d the statement 
b490: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
b4a0: 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72  PreStmt ) Tcl_Fr
b4b0: 65 65 28 28 63 68 61 72 2a 29 70 50 72 65 53 74  ee((char*)pPreSt
b4c0: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mt);.        sql
b4d0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
b4e0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tmt);.      }els
b4f0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76  e{.        /* Ev
b500: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 20  erything worked 
b510: 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 69 73  and the cache is
b520: 20 6f 70 65 72 61 74 69 6f 6e 61 6c 2e 0a 20 20   operational..  
b530: 20 20 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20        ** Create 
b540: 61 20 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65  a new SqlPrepare
b550: 64 53 74 6d 74 20 73 74 72 75 63 74 75 72 65 20  dStmt structure 
b560: 69 66 20 77 65 20 6e 65 65 64 20 6f 6e 65 2e 0a  if we need one..
b570: 20 20 20 20 20 20 20 20 2a 2a 20 28 49 66 20 77          ** (If w
b580: 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 6f  e already have o
b590: 6e 65 20 77 65 20 63 61 6e 20 6a 75 73 74 20 72  ne we can just r
b5a0: 65 75 73 65 20 69 74 2e 29 0a 20 20 20 20 20 20  euse it.).      
b5b0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
b5c0: 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a   pPreStmt==0 ){.
b5d0: 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20            len = 
b5e0: 7a 4c 65 66 74 20 2d 20 7a 53 71 6c 3b 0a 20 20  zLeft - zSql;.  
b5f0: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
b600: 20 3d 20 28 53 71 6c 50 72 65 70 61 72 65 64 53   = (SqlPreparedS
b610: 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  tmt*)Tcl_Alloc( 
b620: 73 69 7a 65 6f 66 28 2a 70 50 72 65 53 74 6d 74  sizeof(*pPreStmt
b630: 29 20 2b 20 6c 65 6e 20 29 3b 0a 20 20 20 20 20  ) + len );.     
b640: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
b650: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  t==0 ) return TC
b660: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
b670: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74     pPreStmt->pSt
b680: 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20  mt = pStmt;.    
b690: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
b6a0: 6e 53 71 6c 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  nSql = len;.    
b6b0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 72        memcpy(pPr
b6c0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71  eStmt->zSql, zSq
b6d0: 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  l, len);.       
b6e0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71     pPreStmt->zSq
b6f0: 6c 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  l[len] = 0;.    
b700: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
b710: 2a 20 41 64 64 20 74 68 65 20 70 72 65 70 61 72  * Add the prepar
b720: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ed statement to 
b730: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
b740: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 0a   the cache list.
b750: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
b760: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65     pPreStmt->pNe
b770: 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  xt = pDb->stmtLi
b780: 73 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65  st;.        pPre
b790: 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b  Stmt->pPrev = 0;
b7a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62  .        if( pDb
b7b0: 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20  ->stmtList ){.  
b7c0: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
b7d0: 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50  List->pPrev = pP
b7e0: 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  reStmt;.        
b7f0: 7d 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  }.        pDb->s
b800: 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74  tmtList = pPreSt
b810: 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mt;.        if( 
b820: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30  pDb->stmtLast==0
b830: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
b840: 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74  sert( pDb->nStmt
b850: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
b860: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
b870: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20   pPreStmt;.     
b880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b890: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
b8a0: 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20  >nStmt>0 );.    
b8b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44      }.        pD
b8c0: 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a  b->nStmt++;.   .
b8d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
b8e0: 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73   have too many s
b8f0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 63 61 63 68  tatement in cach
b900: 65 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 73 75  e, remove the su
b910: 72 70 6c 75 73 20 66 72 6f 6d 20 74 68 65 0a 20  rplus from the. 
b920: 20 20 20 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66         ** end of
b930: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e   the cache list.
b940: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
b950: 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e      while( pDb->
b960: 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74  nStmt>pDb->maxSt
b970: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
b980: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
b990: 28 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e  (pDb->stmtLast->
b9a0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
b9b0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
b9c0: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d  = pDb->stmtLast-
b9d0: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20  >pPrev;.        
b9e0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
b9f0: 2a 29 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d  *)pDb->stmtLast-
ba00: 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20  >pNext);.       
ba10: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
ba20: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ->pNext = 0;.   
ba30: 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d         pDb->nStm
ba40: 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t--;.        }. 
ba50: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
ba60: 20 50 72 6f 63 65 65 64 20 74 6f 20 74 68 65 20   Proceed to the 
ba70: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 2a  next statement *
ba80: 2f 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a  /.      zSql = z
ba90: 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Left;.    }.    
baa0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
bab0: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 20 20  (objv[2]);..    
bac0: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
bad0: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b    if( rc==TCL_OK
bae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
baf0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
bb00: 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20  erp, pRet);.    
bb10: 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44 65    }.      Tcl_De
bb20: 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
bb30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
bb40: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
bb50: 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63 74 69  *     $db functi
bb60: 6f 6e 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20  on NAME SCRIPT. 
bb70: 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20   **.  ** Create 
bb80: 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69  a new SQL functi
bb90: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
bba0: 20 57 68 65 6e 65 76 65 72 20 74 68 61 74 20 66   Whenever that f
bbb0: 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  unction is.  ** 
bbc0: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
bbd0: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
bbe0: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
bbf0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46    */.  case DB_F
bc00: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53  UNCTION: {.    S
bc10: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  qlFunc *pFunc;. 
bc20: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72     Tcl_Obj *pScr
bc30: 69 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ipt;.    char *z
bc40: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 6f 62  Name;.    if( ob
bc50: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54  jc!=4 ){.      T
bc60: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
bc70: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
bc80: 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b   "NAME SCRIPT");
bc90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
bca0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
bcb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47     zName = Tcl_G
bcc0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
bcd0: 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
bce0: 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
bcf0: 33 5d 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20  3];.    pFunc = 
bd00: 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62 2c  findSqlFunc(pDb,
bd10: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
bd20: 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75   pFunc==0 ) retu
bd30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
bd40: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53 63    if( pFunc->pSc
bd50: 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54 63  ript ){.      Tc
bd60: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
bd70: 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a  Func->pScript);.
bd80: 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d      }.    pFunc-
bd90: 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63 72 69  >pScript = pScri
bda0: 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  pt;.    Tcl_Incr
bdb0: 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
bdc0: 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75 73  );.    pFunc->us
bdd0: 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65  eEvalObjv = safe
bde0: 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e  ToUseEvalObjv(in
bdf0: 74 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b 0a  terp, pScript);.
be00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
be10: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
be20: 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  (pDb->db, zName,
be30: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
be40: 2c 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c  ,.        pFunc,
be50: 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20   tclSqlFunc, 0, 
be60: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
be70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
be80: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
be90: 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  R;.      Tcl_Set
bea0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
beb0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
bec0: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
bed0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
bee0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bef0: 2f 2a 20 4d 75 73 74 20 66 6c 75 73 68 20 61 6e  /* Must flush an
bf00: 79 20 63 61 63 68 65 64 20 73 74 61 74 65 6d 65  y cached stateme
bf10: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 66 6c 75  nts */.      flu
bf20: 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62  shStmtCache( pDb
bf30: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72   );.    }.    br
bf40: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
bf50: 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c   **     $db null
bf60: 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20  value ?STRING?. 
bf70: 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20   **.  ** Change 
bf80: 74 65 78 74 20 75 73 65 64 20 77 68 65 6e 20 61  text used when a
bf90: 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b   NULL comes back
bfa0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
bfb0: 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a  se. If ?STRING?.
bfc0: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73    ** is not pres
bfd0: 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ent, then the cu
bfe0: 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65  rrent string use
bff0: 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65  d for NULL is re
c000: 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20  turned..  ** If 
c010: 53 54 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e  STRING is presen
c020: 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69  t, then STRING i
c030: 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a  s returned..  **
c040: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
c050: 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20  NULLVALUE: {.   
c060: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
c070: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
c080: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
c090: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
c0a0: 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b  v, "NULLVALUE");
c0b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
c0c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
c0d0: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
c0e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  {.      int len;
c0f0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75  .      char *zNu
c100: 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ll = Tcl_GetStri
c110: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
c120: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
c130: 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29  if( pDb->zNull )
c140: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
c150: 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a  ee(pDb->zNull);.
c160: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c170: 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30  ( zNull && len>0
c180: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
c190: 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c  >zNull = Tcl_All
c1a0: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
c1b0: 20 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 70         strncpy(p
c1c0: 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c  Db->zNull, zNull
c1d0: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  , len);.        
c1e0: 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20  pDb->zNull[len] 
c1f0: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65  = '\0';.      }e
c200: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
c210: 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  ->zNull = 0;.   
c220: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54     }.    }.    T
c230: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
c240: 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f  interp, dbTextTo
c250: 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29  Obj(pDb->zNull))
c260: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
c270: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
c280: 24 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f  $db last_insert_
c290: 72 6f 77 69 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a  rowid .  **.  **
c2a0: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
c2b0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
c2c0: 52 4f 57 49 44 20 66 6f 72 20 74 68 65 20 6d 6f  ROWID for the mo
c2d0: 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74  st recent insert
c2e0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
c2f0: 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57  _LAST_INSERT_ROW
c300: 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ID: {.    Tcl_Ob
c310: 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
c320: 69 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69  int rowid;.    i
c330: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
c340: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
c350: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
c360: 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
c370: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c380: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77  R;.    }.    row
c390: 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73  id = sqlite3_las
c3a0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70  t_insert_rowid(p
c3b0: 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65  Db->db);.    pRe
c3c0: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
c3d0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
c3e0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f  .    Tcl_SetIntO
c3f0: 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f 77 69  bj(pResult, rowi
c400: 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  d);.    break;. 
c410: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68   }..  /*.  ** Th
c420: 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d  e DB_ONECOLUMN m
c430: 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65  ethod is impleme
c440: 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69  nted together wi
c450: 74 68 20 44 42 5f 45 56 41 4c 2e 0a 20 20 2a 2f  th DB_EVAL..  */
c460: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72  ..  /*    $db pr
c470: 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41  ogress ?N CALLBA
c480: 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49  CK?.  ** .  ** I
c490: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
c4a0: 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79 20 4e  callback every N
c4b0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
c4c0: 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65 20 65   opcodes while e
c4d0: 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75  xecuting.  ** qu
c4e0: 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  eries..  */.  ca
c4f0: 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53 3a 20  se DB_PROGRESS: 
c500: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  {.    if( objc==
c510: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
c520: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b  Db->zProgress ){
c530: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
c540: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
c550: 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  , pDb->zProgress
c560: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
c570: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
c580: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==4 ){.      cha
c590: 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20  r *zProgress;.  
c5a0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
c5b0: 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20     int N;.      
c5c0: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
c5d0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
c5e0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
c5f0: 4e 29 20 29 7b 0a 09 72 65 74 75 72 6e 20 54 43  N) ){..return TC
c600: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
c610: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
c620: 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
c630: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
c640: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a  Db->zProgress);.
c650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50        }.      zP
c660: 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65  rogress = Tcl_Ge
c670: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
c680: 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[3], &len);. 
c690: 20 20 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65       if( zProgre
c6a0: 73 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ss && len>0 ){. 
c6b0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
c6c0: 67 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f  gress = Tcl_Allo
c6d0: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
c6e0: 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62        strcpy(pDb
c6f0: 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72  ->zProgress, zPr
c700: 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d  ogress);.      }
c710: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
c720: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30  b->zProgress = 0
c730: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
c740: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
c750: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
c760: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
c770: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
c780: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
c790: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
c7a0: 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65    sqlite3_progre
c7b0: 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  ss_handler(pDb->
c7c0: 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73  db, N, DbProgres
c7d0: 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  sHandler, pDb);.
c7e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c7f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
c800: 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44  gress_handler(pD
c810: 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  b->db, 0, 0, 0);
c820: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
c830: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c840: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
c850: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
c860: 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29  v, "N CALLBACK")
c870: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
c880: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
c890: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
c8a0: 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66    /*    $db prof
c8b0: 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ile ?CALLBACK?. 
c8c0: 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72   **.  ** Make ar
c8d0: 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e  rangements to in
c8e0: 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43  voke the CALLBAC
c8f0: 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  K routine after 
c900: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
c910: 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73  nt.  ** that has
c920: 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20   run.  The text 
c930: 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74  of the SQL and t
c940: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61  he amount of ela
c950: 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a  pse time are.  *
c960: 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  * appended to CA
c970: 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68  LLBACK before th
c980: 65 20 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e  e script is run.
c990: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
c9a0: 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69  PROFILE: {.    i
c9b0: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
c9c0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
c9d0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
c9e0: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
c9f0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
ca00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ca10: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
ca20: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
ca30: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
ca40: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
ca50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ca60: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20   pDb->zProfile, 
ca70: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ca80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
ca90: 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20  r *zProfile;.   
caa0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
cab0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
cac0: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ile ){.        T
cad0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72  cl_Free(pDb->zPr
cae0: 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  ofile);.      }.
caf0: 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d        zProfile =
cb00: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
cb10: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
cb20: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
cb30: 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e  zProfile && len>
cb40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
cb50: 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c  ->zProfile = Tcl
cb60: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
cb70: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  );.        strcp
cb80: 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c  y(pDb->zProfile,
cb90: 20 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20   zProfile);.    
cba0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cbb0: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d   pDb->zProfile =
cbc0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
cbd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cbe0: 54 52 41 43 45 0a 20 20 20 20 20 20 69 66 28 20  TRACE.      if( 
cbf0: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
cc00: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
cc10: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
cc20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
cc30: 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20  rofile(pDb->db, 
cc40: 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72  DbProfileHandler
cc50: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
cc60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
cc70: 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62  ite3_profile(pDb
cc80: 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
cc90: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
cca0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
ccb0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
ccc0: 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20  $db rekey KEY.  
ccd0: 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74  **.  ** Change t
cce0: 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65  he encryption ke
ccf0: 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  y on the current
cd00: 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  ly open database
cd10: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
cd20: 5f 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e  _REKEY: {.    in
cd30: 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64  t nKey;.    void
cd40: 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66 28 20   *pKey;.    if( 
cd50: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
cd60: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
cd70: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
cd80: 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20  v, "KEY");.     
cd90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
cda0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  R;.    }.    pKe
cdb0: 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  y = Tcl_GetByteA
cdc0: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
cdd0: 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66  [2], &nKey);.#if
cde0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
cdf0: 4f 44 45 43 0a 20 20 20 20 72 63 20 3d 20 73 71  ODEC.    rc = sq
ce00: 6c 69 74 65 33 5f 72 65 6b 65 79 28 70 44 62 2d  lite3_rekey(pDb-
ce10: 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29  >db, pKey, nKey)
ce20: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
ce30: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
ce40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
ce50: 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
ce60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 0);.      rc =
ce70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ce80: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
ce90: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
cea0: 2a 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f  **     $db timeo
ceb0: 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a  ut MILLESECONDS.
cec0: 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20    **.  ** Delay 
ced0: 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  for the number o
cee0: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
cef0: 70 65 63 69 66 69 65 64 20 77 68 65 6e 20 61 20  pecified when a 
cf00: 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a  file is locked..
cf10: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
cf20: 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e  IMEOUT: {.    in
cf30: 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62  t ms;.    if( ob
cf40: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
cf50: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
cf60: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
cf70: 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29   "MILLISECONDS")
cf80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
cf90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
cfa0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
cfb0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
cfc0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20  , objv[2], &ms) 
cfd0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
cfe0: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  OR;.    sqlite3_
cff0: 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62  busy_timeout(pDb
d000: 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62  ->db, ms);.    b
d010: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  reak;.  }.  .  /
d020: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74  *.  **     $db t
d030: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a  otal_changes.  *
d040: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
d050: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
d060: 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66   that were modif
d070: 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f  ied, inserted, o
d080: 72 20 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20  r deleted .  ** 
d090: 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61  since the databa
d0a0: 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72  se handle was cr
d0b0: 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  eated..  */.  ca
d0c0: 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e  se DB_TOTAL_CHAN
d0d0: 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  GES: {.    Tcl_O
d0e0: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
d0f0: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
d100: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
d110: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
d120: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
d130: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d140: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
d150: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
d160: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
d170: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
d180: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71  tObj(pResult, sq
d190: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
d1a0: 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20  ges(pDb->db));. 
d1b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
d1c0: 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63 65   /*    $db trace
d1d0: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
d1e0: 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e  .  ** Make arran
d1f0: 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b  gements to invok
d200: 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72  e the CALLBACK r
d210: 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20  outine for each 
d220: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  SQL statement.  
d230: 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65 63 75  ** that is execu
d240: 74 65 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f  ted.  The text o
d250: 66 20 74 68 65 20 53 51 4c 20 69 73 20 61 70 70  f the SQL is app
d260: 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43  ended to CALLBAC
d270: 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74  K before.  ** it
d280: 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
d290: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41  */.  case DB_TRA
d2a0: 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  CE: {.    if( ob
d2b0: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
d2c0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
d2d0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
d2e0: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
d2f0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
d300: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
d310: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
d320: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
d330: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
d340: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
d350: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
d360: 54 72 61 63 65 2c 20 30 29 3b 0a 20 20 20 20 20  Trace, 0);.     
d370: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
d380: 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65      char *zTrace
d390: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
d3a0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
d3b0: 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  zTrace ){.      
d3c0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
d3d0: 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d  zTrace);.      }
d3e0: 0a 20 20 20 20 20 20 7a 54 72 61 63 65 20 3d 20  .      zTrace = 
d3f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
d400: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
d410: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
d420: 54 72 61 63 65 20 26 26 20 6c 65 6e 3e 30 20 29  Trace && len>0 )
d430: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
d440: 54 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f  Trace = Tcl_Allo
d450: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
d460: 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62        strcpy(pDb
d470: 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61 63 65  ->zTrace, zTrace
d480: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d490: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72          pDb->zTr
d4a0: 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ace = 0;.      }
d4b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d4c0: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20  OMIT_TRACE.     
d4d0: 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
d4e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
d4f0: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
d500: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d510: 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
d520: 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c   DbTraceHandler,
d530: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
d540: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
d550: 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
d560: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
d570: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
d580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
d590: 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73   /*    $db trans
d5a0: 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65  action [-deferre
d5b0: 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78  d|-immediate|-ex
d5c0: 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a  clusive] SCRIPT.
d5d0: 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20    **.  ** Start 
d5e0: 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
d5f0: 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74  n (if we are not
d600: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
d610: 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20  midst of a.  ** 
d620: 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64  transaction) and
d630: 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43 4c   execute the TCL
d640: 20 73 63 72 69 70 74 20 53 43 52 49 50 54 2e 20   script SCRIPT. 
d650: 20 41 66 74 65 72 20 53 43 52 49 50 54 0a 20 20   After SCRIPT.  
d660: 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69  ** completes, ei
d670: 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20  ther commit the 
d680: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72  transaction or r
d690: 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53  oll it back if S
d6a0: 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77  CRIPT.  ** throw
d6b0: 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  s an exception. 
d6c0: 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72   Or if no new tr
d6d0: 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61  ansation was sta
d6e0: 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  rted, do nothing
d6f0: 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20  ..  ** pass the 
d700: 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20  exception on up 
d710: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
d720: 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
d730: 64 20 77 61 73 20 69 6e 73 70 69 72 65 64 20 62  d was inspired b
d740: 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20  y Dave Thomas's 
d750: 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20  talk on Ruby at 
d760: 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27  the.  ** 2005 O'
d770: 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72  Reilly Open Sour
d780: 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f  ce Convention (O
d790: 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  SCON)..  */.  ca
d7a0: 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f  se DB_TRANSACTIO
d7b0: 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 6e 54  N: {.    int inT
d7c0: 72 61 6e 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  rans;.    Tcl_Ob
d7d0: 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20  j *pScript;.    
d7e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67  const char *zBeg
d7f0: 69 6e 20 3d 20 22 42 45 47 49 4e 22 3b 0a 20 20  in = "BEGIN";.  
d800: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
d810: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
d820: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
d830: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
d840: 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49  jv, "[TYPE] SCRI
d850: 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
d860: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d870: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
d880: 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70 53 63  ==3 ){.      pSc
d890: 72 69 70 74 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a  ript = objv[2];.
d8a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
d8b0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
d8c0: 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72 73  char *TTYPE_strs
d8d0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 22  [] = {.        "
d8e0: 64 65 66 65 72 72 65 64 22 2c 20 20 20 22 65 78  deferred",   "ex
d8f0: 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d 6d 65  clusive",  "imme
d900: 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20 20 20  diate", 0.      
d910: 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20 54 54  };.      enum TT
d920: 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20  YPE_enum {.     
d930: 20 20 20 54 54 59 50 45 5f 44 45 46 45 52 52 45     TTYPE_DEFERRE
d940: 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49  D, TTYPE_EXCLUSI
d950: 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44 49  VE, TTYPE_IMMEDI
d960: 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  ATE.      };.   
d970: 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20     int ttype;.  
d980: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
d990: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
d9a0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59  rp, objv[2], TTY
d9b0: 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e 73 61  PE_strs, "transa
d9c0: 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20 20  ction type",.   
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9e0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 26 74             0, &t
d9f0: 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20  type) ){.       
da00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
da10: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
da20: 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 54   switch( (enum T
da30: 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70 65 20  TYPE_enum)ttype 
da40: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
da50: 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 3a 20  TTYPE_DEFERRED: 
da60: 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20     /* no-op */; 
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
da90: 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c 55 53  ase TTYPE_EXCLUS
daa0: 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20  IVE:   zBegin = 
dab0: 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
dac0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
dad0: 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 49 4d     case TTYPE_IM
dae0: 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65 67 69  MEDIATE:   zBegi
daf0: 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45 44  n = "BEGIN IMMED
db00: 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20  IATE";  break;. 
db10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63       }.      pSc
db20: 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  ript = objv[3];.
db30: 20 20 20 20 7d 0a 20 20 20 20 69 6e 54 72 61 6e      }.    inTran
db40: 73 20 3d 20 21 73 71 6c 69 74 65 33 5f 67 65 74  s = !sqlite3_get
db50: 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 44 62 2d  _autocommit(pDb-
db60: 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69  >db);.    if( !i
db70: 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20  nTrans ){.      
db80: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
db90: 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c  ->db, zBegin, 0,
dba0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
dbb0: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
dbc0: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63  bjEx(interp, pSc
dbd0: 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  ript, 0);.    if
dbe0: 28 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20  ( !inTrans ){.  
dbf0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
dc00: 7a 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  zEnd;.      if( 
dc10: 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b  rc==TCL_ERROR ){
dc20: 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20  .        zEnd = 
dc30: 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20  "ROLLBACK";.    
dc40: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
dc50: 20 20 20 7a 45 6e 64 20 3d 20 22 43 4f 4d 4d 49     zEnd = "COMMI
dc60: 54 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T";.      }.    
dc70: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
dc80: 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c  Db->db, zEnd, 0,
dc90: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
dca0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
dcb0: 2f 2a 20 20 20 20 24 64 62 20 76 65 72 73 69 6f  /*    $db versio
dcc0: 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  n.  **.  ** Retu
dcd0: 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73  rn the version s
dce0: 74 72 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64  tring for this d
dcf0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
dd00: 63 61 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a  case DB_VERSION:
dd10: 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65   {.    Tcl_SetRe
dd20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
dd30: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62  ar *)sqlite3_lib
dd40: 76 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53  version(), TCL_S
dd50: 54 41 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61  TATIC);.    brea
dd60: 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20  k;.  }...  } /* 
dd70: 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54 43  End of the SWITC
dd80: 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  H statement */. 
dd90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
dda0: 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44  *.**   sqlite3 D
ddb0: 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f  BNAME FILENAME ?
ddc0: 4d 4f 44 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f  MODE? ?-key KEY?
ddd0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
dde0: 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d  he main Tcl comm
ddf0: 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22  and.  When the "
de00: 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d  sqlite" Tcl comm
de10: 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65  and is.** invoke
de20: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
de30: 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20  runs to process 
de40: 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  that command..**
de50: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
de60: 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20  gument, DBNAME, 
de70: 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20  is an arbitrary 
de80: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a  name for a new.*
de90: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
dea0: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d  ction.  This com
deb0: 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e  mand creates a n
dec0: 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64  ew command named
ded0: 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20  .** DBNAME that 
dee0: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72  is used to contr
def0: 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69  ol that connecti
df00: 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  on.  The databas
df10: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e.** connection 
df20: 69 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  is deleted when 
df30: 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61  the DBNAME comma
df40: 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  nd is deleted..*
df50: 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
df60: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
df70: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65  name of the dire
df80: 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
df90: 69 6e 73 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ins.** the sqlit
dfa0: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
dfb0: 69 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  is to be accesse
dfc0: 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 73  d..**.** For tes
dfd0: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 77  ting purposes, w
dfe0: 65 20 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 74  e also support t
dff0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
e000: 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 65 6e  .**  sqlite3 -en
e010: 63 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20  coding.**.**    
e020: 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 6e     Return the en
e030: 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 4c  coding used by L
e040: 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65  IKE and GLOB ope
e050: 72 61 74 6f 72 73 2e 20 20 43 68 6f 69 63 65 73  rators.  Choices
e060: 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 55 54  .**       are UT
e070: 46 2d 38 20 61 6e 64 20 69 73 6f 38 38 35 39 2e  F-8 and iso8859.
e080: 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20  .**.**  sqlite3 
e090: 2d 76 65 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  -version.**.**  
e0a0: 20 20 20 20 20 52 65 74 75 72 6e 20 74 68 65 20       Return the 
e0b0: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f  version number o
e0c0: 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  f the SQLite lib
e0d0: 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c  rary..**.**  sql
e0e0: 69 74 65 33 20 2d 74 63 6c 2d 75 73 65 73 2d 75  ite3 -tcl-uses-u
e0f0: 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52  tf.**.**       R
e100: 65 74 75 72 6e 20 22 31 22 20 69 66 20 63 6f 6d  eturn "1" if com
e110: 70 69 6c 65 64 20 77 69 74 68 20 61 20 54 63 6c  piled with a Tcl
e120: 20 75 73 65 73 20 55 54 46 2d 38 2e 20 20 52 65   uses UTF-8.  Re
e130: 74 75 72 6e 20 22 30 22 20 69 66 0a 2a 2a 20 20  turn "0" if.**  
e140: 20 20 20 20 20 6e 6f 74 2e 20 20 55 73 65 64 20       not.  Used 
e150: 62 79 20 74 65 73 74 73 20 74 6f 20 6d 61 6b 65  by tests to make
e160: 20 73 75 72 65 20 74 68 65 20 6c 69 62 72 61 72   sure the librar
e170: 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 0a  y was compiled .
e180: 2a 2a 20 20 20 20 20 20 20 63 6f 72 72 65 63 74  **       correct
e190: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
e1a0: 74 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63  t DbMain(void *c
e1b0: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
e1c0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
e1d0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
e1e0: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
e1f0: 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65   *p;.  void *pKe
e200: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65  y = 0;.  int nKe
e210: 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  y = 0;.  const c
e220: 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61  har *zArg;.  cha
e230: 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 63 6f  r *zErrMsg;.  co
e240: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
e250: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 38 30 5d  .  char zBuf[80]
e260: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  ;.  if( objc==2 
e270: 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63  ){.    zArg = Tc
e280: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
e290: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
e2a0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
e2b0: 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d  Arg,"-version")=
e2c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
e2d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e2e0: 65 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73  erp,sqlite3_vers
e2f0: 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65  ion,0);.      re
e300: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
e310: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
e320: 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64  p(zArg,"-has-cod
e330: 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65  ec")==0 ){.#ifde
e340: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
e350: 45 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  EC.      Tcl_App
e360: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e370: 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20  ,"1",0);.#else. 
e380: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
e390: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22  esult(interp,"0"
e3a0: 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ,0);.#endif.    
e3b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
e3c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
e3d0: 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 74 63 6c  trcmp(zArg,"-tcl
e3e0: 2d 75 73 65 73 2d 75 74 66 22 29 3d 3d 30 20 29  -uses-utf")==0 )
e3f0: 7b 0a 23 69 66 64 65 66 20 54 43 4c 5f 55 54 46  {.#ifdef TCL_UTF
e400: 5f 4d 41 58 0a 20 20 20 20 20 20 54 63 6c 5f 41  _MAX.      Tcl_A
e410: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e420: 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65  rp,"1",0);.#else
e430: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
e440: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
e450: 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0",0);.#endif.  
e460: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
e470: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
e480: 66 28 20 6f 62 6a 63 3d 3d 35 20 7c 7c 20 6f 62  f( objc==5 || ob
e490: 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 7a 41 72  jc==6 ){.    zAr
e4a0: 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
e4b0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f 62  gFromObj(objv[ob
e4c0: 6a 63 2d 32 5d 2c 20 30 29 3b 0a 20 20 20 20 69  jc-2], 0);.    i
e4d0: 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
e4e0: 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  -key")==0 ){.   
e4f0: 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65     pKey = Tcl_Ge
e500: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
e510: 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20  j(objv[objc-1], 
e520: 26 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 6f 62  &nKey);.      ob
e530: 6a 63 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  jc -= 2;.    }. 
e540: 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33   }.  if( objc!=3
e550: 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
e560: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
e570: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
e580: 62 6a 76 2c 20 0a 23 69 66 64 65 66 20 53 51 4c  bjv, .#ifdef SQL
e590: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
e5a0: 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45      "HANDLE FILE
e5b0: 4e 41 4d 45 20 3f 2d 6b 65 79 20 43 4f 44 45 43  NAME ?-key CODEC
e5c0: 2d 4b 45 59 3f 22 0a 23 65 6c 73 65 0a 20 20 20  -KEY?".#else.   
e5d0: 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e     "HANDLE FILEN
e5e0: 41 4d 45 20 3f 4d 4f 44 45 3f 22 0a 23 65 6e 64  AME ?MODE?".#end
e5f0: 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65  if.    );.    re
e600: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e610: 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20    }.  zErrMsg = 
e620: 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65  0;.  p = (Sqlite
e630: 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  Db*)Tcl_Alloc( s
e640: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
e650: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54  f( p==0 ){.    T
e660: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
e670: 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69  erp, "malloc fai
e680: 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  led", TCL_STATIC
e690: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
e6a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d  L_ERROR;.  }.  m
e6b0: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
e6c0: 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65  of(*p));.  zFile
e6d0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
e6e0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
e6f0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f   0);.  sqlite3_o
e700: 70 65 6e 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64  pen(zFile, &p->d
e710: 62 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  b);.  if( SQLITE
e720: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72  _OK!=sqlite3_err
e730: 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20  code(p->db) ){. 
e740: 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 74 72     zErrMsg = str
e750: 64 75 70 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  dup(sqlite3_errm
e760: 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
e770: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
e780: 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20  >db);.    p->db 
e790: 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  = 0;.  }.#ifdef 
e7a0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
e7b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 70  .  sqlite3_key(p
e7c0: 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  ->db, pKey, nKey
e7d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
e7e0: 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
e7f0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
e800: 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54  terp, zErrMsg, T
e810: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
e820: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
e830: 2a 29 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  *)p);.    free(z
e840: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74  ErrMsg);.    ret
e850: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e860: 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20   }.  p->maxStmt 
e870: 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53  = NUM_PREPARED_S
e880: 54 4d 54 53 3b 0a 20 20 7a 41 72 67 20 3d 20 54  TMTS;.  zArg = T
e890: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
e8a0: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b  Obj(objv[1], 0);
e8b0: 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
e8c0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
e8d0: 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20  zArg, DbObjCmd, 
e8e0: 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65  (char*)p, DbDele
e8f0: 74 65 43 6d 64 29 3b 0a 0a 20 20 2f 2a 20 54 68  teCmd);..  /* Th
e900: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
e910: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
e920: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
e930: 65 72 0a 20 20 2a 2f 0a 20 20 73 70 72 69 6e 74  er.  */.  sprint
e940: 66 28 7a 42 75 66 2c 20 22 25 70 22 2c 20 70 2d  f(zBuf, "%p", p-
e950: 3e 64 62 29 3b 0a 20 20 69 66 28 20 73 74 72 6e  >db);.  if( strn
e960: 63 6d 70 28 7a 42 75 66 2c 22 30 78 22 2c 32 29  cmp(zBuf,"0x",2)
e970: 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
e980: 7a 42 75 66 2c 20 22 30 78 25 70 22 2c 20 70 2d  zBuf, "0x%p", p-
e990: 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  >db);.  }.  Tcl_
e9a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e9b0: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 0a  erp, zBuf, 0);..
e9c0: 20 20 2f 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64    /* If compiled
e9d0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
e9e0: 54 20 74 75 72 6e 65 64 20 6f 6e 2c 20 74 68 65  T turned on, the
e9f0: 6e 20 72 65 67 69 73 74 65 72 20 74 68 65 20 22  n register the "
ea00: 6d 64 35 73 75 6d 22 0a 20 20 2a 2a 20 53 51 4c  md5sum".  ** SQL
ea10: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
ea20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
ea30: 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72  ST.  {.    exter
ea40: 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73  n void Md5_Regis
ea50: 74 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23  ter(sqlite3*);.#
ea60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d  ifdef SQLITE_MEM
ea70: 44 45 42 55 47 0a 20 20 20 20 69 6e 74 20 6d 61  DEBUG.    int ma
ea80: 6c 6c 6f 63 66 61 69 6c 20 3d 20 73 71 6c 69 74  llocfail = sqlit
ea90: 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3b 0a  e3_iMallocFail;.
eaa0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c      sqlite3_iMal
eab0: 6c 6f 63 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e  locFail = 0;.#en
eac0: 64 69 66 0a 20 20 20 20 4d 64 35 5f 52 65 67 69  dif.    Md5_Regi
ead0: 73 74 65 72 28 70 2d 3e 64 62 29 3b 0a 23 69 66  ster(p->db);.#if
eae0: 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45  def SQLITE_MEMDE
eaf0: 42 55 47 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  BUG.    sqlite3_
eb00: 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6d 61  iMallocFail = ma
eb10: 6c 6c 6f 63 66 61 69 6c 3b 0a 23 65 6e 64 69 66  llocfail;.#endif
eb20: 0a 20 20 20 7d 0a 23 65 6e 64 69 66 20 20 0a 20  .   }.#endif  . 
eb30: 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74   p->interp = int
eb40: 65 72 70 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  erp;.  return TC
eb50: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  L_OK;.}../*.** P
eb60: 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54  rovide a dummy T
eb70: 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20  cl_InitStubs if 
eb80: 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  we are using thi
eb90: 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a  s as a static.**
eba0: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
ebb0: 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  ndef USE_TCL_STU
ebc0: 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f  BS.# undef  Tcl_
ebd0: 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66 69  InitStubs.# defi
ebe0: 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  ne Tcl_InitStubs
ebf0: 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a  (a,b,c).#endif..
ec00: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
ec10: 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41 47  we have a PACKAG
ec20: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20  E_VERSION macro 
ec30: 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77  defined.  This w
ec40: 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65  ill be.** define
ec50: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
ec60: 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66  by the TEA makef
ec70: 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20  ile.  But other 
ec80: 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20  makefiles.** do 
ec90: 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a  not define it..*
eca0: 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47  /.#ifndef PACKAG
ecb0: 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69  E_VERSION.# defi
ecc0: 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ne PACKAGE_VERSI
ecd0: 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  ON SQLITE_VERSIO
ece0: 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  N.#endif../*.** 
ecf0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  Initialize this 
ed00: 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  module..**.** Th
ed10: 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f  is Tcl module co
ed20: 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69  ntains only a si
ed30: 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d  ngle new Tcl com
ed40: 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69  mand named "sqli
ed50: 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74  te"..** (Hence t
ed60: 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73  here is no names
ed70: 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20  pace.  There is 
ed80: 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e  no point in usin
ed90: 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  g a namespace.**
eda0: 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f   if the extensio
edb0: 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20  n only supplies 
edc0: 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20  one new name!)  
edd0: 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d  The "sqlite" com
ede0: 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20  mand is.** used 
edf0: 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51  to open a new SQ
ee00: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
ee10: 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29  See the DbMain()
ee20: 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a   routine above.*
ee30: 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
ee40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
ee50: 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
ee60: 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  te3_Init(Tcl_Int
ee70: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
ee80: 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
ee90: 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b  terp, "8.4", 0);
eea0: 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
eeb0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
eec0: 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f  "sqlite3", (Tcl_
eed0: 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61  ObjCmdProc*)DbMa
eee0: 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c  in, 0, 0);.  Tcl
eef0: 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
ef00: 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50  rp, "sqlite3", P
ef10: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b  ACKAGE_VERSION);
ef20: 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
ef30: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
ef40: 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f  "sqlite", (Tcl_O
ef50: 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
ef60: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  n, 0, 0);.  Tcl_
ef70: 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
ef80: 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 50 41 43  p, "sqlite", PAC
ef90: 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  KAGE_VERSION);. 
efa0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
efb0: 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
efc0: 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c  sqlite3_Init(Tcl
efd0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
efe0: 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
eff0: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
f000: 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
f010: 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  te3_SafeInit(Tcl
f020: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
f030: 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
f040: 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63   }.EXTERN int Tc
f050: 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69  lsqlite3_SafeIni
f060: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
f070: 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
f080: 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65 66  L_OK; }..#ifndef
f090: 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58   SQLITE_3_SUFFIX
f0a0: 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e 20 69 6e 74  _ONLY.EXTERN int
f0b0: 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c   Sqlite_Init(Tcl
f0c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
f0d0: 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
f0e0: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
f0f0: 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
f100: 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
f110: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
f120: 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
f130: 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45  nit(interp); }.E
f140: 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
f150: 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
f160: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
f170: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
f180: 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
f190: 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63  lite_SafeInit(Tc
f1a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f1b0: 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
f1c0: 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ; }.#endif..#ifd
f1d0: 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a  ef TCLSH./******
f1e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f220: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63  *******.** The c
f230: 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ode that follows
f240: 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
f250: 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c  d standalone TCL
f260: 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2f   interpreters.*/
f270: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ../*.** If the m
f280: 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e  acro TCLSH is on
f290: 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20 63  e, then put in c
f2a0: 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74 68 65  ode this for the
f2b0: 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69  .** "main" routi
f2c0: 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69  ne that will ini
f2d0: 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20  tialize Tcl and 
f2e0: 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a  take input from.
f2f0: 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75  ** standard inpu
f300: 74 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d  t..*/.#if TCLSH=
f310: 3d 31 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  =1.static char z
f320: 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22  Mainloop[] =.  "
f330: 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20  set line {}\n". 
f340: 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73   "while {![eof s
f350: 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  tdin]} {\n".    
f360: 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22  "if {$line!=\"\"
f370: 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75  } {\n".      "pu
f380: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22  ts -nonewline \"
f390: 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65  > \"\n".    "} e
f3a0: 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  lse {\n".      "
f3b0: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
f3c0: 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d  \"% \"\n".    "}
f3d0: 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73 68 20 73  \n".    "flush s
f3e0: 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61 70  tdout\n".    "ap
f3f0: 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20  pend line [gets 
f400: 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69  stdin]\n".    "i
f410: 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74  f {[info complet
f420: 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20  e $line]} {\n". 
f430: 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68       "if {[catch
f440: 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69   {uplevel #0 $li
f450: 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e  ne} result]} {\n
f460: 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20  ".        "puts 
f470: 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20  stderr \"Error: 
f480: 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20  $result\"\n".   
f490: 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72     "} elseif {$r
f4a0: 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  esult!=\"\"} {\n
f4b0: 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20  ".        "puts 
f4c0: 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20  $result\n".     
f4d0: 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73 65   "}\n".      "se
f4e0: 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20  t line {}\n".   
f4f0: 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20   "} else {\n".  
f500: 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65      "append line
f510: 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e   \\n\n".    "}\n
f520: 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e 64  ".  "}\n".;.#end
f530: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
f540: 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20   macro TCLSH is 
f550: 74 77 6f 2c 20 74 68 65 6e 20 67 65 74 20 74 68  two, then get th
f560: 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f 64 65  e main loop code
f570: 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 73   out of.** the s
f580: 65 70 61 72 61 74 65 20 66 69 6c 65 20 22 73 70  eparate file "sp
f590: 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e 0a  aceanal_tcl.h"..
f5a0: 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a  */.#if TCLSH==2.
f5b0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69  static char zMai
f5c0: 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63 6c  nloop[] = .#incl
f5d0: 75 64 65 20 22 73 70 61 63 65 61 6e 61 6c 5f 74  ude "spaceanal_t
f5e0: 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a  cl.h".;.#endif..
f5f0: 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41  #define TCLSH_MA
f600: 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65  IN main   /* Nee
f610: 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74 20  ded to fake out 
f620: 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20  mktclapp */.int 
f630: 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61  TCLSH_MAIN(int a
f640: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
f650: 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
f660: 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 46  *interp;.  Tcl_F
f670: 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61 72  indExecutable(ar
f680: 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70  gv[0]);.  interp
f690: 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74   = Tcl_CreateInt
f6a0: 65 72 70 28 29 3b 0a 20 20 53 71 6c 69 74 65 33  erp();.  Sqlite3
f6b0: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
f6c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
f6d0: 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  T.  {.    extern
f6e0: 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31   int Sqlitetest1
f6f0: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
f700: 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
f710: 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49  nt Sqlitetest2_I
f720: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
f730: 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
f740: 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
f750: 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
f760: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
f770: 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
f780: 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
f790: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
f7a0: 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63  itetest5_Init(Tc
f7b0: 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
f7c0: 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f 49  extern int Md5_I
f7d0: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
f7e0: 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
f7f0: 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49   Sqlitetestsse_I
f800: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
f810: 3b 0a 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  ;..    Sqlitetes
f820: 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t1_Init(interp);
f830: 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32  .    Sqlitetest2
f840: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
f850: 20 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49     Sqlitetest3_I
f860: 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
f870: 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69   Sqlitetest4_Ini
f880: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
f890: 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28  qlitetest5_Init(
f8a0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 4d 64 35  interp);.    Md5
f8b0: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
f8c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45  ifdef SQLITE_SSE
f8d0: 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73  .    Sqlitetests
f8e0: 73 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  se_Init(interp);
f8f0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
f900: 69 66 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32  if.  if( argc>=2
f910: 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a   || TCLSH==2 ){.
f920: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 54      int i;.    T
f930: 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
f940: 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d  ,"argv0",argv[1]
f950: 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59  ,TCL_GLOBAL_ONLY
f960: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
f970: 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c  r(interp,"argv",
f980: 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f   "", TCL_GLOBAL_
f990: 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69  ONLY);.    for(i
f9a0: 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63  =3-TCLSH; i<argc
f9b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
f9c0: 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
f9d0: 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d   "argv", argv[i]
f9e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f  ,.          TCL_
f9f0: 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43  GLOBAL_ONLY | TC
fa00: 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c  L_LIST_ELEMENT |
fa10: 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55   TCL_APPEND_VALU
fa20: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  E);.    }.    if
fa30: 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63  ( TCLSH==1 && Tc
fa40: 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72  l_EvalFile(inter
fa50: 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c  p, argv[1])!=TCL
fa60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  _OK ){.      con
fa70: 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d  st char *zInfo =
fa80: 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65   Tcl_GetVar(inte
fa90: 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c  rp, "errorInfo",
faa0: 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
fab0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e  );.      if( zIn
fac0: 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20  fo==0 ) zInfo = 
fad0: 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74 3b 0a  interp->result;.
fae0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
faf0: 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c  derr,"%s: %s\n",
fb00: 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a   *argv, zInfo);.
fb10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
fb20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
fb30: 61 72 67 63 3c 3d 31 20 7c 7c 20 54 43 4c 53 48  argc<=1 || TCLSH
fb40: 3d 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47  ==2 ){.    Tcl_G
fb50: 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70  lobalEval(interp
fb60: 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20  , zMainloop);.  
fb70: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
fb80: 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20  #endif /* TCLSH 
fb90: 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  */..#endif /* !d
fba0: 65 66 69 6e 65 64 28 4e 4f 5f 54 43 4c 29 20 2a  efined(NO_TCL) *
fbb0: 2f 0a                                            /.