/ Hex Artifact Content
Login

Artifact c5700d147d3156a93485f9cb6ec397b151841c96:


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 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45  nt.h".#if SQLITE
0240: 5f 4f 53 5f 57 49 4e 0a 23 20 20 69 6e 63 6c 75  _OS_WIN.#  inclu
0250: 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a 23 65  de "os_win.h".#e
0260: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0270: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 66 20 64  vdbeInt.h".#if d
0280: 65 66 69 6e 65 64 28 49 4e 43 4c 55 44 45 5f 53  efined(INCLUDE_S
0290: 51 4c 49 54 45 5f 54 43 4c 5f 48 29 0a 23 20 20  QLITE_TCL_H).#  
02a0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 5f  include "sqlite_
02b0: 74 63 6c 2e 68 22 0a 23 65 6c 73 65 0a 23 20 20  tcl.h".#else.#  
02c0: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
02d0: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
02e0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
02f0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a  ude <string.h>..
0300: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
0310: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72 73  copy of the firs
0320: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 53 71  t part of the Sq
0330: 6c 69 74 65 44 62 20 73 74 72 75 63 74 75 72 65  liteDb structure
0340: 20 69 6e 20 0a 2a 2a 20 74 63 6c 73 71 6c 69 74   in .** tclsqlit
0350: 65 2e 63 2e 20 20 57 65 20 6e 65 65 64 20 69 74  e.c.  We need it
0360: 20 68 65 72 65 20 73 6f 20 74 68 61 74 20 74 68   here so that th
0370: 65 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69  e get_sqlite_poi
0380: 6e 74 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  nter routine.** 
0390: 63 61 6e 20 65 78 74 72 61 63 74 20 74 68 65 20  can extract the 
03a0: 73 71 6c 69 74 65 33 2a 20 70 6f 69 6e 74 65 72  sqlite3* pointer
03b0: 20 66 72 6f 6d 20 61 6e 20 65 78 69 73 74 69 6e   from an existin
03c0: 67 20 54 63 6c 20 53 51 4c 69 74 65 0a 2a 2a 20  g Tcl SQLite.** 
03d0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
03e0: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
03f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
0400: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  };../*.** Conver
0410: 74 20 74 65 78 74 20 67 65 6e 65 72 61 74 65 64  t text generated
0420: 20 62 79 20 74 68 65 20 22 25 70 22 20 63 6f 6e   by the "%p" con
0430: 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 62  version format b
0440: 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20 61 20 70 6f  ack into.** a po
0450: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
0460: 20 69 6e 74 20 74 65 73 74 48 65 78 54 6f 49 6e   int testHexToIn
0470: 74 28 69 6e 74 20 68 29 7b 0a 20 20 69 66 28 20  t(int h){.  if( 
0480: 68 3e 3d 27 30 27 20 26 26 20 68 3c 3d 27 39 27  h>='0' && h<='9'
0490: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68   ){.    return h
04a0: 20 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20   - '0';.  }else 
04b0: 69 66 28 20 68 3e 3d 27 61 27 20 26 26 20 68 3c  if( h>='a' && h<
04c0: 3d 27 66 27 20 29 7b 0a 20 20 20 20 72 65 74 75  ='f' ){.    retu
04d0: 72 6e 20 68 20 2d 20 27 61 27 20 2b 20 31 30 3b  rn h - 'a' + 10;
04e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
04f0: 73 65 72 74 28 20 68 3e 3d 27 41 27 20 26 26 20  sert( h>='A' && 
0500: 68 3c 3d 27 46 27 20 29 3b 0a 20 20 20 20 72 65  h<='F' );.    re
0510: 74 75 72 6e 20 68 20 2d 20 27 41 27 20 2b 20 31  turn h - 'A' + 1
0520: 30 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 2a 73  0;.  }.}.void *s
0530: 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
0540: 50 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Ptr(const char *
0550: 7a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  z){.  void *p;. 
0560: 20 75 36 34 20 76 3b 0a 20 20 75 33 32 20 76 32   u64 v;.  u32 v2
0570: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 30  ;.  if( z[0]=='0
0580: 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 78 27 20 29  ' && z[1]=='x' )
0590: 7b 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20  {.    z += 2;.  
05a0: 7d 0a 20 20 76 20 3d 20 30 3b 0a 20 20 77 68 69  }.  v = 0;.  whi
05b0: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 76 20  le( *z ){.    v 
05c0: 3d 20 28 76 3c 3c 34 29 20 2b 20 74 65 73 74 48  = (v<<4) + testH
05d0: 65 78 54 6f 49 6e 74 28 2a 7a 29 3b 0a 20 20 20  exToInt(*z);.   
05e0: 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   z++;.  }.  if( 
05f0: 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65 6f  sizeof(p)==sizeo
0600: 66 28 76 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63  f(v) ){.    memc
0610: 70 79 28 26 70 2c 20 26 76 2c 20 73 69 7a 65 6f  py(&p, &v, sizeo
0620: 66 28 70 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f(p));.  }else{.
0630: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
0640: 6f 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28 76 32  of(p)==sizeof(v2
0650: 29 20 29 3b 0a 20 20 20 20 76 32 20 3d 20 28 75  ) );.    v2 = (u
0660: 33 32 29 76 3b 0a 20 20 20 20 6d 65 6d 63 70 79  32)v;.    memcpy
0670: 28 26 70 2c 20 26 76 32 2c 20 73 69 7a 65 6f 66  (&p, &v2, sizeof
0680: 28 70 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (p));.  }.  retu
0690: 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn p;.}.../*.** 
06a0: 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 68  A TCL command th
06b0: 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 61  at returns the a
06c0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 71  ddress of the sq
06d0: 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 0a 2a 2a  lite* pointer.**
06e0: 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 20 63   for an sqlite c
06f0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 73 74 61 6e  onnection instan
0700: 63 65 2e 20 20 42 61 64 20 74 68 69 6e 67 73 20  ce.  Bad things 
0710: 68 61 70 70 65 6e 20 69 66 20 74 68 65 0a 2a 2a  happen if the.**
0720: 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61 6e   input is not an
0730: 20 73 71 6c 69 74 65 20 63 6f 6e 6e 65 63 74 69   sqlite connecti
0740: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
0750: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
0760: 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74  get_sqlite_point
0770: 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  er(.  void * cli
0780: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
0790: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
07a0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
07b0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
07c0: 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  [].){.  struct S
07d0: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
07e0: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
07f0: 6f 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  o;.  char zBuf[1
0800: 30 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  00];.  if( objc!
0810: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
0820: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
0830: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 1, objv, "SQL
0840: 49 54 45 2d 43 4f 4e 4e 45 43 54 49 4f 4e 22 29  ITE-CONNECTION")
0850: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
0860: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
0870: 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
0880: 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
0890: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
08a0: 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
08b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
08c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
08d0: 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75  "command not fou
08e0: 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  nd: ",.         
08f0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
0900: 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
0910: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
0920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
0930: 20 70 20 3d 20 28 73 74 72 75 63 74 20 53 71 6c   p = (struct Sql
0940: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
0950: 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  bjClientData;.  
0960: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
0970: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
0980: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
0990: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
09a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
09b0: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
09c0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
09d0: 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74  * Decode a point
09e0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
09f0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20   object..*/.int 
0a00: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
0a10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c   const char *zA,
0a30: 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29   sqlite3 **ppDb)
0a40: 7b 0a 20 20 73 74 72 75 63 74 20 53 71 6c 69 74  {.  struct Sqlit
0a50: 65 44 62 20 2a 70 3b 0a 20 20 54 63 6c 5f 43 6d  eDb *p;.  Tcl_Cm
0a60: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
0a70: 20 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d   if( Tcl_GetComm
0a80: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
0a90: 7a 41 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  zA, &cmdInfo) ){
0aa0: 0a 20 20 20 20 70 20 3d 20 28 73 74 72 75 63 74  .    p = (struct
0ab0: 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
0ac0: 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
0ad0: 3b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 70 2d  ;.    *ppDb = p-
0ae0: 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >db;.  }else{.  
0af0: 20 20 2a 70 70 44 62 20 3d 20 28 73 71 6c 69 74    *ppDb = (sqlit
0b00: 65 33 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54  e3*)sqlite3TestT
0b10: 65 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20  extToPtr(zA);.  
0b20: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
0b30: 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
0b40: 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 44 65  _OS_WIN./*.** De
0b50: 63 6f 64 65 20 61 20 57 69 6e 33 32 20 48 41 4e  code a Win32 HAN
0b60: 44 4c 45 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69  DLE object..*/.i
0b70: 6e 74 20 67 65 74 57 69 6e 33 32 48 61 6e 64 6c  nt getWin32Handl
0b80: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
0b90: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  terp, const char
0ba0: 20 2a 7a 41 2c 20 4c 50 48 41 4e 44 4c 45 20 70   *zA, LPHANDLE p
0bb0: 68 46 69 6c 65 29 7b 0a 20 20 2a 70 68 46 69 6c  hFile){.  *phFil
0bc0: 65 20 3d 20 28 48 41 4e 44 4c 45 29 73 71 6c 69  e = (HANDLE)sqli
0bd0: 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
0be0: 28 7a 41 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (zA);.  return T
0bf0: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
0c00: 0a 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68  .extern const ch
0c10: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
0c20: 6d 65 28 69 6e 74 29 3b 0a 23 64 65 66 69 6e 65  me(int);.#define
0c30: 20 74 31 45 72 72 6f 72 4e 61 6d 65 20 73 71 6c   t1ErrorName sql
0c40: 69 74 65 33 45 72 72 4e 61 6d 65 0a 0a 2f 2a 0a  ite3ErrName../*.
0c50: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 73 71  ** Convert an sq
0c60: 6c 69 74 65 33 5f 73 74 6d 74 2a 20 69 6e 74 6f  lite3_stmt* into
0c70: 20 61 6e 20 73 71 6c 69 74 65 33 2a 2e 20 20 54   an sqlite3*.  T
0c80: 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  his depends on t
0c90: 68 65 0a 2a 2a 20 66 61 63 74 20 74 68 61 74 20  he.** fact that 
0ca0: 74 68 65 20 73 71 6c 69 74 65 33 2a 20 69 73 20  the sqlite3* is 
0cb0: 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
0cc0: 69 6e 20 74 68 65 20 56 64 62 65 20 73 74 72 75  in the Vdbe stru
0cd0: 63 74 75 72 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cture..*/.#defin
0ce0: 65 20 53 74 6d 74 54 6f 44 62 28 58 29 20 20 20  e StmtToDb(X)   
0cf0: 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
0d00: 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  e(X)../*.** Chec
0d10: 6b 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65  k a return value
0d20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
0d30: 20 61 67 72 65 65 73 20 77 69 74 68 20 74 68 65   agrees with the
0d40: 20 72 65 73 75 6c 74 73 0a 2a 2a 20 66 72 6f 6d   results.** from
0d50: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
0d60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0d70: 54 65 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f  TestErrCode(Tcl_
0d80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0d90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
0da0: 20 72 63 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   rc){.  if( sqli
0db0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
0dc0: 3d 3d 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ==0 && rc!=SQLIT
0dd0: 45 5f 4d 49 53 55 53 45 20 26 26 20 72 63 21 3d  E_MISUSE && rc!=
0de0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
0df0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
0e00: 64 62 29 21 3d 72 63 20 29 7b 0a 20 20 20 20 63  db)!=rc ){.    c
0e10: 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
0e20: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
0e30: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
0e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
0e50: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
0e60: 66 29 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20  f), zBuf,.      
0e70: 20 22 65 72 72 6f 72 20 63 6f 64 65 20 25 73 20   "error code %s 
0e80: 28 25 64 29 20 64 6f 65 73 20 6e 6f 74 20 6d 61  (%d) does not ma
0e90: 74 63 68 20 73 71 6c 69 74 65 33 5f 65 72 72 63  tch sqlite3_errc
0ea0: 6f 64 65 20 25 73 20 28 25 64 29 22 2c 0a 20 20  ode %s (%d)",.  
0eb0: 20 20 20 20 20 74 31 45 72 72 6f 72 4e 61 6d 65       t1ErrorName
0ec0: 28 72 63 29 2c 20 72 63 2c 20 74 31 45 72 72 6f  (rc), rc, t1Erro
0ed0: 72 4e 61 6d 65 28 72 32 29 2c 20 72 32 29 3b 0a  rName(r2), r2);.
0ee0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
0ef0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
0f00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0f10: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
0f20: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  0);.    return 1
0f30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
0f50: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
0f60: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  n sqlite3_stmt o
0f70: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
0f80: 20 69 6e 74 20 67 65 74 53 74 6d 74 50 6f 69 6e   int getStmtPoin
0f90: 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ter(.  Tcl_Inter
0fa0: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63 6f  p *interp, .  co
0fb0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c 20  nst char *zArg, 
0fc0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
0fd0: 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a   **ppStmt.){.  *
0fe0: 70 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65  ppStmt = (sqlite
0ff0: 33 5f 73 74 6d 74 2a 29 73 71 6c 69 74 65 33 54  3_stmt*)sqlite3T
1000: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 72  estTextToPtr(zAr
1010: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  g);.  return TCL
1020: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
1030: 6e 65 72 61 74 65 20 61 20 74 65 78 74 20 72 65  nerate a text re
1040: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1050: 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 63  a pointer that c
1060: 61 6e 20 62 65 20 75 6e 64 65 72 73 74 6f 6f 64  an be understood
1070: 0a 2a 2a 20 62 79 20 74 68 65 20 67 65 74 44 62  .** by the getDb
1080: 50 6f 69 6e 74 65 72 20 61 6e 64 20 67 65 74 56  Pointer and getV
1090: 6d 50 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e 65  mPointer routine
10a0: 73 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  s above..**.** T
10b0: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 2c 20 6f  he problem is, o
10c0: 6e 20 73 6f 6d 65 20 6d 61 63 68 69 6e 65 73 20  n some machines 
10d0: 28 53 6f 6c 61 72 69 73 29 20 69 66 20 79 6f 75  (Solaris) if you
10e0: 20 64 6f 20 61 20 70 72 69 6e 74 66 20 77 69 74   do a printf wit
10f0: 68 0a 2a 2a 20 22 25 70 22 20 79 6f 75 20 63 61  h.** "%p" you ca
1100: 6e 6e 6f 74 20 74 75 72 6e 20 61 72 6f 75 6e 64  nnot turn around
1110: 20 61 6e 64 20 64 6f 20 61 20 73 63 61 6e 66 20   and do a scanf 
1120: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 22 25  with the same "%
1130: 70 22 20 61 6e 64 0a 2a 2a 20 67 65 74 20 79 6f  p" and.** get yo
1140: 75 72 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 2e  ur pointer back.
1150: 20 20 59 6f 75 20 68 61 76 65 20 74 6f 20 70 72    You have to pr
1160: 65 70 65 6e 64 20 61 20 22 30 78 22 20 62 65 66  epend a "0x" bef
1170: 6f 72 65 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 77  ore it will.** w
1180: 6f 72 6b 2e 20 20 4f 72 20 61 74 20 6c 65 61 73  ork.  Or at leas
1190: 74 20 74 68 61 74 20 69 73 20 77 68 61 74 20 69  t that is what i
11a0: 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
11b0: 20 28 64 72 68 29 2e 20 20 42 75 74 20 74 68 69   (drh).  But thi
11c0: 73 0a 2a 2a 20 62 65 68 61 76 69 6f 72 20 76 61  s.** behavior va
11d0: 72 69 65 73 20 66 72 6f 6d 20 6d 61 63 68 69 6e  ries from machin
11e0: 65 20 74 6f 20 6d 61 63 68 69 6e 65 2e 20 20 54  e to machine.  T
11f0: 68 65 20 73 6f 6c 75 74 69 6f 6e 20 75 73 65 64  he solution used
1200: 20 68 65 72 20 69 73 0a 2a 2a 20 74 6f 20 74 65   her is.** to te
1210: 73 74 20 74 68 65 20 73 74 72 69 6e 67 20 72 69  st the string ri
1220: 67 68 74 20 61 66 74 65 72 20 69 74 20 69 73 20  ght after it is 
1230: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 65 65  generated to see
1240: 20 69 66 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a   if it can be.**
1250: 20 75 6e 64 65 72 73 74 6f 6f 64 20 62 79 20 73   understood by s
1260: 63 61 6e 66 2c 20 61 6e 64 20 69 66 20 6e 6f 74  canf, and if not
1270: 2c 20 74 72 79 20 70 72 65 70 65 6e 64 69 6e 67  , try prepending
1280: 20 61 6e 20 22 30 78 22 20 74 6f 20 73 65 65 20   an "0x" to see 
1290: 69 66 0a 2a 2a 20 74 68 61 74 20 68 65 6c 70 73  if.** that helps
12a0: 2e 20 20 49 66 20 6e 6f 74 68 69 6e 67 20 77 6f  .  If nothing wo
12b0: 72 6b 73 2c 20 61 20 66 61 74 61 6c 20 65 72 72  rks, a fatal err
12c0: 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  or is generated.
12d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
12e0: 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
12f0: 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  r(Tcl_Interp *in
1300: 74 65 72 70 2c 20 63 68 61 72 20 2a 7a 50 74 72  terp, char *zPtr
1310: 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 73 71  , void *p){.  sq
1320: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
1330: 30 30 2c 20 7a 50 74 72 2c 20 22 25 70 22 2c 20  00, zPtr, "%p", 
1340: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
1350: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1360: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
1370: 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 65  ne for sqlite3_e
1380: 78 65 63 5f 70 72 69 6e 74 66 28 29 2e 0a 2a 2f  xec_printf()..*/
1390: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 65 63  .static int exec
13a0: 5f 70 72 69 6e 74 66 5f 63 62 28 76 6f 69 64 20  _printf_cb(void 
13b0: 2a 70 41 72 67 2c 20 69 6e 74 20 61 72 67 63 2c  *pArg, int argc,
13c0: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
13d0: 61 72 20 2a 2a 6e 61 6d 65 29 7b 0a 20 20 54 63  ar **name){.  Tc
13e0: 6c 5f 44 53 74 72 69 6e 67 20 2a 73 74 72 20 3d  l_DString *str =
13f0: 20 28 54 63 6c 5f 44 53 74 72 69 6e 67 2a 29 70   (Tcl_DString*)p
1400: 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  Arg;.  int i;.. 
1410: 20 69 66 28 20 54 63 6c 5f 44 53 74 72 69 6e 67   if( Tcl_DString
1420: 4c 65 6e 67 74 68 28 73 74 72 29 3d 3d 30 20 29  Length(str)==0 )
1430: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1440: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1450: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
1460: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c  pendElement(str,
1470: 20 6e 61 6d 65 5b 69 5d 20 3f 20 6e 61 6d 65 5b   name[i] ? name[
1480: 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  i] : "NULL");.  
1490: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
14a0: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
14b0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
14c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74  AppendElement(st
14d0: 72 2c 20 61 72 67 76 5b 69 5d 20 3f 20 61 72 67  r, argv[i] ? arg
14e0: 76 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  v[i] : "NULL");.
14f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1500: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49 2f 4f  }../*.** The I/O
1510: 20 74 72 61 63 69 6e 67 20 63 61 6c 6c 62 61 63   tracing callbac
1520: 6b 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  k..*/.#if !defin
1530: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
1540: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
1550: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
1560: 4f 54 52 41 43 45 29 0a 73 74 61 74 69 63 20 46  OTRACE).static F
1570: 49 4c 45 20 2a 69 6f 74 72 61 63 65 5f 66 69 6c  ILE *iotrace_fil
1580: 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f  e = 0;.static vo
1590: 69 64 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c 6c  id io_trace_call
15a0: 62 61 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20  back(const char 
15b0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
15c0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
15d0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
15e0: 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74  rmat);.  vfprint
15f0: 66 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 2c 20  f(iotrace_file, 
1600: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
1610: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 66  va_end(ap);.  ff
1620: 6c 75 73 68 28 69 6f 74 72 61 63 65 5f 66 69 6c  lush(iotrace_fil
1630: 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  e);.}.#endif../*
1640: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 69 6f 5f 74  .** Usage:  io_t
1650: 72 61 63 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a  race FILENAME.**
1660: 0a 2a 2a 20 54 75 72 6e 20 49 2f 4f 20 74 72 61  .** Turn I/O tra
1670: 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  cing on or off. 
1680: 20 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20   If FILENAME is 
1690: 6e 6f 74 20 61 6e 20 65 6d 70 74 79 20 73 74 72  not an empty str
16a0: 69 6e 67 2c 0a 2a 2a 20 49 2f 4f 20 74 72 61 63  ing,.** I/O trac
16b0: 69 6e 67 20 62 65 67 69 6e 73 20 67 6f 69 6e 67  ing begins going
16c0: 20 69 6e 74 6f 20 46 49 4c 45 4e 41 4d 45 2e 20   into FILENAME. 
16d0: 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20 61  If FILENAME is a
16e0: 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72 69 6e  n empty.** strin
16f0: 67 2c 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 69  g, I/O tracing i
1700: 73 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  s turned off..*/
1710: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1720: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 69  TE_TCLAPI test_i
1730: 6f 5f 74 72 61 63 65 28 0a 20 20 76 6f 69 64 20  o_trace(.  void 
1740: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
1750: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1760: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1770: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1780: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1790: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
17a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
17b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
17c0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
17d0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
17e0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
17f0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
1800: 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  {.#if !defined(S
1810: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
1820: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1830: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
1840: 43 45 29 0a 20 20 69 66 28 20 61 72 67 63 21 3d  CE).  if( argc!=
1850: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1860: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1870: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1880: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1890: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
18a0: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
18b0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18d0: 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69    if( iotrace_fi
18e0: 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 6f  le ){.    if( io
18f0: 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f  trace_file!=stdo
1900: 75 74 20 26 26 20 69 6f 74 72 61 63 65 5f 66 69  ut && iotrace_fi
1910: 6c 65 21 3d 73 74 64 65 72 72 20 29 7b 0a 20 20  le!=stderr ){.  
1920: 20 20 20 20 66 63 6c 6f 73 65 28 69 6f 74 72 61      fclose(iotra
1930: 63 65 5f 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  ce_file);.    }.
1940: 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65      iotrace_file
1950: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
1960: 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  3IoTrace = 0;.  
1970: 7d 0a 20 20 69 66 28 20 61 72 67 76 5b 31 5d 5b  }.  if( argv[1][
1980: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  0] ){.    if( st
1990: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74  rcmp(argv[1],"st
19a0: 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  dout")==0 ){.   
19b0: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
19c0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65  = stdout;.    }e
19d0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
19e0: 72 67 76 5b 31 5d 2c 22 73 74 64 65 72 72 22 29  rgv[1],"stderr")
19f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74  ==0 ){.      iot
1a00: 72 61 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 65  race_file = stde
1a10: 72 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rr;.    }else{. 
1a20: 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c       iotrace_fil
1a30: 65 20 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31  e = fopen(argv[1
1a40: 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20  ], "w");.    }. 
1a50: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
1a60: 65 20 3d 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c  e = io_trace_cal
1a70: 6c 62 61 63 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  lback;.  }.#endi
1a80: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
1a90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1aa0: 65 3a 20 20 63 6c 61 6e 67 5f 73 61 6e 69 74 69  e:  clang_saniti
1ab0: 7a 65 5f 61 64 64 72 65 73 73 20 0a 2a 2a 0a 2a  ze_address .**.*
1ac0: 2a 20 52 65 74 75 72 6e 73 20 74 72 75 65 20 69  * Returns true i
1ad0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 77 61  f the program wa
1ae0: 73 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67  s compiled using
1af0: 20 63 6c 61 6e 67 20 77 69 74 68 20 74 68 65 20   clang with the 
1b00: 0a 2a 2a 20 2d 66 73 61 6e 69 74 69 7a 65 3d 61  .** -fsanitize=a
1b10: 64 64 72 65 73 73 20 73 77 69 74 63 68 20 6f 6e  ddress switch on
1b20: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1b30: 65 2e 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  e. False otherwi
1b40: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  se..**.** Also r
1b50: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1b60: 65 20 4f 4d 49 54 5f 4d 49 53 55 53 45 20 65 6e  e OMIT_MISUSE en
1b70: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
1b80: 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74  le exists..*/.st
1b90: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1ba0: 54 43 4c 41 50 49 20 63 6c 61 6e 67 5f 73 61 6e  TCLAPI clang_san
1bb0: 69 74 69 7a 65 5f 61 64 64 72 65 73 73 28 0a 20  itize_address(. 
1bc0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
1bd0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1be0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1bf0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1c00: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1c10: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1c20: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
1c30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c40: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1c50: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
1c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
1c70: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
1c80: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65  t */.){.  int re
1c90: 73 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 6e  s = 0;.#if defin
1ca0: 65 64 28 5f 5f 68 61 73 5f 66 65 61 74 75 72 65  ed(__has_feature
1cb0: 29 0a 23 20 69 66 20 5f 5f 68 61 73 5f 66 65 61  ).# if __has_fea
1cc0: 74 75 72 65 28 61 64 64 72 65 73 73 5f 73 61 6e  ture(address_san
1cd0: 69 74 69 7a 65 72 29 0a 20 20 72 65 73 20 3d 20  itizer).  res = 
1ce0: 31 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  1;.# endif.#endi
1cf0: 66 0a 23 69 66 64 65 66 20 5f 5f 53 41 4e 49 54  f.#ifdef __SANIT
1d00: 49 5a 45 5f 41 44 44 52 45 53 53 5f 5f 0a 20 20  IZE_ADDRESS__.  
1d10: 72 65 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  res = 1;.#endif.
1d20: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20    if( res==0 && 
1d30: 67 65 74 65 6e 76 28 22 4f 4d 49 54 5f 4d 49 53  getenv("OMIT_MIS
1d40: 55 53 45 22 29 21 3d 30 20 29 20 72 65 73 20 3d  USE")!=0 ) res =
1d50: 20 31 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a   1;.  Tcl_SetObj
1d60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1d70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73  cl_NewIntObj(res
1d80: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1d90: 5f 4f 4b 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20  _OK;.}.  ./*.** 
1da0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1db0: 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42 20  exec_printf  DB 
1dc0: 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 0a   FORMAT  STRING.
1dd0: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  **.** Invoke the
1de0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72   sqlite3_exec_pr
1df0: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
1e00: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
1e10: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
1e20: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
1e30: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
1e40: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
1e50: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
1e60: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
1e70: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
1e80: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
1e90: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
1ea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1eb0: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1ec0: 65 78 65 63 5f 70 72 69 6e 74 66 28 0a 20 20 76  exec_printf(.  v
1ed0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
1ee0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ef0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1f00: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1f10: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1f20: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1f30: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
1f40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f50: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1f60: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
1f70: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
1f80: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
1f90: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
1fa0: 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  *db;.  Tcl_DStri
1fb0: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
1fc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
1fd0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   0;.  char *zSql
1fe0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
1ff0: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  ];.  if( argc!=4
2000: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2010: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2020: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2030: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2040: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2050: 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52 49  " DB FORMAT STRI
2060: 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  NG", 0);.    ret
2070: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2080: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2090: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
20a0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
20b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
20d0: 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20  t(&str);.  zSql 
20e0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
20f0: 66 28 61 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b  f(argv[2], argv[
2100: 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  3]);.  rc = sqli
2110: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
2120: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
2130: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
2140: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2150: 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
2160: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2170: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
2180: 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41  d", rc);.  Tcl_A
2190: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
21a0: 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  erp, zBuf);.  Tc
21b0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
21c0: 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49  interp, rc==SQLI
21d0: 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72  TE_OK ? Tcl_DStr
21e0: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a  ingValue(&str) :
21f0: 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53   zErr);.  Tcl_DS
2200: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
2210: 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73 71  .  if( zErr ) sq
2220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
2230: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
2240: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
2250: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
2260: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2270: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2280: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
2290: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65   sqlite3_exec_he
22a0: 78 20 20 44 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a  x  DB  HEX.**.**
22b0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
22c0: 74 65 33 5f 65 78 65 63 28 29 20 6f 6e 20 61 20  te3_exec() on a 
22d0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6f  string that is o
22e0: 62 74 61 69 6e 65 64 20 62 79 20 74 72 61 6e 73  btained by trans
22f0: 6c 61 74 69 6e 67 0a 2a 2a 20 48 45 58 20 69 6e  lating.** HEX in
2300: 74 6f 20 41 53 43 49 49 2e 20 20 4d 6f 73 74 20  to ASCII.  Most 
2310: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 74  characters are t
2320: 72 61 6e 73 6c 61 74 65 64 20 61 73 20 69 73 2e  ranslated as is.
2330: 20 20 25 48 48 20 62 65 63 6f 6d 65 73 0a 2a 2a    %HH becomes.**
2340: 20 61 20 68 65 78 20 63 68 61 72 61 63 74 65 72   a hex character
2350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2360: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
2370: 73 74 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76  st_exec_hex(.  v
2380: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2390: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
23a0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
23b0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
23c0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
23d0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23e0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
23f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2400: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2410: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2420: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2430: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2440: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2450: 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  *db;.  Tcl_DStri
2460: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
2470: 2c 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a  , i, j;.  char *
2480: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  zErr = 0;.  char
2490: 20 2a 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a   *zHex;.  char z
24a0: 53 71 6c 5b 35 30 31 5d 3b 0a 20 20 63 68 61 72  Sql[501];.  char
24b0: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
24c0: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
24d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
24e0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
24f0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2500: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2510: 0a 20 20 20 20 20 20 20 22 20 44 42 20 48 45 58  .       " DB HEX
2520: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2530: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2540: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2550: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
2560: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
2570: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2580: 7a 48 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  zHex = argv[2];.
2590: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 28    for(i=j=0; i<(
25a0: 73 69 7a 65 6f 66 28 7a 53 71 6c 29 2d 31 29 20  sizeof(zSql)-1) 
25b0: 26 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c  && zHex[j]; i++,
25c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   j++){.    if( z
25d0: 48 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a  Hex[j]=='%' && z
25e0: 48 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78  Hex[j+2] && zHex
25f0: 5b 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a  [j+2] ){.      z
2600: 53 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65  Sql[i] = (testHe
2610: 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d  xToInt(zHex[j+1]
2620: 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  )<<4) + testHexT
2630: 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b  oInt(zHex[j+2]);
2640: 0a 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20  .      j += 2;. 
2650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2660: 7a 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a  zSql[i] = zHex[j
2670: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  ];.    }.  }.  z
2680: 53 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63  Sql[i] = 0;.  Tc
2690: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
26a0: 74 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  tr);.  rc = sqli
26b0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
26c0: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
26d0: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
26e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
26f0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
2700: 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  , zBuf, "%d", rc
2710: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
2720: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
2730: 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  Buf);.  Tcl_Appe
2740: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2750: 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , rc==SQLITE_OK 
2760: 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  ? Tcl_DStringVal
2770: 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29  ue(&str) : zErr)
2780: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
2790: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28  ree(&str);.  if(
27a0: 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f   zErr ) sqlite3_
27b0: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66  free(zErr);.  if
27c0: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
27d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
27e0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
27f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
2800: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2810: 2a 2a 20 55 73 61 67 65 3a 20 20 64 62 5f 65 6e  ** Usage:  db_en
2820: 74 65 72 20 44 42 0a 2a 2a 20 20 20 20 20 20 20  ter DB.**       
2830: 20 20 64 62 5f 6c 65 61 76 65 20 44 42 0a 2a 2a    db_leave DB.**
2840: 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20 6c 65 61  .** Enter or lea
2850: 76 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ve the mutex on 
2860: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2870: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2880: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2890: 50 49 20 64 62 5f 65 6e 74 65 72 28 0a 20 20 76  PI db_enter(.  v
28a0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
28b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28c0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
28d0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
28e0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
28f0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2900: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2910: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2920: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2930: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2940: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2950: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2960: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2970: 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
2980: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
2990: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
29a0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
29b0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
29c0: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
29d0: 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
29e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29f0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2a00: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2a10: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
2a20: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2a30: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  OR;.  sqlite3_mu
2a40: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
2a50: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  tex);.  return T
2a60: 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  CL_OK;.}.static 
2a70: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2a80: 49 20 64 62 5f 6c 65 61 76 65 28 0a 20 20 76 6f  I db_leave(.  vo
2a90: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2aa0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2ab0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2ac0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2ad0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2ae0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2af0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2b00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b10: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2b20: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2b30: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2b40: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2b50: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2b60: 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
2b70: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
2b80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2b90: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2ba0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
2bb0: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
2bc0: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
2bd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2be0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2bf0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2c00: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
2c10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c20: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  R;.  sqlite3_mut
2c30: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
2c40: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ex);.  return TC
2c50: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2c60: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
2c70: 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a  xec  DB  SQL.**.
2c80: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
2c90: 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72  lite3_exec inter
2ca0: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
2cb0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 0a  pen database DB.
2cc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2cd0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
2ce0: 5f 65 78 65 63 28 0a 20 20 76 6f 69 64 20 2a 4e  _exec(.  void *N
2cf0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
2d00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2d10: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2d20: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2d30: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2d40: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d60: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2d70: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2d80: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2d90: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2da0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2db0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2dc0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
2dd0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
2de0: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
2df0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
2e00: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a  t i, j;.  char z
2e10: 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61  Buf[30];.  if( a
2e20: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
2e30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2e40: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
2e50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
2e60: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
2e70: 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c        " DB SQL",
2e80: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2e90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ea0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2eb0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2ec0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2ed0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
2ee0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
2ef0: 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  tr);.  zSql = sq
2f00: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2f10: 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20  s", argv[2]);.  
2f20: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53 71 6c 5b  for(i=j=0; zSql[
2f30: 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  i];){.    if( zS
2f40: 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20  ql[i]=='%' ){.  
2f50: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2f60: 28 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53  (testHexToInt(zS
2f70: 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b 20 74  ql[i+1])<<4) + t
2f80: 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c  estHexToInt(zSql
2f90: 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 20  [i+2]);.      i 
2fa0: 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  += 3;.    }else{
2fb0: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
2fc0: 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a 20 20   = zSql[i++];.  
2fd0: 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 6a    }.  }.  zSql[j
2fe0: 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  ] = 0;.  rc = sq
2ff0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
3000: 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66  Sql, exec_printf
3010: 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72  _cb, &str, &zErr
3020: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3030: 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  e(zSql);.  sqlit
3040: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3050: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
3060: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
3070: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
3080: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
3090: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
30a0: 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51  t(interp, rc==SQ
30b0: 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53  LITE_OK ? Tcl_DS
30c0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
30d0: 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f   : zErr);.  Tcl_
30e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
30f0: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20  );.  if( zErr ) 
3100: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
3110: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
3120: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
3130: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
3140: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3150: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
3170: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
3180: 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a  nr  DB  SQL.**.*
3190: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c  * Invoke the sql
31a0: 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72 66  ite3_exec interf
31b0: 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70  ace using the op
31c0: 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 2e 20  en database DB. 
31d0: 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c 6c 20   Discard.** all 
31e0: 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61 74 69  results.*/.stati
31f0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
3200: 41 50 49 20 74 65 73 74 5f 65 78 65 63 5f 6e 72  API test_exec_nr
3210: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3220: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3230: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3240: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3250: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3260: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3270: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3290: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
32a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32c0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
32d0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
32e0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
32f0: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
3300: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 63   = 0;.  if( argc
3310: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
3320: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3330: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
3340: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
3350: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
3360: 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29     " DB SQL", 0)
3370: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3380: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3390: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
33a0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
33b0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
33c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
33d0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
33e0: 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20   argv[2], 0, 0, 
33f0: 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  &zErr);.  if( sq
3400: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
3410: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
3420: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
3430: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
3440: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3450: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
3460: 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53  printf_z_test  S
3470: 45 50 41 52 41 54 4f 52 20 20 41 52 47 30 20 20  EPARATOR  ARG0  
3480: 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  ARG1 ....**.** T
3490: 65 73 74 20 74 68 65 20 25 7a 20 66 6f 72 6d 61  est the %z forma
34a0: 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69  t of sqlite_mpri
34b0: 6e 74 66 28 29 2e 20 20 55 73 65 20 6d 75 6c 74  ntf().  Use mult
34c0: 69 70 6c 65 20 6d 70 72 69 6e 74 66 28 29 20 63  iple mprintf() c
34d0: 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63  alls to .** conc
34e0: 61 74 65 6e 61 74 65 20 61 72 67 30 20 74 68 72  atenate arg0 thr
34f0: 6f 75 67 68 20 61 72 67 6e 20 75 73 69 6e 67 20  ough argn using 
3500: 73 65 70 61 72 61 74 6f 72 20 61 73 20 74 68 65  separator as the
3510: 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52   separator..** R
3520: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
3530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3540: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
3550: 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20  st_mprintf_z(.  
3560: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3570: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3580: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3590: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
35a0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
35b0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
35c0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
35d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35e0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
35f0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3600: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3610: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3620: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
3630: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e  Result = 0;.  in
3640: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b  t i;..  for(i=2;
3650: 20 69 3c 61 72 67 63 20 26 26 20 28 69 3d 3d 32   i<argc && (i==2
3660: 20 7c 7c 20 7a 52 65 73 75 6c 74 29 3b 20 69 2b   || zResult); i+
3670: 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  +){.    zResult 
3680: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3690: 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73  f("%z%s%s", zRes
36a0: 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72  ult, argv[1], ar
36b0: 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63  gv[i]);.  }.  Tc
36c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
36d0: 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20  nterp, zResult, 
36e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
36f0: 65 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72  ee(zResult);.  r
3700: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3710: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3720: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e  qlite3_mprintf_n
3730: 5f 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a 2a  _test  STRING.**
3740: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e 20  .** Test the %n 
3750: 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65  format of sqlite
3760: 5f 6d 70 72 69 6e 74 66 28 29 2e 20 20 52 65 74  _mprintf().  Ret
3770: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
3780: 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73  f the.** input s
3790: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
37a0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
37b0: 50 49 20 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f  PI test_mprintf_
37c0: 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  n(.  void *NotUs
37d0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
37e0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
37f0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
3800: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
3810: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
3820: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
3830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3840: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3850: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
3860: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
3870: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
3880: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  ument */.){.  ch
3890: 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e 74 20  ar *zStr;.  int 
38a0: 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20 3d 20  n = 0;.  zStr = 
38b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
38c0: 22 25 73 25 6e 22 2c 20 61 72 67 76 5b 31 5d 2c  "%s%n", argv[1],
38d0: 20 26 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   &n);.  sqlite3_
38e0: 66 72 65 65 28 7a 53 74 72 29 3b 0a 20 20 54 63  free(zStr);.  Tc
38f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
3900: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
3910: 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 72 65 74 75  tObj(n));.  retu
3920: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
3930: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3940: 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74  te3_snprintf_int
3950: 20 20 53 49 5a 45 20 46 4f 52 4d 41 54 20 20 49    SIZE FORMAT  I
3960: 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  NT.**.** Test th
3970: 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 73 6e 70  e of sqlite3_snp
3980: 72 69 6e 74 66 28 29 20 72 6f 75 74 69 6e 65 2e  rintf() routine.
3990: 20 20 53 49 5a 45 20 69 73 20 74 68 65 20 73 69    SIZE is the si
39a0: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ze of the.** out
39b0: 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
39c0: 74 65 73 2e 20 20 54 68 65 20 6d 61 78 69 6d 75  tes.  The maximu
39d0: 6d 20 73 69 7a 65 20 69 73 20 31 30 30 2e 20 20  m size is 100.  
39e0: 46 4f 52 4d 41 54 20 69 73 20 74 68 65 0a 2a 2a  FORMAT is the.**
39f0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20   format string. 
3a00: 20 49 4e 54 20 69 73 20 61 20 73 69 6e 67 6c 65   INT is a single
3a10: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
3a20: 74 2e 20 20 54 68 65 20 46 4f 52 4d 41 54 0a 2a  t.  The FORMAT.*
3a30: 2a 20 73 74 72 69 6e 67 20 6d 75 73 74 20 72 65  * string must re
3a40: 71 75 69 72 65 20 6e 6f 20 6d 6f 72 65 20 74 68  quire no more th
3a50: 61 6e 20 74 68 69 73 20 6f 6e 65 20 69 6e 74 65  an this one inte
3a60: 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20 20 49  ger argument.  I
3a70: 66 0a 2a 2a 20 59 6f 75 20 70 61 73 73 20 69 6e  f.** You pass in
3a80: 20 61 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67   a format string
3a90: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6d   that requires m
3aa0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 61 72 67  ore than one arg
3ab0: 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61 64 20 74 68  ument,.** bad th
3ac0: 69 6e 67 73 20 77 69 6c 6c 20 68 61 70 70 65 6e  ings will happen
3ad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3ae0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
3af0: 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28  st_snprintf_int(
3b00: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3b10: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3b20: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3b30: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
3b40: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
3b50: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
3b60: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
3b70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3b80: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
3b90: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
3ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
3bb0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
3bc0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
3bd0: 20 7a 53 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e   zStr[100];.  in
3be0: 74 20 6e 20 3d 20 61 74 6f 69 28 61 72 67 76 5b  t n = atoi(argv[
3bf0: 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  1]);.  const cha
3c00: 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67  r *zFormat = arg
3c10: 76 5b 32 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d  v[2];.  int a1 =
3c20: 20 61 74 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a   atoi(argv[3]);.
3c30: 20 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a    if( n>sizeof(z
3c40: 53 74 72 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f  Str) ) n = sizeo
3c50: 66 28 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  f(zStr);.  sqlit
3c60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3c70: 6f 66 28 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20  of(zStr), zStr, 
3c80: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
3c90: 70 71 72 73 74 75 76 77 78 79 7a 22 29 3b 0a 20  pqrstuvwxyz");. 
3ca0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3cb0: 66 28 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d  f(n, zStr, zForm
3cc0: 61 74 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41  at, a1);.  Tcl_A
3cd0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3ce0: 72 70 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20  rp, zStr, 0);.  
3cf0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3d00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d10: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a  _OMIT_GET_TABLE.
3d20: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3d30: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
3d40: 5f 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52  _printf  DB  FOR
3d50: 4d 41 54 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d  MAT  STRING  ?--
3d60: 6e 6f 2d 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a  no-counts?.**.**
3d70: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
3d80: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
3d90: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
3da0: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
3db0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
3dc0: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
3dd0: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
3de0: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
3df0: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
3e00: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
3e10: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
3e20: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
3e30: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
3e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
3e50: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
3e60: 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
3e70: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3e80: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3e90: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3ea0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3eb0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3ec0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3ed0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3ef0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
3f00: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3f20: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
3f30: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
3f40: 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f  ite3 *db;.  Tcl_
3f50: 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69  DString str;.  i
3f60: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
3f70: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Err = 0;.  int n
3f80: 52 6f 77 20 3d 20 30 2c 20 6e 43 6f 6c 20 3d 20  Row = 0, nCol = 
3f90: 30 3b 0a 20 20 63 68 61 72 20 2a 2a 61 52 65 73  0;.  char **aRes
3fa0: 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ult;.  int i;.  
3fb0: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
3fc0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
3fd0: 6e 74 20 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31  nt resCount = -1
3fe0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20  ;.  if( argc==5 
3ff0: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
4000: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
4010: 67 76 5b 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74  gv[4], &resCount
4020: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4030: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4040: 61 72 67 63 21 3d 34 20 26 26 20 61 72 67 63 21  argc!=4 && argc!
4050: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
4060: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4070: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
4080: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
4090: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
40a0: 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54    " DB FORMAT ST
40b0: 52 49 4e 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30  RING ?COUNT?", 0
40c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
40d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
40e0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
40f0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4100: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4110: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
4120: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
4130: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
4140: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
4150: 5b 32 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20  [2],argv[3]);.  
4160: 69 66 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20  if( argc==5 ){. 
4170: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4180: 67 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53  get_table(db, zS
4190: 71 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 30 2c  ql, &aResult, 0,
41a0: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65   0, &zErr);.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
41c0: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28  lite3_get_table(
41d0: 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75  db, zSql, &aResu
41e0: 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c  lt, &nRow, &nCol
41f0: 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 72 65  , &zErr);.    re
4200: 73 43 6f 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31  sCount = (nRow+1
4210: 29 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71  )*nCol;.  }.  sq
4220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
4230: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
4240: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
4250: 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72  ), zBuf, "%d", r
4260: 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  c);.  Tcl_Append
4270: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4280: 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d  zBuf);.  if( rc=
4290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
42a0: 20 20 69 66 28 20 61 72 67 63 3d 3d 34 20 29 7b    if( argc==4 ){
42b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
42c0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
42d0: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22  Buf), zBuf, "%d"
42e0: 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54  , nRow);.      T
42f0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
4300: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
4310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4320: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
4330: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
4340: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63   nCol);.      Tc
4350: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4360: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
4370: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
4380: 3b 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b  ; i<resCount; i+
4390: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  +){.      Tcl_Ap
43a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
43b0: 72 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f  rp, aResult[i] ?
43c0: 20 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e   aResult[i] : "N
43d0: 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ULL");.    }.  }
43e0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70  else{.    Tcl_Ap
43f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4400: 72 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  rp, zErr);.  }. 
4410: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61   sqlite3_free_ta
4420: 62 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20  ble(aResult);.  
4430: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
4440: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
4450: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
4460: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
4470: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
4480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
4490: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
44a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
44b0: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20  _OMIT_GET_TABLE 
44c0: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  */.../*.** Usage
44d0: 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  :  sqlite3_last_
44e0: 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a  insert_rowid DB.
44f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
4500: 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20  e integer ROWID 
4510: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
4520: 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74  nt insert..*/.st
4530: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
4540: 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 61 73 74  TCLAPI test_last
4550: 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20 2a  _rowid(.  void *
4560: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
4570: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
4580: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
4590: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
45a0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
45b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
45c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
45d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
45e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
45f0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
4600: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
4610: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
4620: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
4630: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
4640: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
4650: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
4660: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4670: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
4680: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
4690: 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c 20  gv[0], " DB\"", 
46a0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
46b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
46c0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
46d0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
46e0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
46f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
4700: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
4710: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
4720: 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65  , "%lld", sqlite
4730: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
4740: 77 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f  wid(db));.  Tcl_
4750: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4760: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
4770: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4780: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
4790: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 20  e:  sqlite3_key 
47a0: 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74  DB KEY.**.** Set
47b0: 20 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a   the codec key..
47c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
47d0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
47e0: 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  _key(.  void *No
47f0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4800: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4810: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4820: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4830: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4840: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4860: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4870: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4880: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4890: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
48a0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23  argument */.){.#
48b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
48c0: 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
48d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
48e0: 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
48f0: 54 43 4c 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  TCL).  sqlite3 *
4900: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4910: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4920: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4930: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4950: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4960: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4970: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4980: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4990: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
49a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
49b0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
49c0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
49d0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
49e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
49f0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4a00: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  );.  sqlite3_key
4a20: 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29  (db, zKey, nKey)
4a30: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
4a40: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4a50: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
4a60: 65 33 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a  e3_rekey DB KEY.
4a70: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  **.** Change the
4a80: 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73   codec key..*/.s
4a90: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
4aa0: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72 65 6b  _TCLAPI test_rek
4ab0: 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ey(.  void *NotU
4ac0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4ad0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4ae0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4af0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4b00: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4b10: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4b30: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4b40: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
4b50: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4b60: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4b70: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66  gument */.){.#if
4b80: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
4b90: 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a  ODEC.  sqlite3 *
4ba0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4bb0: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4bc0: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4bd0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4be0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4bf0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4c00: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4c10: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4c20: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4c30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
4c40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
4c50: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
4c60: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4c70: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4c80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
4c90: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4ca0: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4cb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b  );.  sqlite3_rek
4cc0: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ey(db, zKey, nKe
4cd0: 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  y);.#endif.  ret
4ce0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4cf0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4d00: 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a  ite3_close DB.**
4d10: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
4d20: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
4d30: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
4d40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
4d50: 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69  LITE_TCLAPI sqli
4d60: 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28 0a 20  te_test_close(. 
4d70: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4d80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4d90: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4da0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4db0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4dc0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4dd0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4de0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4df0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4e00: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
4e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
4e20: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4e30: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
4e40: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
4e50: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
4e60: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
4e70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
4e80: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
4e90: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
4ea0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
4eb0: 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
4ec0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4ed0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4ee0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
4ef0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
4f00: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
4f10: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
4f20: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
4f30: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
4f40: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
4f50: 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
4f60: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
4f70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
4f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
4f90: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
4fa0: 32 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65  2 DB.**.** Close
4fb0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  s the database o
4fc0: 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
4fd0: 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  _open..*/.static
4fe0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
4ff0: 50 49 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  PI sqlite_test_c
5000: 6c 6f 73 65 5f 76 32 28 0a 20 20 76 6f 69 64 20  lose_v2(.  void 
5010: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
5020: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
5030: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
5040: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
5050: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
5060: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
5070: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5080: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5090: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
50a0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
50b0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
50c0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
50d0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
50e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
50f0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
5100: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5110: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
5120: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
5130: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
5140: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
5150: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
5160: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5170: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
5180: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
5190: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
51a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
51b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
51c0: 63 6c 6f 73 65 5f 76 32 28 64 62 29 3b 0a 20 20  close_v2(db);.  
51d0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
51e0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
51f0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
5200: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
5210: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5220: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
5230: 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f  tion of the x_co
5240: 61 6c 65 73 63 65 28 29 20 66 75 6e 63 74 69 6f  alesce() functio
5250: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  n..** Return the
5260: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
5270: 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
5280: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5290: 64 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28  d t1_ifnullFunc(
52a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
52b0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
52c0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
52d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
52e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
52f0: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
5300: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  ++){.    if( SQL
5310: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
5320: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
5330: 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 69  v[i]) ){.      i
5340: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  nt n = sqlite3_v
5350: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
5360: 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i]);.      sqlit
5370: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5380: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73  ontext, (char*)s
5390: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
53a0: 74 28 61 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20  t(argv[i]),.    
53b0: 20 20 20 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f        n, SQLITE_
53c0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
53d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
53e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73   }.}../*.** Thes
53f0: 65 20 61 72 65 20 74 65 73 74 20 66 75 6e 63 74  e are test funct
5400: 69 6f 6e 73 2e 20 20 20 20 68 65 78 38 28 29 20  ions.    hex8() 
5410: 69 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61  interprets its a
5420: 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54  rgument as.** UT
5430: 46 38 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  F8 and returns a
5440: 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20   hex encoding.  
5450: 68 65 78 31 36 6c 65 28 29 20 69 6e 74 65 72 70  hex16le() interp
5460: 72 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e  rets its argumen
5470: 74 0a 2a 2a 20 61 73 20 55 54 46 31 36 6c 65 20  t.** as UTF16le 
5480: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65  and returns a he
5490: 78 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  x encoding..*/.s
54a0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 38 46  tatic void hex8F
54b0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
54c0: 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63  ext *p, int argc
54d0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
54e0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
54f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5500: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
5510: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
5520: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
5530: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5540: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
5550: 7a 65 6f 66 28 7a 42 75 66 29 2f 32 20 2d 20 32  zeof(zBuf)/2 - 2
5560: 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   && z[i]; i++){.
5570: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5580: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
5590: 29 2d 69 2a 32 2c 20 26 7a 42 75 66 5b 69 2a 32  )-i*2, &zBuf[i*2
55a0: 5d 2c 20 22 25 30 32 78 22 2c 20 7a 5b 69 5d 29  ], "%02x", z[i])
55b0: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32  ;.  }.  zBuf[i*2
55c0: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
55d0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20  _result_text(p, 
55e0: 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c  (char*)zBuf, -1,
55f0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
5600: 54 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51  T);.}.#ifndef SQ
5610: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
5620: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 31  static void hex1
5630: 36 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  6Func(sqlite3_co
5640: 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72  ntext *p, int ar
5650: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
5660: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e  e **argv){.  con
5670: 73 74 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  st unsigned shor
5680: 74 20 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20  t int *z;.  int 
5690: 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34  i;.  char zBuf[4
56a0: 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  00];.  z = sqlit
56b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
56c0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28  argv[0]);.  for(
56d0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42  i=0; i<sizeof(zB
56e0: 75 66 29 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69  uf)/4 - 4 && z[i
56f0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
5700: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
5710: 7a 65 6f 66 28 7a 42 75 66 29 2d 69 2a 34 2c 20  zeof(zBuf)-i*4, 
5720: 26 7a 42 75 66 5b 69 2a 34 5d 2c 22 25 30 34 78  &zBuf[i*4],"%04x
5730: 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20  ", z[i]&0xff);. 
5740: 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d   }.  zBuf[i*4] =
5750: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
5760: 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68  sult_text(p, (ch
5770: 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51  ar*)zBuf, -1, SQ
5780: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
5790: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
57a0: 20 41 20 73 74 72 75 63 74 75 72 65 20 69 6e 74   A structure int
57b0: 6f 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d  o which to accum
57c0: 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73  ulate text..*/.s
57d0: 74 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69  truct dstr {.  i
57e0: 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53  nt nAlloc;  /* S
57f0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a  pace allocated *
5800: 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20  /.  int nUsed;  
5810: 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a   /* Space used *
5820: 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
5830: 20 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f   /* The space */
5840: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .};../*.** Appen
5850: 64 20 74 65 78 74 20 74 6f 20 61 20 64 73 74 72  d text to a dstr
5860: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5870: 64 73 74 72 41 70 70 65 6e 64 28 73 74 72 75 63  dstrAppend(struc
5880: 74 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74  t dstr *p, const
5890: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69   char *z, int di
58a0: 76 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  vider){.  int n 
58b0: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29  = (int)strlen(z)
58c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64  ;.  if( p->nUsed
58d0: 20 2b 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41   + n + 2 > p->nA
58e0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72  lloc ){.    char
58f0: 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e   *zNew;.    p->n
5900: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
5910: 63 2a 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20  c*2 + n + 200;. 
5920: 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65     zNew = sqlite
5930: 33 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20  3_realloc(p->z, 
5940: 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  p->nAlloc);.    
5950: 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( zNew==0 ){. 
5960: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5970: 65 28 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 6d  e(p->z);.      m
5980: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
5990: 6f 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72  of(*p));.      r
59a0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
59b0: 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20   p->z = zNew;.  
59c0: 7d 0a 20 20 69 66 28 20 64 69 76 69 64 65 72 20  }.  if( divider 
59d0: 26 26 20 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b  && p->nUsed>0 ){
59e0: 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55 73  .    p->z[p->nUs
59f0: 65 64 2b 2b 5d 20 3d 20 64 69 76 69 64 65 72 3b  ed++] = divider;
5a00: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
5a10: 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a  ->z[p->nUsed], z
5a20: 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55 73  , n+1);.  p->nUs
5a30: 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  ed += n;.}../*.*
5a40: 2a 20 49 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61  * Invoked for ea
5a50: 63 68 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d  ch callback from
5a60: 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63   sqlite3ExecFunc
5a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
5a80: 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 28  xecFuncCallback(
5a90: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
5aa0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
5ab0: 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73  gv, char **NotUs
5ac0: 65 64 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73  ed){.  struct ds
5ad0: 74 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20  tr *p = (struct 
5ae0: 64 73 74 72 2a 29 70 44 61 74 61 3b 0a 20 20 69  dstr*)pData;.  i
5af0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5b00: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
5b10: 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d     if( argv[i]==
5b20: 30 20 29 7b 0a 20 20 20 20 20 20 64 73 74 72 41  0 ){.      dstrA
5b30: 70 70 65 6e 64 28 70 2c 20 22 4e 55 4c 4c 22 2c  ppend(p, "NULL",
5b40: 20 27 20 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65   ' ');.    }else
5b50: 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70 70 65  {.      dstrAppe
5b60: 6e 64 28 70 2c 20 61 72 67 76 5b 69 5d 2c 20 27  nd(p, argv[i], '
5b70: 20 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   ');.    }.  }. 
5b80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5b90: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
5ba0: 6f 6e 20 6f 66 20 74 68 65 20 78 5f 73 71 6c 69  on of the x_sqli
5bb0: 74 65 5f 65 78 65 63 28 29 20 66 75 6e 63 74 69  te_exec() functi
5bc0: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
5bd0: 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20 61 20 73 69  on takes.** a si
5be0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 61 6e  ngle argument an
5bf0: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78  d attempts to ex
5c00: 65 63 75 74 65 20 74 68 61 74 20 61 72 67 75 6d  ecute that argum
5c10: 65 6e 74 20 61 73 20 53 51 4c 20 63 6f 64 65 2e  ent as SQL code.
5c20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 69 6c 6c 65  .** This is ille
5c30: 67 61 6c 20 61 6e 64 20 73 68 6f 75 6c 64 20 73  gal and should s
5c40: 65 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49  et the SQLITE_MI
5c50: 53 55 53 45 20 66 6c 61 67 20 6f 6e 20 74 68 65  SUSE flag on the
5c60: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
5c70: 20 32 30 30 34 2d 4a 61 6e 2d 30 37 3a 20 20 57   2004-Jan-07:  W
5c80: 65 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 74  e have changed t
5c90: 68 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c  his to make it l
5ca0: 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
5cb0: 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66  ite3_exec().** f
5cc0: 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 66 75 6e  rom within a fun
5cd0: 63 74 69 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a 2a  ction call.  .**
5ce0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
5cf0: 65 20 73 69 6d 75 6c 61 74 65 73 20 74 68 65 20  e simulates the 
5d00: 65 66 66 65 63 74 20 6f 66 20 68 61 76 69 6e 67  effect of having
5d10: 20 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 74   two threads att
5d20: 65 6d 70 74 20 74 6f 0a 2a 2a 20 75 73 65 20 74  empt to.** use t
5d30: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
5d40: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
5d50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5d60: 64 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e  d sqlite3ExecFun
5d70: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5d80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
5d90: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
5da0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5db0: 61 72 67 76 0a 29 7b 0a 20 20 73 74 72 75 63 74  argv.){.  struct
5dc0: 20 64 73 74 72 20 78 3b 0a 20 20 6d 65 6d 73 65   dstr x;.  memse
5dd0: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
5de0: 78 29 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c  x));.  (void)sql
5df0: 69 74 65 33 5f 65 78 65 63 28 28 73 71 6c 69 74  ite3_exec((sqlit
5e00: 65 33 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  e3*)sqlite3_user
5e10: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a  _data(context),.
5e20: 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
5e30: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5e40: 61 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20  argv[0]),.      
5e50: 65 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b  execFuncCallback
5e60: 2c 20 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69  , &x, 0);.  sqli
5e70: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5e80: 63 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e  context, x.z, x.
5e90: 6e 55 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52  nUsed, SQLITE_TR
5ea0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
5eb0: 74 65 33 5f 66 72 65 65 28 78 2e 7a 29 3b 0a 7d  te3_free(x.z);.}
5ec0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
5ed0: 74 61 74 69 6f 6e 20 6f 66 20 74 6b 74 32 32 31  tation of tkt221
5ee0: 33 66 75 6e 63 28 29 2c 20 61 20 73 63 61 6c 61  3func(), a scala
5ef0: 72 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  r function that 
5f00: 74 61 6b 65 73 20 65 78 61 63 74 6c 79 0a 2a 2a  takes exactly.**
5f10: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2e 20 49   one argument. I
5f20: 74 20 68 61 73 20 74 77 6f 20 69 6e 74 65 72 65  t has two intere
5f30: 73 74 69 6e 67 20 66 65 61 74 75 72 65 73 3a 0a  sting features:.
5f40: 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63 61 6c 6c 73  **.** * It calls
5f50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5f60: 65 78 74 28 29 20 33 20 74 69 6d 65 73 20 6f 6e  ext() 3 times on
5f70: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 73 71   the argument sq
5f80: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2e 0a 2a 2a  lite3_value*..**
5f90: 20 20 20 49 66 20 74 68 65 20 74 68 72 65 65 20     If the three 
5fa0: 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65  pointers returne
5fb0: 64 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61  d are not the sa
5fc0: 6d 65 20 61 6e 20 53 51 4c 20 65 72 72 6f 72 20  me an SQL error 
5fd0: 69 73 20 72 61 69 73 65 64 2e 0a 2a 2a 0a 2a 2a  is raised..**.**
5fe0: 20 2a 20 4f 74 68 65 72 77 69 73 65 20 69 74 20   * Otherwise it 
5ff0: 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f  returns a copy o
6000: 66 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  f the text repre
6010: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 74 73  sentation of its
6020: 20 0a 2a 2a 20 20 20 61 72 67 75 6d 65 6e 74 20   .**   argument 
6030: 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
6040: 20 74 68 65 20 56 44 42 45 20 72 65 70 72 65 73   the VDBE repres
6050: 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 20 4d 65  entation is a Me
6060: 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20 20 20 77 69  m* cell .**   wi
6070: 74 68 20 74 68 65 20 4d 45 4d 5f 54 65 72 6d 20  th the MEM_Term 
6080: 66 6c 61 67 20 63 6c 65 61 72 2e 20 0a 2a 2a 0a  flag clear. .**.
6090: 2a 2a 20 54 69 63 6b 65 74 20 23 32 32 31 33 20  ** Ticket #2213 
60a0: 63 61 6e 20 74 68 65 72 65 66 6f 72 65 20 62 65  can therefore be
60b0: 20 74 65 73 74 65 64 20 62 79 20 65 76 61 6c 75   tested by evalu
60c0: 61 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  ating the follow
60d0: 69 6e 67 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65  ing.** SQL expre
60e0: 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 74  ssion:.**.**   t
60f0: 6b 74 32 32 31 33 66 75 6e 63 28 74 6b 74 32 32  kt2213func(tkt22
6100: 31 33 66 75 6e 63 28 27 61 20 73 74 72 69 6e 67  13func('a string
6110: 27 29 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76  '));.*/.static v
6120: 6f 69 64 20 74 6b 74 32 32 31 33 46 75 6e 63 74  oid tkt2213Funct
6130: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
6140: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6150: 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a   .  int argc,  .
6160: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6170: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
6180: 6e 54 65 78 74 3b 0a 20 20 75 6e 73 69 67 6e 65  nText;.  unsigne
6190: 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54  d char const *zT
61a0: 65 78 74 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ext1;.  unsigned
61b0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65   char const *zTe
61c0: 78 74 32 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  xt2;.  unsigned 
61d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78  char const *zTex
61e0: 74 33 3b 0a 0a 20 20 6e 54 65 78 74 20 3d 20 73  t3;..  nText = s
61f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6200: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  es(argv[0]);.  z
6210: 54 65 78 74 31 20 3d 20 73 71 6c 69 74 65 33 5f  Text1 = sqlite3_
6220: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6230: 30 5d 29 3b 0a 20 20 7a 54 65 78 74 32 20 3d 20  0]);.  zText2 = 
6240: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6250: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  xt(argv[0]);.  z
6260: 54 65 78 74 33 20 3d 20 73 71 6c 69 74 65 33 5f  Text3 = sqlite3_
6270: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6280: 30 5d 29 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78  0]);..  if( zTex
6290: 74 31 21 3d 7a 54 65 78 74 32 20 7c 7c 20 7a 54  t1!=zText2 || zT
62a0: 65 78 74 32 21 3d 7a 54 65 78 74 33 20 29 7b 0a  ext2!=zText3 ){.
62b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
62c0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
62d0: 2c 20 22 74 6b 74 32 32 31 33 20 69 73 20 6e 6f  , "tkt2213 is no
62e0: 74 20 66 69 78 65 64 22 2c 20 2d 31 29 3b 0a 20  t fixed", -1);. 
62f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
6300: 20 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61 72 20   *zCopy = (char 
6310: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
6320: 28 6e 54 65 78 74 29 3b 0a 20 20 20 20 6d 65 6d  (nText);.    mem
6330: 63 70 79 28 7a 43 6f 70 79 2c 20 7a 54 65 78 74  cpy(zCopy, zText
6340: 31 2c 20 6e 54 65 78 74 29 3b 0a 20 20 20 20 73  1, nText);.    s
6350: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
6360: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 43 6f 70  xt(context, zCop
6370: 79 2c 20 6e 54 65 78 74 2c 20 73 71 6c 69 74 65  y, nText, sqlite
6380: 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  3_free);.  }.}..
6390: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
63a0: 69 6e 67 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ing SQL function
63b0: 20 74 61 6b 65 73 20 34 20 61 72 67 75 6d 65 6e   takes 4 argumen
63c0: 74 73 2e 20 20 54 68 65 20 32 6e 64 20 61 6e 64  ts.  The 2nd and
63d0: 0a 2a 2a 20 34 74 68 20 61 72 67 75 6d 65 6e 74  .** 4th argument
63e0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
63f0: 74 68 65 73 65 20 73 74 72 69 6e 67 73 3a 20 20  these strings:  
6400: 27 74 65 78 74 27 2c 20 27 74 65 78 74 31 36 27  'text', 'text16'
6410: 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f 62 27 20 63  ,.** or 'blob' c
6420: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
6430: 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  API functions.**
6440: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
6450: 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 0a 2a 2a  _value_text().**
6460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
6470: 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 2a 2a 20  lue_text16().** 
6480: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6490: 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a 0a 2a 2a 20  ue_blob().**.** 
64a0: 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
64b0: 6e 74 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  nt is a string, 
64c0: 65 69 74 68 65 72 20 27 62 79 74 65 73 27 20 6f  either 'bytes' o
64d0: 72 20 27 62 79 74 65 73 31 36 27 20 6f 72 20 27  r 'bytes16' or '
64e0: 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f 72 72 65 73  noop',.** corres
64f0: 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 73 3a  ponding to APIs:
6500: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
6510: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
6520: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6530: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28  3_value_bytes16(
6540: 29 0a 2a 2a 20 20 20 20 20 20 6e 6f 6f 70 0a 2a  ).**      noop.*
6550: 2a 0a 2a 2a 20 54 68 65 20 41 50 49 73 20 64 65  *.** The APIs de
6560: 73 69 67 6e 61 74 65 64 20 62 79 20 74 68 65 20  signated by the 
6570: 32 6e 64 20 74 68 72 6f 75 67 68 20 34 74 68 20  2nd through 4th 
6580: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
6590: 70 6c 69 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  plied.** to the 
65a0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
65b0: 6e 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 65  n order.  If the
65c0: 20 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e   pointers return
65d0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 65 63  ed by the.** sec
65e0: 6f 6e 64 20 61 6e 64 20 66 6f 75 72 74 68 20 61  ond and fourth a
65f0: 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68  re different, th
6600: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6610: 6e 73 20 31 2e 20 20 4f 74 68 65 72 77 69 73 65  ns 1.  Otherwise
6620: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
6630: 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a  e returns 0..**.
6640: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6650: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
6660: 20 74 6f 20 73 65 65 20 77 68 65 6e 20 72 65 74   to see when ret
6670: 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 73 20 66  urned pointers f
6680: 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f 74 65 78 74  rom.** the _text
6690: 28 29 2c 20 5f 74 65 78 74 31 36 28 29 20 61 6e  (), _text16() an
66a0: 64 20 5f 62 6c 6f 62 28 29 20 41 50 49 73 20 62  d _blob() APIs b
66b0: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 61 74 65  ecome invalidate
66c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
66d0: 64 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f  d ptrChngFunctio
66e0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
66f0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
6700: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
6710: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6720: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
6730: 76 6f 69 64 20 2a 70 31 2c 20 2a 70 32 3b 0a 20  void *p1, *p2;. 
6740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d   const char *zCm
6750: 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  d;.  if( argc!=4
6760: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 43 6d   ) return;.  zCm
6770: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6780: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6790: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
67a0: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
67b0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
67c0: 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d  mp(zCmd,"text")=
67d0: 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28  =0 ){.    p1 = (
67e0: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
67f0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6800: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
6810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
6820: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
6830: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78  trcmp(zCmd, "tex
6840: 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t16")==0 ){.    
6850: 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p1 = (const void
6860: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6870: 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b  text16(argv[0]);
6880: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6890: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
68a0: 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20   "blob")==0 ){. 
68b0: 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76     p1 = (const v
68c0: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
68d0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
68e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
68f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d  eturn;.  }.  zCm
6900: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6910: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6920: 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  ext(argv[2]);.  
6930: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
6940: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
6950: 6d 70 28 7a 43 6d 64 2c 22 62 79 74 65 73 22 29  mp(zCmd,"bytes")
6960: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6970: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
6980: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
6990: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
69a0: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
69b0: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 79 74  trcmp(zCmd, "byt
69c0: 65 73 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20  es16")==0 ){.   
69d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
69e0: 79 74 65 73 31 36 28 61 72 67 76 5b 30 5d 29 3b  ytes16(argv[0]);
69f0: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6a00: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6a10: 20 22 6e 6f 6f 70 22 29 3d 3d 30 20 29 7b 0a 20   "noop")==0 ){. 
6a20: 20 20 20 2f 2a 20 64 6f 20 6e 6f 74 68 69 6e 67     /* do nothing
6a30: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
6a40: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a   return;.  }.  z
6a50: 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Cmd = (const cha
6a60: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
6a70: 5f 74 65 78 74 28 61 72 67 76 5b 33 5d 29 3b 0a  _text(argv[3]);.
6a80: 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20    if( zCmd==0 ) 
6a90: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74  return;.  if( st
6aa0: 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22  rcmp(zCmd,"text"
6ab0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d  )==0 ){.    p2 =
6ac0: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
6ad0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6ae0: 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64  (argv[0]);.#ifnd
6af0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
6b00: 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28  TF16.  }else if(
6b10: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74   strcmp(zCmd, "t
6b20: 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20  ext16")==0 ){.  
6b30: 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f    p2 = (const vo
6b40: 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  id*)sqlite3_valu
6b50: 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d  e_text16(argv[0]
6b60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
6b70: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d  e if( strcmp(zCm
6b80: 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b  d, "blob")==0 ){
6b90: 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74  .    p2 = (const
6ba0: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6bb0: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
6bc0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
6bd0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
6be0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6bf0: 74 28 63 6f 6e 74 65 78 74 2c 20 70 31 21 3d 70  t(context, p1!=p
6c00: 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  2);.}../*.** Thi
6c10: 73 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72  s SQL function r
6c20: 65 74 75 72 6e 73 20 61 20 64 69 66 66 65 72 65  eturns a differe
6c30: 6e 74 20 61 6e 73 77 65 72 20 65 61 63 68 20 74  nt answer each t
6c40: 69 6d 65 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ime it is called
6c50: 2c 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  , even if.** the
6c60: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74   arguments are t
6c70: 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
6c80: 69 63 20 76 6f 69 64 20 6e 6f 6e 64 65 74 65 72  ic void nondeter
6c90: 6d 69 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e  ministicFunction
6ca0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
6cb0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
6cc0: 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73   int argc,  .  s
6cd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6ce0: 72 67 76 0a 29 7b 0a 20 20 73 74 61 74 69 63 20  rgv.){.  static 
6cf0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 73  int cnt = 0;.  s
6d00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6d10: 74 28 63 6f 6e 74 65 78 74 2c 20 63 6e 74 2b 2b  t(context, cnt++
6d20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
6d30: 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  e:  sqlite3_crea
6d40: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 0a 2a  te_function DB.*
6d50: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
6d60: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6d70: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
6d80: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
6d90: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
6da0: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
6db0: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 61 6c 65 73   named "x_coales
6dc0: 63 65 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ce".  This funct
6dd0: 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d  ion does the sam
6de0: 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68  e thing.** as th
6df0: 65 20 22 63 6f 61 6c 65 73 63 65 22 20 66 75 6e  e "coalesce" fun
6e00: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
6e10: 63 74 69 6f 6e 20 61 6c 73 6f 20 72 65 67 69 73  ction also regis
6e20: 74 65 72 73 20 61 6e 20 53 51 4c 20 66 75 6e 63  ters an SQL func
6e30: 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64 20 22 78  tion.** named "x
6e40: 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 20 74 68  _sqlite_exec" th
6e50: 61 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  at invokes sqlit
6e60: 65 33 5f 65 78 65 63 28 29 2e 20 20 49 6e 76 6f  e3_exec().  Invo
6e70: 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 65 78 65  king sqlite3_exe
6e80: 63 28 29 0a 2a 2a 20 69 6e 20 74 68 69 73 20 77  c().** in this w
6e90: 61 79 20 69 73 20 69 6c 6c 65 67 61 6c 20 72 65  ay is illegal re
6ea0: 63 75 72 73 69 6f 6e 20 61 6e 64 20 73 68 6f 75  cursion and shou
6eb0: 6c 64 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49  ld raise an SQLI
6ec0: 54 45 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 2e  TE_MISUSE error.
6ed0: 0a 2a 2a 20 54 68 65 20 65 66 66 65 63 74 20 69  .** The effect i
6ee0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 72 79  s similar to try
6ef0: 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 73  ing to use the s
6f00: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
6f10: 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20  nection from.** 
6f20: 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 20 74  two threads at t
6f30: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a  he same time..**
6f40: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
6f50: 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20   motivation for 
6f60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
6f70: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63   to be able to c
6f80: 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  all the.** sqlit
6f90: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
6fa0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  on function whil
6fb0: 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20  e a query is in 
6fc0: 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65  progress in orde
6fd0: 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  r.** to test the
6fe0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64   SQLITE_MISUSE d
6ff0: 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a  etection logic..
7000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
7010: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
7020: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7030: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
7040: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
7050: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
7060: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
7070: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
7080: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
7090: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
70a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
70b0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
70c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
70e0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
70f0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
7100: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
7110: 64 62 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  db;..  if( argc!
7120: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
7130: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7140: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
7150: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
7160: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
7170: 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20   " DB\"", 0);.  
7180: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7190: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
71a0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
71b0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
71c0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
71d0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
71e0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
71f0: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 61 6c 65  ion(db, "x_coale
7200: 73 63 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  sce", -1, SQLITE
7210: 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20  _UTF8, 0, .     
7220: 20 20 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63     t1_ifnullFunc
7230: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
7240: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7250: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7260: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7270: 28 64 62 2c 20 22 68 65 78 38 22 2c 20 31 2c 20  (db, "hex8", 1, 
7280: 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
7290: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
72a0: 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c  IC,.          0,
72b0: 20 68 65 78 38 46 75 6e 63 2c 20 30 2c 20 30 29   hex8Func, 0, 0)
72c0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
72d0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
72e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
72f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7300: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7310: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78  unction(db, "hex
7320: 31 36 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  16", 1, SQLITE_U
7330: 54 46 31 36 20 7c 20 53 51 4c 49 54 45 5f 44 45  TF16 | SQLITE_DE
7340: 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20 20 20  TERMINISTIC,.   
7350: 20 20 20 20 20 20 20 30 2c 20 68 65 78 31 36 46         0, hex16F
7360: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
7370: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 3d  #endif.  if( rc=
7380: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7390: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
73a0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
73b0: 62 2c 20 22 74 6b 74 32 32 31 33 66 75 6e 63 22  b, "tkt2213func"
73c0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 1, SQLITE_ANY,
73d0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 74   0, .          t
73e0: 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e 2c 20  kt2213Function, 
73f0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
7400: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7410: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7420: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7430: 6f 6e 28 64 62 2c 20 22 70 6f 69 6e 74 65 72 5f  on(db, "pointer_
7440: 63 68 61 6e 67 65 22 2c 20 34 2c 20 53 51 4c 49  change", 4, SQLI
7450: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
7460: 20 20 20 20 20 20 70 74 72 43 68 6e 67 46 75 6e        ptrChngFun
7470: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
7480: 7d 0a 0a 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  }..  /* Function
7490: 73 20 63 6f 75 6e 74 65 72 31 28 29 20 61 6e 64  s counter1() and
74a0: 20 63 6f 75 6e 74 65 72 32 28 29 20 68 61 76 65   counter2() have
74b0: 20 74 68 65 20 73 61 6d 65 20 69 6d 70 6c 65 6d   the same implem
74c0: 65 6e 74 61 74 69 6f 6e 20 2d 20 74 68 65 79 0a  entation - they.
74d0: 20 20 2a 2a 20 62 6f 74 68 20 72 65 74 75 72 6e    ** both return
74e0: 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
74f0: 74 65 67 65 72 20 77 69 74 68 20 65 61 63 68 20  teger with each 
7500: 63 61 6c 6c 2e 20 20 42 75 74 20 63 6f 75 6e 74  call.  But count
7510: 65 72 31 28 29 20 69 73 20 6d 61 72 6b 65 64 0a  er1() is marked.
7520: 20 20 2a 2a 20 61 73 20 6e 6f 6e 2d 64 65 74 65    ** as non-dete
7530: 72 6d 69 6e 69 73 74 69 63 20 61 6e 64 20 63 6f  rministic and co
7540: 75 6e 74 65 72 32 28 29 20 69 73 20 6d 61 72 6b  unter2() is mark
7550: 65 64 20 61 73 20 64 65 74 65 72 6d 69 6e 69 73  ed as determinis
7560: 74 69 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tic..  */.  if( 
7570: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7580: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7590: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
75a0: 6e 28 64 62 2c 20 22 63 6f 75 6e 74 65 72 31 22  n(db, "counter1"
75b0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
75c0: 38 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  8,.          0, 
75d0: 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69 63  nondeterministic
75e0: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
75f0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
7600: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7610: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7620: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7630: 20 22 63 6f 75 6e 74 65 72 32 22 2c 20 2d 31 2c   "counter2", -1,
7640: 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c   SQLITE_UTF8|SQL
7650: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
7660: 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  C,.          0, 
7670: 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69 63  nondeterministic
7680: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
7690: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
76a0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
76b0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 71 6c    /* Use the sql
76c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
76d0: 74 69 6f 6e 31 36 28 29 20 41 50 49 20 68 65 72  tion16() API her
76e0: 65 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20 66 75  e. Mainly for fu
76f0: 6e 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20 20 2a  n, but also .  *
7700: 2a 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  * because it is 
7710: 6e 6f 74 20 74 65 73 74 65 64 20 61 6e 79 77 68  not tested anywh
7720: 65 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 69  ere else. */.  i
7730: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7740: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f   ){.    const vo
7750: 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20  id *zUtf16;.    
7760: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
7770: 56 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Val;.    sqlite3
7780: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
7790: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61  >mutex);.    pVa
77a0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
77b0: 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  New(db);.    sql
77c0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
77d0: 70 56 61 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c  pVal, -1, "x_sql
77e0: 69 74 65 5f 65 78 65 63 22 2c 20 53 51 4c 49 54  ite_exec", SQLIT
77f0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
7800: 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66  TATIC);.    zUtf
7810: 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  16 = sqlite3Valu
7820: 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
7830: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
7840: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
7850: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
7860: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
7870: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
7880: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7890: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
78a0: 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36  ion16(db, zUtf16
78b0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
78c0: 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46     1, SQLITE_UTF
78d0: 31 36 2c 20 64 62 2c 20 73 71 6c 69 74 65 33 45  16, db, sqlite3E
78e0: 78 65 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  xecFunc, 0, 0);.
78f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7900: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
7910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
7920: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
7930: 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
7940: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ..  if( sqlite3T
7950: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
7960: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
7970: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7980: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
7990: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
79a0: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
79b0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
79c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
79d0: 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d  utines to implem
79e0: 65 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e 74 28  ent the x_count(
79f0: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
7a00: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f  tion..**.** x_co
7a10: 75 6e 74 28 29 20 63 6f 75 6e 74 73 20 74 68 65  unt() counts the
7a20: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 6e   number of non-n
7a30: 75 6c 6c 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ull arguments.  
7a40: 42 75 74 20 74 68 65 72 65 20 61 72 65 0a 2a 2a  But there are.**
7a50: 20 73 6f 6d 65 20 74 77 69 73 74 73 20 66 6f 72   some twists for
7a60: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
7a70: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
7a80: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 5f 63 6f  argument to x_co
7a90: 75 6e 74 28 29 20 69 73 20 34 30 20 74 68 65 6e  unt() is 40 then
7aa0: 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69   a UTF-8 error i
7ab0: 73 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 6f 6e  s reported.** on
7ac0: 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
7ad0: 6f 6e 2e 20 20 49 66 20 78 5f 63 6f 75 6e 74 28  on.  If x_count(
7ae0: 34 31 29 20 69 73 20 73 65 65 6e 2c 20 74 68 65  41) is seen, the
7af0: 6e 20 61 20 55 54 46 2d 31 36 20 65 72 72 6f 72  n a UTF-16 error
7b00: 0a 2a 2a 20 69 73 20 72 65 70 6f 72 74 65 64 20  .** is reported 
7b10: 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  on the step func
7b20: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 74 6f  tion.  If the to
7b30: 74 61 6c 20 63 6f 75 6e 74 20 69 73 20 34 32 2c  tal count is 42,
7b40: 20 74 68 65 6e 0a 2a 2a 20 61 20 55 54 46 2d 38   then.** a UTF-8
7b50: 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74   error is report
7b60: 65 64 20 6f 6e 20 74 68 65 20 66 69 6e 61 6c 69  ed on the finali
7b70: 7a 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ze function..*/.
7b80: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 74  typedef struct t
7b90: 31 43 6f 75 6e 74 43 74 78 20 74 31 43 6f 75 6e  1CountCtx t1Coun
7ba0: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 74 31 43  tCtx;.struct t1C
7bb0: 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e 74 20  ountCtx {.  int 
7bc0: 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69  n;.};.static voi
7bd0: 64 20 74 31 43 6f 75 6e 74 53 74 65 70 28 0a 20  d t1CountStep(. 
7be0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
7bf0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
7c00: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
7c10: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
7c20: 0a 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70  .  t1CountCtx *p
7c30: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
7c40: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
7c50: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
7c60: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61  f(*p));.  if( (a
7c70: 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45  rgc==0 || SQLITE
7c80: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
7c90: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
7ca0: 5d 29 20 29 20 26 26 20 70 20 29 7b 0a 20 20 20  ]) ) && p ){.   
7cb0: 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69   p->n++;.  }.  i
7cc0: 66 28 20 61 72 67 63 3e 30 20 29 7b 0a 20 20 20  f( argc>0 ){.   
7cd0: 20 69 6e 74 20 76 20 3d 20 73 71 6c 69 74 65 33   int v = sqlite3
7ce0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
7cf0: 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  0]);.    if( v==
7d00: 34 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  40 ){.      sqli
7d10: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7d20: 28 63 6f 6e 74 65 78 74 2c 20 22 76 61 6c 75 65  (context, "value
7d30: 20 6f 66 20 34 30 20 68 61 6e 64 65 64 20 74 6f   of 40 handed to
7d40: 20 78 5f 63 6f 75 6e 74 22 2c 20 2d 31 29 3b 0a   x_count", -1);.
7d50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7d60: 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 7d 65  MIT_UTF16.    }e
7d70: 6c 73 65 20 69 66 28 20 76 3d 3d 34 31 20 29 7b  lse if( v==41 ){
7d80: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
7d90: 72 20 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 5d  r zUtf16ErrMsg[]
7da0: 20 3d 20 7b 20 30 2c 20 30 78 36 31 2c 20 30 2c   = { 0, 0x61, 0,
7db0: 20 30 78 36 32 2c 20 30 2c 20 30 78 36 33 2c 20   0x62, 0, 0x63, 
7dc0: 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20  0, 0, 0};.      
7dd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7de0: 72 72 6f 72 31 36 28 63 6f 6e 74 65 78 74 2c 20  rror16(context, 
7df0: 26 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 31 2d  &zUtf16ErrMsg[1-
7e00: 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e  SQLITE_BIGENDIAN
7e10: 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20  ], -1);.#endif. 
7e20: 20 20 20 7d 0a 20 20 7d 0a 7d 20 20 20 0a 73 74     }.  }.}   .st
7e30: 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e  atic void t1Coun
7e40: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
7e50: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7e60: 78 74 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74  xt){.  t1CountCt
7e70: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
7e80: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7e90: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
7ea0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
7eb0: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
7ec0: 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20 20 20 20 20  ->n==42 ){.     
7ed0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7ee0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
7ef0: 78 5f 63 6f 75 6e 74 20 74 6f 74 61 6c 73 20 74  x_count totals t
7f00: 6f 20 34 32 22 2c 20 2d 31 29 3b 0a 20 20 20 20  o 42", -1);.    
7f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
7f20: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
7f30: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
7f40: 6e 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  n : 0);.    }.  
7f50: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
7f60: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
7f70: 54 45 44 0a 73 74 61 74 69 63 20 76 6f 69 64 20  TED.static void 
7f80: 6c 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70 28  legacyCountStep(
7f90: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7fa0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
7fb0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7fc0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7fd0: 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  ){.  /* no-op */
7fe0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7ff0: 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c  legacyCountFinal
8000: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
8010: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
8020: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8030: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
8040: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
8050: 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 29 3b 0a  ount(context));.
8060: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
8070: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
8080: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
8090: 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74   DB.**.** Call t
80a0: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
80b0: 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f  e_function API o
80c0: 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  n the given data
80d0: 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  base in order.**
80e0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e   to create a fun
80f0: 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63  ction named "x_c
8100: 6f 75 6e 74 22 2e 20 20 54 68 69 73 20 66 75 6e  ount".  This fun
8110: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
8120: 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 69 6c 74  .** to the built
8130: 2d 69 6e 20 63 6f 75 6e 74 28 29 20 66 75 6e 63  -in count() func
8140: 74 69 6f 6e 2c 20 77 69 74 68 20 61 20 66 65 77  tion, with a few
8150: 20 73 70 65 63 69 61 6c 20 71 75 69 72 6b 73 0a   special quirks.
8160: 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74  ** for testing t
8170: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  he sqlite3_resul
8180: 74 5f 65 72 72 6f 72 28 29 20 41 50 49 73 2e 0a  t_error() APIs..
8190: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
81a0: 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f  al motivation fo
81b0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
81c0: 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  as to be able to
81d0: 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c   call the.** sql
81e0: 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72  ite3_create_aggr
81f0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 77  egate function w
8200: 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73 20  hile a query is 
8210: 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f  in progress in o
8220: 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20  rder.** to test 
8230: 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  the SQLITE_MISUS
8240: 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69  E detection logi
8250: 63 2e 20 20 53 65 65 20 6d 69 73 75 73 65 2e 74  c.  See misuse.t
8260: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  est..**.** This 
8270: 72 6f 75 74 69 6e 65 20 77 61 73 20 6c 61 74 65  routine was late
8280: 72 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 65  r extended to te
8290: 73 74 20 74 68 65 20 75 73 65 20 6f 66 20 73 71  st the use of sq
82a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
82b0: 6f 72 28 29 0a 2a 2a 20 77 69 74 68 69 6e 20 61  or().** within a
82c0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
82d0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 74 65 72 3a  ns..**.** Later:
82e0: 20 49 74 20 69 73 20 6e 6f 77 20 61 6c 73 6f 20   It is now also 
82f0: 65 78 74 65 6e 64 65 64 20 74 6f 20 72 65 67 69  extended to regi
8300: 73 74 65 72 20 74 68 65 20 61 67 67 72 65 67 61  ster the aggrega
8310: 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22  te function.** "
8320: 6c 65 67 61 63 79 5f 63 6f 75 6e 74 28 29 22 20  legacy_count()" 
8330: 77 69 74 68 20 74 68 65 20 73 75 70 70 6c 69 65  with the supplie
8340: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
8350: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  e. This is used.
8360: 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 64  ** to test the d
8370: 65 70 72 65 63 61 74 65 64 20 73 71 6c 69 74 65  eprecated sqlite
8380: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e  3_aggregate_coun
8390: 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  t() API..*/.stat
83a0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
83b0: 4c 41 50 49 20 74 65 73 74 5f 63 72 65 61 74 65  LAPI test_create
83c0: 5f 61 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f  _aggregate(.  vo
83d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
83e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
83f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8400: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8410: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8420: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8430: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8450: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8460: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8470: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8480: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8490: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
84a0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
84b0: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
84c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
84d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
84e0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
84f0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8500: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45  ],.       " FILE
8510: 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  NAME\"", 0);.   
8520: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8530: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
8540: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
8550: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
8560: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8570: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
8580: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8590: 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22  on(db, "x_count"
85a0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
85b0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 74 31  , 0, 0,.      t1
85c0: 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e  CountStep,t1Coun
85d0: 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66  tFinalize);.  if
85e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
85f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
8600: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8610: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74  ion(db, "x_count
8620: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
8630: 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  8, 0, 0,.       
8640: 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31 43   t1CountStep,t1C
8650: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20  ountFinalize);. 
8660: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
8670: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
8680: 44 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  D.  if( rc==SQLI
8690: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
86a0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
86b0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c  _function(db, "l
86c0: 65 67 61 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c  egacy_count", 0,
86d0: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
86e0: 30 2c 0a 20 20 20 20 20 20 20 20 6c 65 67 61 63  0,.        legac
86f0: 79 43 6f 75 6e 74 53 74 65 70 2c 20 6c 65 67 61  yCountStep, lega
8700: 63 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a  cyCountFinalize.
8710: 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69      );.  }.#endi
8720: 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  f.  if( sqlite3T
8730: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
8740: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
8750: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8760: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
8770: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
8780: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
8790: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
87a0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
87b0: 73 61 67 65 3a 20 20 70 72 69 6e 74 66 20 54 45  sage:  printf TE
87c0: 58 54 0a 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75  XT.**.** Send ou
87d0: 74 70 75 74 20 74 6f 20 70 72 69 6e 74 66 2e 20  tput to printf. 
87e0: 20 55 73 65 20 74 68 69 73 20 72 61 74 68 65 72   Use this rather
87f0: 20 74 68 61 6e 20 70 75 74 73 20 74 6f 20 6d 65   than puts to me
8800: 72 67 65 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  rge the output.*
8810: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
8820: 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 64   sequence with d
8830: 65 62 75 67 67 69 6e 67 20 70 72 69 6e 74 66 73  ebugging printfs
8840: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 43   inserted into C
8850: 20 63 6f 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75   code..** Puts u
8860: 73 65 73 20 61 20 73 65 70 61 72 61 74 65 20 62  ses a separate b
8870: 75 66 66 65 72 20 61 6e 64 20 64 65 62 75 67 67  uffer and debugg
8880: 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 77  ing statements w
8890: 69 6c 6c 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a  ill be out of.**
88a0: 20 73 65 71 75 65 6e 63 65 20 69 66 20 69 74 20   sequence if it 
88b0: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  is used..*/.stat
88c0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
88d0: 4c 41 50 49 20 74 65 73 74 5f 70 72 69 6e 74 66  LAPI test_printf
88e0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
88f0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
8900: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
8910: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
8920: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
8930: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
8940: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
8950: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8960: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8970: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
8980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8990: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
89a0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ment */.){.  if(
89b0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
89c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
89d0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
89e0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
89f0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
8a00: 20 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22         " TEXT\""
8a10: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
8a20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
8a30: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
8a40: 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74   argv[1]);.  ret
8a50: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
8a60: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
8a70: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
8a80: 6e 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  nt FORMAT INTEGE
8a90: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8aa0: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8ab0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8ac0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
8ad0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
8ae0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71  SQLITE_TCLAPI sq
8af0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8b00: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
8b10: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8b20: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8b30: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8b40: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8b50: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
8b60: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
8b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8b80: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8b90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8ba0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8bb0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8bc0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8bd0: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61  t a[3], i;.  cha
8be0: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
8bf0: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
8c00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8c10: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
8c20: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
8c30: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8c40: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
8c50: 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20  NT INT\"", 0);. 
8c60: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8c70: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
8c80: 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20  =2; i<5; i++){. 
8c90: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
8ca0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
8cb0: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65  ], &a[i-2]) ) re
8cc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8cd0: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
8ce0: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
8cf0: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61  ], a[0], a[1], a
8d00: 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
8d10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8d20: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
8d30: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
8d40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
8d50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
8d60: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
8d70: 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  64 FORMAT INTEGE
8d80: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8d90: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8da0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8db0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61  64-bit integer a
8dc0: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
8dd0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
8de0: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
8df0: 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20 20 76 6f  intf_int64(.  vo
8e00: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
8e10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8e20: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8e30: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8e40: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8e50: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8e60: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8e70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8e80: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8e90: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8ea0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8eb0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8ec0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
8ed0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 61 5b 33  sqlite_int64 a[3
8ee0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
8ef0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
8f00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8f10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8f20: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8f30: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8f40: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
8f50: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
8f60: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
8f70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8f80: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
8f90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
8fa0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 61 72 67  qlite3Atoi64(arg
8fb0: 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 2c 20 73  v[i], &a[i-2], s
8fc0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 61  qlite3Strlen30(a
8fd0: 72 67 76 5b 69 5d 29 2c 20 53 51 4c 49 54 45 5f  rgv[i]), SQLITE_
8fe0: 55 54 46 38 29 20 29 7b 0a 20 20 20 20 20 20 54  UTF8) ){.      T
8ff0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9000: 69 6e 74 65 72 70 2c 20 22 61 72 67 75 6d 65 6e  interp, "argumen
9010: 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  t is not a valid
9020: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 22   64-bit integer"
9030: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
9040: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9050: 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71    }.  }.  z = sq
9060: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9070: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9080: 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[2]);.  Tcl_
9090: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
90a0: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
90b0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
90c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
90d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
90e0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
90f0: 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54 20 49 4e 54  _long FORMAT INT
9100: 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54  EGER INTEGER INT
9110: 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  EGER.**.** Call 
9120: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68 72  mprintf with thr
9130: 65 65 20 6c 6f 6e 67 20 69 6e 74 65 67 65 72 20  ee long integer 
9140: 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 54 68 69  arguments.   Thi
9150: 73 20 6d 69 67 68 74 20 62 65 20 74 68 65 0a 2a  s might be the.*
9160: 2a 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  * same as sqlite
9170: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 6f 72  3_mprintf_int or
9180: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9190: 5f 69 6e 74 36 34 2c 20 64 65 70 65 6e 64 69 6e  _int64, dependin
91a0: 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  g on.** platform
91b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
91c0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71  SQLITE_TCLAPI sq
91d0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
91e0: 6e 67 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ng(.  void *NotU
91f0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
9200: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
9210: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
9220: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
9230: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
9240: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
9250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9260: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9270: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
9280: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
9290: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
92a0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
92b0: 6e 74 20 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74  nt i;.  long int
92c0: 20 61 5b 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33   a[3];.  int b[3
92d0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
92e0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
92f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9310: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9320: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
9330: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
9340: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
9350: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9360: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9370: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
9380: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
9390: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
93a0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d  , argv[i], &b[i-
93b0: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
93c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d  _ERROR;.    a[i-
93d0: 32 5d 20 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62  2] = (long int)b
93e0: 5b 69 2d 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32  [i-2];.    a[i-2
93f0: 5d 20 26 3d 20 28 28 28 75 36 34 29 31 29 3c 3c  ] &= (((u64)1)<<
9400: 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29  (sizeof(int)*8))
9410: 2d 31 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  -1;.  }.  z = sq
9420: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9430: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9440: 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[2]);.  Tcl_
9450: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9460: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
9470: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
9480: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9490: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
94a0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
94b0: 5f 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45  _str FORMAT INTE
94c0: 47 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49  GER INTEGER STRI
94d0: 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  NG.**.** Call mp
94e0: 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69  rintf with two i
94f0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
9500: 20 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20   and one string 
9510: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  argument.*/.stat
9520: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
9530: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
9540: 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64  intf_str(.  void
9550: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9560: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9570: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9580: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
9590: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
95a0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
95b0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
95c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
95d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
95e0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
95f0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
9600: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
9610: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
9620: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
9630: 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67  f( argc<4 || arg
9640: 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c>5 ){.    Tcl_A
9650: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9660: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9670: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9680: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9690: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
96a0: 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20  NT ?STRING?\"", 
96b0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
96c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
96d0: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
96e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
96f0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
9700: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
9710: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9720: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
9730: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
9740: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
9750: 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67  1], argc>4 ? arg
9760: 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20  v[4] : NULL);.  
9770: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9780: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
9790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
97a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
97b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
97c0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ge:  sqlite3_snp
97d0: 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47 45  rintf_str INTEGE
97e0: 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  R FORMAT INTEGER
97f0: 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a   INTEGER STRING.
9800: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9810: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
9820: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
9830: 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67  d one string arg
9840: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
9850: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
9860: 49 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  I sqlite3_snprin
9870: 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20 2a  tf_str(.  void *
9880: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
9890: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
98a0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
98b0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
98c0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
98d0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
98e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
98f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
9900: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
9910: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
9920: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
9930: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
9940: 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a  .  int a[3], i;.
9950: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
9960: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 35  *z;.  if( argc<5
9970: 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a 20 20   || argc>6 ){.  
9980: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9990: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
99a0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
99b0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
99c0: 2c 0a 20 20 20 20 20 20 20 22 20 49 4e 54 20 46  ,.       " INT F
99d0: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f 53  ORMAT INT INT ?S
99e0: 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20  TRING?\"", 0);. 
99f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9a00: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
9a10: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
9a20: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20 29  , argv[1], &n) )
9a30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9a40: 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a  R;.  if( n<0 ){.
9a50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9a60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 20  sult(interp, "N 
9a70: 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  must be non-nega
9a80: 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  tive", 0);.    r
9a90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9aa0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20  .  }.  for(i=3; 
9ab0: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
9ac0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
9ad0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
9ae0: 61 5b 69 2d 33 5d 29 20 29 20 72 65 74 75 72 6e  a[i-3]) ) return
9af0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9b00: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    z = sqlite3_ma
9b10: 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 73  lloc( n+1 );.  s
9b20: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9b30: 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c 20 61  n, z, argv[2], a
9b40: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e  [0], a[1], argc>
9b50: 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20 4e 55  4 ? argv[5] : NU
9b60: 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  LL);.  Tcl_Appen
9b70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9b80: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
9b90: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
9ba0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9bb0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
9bc0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
9bd0: 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  le FORMAT INTEGE
9be0: 52 20 49 4e 54 45 47 45 52 20 44 4f 55 42 4c 45  R INTEGER DOUBLE
9bf0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
9c00: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
9c10: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
9c20: 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72  nd one double ar
9c30: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
9c40: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
9c50: 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  PI sqlite3_mprin
9c60: 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  tf_double(.  voi
9c70: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9c80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9c90: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9ca0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9cb0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9cc0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9cd0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9ce0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9cf0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9d00: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9d10: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
9d20: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
9d30: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
9d40: 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  i;.  double r;. 
9d50: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
9d60: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
9d70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9d80: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
9d90: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
9da0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
9db0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49        " FORMAT I
9dc0: 4e 54 20 49 4e 54 20 44 4f 55 42 4c 45 5c 22 22  NT INT DOUBLE\""
9dd0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
9de0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9df0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
9e00: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
9e10: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
9e20: 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32   argv[i], &a[i-2
9e30: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
9e40: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
9e50: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69   Tcl_GetDouble(i
9e60: 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20  nterp, argv[4], 
9e70: 26 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &r) ) return TCL
9e80: 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71  _ERROR;.  z = sq
9e90: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9ea0: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9eb0: 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70  ], r);.  Tcl_App
9ec0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9ed0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
9ee0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
9ef0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9f00: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
9f10: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
9f20: 61 6c 65 64 20 46 4f 52 4d 41 54 20 44 4f 55 42  aled FORMAT DOUB
9f30: 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20  LE DOUBLE.**.** 
9f40: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
9f50: 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c  h a single doubl
9f60: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
9f70: 20 69 73 20 74 68 65 20 70 72 6f 64 75 63 74 20   is the product 
9f80: 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72  of the.** two ar
9f90: 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61 62  guments given ab
9fa0: 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  ove.  This is us
9fb0: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 6f  ed to generate o
9fc0: 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65  verflow and unde
9fd0: 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73  rflow.** doubles
9fe0: 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 74 68   to test that th
9ff0: 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  ey are converted
a000: 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74   properly..*/.st
a010: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
a020: 54 43 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d  TCLAPI sqlite3_m
a030: 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20  printf_scaled(. 
a040: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
a050: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a060: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a070: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a080: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a090: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a0a0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
a0b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a0c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a0d0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
a0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
a0f0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
a100: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
a110: 0a 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a  .  double r[2];.
a120: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
a130: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
a140: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a150: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
a160: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
a170: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
a180: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
a190: 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22  DOUBLE DOUBLE\""
a1a0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
a1b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a1c0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
a1d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
a1e0: 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65  l_GetDouble(inte
a1f0: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b  rp, argv[i], &r[
a200: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
a210: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a220: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a230: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30  ntf(argv[1], r[0
a240: 5d 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41  ]*r[1]);.  Tcl_A
a250: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a260: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
a270: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
a280: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
a290: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
a2a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a2b0: 73 74 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53  stronly FORMAT S
a2c0: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TRING.**.** Call
a2d0: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20   mprintf with a 
a2e0: 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72  single double ar
a2f0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
a300: 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74  the product of t
a310: 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65  he.** two argume
a320: 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e  nts given above.
a330: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
a340: 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66  o generate overf
a350: 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f  low and underflo
a360: 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20  w.** doubles to 
a370: 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61  test that they a
a380: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f  re converted pro
a390: 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  perly..*/.static
a3a0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
a3b0: 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  PI sqlite3_mprin
a3c0: 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f  tf_stronly(.  vo
a3d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
a3e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a3f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
a400: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
a410: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
a420: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
a430: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
a440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a450: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
a460: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
a470: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
a480: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
a490: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
a4a0: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
a4b0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a4c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
a4d0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
a4e0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
a4f0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
a500: 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20  RMAT STRING\"", 
a510: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a520: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a530: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a540: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67  ntf(argv[1], arg
a550: 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  v[2]);.  Tcl_App
a560: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a570: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
a580: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
a590: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
a5a0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
a5b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
a5c0: 78 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 48  xdouble FORMAT H
a5d0: 45 58 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  EX.**.** Call mp
a5e0: 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e  rintf with a sin
a5f0: 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  gle double argum
a600: 65 6e 74 20 77 68 69 63 68 20 69 73 20 64 65 72  ent which is der
a610: 69 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ived from the.**
a620: 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63   hexadecimal enc
a630: 6f 64 69 6e 67 20 6f 66 20 61 6e 20 49 45 45 45  oding of an IEEE
a640: 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74   double..*/.stat
a650: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
a660: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
a670: 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 28 0a  intf_hexdouble(.
a680: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
a690: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a6a0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
a6b0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
a6c0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
a6d0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
a6e0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
a6f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a700: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a710: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
a720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
a730: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
a740: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
a750: 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a  *z;.  double r;.
a760: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
a770: 31 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74 65 5f  1, x2;.  sqlite_
a780: 75 69 6e 74 36 34 20 64 3b 0a 20 20 69 66 28 20  uint64 d;.  if( 
a790: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
a7a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a7b0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
a7c0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
a7d0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
a7e0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53        " FORMAT S
a7f0: 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20  TRING\"", 0);.  
a800: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a810: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 73  OR;.  }.  if( ss
a820: 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22 25  canf(argv[2], "%
a830: 30 38 78 25 30 38 78 22 2c 20 26 78 32 2c 20 26  08x%08x", &x2, &
a840: 78 31 29 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  x1)!=2 ){.    Tc
a850: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a860: 6e 74 65 72 70 2c 20 22 32 6e 64 20 61 72 67 75  nterp, "2nd argu
a870: 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 31  ment should be 1
a880: 36 2d 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  6-characters of 
a890: 68 65 78 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  hex", 0);.    re
a8a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a8b0: 20 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20    }.  d = x2;.  
a8c0: 64 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20 78 31  d = (d<<32) + x1
a8d0: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c 20 26  ;.  memcpy(&r, &
a8e0: 64 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20  d, sizeof(r));. 
a8f0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
a900: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 29  intf(argv[1], r)
a910: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
a920: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
a930: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
a940: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
a950: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
a960: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
a970: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
a980: 63 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  che ?BOOLEAN?.**
a990: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
a9a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a9b0: 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74 69  RED_CACHE).stati
a9c0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
a9d0: 41 50 49 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  API test_enable_
a9e0: 73 68 61 72 65 64 28 0a 20 20 43 6c 69 65 6e 74  shared(.  Client
a9f0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
aa00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
aa10: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
aa20: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
aa30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
aa40: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
aa50: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
aa60: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
aa70: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
aa80: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
aa90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
aaa0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
aab0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
aac0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
aad0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
aae0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
aaf0: 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20  t enable;.  int 
ab00: 72 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ret = 0;..  if( 
ab10: 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
ab20: 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
ab30: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ab40: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f  p, 1, objv, "?BO
ab50: 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65  OLEAN?");.    re
ab60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ab70: 20 20 7d 0a 20 20 72 65 74 20 3d 20 73 71 6c 69    }.  ret = sqli
ab80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
ab90: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
aba0: 65 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d  ed;..  if( objc=
abb0: 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  =2 ){.    if( Tc
abc0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
abd0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
abe0: 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b  [1], &enable) ){
abf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
ac00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ac10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
ac20: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
ac30: 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20  che(enable);.   
ac40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ac50: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
ac60: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
ac70: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
ac80: 33 45 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c  3ErrStr(rc), TCL
ac90: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
aca0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
acb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63  ;.    }.  }.  Tc
acc0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
acd0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
ace0: 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a  oleanObj(ret));.
acf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ad00: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  .}.#endif..../*.
ad10: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
ad20: 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
ad30: 74 5f 63 6f 64 65 73 20 20 20 44 42 20 20 20 20  t_codes   DB    
ad40: 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74  BOOLEAN.**.*/.st
ad50: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
ad60: 54 43 4c 41 50 49 20 74 65 73 74 5f 65 78 74 65  TCLAPI test_exte
ad70: 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
ad80: 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  s(.  ClientData 
ad90: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
ada0: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
adb0: 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
adc0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
add0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
ade0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
adf0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
ae00: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
ae10: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
ae20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ae30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
ae40: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
ae50: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
ae60: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
ae70: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
ae80: 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c  nt enable;.  sql
ae90: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
aea0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
aeb0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
aec0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
aed0: 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b  , "DB BOOLEAN");
aee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
aef0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
af00: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
af10: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
af20: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
af30: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
af40: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
af50: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
af60: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
af70: 32 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 20 72  2], &enable) ) r
af80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
af90: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  .  sqlite3_exten
afa0: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
afb0: 28 64 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20  (db, enable);.  
afc0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
afd0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
afe0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
aff0: 6e 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73  n_number.**.*/.s
b000: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
b010: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 69 62  _TCLAPI test_lib
b020: 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a  version_number(.
b030: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
b040: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
b050: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
b060: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
b070: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
b080: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
b090: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
b0a0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
b0b0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
b0c0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b0e0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b0f0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
b100: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
b110: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
b120: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
b130: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b140: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
b150: 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  bj(sqlite3_libve
b160: 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29  rsion_number()))
b170: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
b180: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
b190: 65 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  e: sqlite3_table
b1a0: 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
b1b0: 20 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61   DB dbname tblna
b1c0: 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f  me colname.**.*/
b1d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
b1e0: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 74  TE_TCLAPI test_t
b1f0: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
b200: 64 61 74 61 28 0a 20 20 43 6c 69 65 6e 74 44 61  data(.  ClientDa
b210: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
b220: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
b230: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
b240: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
b250: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b260: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
b270: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
b280: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
b290: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
b2a0: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
b2b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
b2c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
b2d0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b2e0: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
b2f0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
b300: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
b310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
b320: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b330: 7a 54 62 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  zTbl;.  const ch
b340: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74 20  ar *zCol;.  int 
b350: 72 63 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rc;.  Tcl_Obj *p
b360: 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68  Ret;..  const ch
b370: 61 72 20 2a 7a 44 61 74 61 74 79 70 65 3b 0a 20  ar *zDatatype;. 
b380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
b390: 6c 6c 73 65 71 3b 0a 20 20 69 6e 74 20 6e 6f 74  llseq;.  int not
b3a0: 6e 75 6c 6c 3b 0a 20 20 69 6e 74 20 70 72 69 6d  null;.  int prim
b3b0: 61 72 79 6b 65 79 3b 0a 20 20 69 6e 74 20 61 75  arykey;.  int au
b3c0: 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20 20  toincrement;..  
b3d0: 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
b3e0: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
b3f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
b400: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
b410: 22 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61  "DB dbname tblna
b420: 6d 65 20 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20  me colname");.  
b430: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b440: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
b450: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
b460: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
b470: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
b480: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b490: 4f 52 3b 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f  OR;.  zDb = Tcl_
b4a0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
b4b0: 5d 29 3b 0a 20 20 7a 54 62 6c 20 3d 20 54 63 6c  ]);.  zTbl = Tcl
b4c0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
b4d0: 33 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 6f 62  3]);.  zCol = ob
b4e0: 6a 63 3d 3d 35 20 3f 20 54 63 6c 5f 47 65 74 53  jc==5 ? Tcl_GetS
b4f0: 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 20 3a  tring(objv[4]) :
b500: 20 30 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c 65   0;..  if( strle
b510: 6e 28 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62 20  n(zDb)==0 ) zDb 
b520: 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 0;..  rc = sql
b530: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
b540: 6e 5f 6d 65 74 61 64 61 74 61 28 64 62 2c 20 7a  n_metadata(db, z
b550: 44 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20  Db, zTbl, zCol, 
b560: 0a 20 20 20 20 20 20 26 7a 44 61 74 61 74 79 70  .      &zDatatyp
b570: 65 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e  e, &zCollseq, &n
b580: 6f 74 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79  otnull, &primary
b590: 6b 65 79 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d  key, &autoincrem
b5a0: 65 6e 74 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  ent);..  if( rc!
b5b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b5c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b5d0: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
b5e0: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
b5f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
b600: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
b610: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
b620: 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  j();.  Tcl_ListO
b630: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b640: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
b650: 53 74 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74  StringObj(zDatat
b660: 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ype, -1));.  Tcl
b670: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
b680: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
b690: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
b6a0: 7a 43 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a  zCollseq, -1));.
b6b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b6c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
b6d0: 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
b6e0: 6a 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54  j(notnull));.  T
b6f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b700: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b710: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70   Tcl_NewIntObj(p
b720: 72 69 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20 54  rimarykey));.  T
b730: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b740: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b750: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61   Tcl_NewIntObj(a
b760: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a  utoincrement));.
b770: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
b780: 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
b790: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
b7a0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
b7b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
b7c0: 4c 4f 42 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  LOB..static int 
b7d0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 62 6c  SQLITE_TCLAPI bl
b7e0: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
b7f0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
b800: 6e 74 65 72 70 2c 20 0a 20 20 54 63 6c 5f 4f 62  nterp, .  Tcl_Ob
b810: 6a 20 2a 70 4f 62 6a 2c 0a 20 20 73 71 6c 69 74  j *pObj,.  sqlit
b820: 65 33 5f 62 6c 6f 62 20 2a 2a 70 70 42 6c 6f 62  e3_blob **ppBlob
b830: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
b840: 20 69 6e 74 20 6e 3b 0a 0a 20 20 7a 20 3d 20 54   int n;..  z = T
b850: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
b860: 4f 62 6a 28 70 4f 62 6a 2c 20 26 6e 29 3b 0a 20  Obj(pObj, &n);. 
b870: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
b880: 20 2a 70 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20   *ppBlob = 0;.  
b890: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
b8a0: 6f 74 55 73 65 64 3b 0a 20 20 20 20 54 63 6c 5f  otUsed;.    Tcl_
b8b0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b  Channel channel;
b8c0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
b8d0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
b8e0: 20 20 0a 20 20 20 20 63 68 61 6e 6e 65 6c 20 3d    .    channel =
b8f0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
b900: 69 6e 74 65 72 70 2c 20 7a 2c 20 26 6e 6f 74 55  interp, z, &notU
b910: 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 21 63  sed);.    if( !c
b920: 68 61 6e 6e 65 6c 20 29 20 72 65 74 75 72 6e 20  hannel ) return 
b930: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20  TCL_ERROR;..    
b940: 54 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 6e 65  Tcl_Flush(channe
b950: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 65 6b  l);.    Tcl_Seek
b960: 28 63 68 61 6e 6e 65 6c 2c 20 30 2c 20 53 45 45  (channel, 0, SEE
b970: 4b 5f 53 45 54 29 3b 0a 0a 20 20 20 20 69 6e 73  K_SET);..    ins
b980: 74 61 6e 63 65 44 61 74 61 20 3d 20 54 63 6c 5f  tanceData = Tcl_
b990: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
b9a0: 63 65 44 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b  ceData(channel);
b9b0: 0a 20 20 20 20 2a 70 70 42 6c 6f 62 20 3d 20 2a  .    *ppBlob = *
b9c0: 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a  ((sqlite3_blob *
b9d0: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 29 3b  *)instanceData);
b9e0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
b9f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  CL_OK;.}..static
ba00: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
ba10: 50 49 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f  PI test_blob_reo
ba20: 70 65 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  pen(.  ClientDat
ba30: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
ba40: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
ba50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ba60: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
ba70: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
ba80: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
ba90: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
baa0: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
bab0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bac0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
bad0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
bae0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
baf0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
bb00: 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69  .  Tcl_WideInt i
bb10: 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33  Rowid;.  sqlite3
bb20: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20  _blob *pBlob;.  
bb30: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
bb40: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
bb50: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
bb60: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
bb70: 22 43 48 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29  "CHANNEL ROWID")
bb80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
bb90: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
bba0: 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  f( blobHandleFro
bbb0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
bbc0: 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20  v[1], &pBlob) ) 
bbd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bbe0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57  ;.  if( Tcl_GetW
bbf0: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
bc00: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
bc10: 69 52 6f 77 69 64 29 20 29 20 72 65 74 75 72 6e  iRowid) ) return
bc20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
bc30: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
bc40: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
bc50: 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 72 63  Rowid);.  if( rc
bc60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bc70: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
bc80: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
bc90: 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  )sqlite3ErrName(
bca0: 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  rc), TCL_VOLATIL
bcb0: 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  E);.  }..  retur
bcc0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
bcd0: 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f   ? TCL_OK : TCL_
bce0: 45 52 52 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ERROR);.}..#endi
bcf0: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  f../*.** Usage: 
bd00: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
bd10: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48  ollation_v2 DB-H
bd20: 41 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50  ANDLE NAME CMP-P
bd30: 52 4f 43 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a  ROC DEL-PROC.**.
bd40: 2a 2a 20 20 20 54 68 69 73 20 54 63 6c 20 70 72  **   This Tcl pr
bd50: 6f 63 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  oc is used for t
bd60: 65 73 74 69 6e 67 20 74 68 65 20 65 78 70 65 72  esting the exper
bd70: 69 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c  imental.**   sql
bd80: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
bd90: 61 74 69 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72  ation_v2() inter
bda0: 66 61 63 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  face..*/.struct 
bdb0: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b  TestCollationX {
bdc0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
bdd0: 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
bde0: 20 2a 70 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62   *pCmp;.  Tcl_Ob
bdf0: 6a 20 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65  j *pDel;.};.type
be00: 64 65 66 20 73 74 72 75 63 74 20 54 65 73 74 43  def struct TestC
be10: 6f 6c 6c 61 74 69 6f 6e 58 20 54 65 73 74 43 6f  ollationX TestCo
be20: 6c 6c 61 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63  llationX;.static
be30: 20 76 6f 69 64 20 74 65 73 74 43 72 65 61 74 65   void testCreate
be40: 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69  CollationDel(voi
be50: 64 20 2a 70 43 74 78 29 7b 0a 20 20 54 65 73 74  d *pCtx){.  Test
be60: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20  CollationX *p = 
be70: 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20  (TestCollationX 
be80: 2a 29 70 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72  *)pCtx;..  int r
be90: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
bea0: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  x(p->interp, p->
beb0: 70 44 65 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pDel, TCL_EVAL_D
bec0: 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47  IRECT|TCL_EVAL_G
bed0: 4c 4f 42 41 4c 29 3b 0a 20 20 69 66 28 20 72 63  LOBAL);.  if( rc
bee0: 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=TCL_OK ){.    
bef0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
bf00: 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a  ror(p->interp);.
bf10: 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52    }..  Tcl_DecrR
bf20: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29  efCount(p->pCmp)
bf30: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
bf40: 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20  ount(p->pDel);. 
bf50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76   sqlite3_free((v
bf60: 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74  oid *)p);.}.stat
bf70: 69 63 20 69 6e 74 20 74 65 73 74 43 72 65 61 74  ic int testCreat
bf80: 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20  eCollationCmp(. 
bf90: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
bfa0: 6e 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73  nt nLeft,.  cons
bfb0: 74 20 76 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20  t void *zLeft,. 
bfc0: 20 69 6e 74 20 6e 52 69 67 68 74 2c 0a 20 20 63   int nRight,.  c
bfd0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 52 69 67 68  onst void *zRigh
bfe0: 74 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61  t.){.  TestColla
bff0: 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74  tionX *p = (Test
c000: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74  CollationX *)pCt
c010: 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  x;.  Tcl_Obj *pS
c020: 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c  cript = Tcl_Dupl
c030: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70  icateObj(p->pCmp
c040: 29 3b 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20  );.  int iRes = 
c050: 30 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  0;..  Tcl_IncrRe
c060: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
c070: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c080: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c090: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c0a0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c0b0: 29 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b  )zLeft, nLeft));
c0c0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c0d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c0e0: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c0f0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c100: 29 7a 52 69 67 68 74 2c 6e 52 69 67 68 74 29 29  )zRight,nRight))
c110: 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  ;..  if( TCL_OK!
c120: 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70  =Tcl_EvalObjEx(p
c130: 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  ->interp, pScrip
c140: 74 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  t, TCL_EVAL_DIRE
c150: 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  CT|TCL_EVAL_GLOB
c160: 41 4c 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b  AL).   || TCL_OK
c170: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
c180: 4f 62 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54  Obj(p->interp, T
c190: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
c1a0: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 26 69 52 65  p->interp), &iRe
c1b0: 73 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f  s).  ){.    Tcl_
c1c0: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
c1d0: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  p->interp);.  }.
c1e0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
c1f0: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20  nt(pScript);..  
c200: 72 65 74 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73  return iRes;.}.s
c210: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
c220: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 72 65  _TCLAPI test_cre
c230: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c240: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
c250: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
c260: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
c270: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
c280: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
c290: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
c2a0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
c2b0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
c2c0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c2d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
c2e0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
c2f0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c300: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
c310: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
c320: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
c330: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
c340: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
c350: 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
c360: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c370: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
c380: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e  jv, "DB-HANDLE N
c390: 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c  AME CMP-PROC DEL
c3a0: 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65 74  -PROC");.    ret
c3b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c3c0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
c3d0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
c3e0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c3f0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
c400: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
c410: 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61    p = (TestColla
c420: 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f  tionX *)sqlite3_
c430: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65  malloc(sizeof(Te
c440: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a  stCollationX));.
c450: 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76    p->pCmp = objv
c460: 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d  [3];.  p->pDel =
c470: 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69   objv[4];.  p->i
c480: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
c490: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
c4a0: 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54  nt(p->pCmp);.  T
c4b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c4c0: 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20  p->pDel);..  rc 
c4d0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
c4e0: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
c4f0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
c500: 6f 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20  objv[2]), 16, . 
c510: 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20       (void *)p, 
c520: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
c530: 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61  ionCmp, testCrea
c540: 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20  teCollationDel. 
c550: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
c560: 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20  LITE_MISUSE ){. 
c570: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
c580: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ult(interp, "sql
c590: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c5a0: 61 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64 20  ate_v2() failed 
c5b0: 74 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20 20  to detect ".    
c5c0: 20 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e    "an invalid en
c5d0: 63 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29  coding", (char*)
c5e0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
c5f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
c600: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
c610: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c620: 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  (db, Tcl_GetStri
c630: 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c  ng(objv[2]), SQL
c640: 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
c650: 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74   (void *)p, test
c660: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
c670: 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  mp, testCreateCo
c680: 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a  llationDel.  );.
c690: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
c6a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a  .}../*.** USAGE:
c6b0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c6c0: 66 75 6e 63 74 69 6f 6e 5f 76 32 20 44 42 20 4e  function_v2 DB N
c6d0: 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 3f 53 57  AME NARG ENC ?SW
c6e0: 49 54 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76  ITCHES?.**.** Av
c6f0: 61 69 6c 61 62 6c 65 20 73 77 69 74 63 68 65 73  ailable switches
c700: 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66   are:.**.**   -f
c710: 75 6e 63 20 20 20 20 53 43 52 49 50 54 0a 2a 2a  unc    SCRIPT.**
c720: 20 20 20 2d 73 74 65 70 20 20 20 20 53 43 52 49     -step    SCRI
c730: 50 54 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c 20 20  PT.**   -final  
c740: 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 64 65   SCRIPT.**   -de
c750: 73 74 72 6f 79 20 53 43 52 49 50 54 0a 2a 2f 0a  stroy SCRIPT.*/.
c760: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
c770: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
c780: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
c790: 3b 0a 73 74 72 75 63 74 20 43 72 65 61 74 65 46  ;.struct CreateF
c7a0: 75 6e 63 74 69 6f 6e 56 32 20 7b 0a 20 20 54 63  unctionV2 {.  Tc
c7b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c7c0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 75  ;.  Tcl_Obj *pFu
c7d0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
c7e0: 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f      /* Script fo
c7f0: 72 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 63  r function invoc
c800: 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ation */.  Tcl_O
c810: 62 6a 20 2a 70 53 74 65 70 3b 20 20 20 20 20 20  bj *pStep;      
c820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
c830: 72 69 70 74 20 66 6f 72 20 61 67 67 2e 20 73 74  ript for agg. st
c840: 65 70 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  ep invocation */
c850: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e  .  Tcl_Obj *pFin
c860: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
c870: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72     /* Script for
c880: 20 61 67 67 2e 20 66 69 6e 61 6c 69 7a 61 74 69   agg. finalizati
c890: 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  on invocation */
c8a0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 73  .  Tcl_Obj *pDes
c8b0: 74 72 6f 79 3b 20 20 20 20 20 20 20 20 20 20 20  troy;           
c8c0: 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72     /* Destructor
c8d0: 20 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74   script */.};.st
c8e0: 61 74 69 63 20 76 6f 69 64 20 63 66 32 46 75 6e  atic void cf2Fun
c8f0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
c900: 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67  t *ctx, int nArg
c910: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
c920: 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69  **aArg){.}.stati
c930: 63 20 76 6f 69 64 20 63 66 32 53 74 65 70 28 73  c void cf2Step(s
c940: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c950: 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73  ctx, int nArg, s
c960: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
c970: 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76  Arg){.}.static v
c980: 6f 69 64 20 63 66 32 46 69 6e 61 6c 28 73 71 6c  oid cf2Final(sql
c990: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
c9a0: 78 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  x){.}.static voi
c9b0: 64 20 63 66 32 44 65 73 74 72 6f 79 28 76 6f 69  d cf2Destroy(voi
c9c0: 64 20 2a 70 55 73 65 72 29 7b 0a 20 20 43 72 65  d *pUser){.  Cre
c9d0: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70  ateFunctionV2 *p
c9e0: 20 3d 20 28 43 72 65 61 74 65 46 75 6e 63 74 69   = (CreateFuncti
c9f0: 6f 6e 56 32 20 2a 29 70 55 73 65 72 3b 0a 0a 20  onV2 *)pUser;.. 
ca00: 20 69 66 28 20 70 2d 3e 69 6e 74 65 72 70 20 26   if( p->interp &
ca10: 26 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 7b  & p->pDestroy ){
ca20: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 54 63  .    int rc = Tc
ca30: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
ca40: 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 73 74 72  nterp, p->pDestr
ca50: 6f 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  oy, 0);.    if( 
ca60: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 54 63 6c  rc!=TCL_OK ) Tcl
ca70: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
ca80: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  (p->interp);.  }
ca90: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63  ..  if( p->pFunc
caa0: 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   ) Tcl_DecrRefCo
cab0: 75 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a  unt(p->pFunc); .
cac0: 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29    if( p->pStep )
cad0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
cae0: 74 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20  t(p->pStep); .  
caf0: 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20  if( p->pFinal ) 
cb00: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
cb10: 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20  (p->pFinal); .  
cb20: 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20  if( p->pDestroy 
cb30: 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ) Tcl_DecrRefCou
cb40: 6e 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b  nt(p->pDestroy);
cb50: 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65   .  sqlite3_free
cb60: 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  (p);.}.static in
cb70: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
cb80: 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63  test_create_func
cb90: 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e  tion_v2(.  Clien
cba0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
cbb0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ,          /* No
cbc0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
cbd0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cbf0: 68 65 20 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20  he invoking TCL 
cc00: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
cc10: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
cc40: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
cc50: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
cc60: 5b 5d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  []           /* 
cc70: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
cc80: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
cc90: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
cca0: 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e  har *zFunc;.  in
ccb0: 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e  t nArg;.  int en
ccc0: 63 3b 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74  c;.  CreateFunct
ccd0: 69 6f 6e 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20  ionV2 *p;.  int 
cce0: 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  i;.  int rc;..  
ccf0: 73 74 72 75 63 74 20 45 6e 63 54 61 62 6c 65 20  struct EncTable 
cd00: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
cd10: 20 2a 7a 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20   *zEnc;.    int 
cd20: 65 6e 63 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20  enc;.  } aEnc[] 
cd30: 3d 20 7b 0a 20 20 20 20 7b 22 75 74 66 38 22 2c  = {.    {"utf8",
cd40: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
cd50: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 22 2c  },.    {"utf16",
cd60: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20     SQLITE_UTF16 
cd70: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 6c 65  },.    {"utf16le
cd80: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
cd90: 45 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36  E },.    {"utf16
cda0: 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  be", SQLITE_UTF1
cdb0: 36 42 45 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79  6BE },.    {"any
cdc0: 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e  ",     SQLITE_AN
cdd0: 59 20 7d 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30  Y },.    {"0", 0
cde0: 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f   }.  };..  if( o
cdf0: 62 6a 63 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32  bjc<5 || (objc%2
ce00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  )==0 ){.    Tcl_
ce10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ce20: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
ce30: 42 20 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20  B NAME NARG ENC 
ce40: 53 57 49 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20  SWITCHES...");. 
ce50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ce60: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
ce70: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
ce80: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
ce90: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
cea0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ceb0: 52 52 4f 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20  RROR;.  zFunc = 
cec0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ced0: 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
cee0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
cef0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
cf00: 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e   &nArg) ) return
cf10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
cf20: 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
cf30: 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65  omObjStruct(inte
cf40: 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e  rp, objv[4], aEn
cf50: 63 2c 20 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30  c, sizeof(aEnc[0
cf60: 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  ]), .          "
cf70: 65 6e 63 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65  encoding", 0, &e
cf80: 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  nc).  ){.    ret
cf90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cfa0: 20 7d 0a 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b   }.  enc = aEnc[
cfb0: 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d  enc].enc;..  p =
cfc0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
cfd0: 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46 75 6e  sizeof(CreateFun
cfe0: 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73  ctionV2));.  ass
cff0: 65 72 74 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73  ert( p );.  mems
d000: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
d010: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
d020: 29 29 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20  ));.  p->interp 
d030: 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72  = interp;..  for
d040: 28 69 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b  (i=5; i<objc; i+
d050: 3d 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 77  =2){.    int iSw
d060: 69 74 63 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20  itch;.    const 
d070: 63 68 61 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d  char *azSwitch[]
d080: 20 3d 20 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73   = {"-func", "-s
d090: 74 65 70 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20  tep", "-final", 
d0a0: 22 2d 64 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a  "-destroy", 0};.
d0b0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
d0c0: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
d0d0: 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53  rp, objv[i], azS
d0e0: 77 69 74 63 68 2c 20 22 73 77 69 74 63 68 22 2c  witch, "switch",
d0f0: 20 30 2c 20 26 69 53 77 69 74 63 68 29 20 29 7b   0, &iSwitch) ){
d100: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
d110: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ree(p);.      re
d120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d130: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
d140: 68 28 20 69 53 77 69 74 63 68 20 29 7b 0a 20 20  h( iSwitch ){.  
d150: 20 20 20 20 63 61 73 65 20 30 3a 20 70 2d 3e 70      case 0: p->p
d160: 46 75 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  Func = objv[i+1]
d170: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
d180: 20 20 20 20 63 61 73 65 20 31 3a 20 70 2d 3e 70      case 1: p->p
d190: 53 74 65 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  Step = objv[i+1]
d1a0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
d1b0: 20 20 20 20 63 61 73 65 20 32 3a 20 70 2d 3e 70      case 2: p->p
d1c0: 46 69 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31  Final = objv[i+1
d1d0: 5d 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ];     break;.  
d1e0: 20 20 20 20 63 61 73 65 20 33 3a 20 70 2d 3e 70      case 3: p->p
d1f0: 44 65 73 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69  Destroy = objv[i
d200: 2b 31 5d 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  +1];   break;.  
d210: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
d220: 3e 70 46 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e  >pFunc ) p->pFun
d230: 63 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  c = Tcl_Duplicat
d240: 65 4f 62 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20  eObj(p->pFunc); 
d250: 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20  .  if( p->pStep 
d260: 29 20 70 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c  ) p->pStep = Tcl
d270: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d  _DuplicateObj(p-
d280: 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20  >pStep); .  if( 
d290: 70 2d 3e 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70  p->pFinal ) p->p
d2a0: 46 69 6e 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c  Final = Tcl_Dupl
d2b0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e  icateObj(p->pFin
d2c0: 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  al); .  if( p->p
d2d0: 44 65 73 74 72 6f 79 20 29 20 70 2d 3e 70 44 65  Destroy ) p->pDe
d2e0: 73 74 72 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c  stroy = Tcl_Dupl
d2f0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73  icateObj(p->pDes
d300: 74 72 6f 79 29 3b 20 0a 0a 20 20 69 66 28 20 70  troy); ..  if( p
d310: 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e  ->pFunc ) Tcl_In
d320: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46  crRefCount(p->pF
d330: 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  unc); .  if( p->
d340: 70 53 74 65 70 20 29 20 54 63 6c 5f 49 6e 63 72  pStep ) Tcl_Incr
d350: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65  RefCount(p->pSte
d360: 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46  p); .  if( p->pF
d370: 69 6e 61 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52  inal ) Tcl_IncrR
d380: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61  efCount(p->pFina
d390: 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44  l); .  if( p->pD
d3a0: 65 73 74 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63  estroy ) Tcl_Inc
d3b0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65  rRefCount(p->pDe
d3c0: 73 74 72 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d  stroy); ..  rc =
d3d0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d3e0: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
d3f0: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
d400: 2c 20 28 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20  , (void *)p, .  
d410: 20 20 20 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20      (p->pFunc ? 
d420: 63 66 32 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20  cf2Func : 0),.  
d430: 20 20 20 20 28 70 2d 3e 70 53 74 65 70 20 3f 20      (p->pStep ? 
d440: 63 66 32 53 74 65 70 20 3a 20 30 29 2c 0a 20 20  cf2Step : 0),.  
d450: 20 20 20 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f      (p->pFinal ?
d460: 20 63 66 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a   cf2Final : 0),.
d470: 20 20 20 20 20 20 63 66 32 44 65 73 74 72 6f 79        cf2Destroy
d480: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
d490: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d4a0: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
d4b0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
d4c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d4d0: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
d4e0: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
d4f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d500: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
d510: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
d520: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
d530: 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
d540: 20 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20   DB-HANDLE FILE 
d550: 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63  ?PROC?.*/.static
d560: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
d570: 50 49 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74  PI test_load_ext
d580: 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74  ension(.  Client
d590: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
d5a0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
d5b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d5c0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
d5d0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
d5e0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
d5f0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
d600: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
d610: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d620: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d630: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d640: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
d650: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
d660: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
d670: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
d680: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
d690: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  rc;.  char *zDb;
d6a0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
d6b0: 20 20 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20    char *zProc = 
d6c0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  0;.  char *zErr 
d6d0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
d6e0: 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=4 && objc!=3 )
d6f0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
d700: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
d710: 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44  , objv, "DB-HAND
d720: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29  LE FILE ?PROC?")
d730: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d740: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
d750: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
d760: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46  g(objv[1]);.  zF
d770: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
d780: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
d790: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
d7a0: 20 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47     zProc = Tcl_G
d7b0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
d7c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74  );.  }..  /* Ext
d7d0: 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62  ract the C datab
d7e0: 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ase handle from 
d7f0: 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  the Tcl command 
d800: 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54  name */.  if( !T
d810: 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
d820: 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26  o(interp, zDb, &
d830: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
d840: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d850: 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
d860: 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20  d not found: ", 
d870: 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  zDb, (char*)0);.
d880: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d890: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  RROR;.  }.  db =
d8a0: 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65   ((struct Sqlite
d8b0: 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
d8c0: 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a  lientData)->db;.
d8d0: 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20    assert(db);.. 
d8e0: 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e 64   /* Call the und
d8f0: 65 72 6c 79 69 6e 67 20 43 20 66 75 6e 63 74 69  erlying C functi
d900: 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  on. If an error 
d910: 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74  occurs, set rc t
d920: 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f  o .  ** TCL_ERRO
d930: 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65  R and load any e
d940: 72 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 74 6f  rror string into
d950: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
d960: 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72  . If no .  ** er
d970: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
d980: 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20  rc to TCL_OK..  
d990: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
d9a0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
d9b0: 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49  SION.  rc = SQLI
d9c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72  TE_ERROR;.  zErr
d9d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
d9e0: 74 66 28 22 74 68 69 73 20 62 75 69 6c 64 20 6f  tf("this build o
d9f0: 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61  mits sqlite3_loa
da00: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b  d_extension()");
da10: 0a 20 20 28 76 6f 69 64 29 7a 50 72 6f 63 3b 0a  .  (void)zProc;.
da20: 20 20 28 76 6f 69 64 29 7a 46 69 6c 65 3b 0a 23    (void)zFile;.#
da30: 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69  else.  rc = sqli
da40: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
da50: 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50  on(db, zFile, zP
da60: 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23 65 6e  roc, &zErr);.#en
da70: 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
da80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
da90: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
daa0: 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45 72 72  erp, zErr ? zErr
dab0: 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c 41 54   : "", TCL_VOLAT
dac0: 49 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  ILE);.    rc = T
dad0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  CL_ERROR;.  }els
dae0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  e{.    rc = TCL_
daf0: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
db00: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 0a 20  3_free(zErr);.. 
db10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
db20: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
db30: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
db40: 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e  extension DB-HAN
db50: 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61  DLE ONOFF.*/.sta
db60: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
db70: 43 4c 41 50 49 20 74 65 73 74 5f 65 6e 61 62 6c  CLAPI test_enabl
db80: 65 5f 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74  e_load(.  Client
db90: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
dba0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
dbb0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
dbc0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
dbd0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
dbe0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
dbf0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
dc00: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
dc10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dc20: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
dc30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
dc40: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
dc50: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
dc60: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
dc70: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
dc80: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
dc90: 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f   *zDb;.  int ono
dca0: 66 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ff;..  if( objc!
dcb0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
dcc0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
dcd0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d  p, 1, objv, "DB-
dce0: 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a  HANDLE ONOFF");.
dcf0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dd00: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
dd10: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
dd20: 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  objv[1]);..  /* 
dd30: 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64 61  Extract the C da
dd40: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72  tabase handle fr
dd50: 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61  om the Tcl comma
dd60: 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28  nd name */.  if(
dd70: 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
dd80: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62  Info(interp, zDb
dd90: 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
dda0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ddb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
ddc0: 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
ddd0: 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30  ", zDb, (char*)0
dde0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ddf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64  L_ERROR;.  }.  d
de00: 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c  b = ((struct Sql
de10: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
de20: 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64  bjClientData)->d
de30: 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b  b;.  assert(db);
de40: 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6f  ..  /* Get the o
de50: 6e 6f 66 66 20 70 61 72 61 6d 65 74 65 72 20 2a  noff parameter *
de60: 2f 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  /.  if( Tcl_GetB
de70: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
de80: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
de90: 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 72 65  onoff) ){.    re
dea0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
deb0: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
dec0: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
ded0: 45 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70  ENSION.  Tcl_App
dee0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
def0: 2c 20 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d  , "this build om
df00: 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  its sqlite3_load
df10: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a  _extension()");.
df20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
df30: 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69  OR;.#else.  sqli
df40: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
df50: 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e  extension(db, on
df60: 6f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  off);.  return T
df70: 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a  CL_OK;.#endif.}.
df80: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
df90: 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a  qlite_abort.**.*
dfa0: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
dfb0: 72 6f 63 65 73 73 20 69 6d 6d 65 64 69 61 74 65  rocess immediate
dfc0: 6c 79 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74  ly.  This is not
dfd0: 20 61 20 63 6c 65 61 6e 20 73 68 75 74 64 6f 77   a clean shutdow
dfe0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  n..** This comma
dff0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  nd is used to te
e000: 73 74 20 74 68 65 20 72 65 63 6f 76 65 72 61 62  st the recoverab
e010: 69 6c 69 74 79 20 6f 66 20 61 20 64 61 74 61 62  ility of a datab
e020: 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76  ase in.** the ev
e030: 65 6e 74 20 6f 66 20 61 20 70 72 6f 67 72 61 6d  ent of a program
e040: 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69   crash..*/.stati
e050: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
e060: 41 50 49 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  API sqlite_abort
e070: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
e080: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
e090: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
e0a0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
e0b0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
e0c0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
e0d0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
e0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e0f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
e100: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
e110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e120: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
e130: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 64  ment */.){.#if d
e140: 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
e150: 0a 20 20 2f 2a 20 57 65 20 64 6f 20 74 68 69 73  .  /* We do this
e160: 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65 20  , otherwise the 
e170: 74 65 73 74 20 77 69 6c 6c 20 68 61 6c 74 20 77  test will halt w
e180: 69 74 68 20 61 20 70 6f 70 75 70 20 6d 65 73 73  ith a popup mess
e190: 61 67 65 0a 20 20 20 2a 20 74 68 61 74 20 77 65  age.   * that we
e1a0: 20 68 61 76 65 20 74 6f 20 63 6c 69 63 6b 20 61   have to click a
e1b0: 77 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 74  way before the t
e1c0: 65 73 74 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75  est will continu
e1d0: 65 2e 0a 20 20 20 2a 2f 0a 20 20 5f 73 65 74 5f  e..   */.  _set_
e1e0: 61 62 6f 72 74 5f 62 65 68 61 76 69 6f 72 28 20  abort_behavior( 
e1f0: 30 2c 20 5f 43 41 4c 4c 5f 52 45 50 4f 52 54 46  0, _CALL_REPORTF
e200: 41 55 4c 54 20 29 3b 0a 23 65 6e 64 69 66 0a 20  AULT );.#endif. 
e210: 20 65 78 69 74 28 32 35 35 29 3b 0a 20 20 61 73   exit(255);.  as
e220: 73 65 72 74 28 20 69 6e 74 65 72 70 3d 3d 30 20  sert( interp==0 
e230: 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 77 69 6c  );   /* This wil
e240: 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f  l always fail */
e250: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
e260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
e270: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
e280: 20 69 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e   is a user-defin
e290: 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ed SQL function 
e2a0: 77 68 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a  whose purpose.**
e2b0: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 65 20   is to test the 
e2c0: 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c  sqlite_set_resul
e2d0: 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  t() API..*/.stat
e2e0: 69 63 20 76 6f 69 64 20 74 65 73 74 46 75 6e 63  ic void testFunc
e2f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e300: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
e310: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
e320: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68  ue **argv){.  wh
e330: 69 6c 65 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a  ile( argc>=2 ){.
e340: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e350: 7a 41 72 67 30 20 3d 20 28 63 68 61 72 2a 29 73  zArg0 = (char*)s
e360: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
e370: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
e380: 69 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20  if( zArg0 ){.   
e390: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
e3a0: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20  3StrICmp(zArg0, 
e3b0: 22 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20  "int") ){.      
e3c0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e3d0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
e3e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
e3f0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
e400: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
e410: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
e420: 22 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20  "int64")==0 ){. 
e430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
e440: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
e450: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
e460: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d  ue_int64(argv[1]
e470: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
e480: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
e490: 6d 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67  mp(zArg0,"string
e4a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e4b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e4c0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
e4d0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
e4e0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
e4f0: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
e500: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
e510: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NT);.      }else
e520: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
e530: 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c  Cmp(zArg0,"doubl
e540: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
e550: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e560: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
e570: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
e580: 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b  ouble(argv[1]));
e590: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e5a0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e5b0: 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30  zArg0,"null")==0
e5c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e5d0: 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28  te3_result_null(
e5e0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
e5f0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
e600: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
e610: 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20  value")==0 ){.  
e620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
e630: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
e640: 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65 33  xt, argv[sqlite3
e650: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
e660: 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1])]);.      }el
e670: 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  se{.        goto
e680: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
e690: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e6a0: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
e6b0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
e6c0: 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72  rgc -= 2;.    ar
e6d0: 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  gv += 2;.  }.  r
e6e0: 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75  eturn;..error_ou
e6f0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  t:.  sqlite3_res
e700: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
e710: 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65 6e  t,"first argumen
e720: 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  t should be one 
e730: 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e 74  of: ".      "int
e740: 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64 6f   int64 string do
e750: 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22  uble null value"
e760: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
e770: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 5f  Usage:   sqlite_
e780: 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75  register_test_fu
e790: 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45  nction  DB  NAME
e7a0: 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
e7b0: 74 68 65 20 74 65 73 74 20 53 51 4c 20 66 75 6e  the test SQL fun
e7c0: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74  ction on the dat
e7d0: 61 62 61 73 65 20 44 42 20 75 6e 64 65 72 20 74  abase DB under t
e7e0: 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f  he name NAME..*/
e7f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
e800: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72  TE_TCLAPI test_r
e810: 65 67 69 73 74 65 72 5f 66 75 6e 63 28 0a 20 20  egister_func(.  
e820: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
e830: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e840: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
e850: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
e860: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
e870: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
e880: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
e890: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e8a0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
e8b0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
e8c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
e8d0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
e8e0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
e8f0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
e900: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
e910: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e920: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
e930: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
e940: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
e950: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
e960: 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22  B FUNCTION-NAME"
e970: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
e980: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
e990: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
e9a0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
e9b0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
e9c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
e9d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
e9e0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
e9f0: 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c  argv[2], -1, SQL
ea00: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20  ITE_UTF8, 0, .  
ea10: 20 20 20 20 74 65 73 74 46 75 6e 63 2c 20 30 2c      testFunc, 0,
ea20: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30   0);.  if( rc!=0
ea30: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
ea40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ea50: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
ea60: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
ea70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ea80: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  }.  if( sqlite3T
ea90: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
eaa0: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
eab0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
eac0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
ead0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
eae0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
eaf0: 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46  e  STMT .**.** F
eb00: 69 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d  inalize a statem
eb10: 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ent handle..*/.s
eb20: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
eb30: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 66 69 6e  _TCLAPI test_fin
eb40: 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20  alize(.  void * 
eb50: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
eb60: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
eb70: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
eb80: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
eb90: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
eba0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
ebb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
ebc0: 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20  te3 *db = 0;..  
ebd0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
ebe0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ebf0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
ec00: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
ec10: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
ec20: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
ec30: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
ec40: 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
ec50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ec60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
ec70: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
ec80: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
ec90: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
eca0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
ecb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
ecc0: 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
ecd0: 20 20 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62     db = StmtToDb
ece0: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72  (pStmt);.  }.  r
ecf0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
ed00: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54  lize(pStmt);.  T
ed10: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
ed20: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
ed30: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
ed40: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  L_STATIC);.  if(
ed50: 20 64 62 20 26 26 20 73 71 6c 69 74 65 33 54 65   db && sqlite3Te
ed60: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
ed70: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
ed80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ed90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
eda0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
edb0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
edc0: 74 75 73 20 20 53 54 4d 54 20 20 43 4f 44 45 20  tus  STMT  CODE 
edd0: 20 52 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a   RESETFLAG.**.**
ede0: 20 47 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Get the value o
edf0: 66 20 61 20 73 74 61 74 75 73 20 63 6f 75 6e 74  f a status count
ee00: 65 72 20 66 72 6f 6d 20 61 20 73 74 61 74 65 6d  er from a statem
ee10: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
ee20: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
ee30: 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75   test_stmt_statu
ee40: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
ee50: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
ee60: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
ee70: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
ee80: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ee90: 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 75  ].){.  int iValu
eea0: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 70 20 3d  e;.  int i, op =
eeb0: 20 30 2c 20 72 65 73 65 74 46 6c 61 67 3b 0a 20   0, resetFlag;. 
eec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
eed0: 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Name;.  sqlite3_
eee0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
eef0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
ef00: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
ef10: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
ef20: 20 69 6e 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70   int op;.  } aOp
ef30: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51  [] = {.    { "SQ
ef40: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ef50: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20  FULLSCAN_STEP", 
ef60: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
ef70: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
ef80: 50 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51  P   },.    { "SQ
ef90: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
efa0: 53 4f 52 54 22 2c 20 20 20 20 20 20 20 20 20 20  SORT",          
efb0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
efc0: 54 55 53 5f 53 4f 52 54 20 20 20 20 20 20 20 20  TUS_SORT        
efd0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
efe0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
eff0: 41 55 54 4f 49 4e 44 45 58 22 2c 20 20 20 20 20  AUTOINDEX",     
f000: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f010: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 20 20 20  TUS_AUTOINDEX   
f020: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f030: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f040: 56 4d 5f 53 54 45 50 22 2c 20 20 20 20 20 20 20  VM_STEP",       
f050: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f060: 54 55 53 5f 56 4d 5f 53 54 45 50 20 20 20 20 20  TUS_VM_STEP     
f070: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66      },.  };.  if
f080: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
f090: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f0a0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
f0b0: 76 2c 20 22 53 54 4d 54 20 50 41 52 41 4d 45 54  v, "STMT PARAMET
f0c0: 45 52 20 52 45 53 45 54 46 4c 41 47 22 29 3b 0a  ER RESETFLAG");.
f0d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f0e0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
f0f0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
f100: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
f110: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
f120: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
f130: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70  TCL_ERROR;.  zOp
f140: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
f150: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
f160: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
f170: 79 53 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29  ySize(aOp); i++)
f180: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
f190: 28 61 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  (aOp[i].zName, z
f1a0: 4f 70 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  OpName)==0 ){.  
f1b0: 20 20 20 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e      op = aOp[i].
f1c0: 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  op;.      break;
f1d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
f1e0: 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4f   i>=ArraySize(aO
f1f0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  p) ){.    if( Tc
f200: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
f210: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
f220: 20 26 6f 70 29 20 29 20 72 65 74 75 72 6e 20 54   &op) ) return T
f230: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
f240: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
f250: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
f260: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65  , objv[3], &rese
f270: 74 46 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20  tFlag) ) return 
f280: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61  TCL_ERROR;.  iVa
f290: 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  lue = sqlite3_st
f2a0: 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c  mt_status(pStmt,
f2b0: 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67 29 3b   op, resetFlag);
f2c0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
f2d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
f2e0: 4e 65 77 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65  NewIntObj(iValue
f2f0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
f300: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
f310: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
f320: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 2f 2a 0a  T_SCANSTATUS./*.
f330: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
f340: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
f350: 75 73 20 53 54 4d 54 20 49 44 58 0a 2a 2f 0a 73  us STMT IDX.*/.s
f360: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
f370: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d  _TCLAPI test_stm
f380: 74 5f 73 63 61 6e 73 74 61 74 75 73 28 0a 20 20  t_scanstatus(.  
f390: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
f3a0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
f3b0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
f3c0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
f3d0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
f3e0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
f3f0: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
f400: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
f410: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ent */.  int idx
f420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f430: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f           /* Seco
f440: 6e 64 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 0a  nd argument */..
f450: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
f460: 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
f470: 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20 73  r *zExplain;.  s
f480: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f  qlite3_int64 nLo
f490: 6f 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  op;.  sqlite3_in
f4a0: 74 36 34 20 6e 56 69 73 69 74 3b 0a 20 20 64 6f  t64 nVisit;.  do
f4b0: 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 69 6e 74  uble rEst;.  int
f4c0: 20 72 65 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   res;..  if( obj
f4d0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
f4e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f4f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
f500: 54 4d 54 20 49 44 58 22 29 3b 0a 20 20 20 20 72  TMT IDX");.    r
f510: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f520: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
f530: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
f540: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
f550: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
f560: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
f570: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
f580: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
f590: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
f5a0: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
f5b0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 65 73 20  L_ERROR;..  res 
f5c0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
f5d0: 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c  canstatus(pStmt,
f5e0: 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41   idx, SQLITE_SCA
f5f0: 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f  NSTAT_NLOOP, (vo
f600: 69 64 2a 29 26 6e 4c 6f 6f 70 29 3b 0a 20 20 69  id*)&nLoop);.  i
f610: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
f620: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d   Tcl_Obj *pRet =
f630: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
f640: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
f650: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
f660: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
f670: 6e 67 4f 62 6a 28 22 6e 4c 6f 6f 70 22 2c 20 2d  ngObj("nLoop", -
f680: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
f690: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f6a0: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
f6b0: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 4c 6f  ewWideIntObj(nLo
f6c0: 6f 70 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  op));.    sqlite
f6d0: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
f6e0: 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51  s(pStmt, idx, SQ
f6f0: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56  LITE_SCANSTAT_NV
f700: 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56  ISIT, (void*)&nV
f710: 69 73 69 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  isit);.    Tcl_L
f720: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f730: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
f740: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e  _NewStringObj("n
f750: 56 69 73 69 74 22 2c 20 2d 31 29 29 3b 0a 20 20  Visit", -1));.  
f760: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f770: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f780: 65 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  et, Tcl_NewWideI
f790: 6e 74 4f 62 6a 28 6e 56 69 73 69 74 29 29 3b 0a  ntObj(nVisit));.
f7a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f7b0: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f7c0: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f7d0: 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f  CANSTAT_EST, (vo
f7e0: 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20  id*)&rEst);.    
f7f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f800: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
f810: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f820: 62 6a 28 22 6e 45 73 74 22 2c 20 2d 31 29 29 3b  bj("nEst", -1));
f830: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
f840: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
f850: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 44 6f   pRet, Tcl_NewDo
f860: 75 62 6c 65 4f 62 6a 28 72 45 73 74 29 29 3b 0a  ubleObj(rEst));.
f870: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f880: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f890: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f8a0: 43 41 4e 53 54 41 54 5f 4e 41 4d 45 2c 20 28 76  CANSTAT_NAME, (v
f8b0: 6f 69 64 2a 29 26 7a 4e 61 6d 65 29 3b 0a 20 20  oid*)&zName);.  
f8c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f8d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f8e0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f8f0: 67 4f 62 6a 28 22 7a 4e 61 6d 65 22 2c 20 2d 31  gObj("zName", -1
f900: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
f910: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f920: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
f930: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65  wStringObj(zName
f940: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73 71 6c 69  , -1));.    sqli
f950: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
f960: 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  tus(pStmt, idx, 
f970: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
f980: 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29  EXPLAIN, (void*)
f990: 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  &zExplain);.    
f9a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f9b0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
f9c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f9d0: 62 6a 28 22 7a 45 78 70 6c 61 69 6e 22 2c 20 2d  bj("zExplain", -
f9e0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
f9f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
fa00: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
fa10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 78 70  ewStringObj(zExp
fa20: 6c 61 69 6e 2c 20 2d 31 29 29 3b 0a 20 20 20 20  lain, -1));.    
fa30: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
fa40: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
fa50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
fa60: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
fa70: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  erp);.  }.  retu
fa80: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
fa90: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
faa0: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
fab0: 74 75 73 5f 72 65 73 65 74 20 20 53 54 4d 54 0a  tus_reset  STMT.
fac0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
fad0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
fae0: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
faf0: 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a  _reset(.  void *
fb00: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
fb10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
fb20: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
fb30: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
fb40: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
fb50: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
fb70: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 2a 2f  irst argument */
fb80: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
fb90: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
fba0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
fbb0: 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
fbc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
fbd0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
fbe0: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
fbf0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
fc00: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
fc10: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
fc20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
fc30: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
fc40: 74 61 74 75 73 5f 72 65 73 65 74 28 70 53 74 6d  tatus_reset(pStm
fc50: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
fc60: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
fc70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
fc80: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a  BLE_SQLLOG./*.**
fc90: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
fca0: 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 0a 2a  _config_sqllog.*
fcb0: 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 53 51  *.** Zero the SQ
fcc0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
fcd0: 4f 47 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  OG configuration
fce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
fcf0: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
fd00: 74 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 28  t_config_sqllog(
fd10: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
fd20: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
fd30: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
fd40: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
fd50: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
fd60: 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  ){.  if( objc!=1
fd70: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
fd80: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
fd90: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   1, objv, "");. 
fda0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
fdb0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
fdc0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
fdd0: 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 2c 20  _CONFIG_SQLLOG, 
fde0: 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
fdf0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
fe00: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 76  ../*.** Usage: v
fe10: 66 73 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 5f  fs_current_time_
fe20: 69 6e 74 36 34 0a 2a 2a 0a 2a 2a 20 52 65 74 75  int64.**.** Retu
fe30: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  rn the value ret
fe40: 75 72 6e 65 64 20 62 79 20 74 68 65 20 64 65 66  urned by the def
fe50: 61 75 6c 74 20 56 46 53 27 73 20 78 43 75 72 72  ault VFS's xCurr
fe60: 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 6d 65 74  entTimeInt64 met
fe70: 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
fe80: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
fe90: 20 76 66 73 43 75 72 72 65 6e 74 54 69 6d 65 49   vfsCurrentTimeI
fea0: 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  nt64(.  void * c
feb0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
fec0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
fed0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
fee0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
fef0: 6a 76 5b 5d 0a 29 7b 0a 20 20 69 36 34 20 74 3b  jv[].){.  i64 t;
ff00: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
ff10: 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
ff20: 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
ff30: 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  ( objc!=1 ){.   
ff40: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
ff50: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
ff60: 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75  v, "");.    retu
ff70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ff80: 7d 0a 20 20 70 56 66 73 2d 3e 78 43 75 72 72 65  }.  pVfs->xCurre
ff90: 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
ffa0: 2c 20 26 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  , &t);.  Tcl_Set
ffb0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
ffc0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
ffd0: 4f 62 6a 28 74 29 29 3b 0a 20 20 72 65 74 75 72  Obj(t));.  retur
ffe0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
fff0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10000 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
10010 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
10020 73 6e 61 70 73 68 6f 74 5f 67 65 74 20 44 42 20  snapshot_get DB 
10030 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63  DBNAME.*/.static
10040 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
10050 50 49 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74  PI test_snapshot
10060 5f 67 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  _get(.  void * c
10070 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10080 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10090 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
100a0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
100b0 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63  jv[].){.  int rc
100c0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
100d0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
100e0 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68    sqlite3_snapsh
100f0 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 20 3d 20  ot *pSnapshot = 
10100 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
10110 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
10120 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10130 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
10140 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74  BNAME");.    ret
10150 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10160 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
10170 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
10180 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10190 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
101a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
101b0 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
101c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
101d0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
101e0 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 64 62  _snapshot_get(db
101f0 2c 20 7a 4e 61 6d 65 2c 20 26 70 53 6e 61 70 73  , zName, &pSnaps
10200 68 6f 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  hot);.  if( rc!=
10210 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10220 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10230 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
10240 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
10250 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d  e3ErrName(rc), -
10260 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  1));.    return 
10270 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  TCL_ERROR;.  }el
10280 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  se{.    char zBu
10290 66 5b 31 30 30 5d 3b 0a 20 20 20 20 69 66 28 20  f[100];.    if( 
102a0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
102b0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
102c0 2c 20 7a 42 75 66 2c 20 70 53 6e 61 70 73 68 6f  , zBuf, pSnapsho
102d0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
102e0 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 53  ERROR;.    Tcl_S
102f0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
10300 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
10310 67 4f 62 6a 28 7a 42 75 66 2c 20 2d 31 29 29 3b  gObj(zBuf, -1));
10320 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
10330 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  L_OK;.}.#endif /
10340 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
10350 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66  SNAPSHOT */..#if
10360 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10370 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
10380 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
10390 73 6e 61 70 73 68 6f 74 5f 72 65 63 6f 76 65 72  snapshot_recover
103a0 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74   DB DBNAME.*/.st
103b0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
103c0 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61 70  TCLAPI test_snap
103d0 73 68 6f 74 5f 72 65 63 6f 76 65 72 28 0a 20 20  shot_recover(.  
103e0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
103f0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10400 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10410 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10420 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10430 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
10440 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
10450 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 69 66 28 20 6f  *zName;..  if( o
10460 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
10470 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10480 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
10490 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20  "DB DBNAME");.  
104a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
104b0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
104c0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
104d0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
104e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
104f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
10500 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 54 63  OR;.  zName = Tc
10510 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10520 5b 32 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  [2]);..  rc = sq
10530 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72  lite3_snapshot_r
10540 65 63 6f 76 65 72 28 64 62 2c 20 7a 4e 61 6d 65  ecover(db, zName
10550 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10560 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
10570 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
10580 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
10590 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45  ringObj(sqlite3E
105a0 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29  rrName(rc), -1))
105b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
105c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
105d0 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
105e0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
105f0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
10600 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
10610 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
10620 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66  PSHOT */..#ifdef
10630 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
10640 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73  NAPSHOT./*.** Us
10650 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61  age: sqlite3_sna
10660 70 73 68 6f 74 5f 6f 70 65 6e 20 44 42 20 44 42  pshot_open DB DB
10670 4e 41 4d 45 20 53 4e 41 50 53 48 4f 54 0a 2a 2f  NAME SNAPSHOT.*/
10680 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
10690 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73  TE_TCLAPI test_s
106a0 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20  napshot_open(.  
106b0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
106c0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
106d0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
106e0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
106f0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10700 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
10710 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
10720 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  *zName;.  sqlite
10730 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61  3_snapshot *pSna
10740 70 73 68 6f 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pshot;..  if( ob
10750 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
10760 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
10770 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
10780 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53 48  DB DBNAME SNAPSH
10790 4f 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OT");.    return
107a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
107b0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
107c0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
107d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
107e0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
107f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e   TCL_ERROR;.  zN
10800 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
10810 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
10820 70 53 6e 61 70 73 68 6f 74 20 3d 20 28 73 71 6c  pSnapshot = (sql
10830 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 73  ite3_snapshot*)s
10840 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
10850 50 74 72 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  Ptr(Tcl_GetStrin
10860 67 28 6f 62 6a 76 5b 33 5d 29 29 3b 0a 0a 20 20  g(objv[3]));..  
10870 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61  rc = sqlite3_sna
10880 70 73 68 6f 74 5f 6f 70 65 6e 28 64 62 2c 20 7a  pshot_open(db, z
10890 4e 61 6d 65 2c 20 70 53 6e 61 70 73 68 6f 74 29  Name, pSnapshot)
108a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
108b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
108c0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
108d0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
108e0 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72  ingObj(sqlite3Er
108f0 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b  rName(rc), -1));
10900 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10910 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
10920 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
10930 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
10940 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a  NABLE_SNAPSHOT *
10950 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
10960 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
10970 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
10980 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66  lite3_snapshot_f
10990 72 65 65 20 53 4e 41 50 53 48 4f 54 0a 2a 2f 0a  ree SNAPSHOT.*/.
109a0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
109b0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e  E_TCLAPI test_sn
109c0 61 70 73 68 6f 74 5f 66 72 65 65 28 0a 20 20 76  apshot_free(.  v
109d0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
109e0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
109f0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
10a00 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
10a10 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
10a20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
10a30 74 20 2a 70 53 6e 61 70 73 68 6f 74 3b 0a 20 20  t *pSnapshot;.  
10a40 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
10a50 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10a60 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
10a70 62 6a 76 2c 20 22 53 4e 41 50 53 48 4f 54 22 29  bjv, "SNAPSHOT")
10a80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10a90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 53  _ERROR;.  }.  pS
10aa0 6e 61 70 73 68 6f 74 20 3d 20 28 73 71 6c 69 74  napshot = (sqlit
10ab0 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c  e3_snapshot*)sql
10ac0 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74  ite3TestTextToPt
10ad0 72 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  r(Tcl_GetString(
10ae0 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 73 71 6c  objv[1]));.  sql
10af0 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72  ite3_snapshot_fr
10b00 65 65 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  ee(pSnapshot);. 
10b10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10b20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10b30 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
10b40 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  OT */..#ifdef SQ
10b50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
10b60 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  SHOT./*.** Usage
10b70 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  : sqlite3_snapsh
10b80 6f 74 5f 63 6d 70 20 53 4e 41 50 53 48 4f 54 31  ot_cmp SNAPSHOT1
10b90 20 53 4e 41 50 53 48 4f 54 32 0a 2a 2f 0a 73 74   SNAPSHOT2.*/.st
10ba0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
10bb0 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61 70  TCLAPI test_snap
10bc0 73 68 6f 74 5f 63 6d 70 28 0a 20 20 76 6f 69 64  shot_cmp(.  void
10bd0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
10be0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10bf0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
10c00 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
10c10 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
10c20 74 20 72 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  t res;.  sqlite3
10c30 5f 73 6e 61 70 73 68 6f 74 20 2a 70 31 3b 0a 20  _snapshot *p1;. 
10c40 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
10c50 74 20 2a 70 32 3b 0a 20 20 69 66 28 20 6f 62 6a  t *p2;.  if( obj
10c60 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
10c70 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
10c80 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
10c90 4e 41 50 53 48 4f 54 31 20 53 4e 41 50 53 48 4f  NAPSHOT1 SNAPSHO
10ca0 54 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  T2");.    return
10cb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
10cc0 20 20 70 31 20 3d 20 28 73 71 6c 69 74 65 33 5f    p1 = (sqlite3_
10cd0 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69 74 65  snapshot*)sqlite
10ce0 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 54  3TestTextToPtr(T
10cf0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10d00 76 5b 31 5d 29 29 3b 0a 20 20 70 32 20 3d 20 28  v[1]));.  p2 = (
10d10 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
10d20 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65 78  *)sqlite3TestTex
10d30 74 54 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74  tToPtr(Tcl_GetSt
10d40 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a  ring(objv[2]));.
10d50 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f    res = sqlite3_
10d60 73 6e 61 70 73 68 6f 74 5f 63 6d 70 28 70 31 2c  snapshot_cmp(p1,
10d70 20 70 32 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f   p2);.  Tcl_SetO
10d80 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10d90 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
10da0 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  es));.  return T
10db0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
10dc0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
10dd0 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69  _SNAPSHOT */..#i
10de0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10df0 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a  LE_SNAPSHOT./*.*
10e00 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
10e10 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 5f 62 6c  _snapshot_get_bl
10e20 6f 62 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a  ob DB DBNAME.*/.
10e30 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
10e40 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e  E_TCLAPI test_sn
10e50 61 70 73 68 6f 74 5f 67 65 74 5f 62 6c 6f 62 28  apshot_get_blob(
10e60 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
10e70 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
10e80 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
10e90 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
10ea0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
10eb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
10ec0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68  qlite3 *db;.  ch
10ed0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c  ar *zName;.  sql
10ee0 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70  ite3_snapshot *p
10ef0 53 6e 61 70 73 68 6f 74 20 3d 20 30 3b 0a 0a 20  Snapshot = 0;.. 
10f00 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
10f10 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10f20 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
10f30 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45  objv, "DB DBNAME
10f40 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
10f50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
10f60 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
10f70 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10f80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
10f90 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
10fa0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d  CL_ERROR;.  zNam
10fb0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
10fc0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 72  g(objv[2]);..  r
10fd0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  c = sqlite3_snap
10fe0 73 68 6f 74 5f 67 65 74 28 64 62 2c 20 7a 4e 61  shot_get(db, zNa
10ff0 6d 65 2c 20 26 70 53 6e 61 70 73 68 6f 74 29 3b  me, &pSnapshot);
11000 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
11020 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11030 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
11040 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72  ngObj(sqlite3Err
11050 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a  Name(rc), -1));.
11060 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11070 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
11080 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
11090 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20  ult(interp, .   
110a0 20 20 20 20 20 54 63 6c 5f 4e 65 77 42 79 74 65       Tcl_NewByte
110b0 41 72 72 61 79 4f 62 6a 28 28 75 6e 73 69 67 6e  ArrayObj((unsign
110c0 65 64 20 63 68 61 72 2a 29 70 53 6e 61 70 73 68  ed char*)pSnapsh
110d0 6f 74 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  ot, sizeof(sqlit
110e0 65 33 5f 73 6e 61 70 73 68 6f 74 29 29 0a 20 20  e3_snapshot)).  
110f0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
11100 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 70  _snapshot_free(p
11110 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 7d 0a 20  Snapshot);.  }. 
11120 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11130 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11140 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
11150 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  OT */..#ifdef SQ
11160 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
11170 53 48 4f 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55  SHOT.  /*.  ** U
11180 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e  sage: sqlite3_sn
11190 61 70 73 68 6f 74 5f 6f 70 65 6e 5f 62 6c 6f 62  apshot_open_blob
111a0 20 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53   DB DBNAME SNAPS
111b0 48 4f 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  HOT.*/.static in
111c0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
111d0 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 6f 70  test_snapshot_op
111e0 65 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20  en_blob(.  void 
111f0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
11200 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11210 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
11220 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
11230 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
11240 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
11250 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  db;.  char *zNam
11260 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  e;.  unsigned ch
11270 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ar *pBlob;.  int
11280 20 6e 42 6c 6f 62 3b 0a 0a 20 20 69 66 28 20 6f   nBlob;..  if( o
11290 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
112a0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
112b0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
112c0 22 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53  "DB DBNAME SNAPS
112d0 48 4f 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  HOT");.    retur
112e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
112f0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
11300 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
11310 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
11320 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
11330 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
11340 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
11350 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
11360 20 70 42 6c 6f 62 20 3d 20 54 63 6c 5f 47 65 74   pBlob = Tcl_Get
11370 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
11380 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 6c 6f 62  (objv[3], &nBlob
11390 29 3b 0a 20 20 69 66 28 20 6e 42 6c 6f 62 21 3d  );.  if( nBlob!=
113a0 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 73  sizeof(sqlite3_s
113b0 6e 61 70 73 68 6f 74 29 20 29 7b 0a 20 20 20 20  napshot) ){.    
113c0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
113d0 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 53 4e  (interp, "bad SN
113e0 41 50 53 48 4f 54 22 2c 20 30 29 3b 0a 20 20 20  APSHOT", 0);.   
113f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11400 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
11410 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f  lite3_snapshot_o
11420 70 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  pen(db, zName, (
11430 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
11440 2a 29 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20  *)pBlob);.  if( 
11450 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11460 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
11470 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
11480 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
11490 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
114a0 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74  ), -1));.    ret
114b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
114c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
114d0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
114e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
114f0 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65  APSHOT */..#ifde
11500 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11510 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55  SNAPSHOT./*.** U
11520 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e  sage: sqlite3_sn
11530 61 70 73 68 6f 74 5f 63 6d 70 5f 62 6c 6f 62 20  apshot_cmp_blob 
11540 53 4e 41 50 53 48 4f 54 31 20 53 4e 41 50 53 48  SNAPSHOT1 SNAPSH
11550 4f 54 32 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OT2.*/.static in
11560 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
11570 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 63 6d  test_snapshot_cm
11580 70 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a  p_blob(.  void *
11590 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
115a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
115b0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
115c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
115d0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
115e0 72 65 73 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  res;.  unsigned 
115f0 63 68 61 72 20 2a 70 31 3b 0a 20 20 75 6e 73 69  char *p1;.  unsi
11600 67 6e 65 64 20 63 68 61 72 20 2a 70 32 3b 0a 20  gned char *p2;. 
11610 20 69 6e 74 20 6e 31 3b 0a 20 20 69 6e 74 20 6e   int n1;.  int n
11620 32 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  2;..  if( objc!=
11630 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
11640 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
11650 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4e 41 50  , 1, objv, "SNAP
11660 53 48 4f 54 31 20 53 4e 41 50 53 48 4f 54 32 22  SHOT1 SNAPSHOT2"
11670 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
11680 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
11690 70 31 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  p1 = Tcl_GetByte
116a0 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
116b0 76 5b 31 5d 2c 20 26 6e 31 29 3b 0a 20 20 70 32  v[1], &n1);.  p2
116c0 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
116d0 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
116e0 32 5d 2c 20 26 6e 32 29 3b 0a 0a 20 20 69 66 28  2], &n2);..  if(
116f0 20 6e 31 21 3d 73 69 7a 65 6f 66 28 73 71 6c 69   n1!=sizeof(sqli
11700 74 65 33 5f 73 6e 61 70 73 68 6f 74 29 20 7c 7c  te3_snapshot) ||
11710 20 6e 31 21 3d 6e 32 20 29 7b 0a 20 20 20 20 54   n1!=n2 ){.    T
11720 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11730 69 6e 74 65 72 70 2c 20 22 62 61 64 20 53 4e 41  interp, "bad SNA
11740 50 53 48 4f 54 22 2c 20 30 29 3b 0a 20 20 20 20  PSHOT", 0);.    
11750 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11760 3b 0a 20 20 7d 0a 0a 20 20 72 65 73 20 3d 20 73  ;.  }..  res = s
11770 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
11780 63 6d 70 28 28 73 71 6c 69 74 65 33 5f 73 6e 61  cmp((sqlite3_sna
11790 70 73 68 6f 74 2a 29 70 31 2c 20 28 73 71 6c 69  pshot*)p1, (sqli
117a0 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 70 32  te3_snapshot*)p2
117b0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
117c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
117d0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73 29  l_NewIntObj(res)
117e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
117f0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
11800 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
11810 41 50 53 48 4f 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  APSHOT */../*.**
11820 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
11830 64 65 6c 65 74 65 5f 64 61 74 61 62 61 73 65 20  delete_database 
11840 46 49 4c 45 4e 41 4d 45 0a 2a 2f 0a 69 6e 74 20  FILENAME.*/.int 
11850 73 71 6c 69 74 65 33 5f 64 65 6c 65 74 65 5f 64  sqlite3_delete_d
11860 61 74 61 62 61 73 65 28 63 6f 6e 73 74 20 63 68  atabase(const ch
11870 61 72 2a 29 3b 20 20 20 2f 2a 20 69 6e 20 74 65  ar*);   /* in te
11880 73 74 5f 64 65 6c 65 74 65 2e 63 20 2a 2f 0a 73  st_delete.c */.s
11890 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
118a0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64 65 6c  _TCLAPI test_del
118b0 65 74 65 5f 64 61 74 61 62 61 73 65 28 0a 20 20  ete_database(.  
118c0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
118d0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
118e0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
118f0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
11900 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
11910 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
11920 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20  t char *zFile;. 
11930 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
11940 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
11950 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
11960 6f 62 6a 76 2c 20 22 46 49 4c 45 22 29 3b 0a 20  objv, "FILE");. 
11970 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11980 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  ROR;.  }.  zFile
11990 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
119a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
119b0 6a 76 5b 31 5d 29 3b 0a 20 20 72 63 20 3d 20 73  jv[1]);.  rc = s
119c0 71 6c 69 74 65 33 5f 64 65 6c 65 74 65 5f 64 61  qlite3_delete_da
119d0 74 61 62 61 73 65 28 7a 46 69 6c 65 29 3b 0a 0a  tabase(zFile);..
119e0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
119f0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
11a00 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
11a10 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
11a20 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  -1));.  return T
11a30 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
11a40 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
11a50 6e 65 78 74 5f 73 74 6d 74 20 20 44 42 20 20 53  next_stmt  DB  S
11a60 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TMT.**.** Return
11a70 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 6d 65   the next statme
11a80 6e 74 20 69 6e 20 73 65 71 75 65 6e 63 65 20 61  nt in sequence a
11a90 66 74 65 72 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74  fter STMT..*/.st
11aa0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
11ab0 54 43 4c 41 50 49 20 74 65 73 74 5f 6e 65 78 74  TCLAPI test_next
11ac0 5f 73 74 6d 74 28 0a 20 20 76 6f 69 64 20 2a 20  _stmt(.  void * 
11ad0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
11ae0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
11af0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
11b00 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
11b10 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
11b20 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
11b30 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11b40 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
11b50 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
11b60 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
11b70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11b80 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
11b90 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
11ba0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
11bb0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
11bc0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20  jv[0], 0), " DB 
11bd0 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
11be0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11bf0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44  .  }..  if( getD
11c00 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
11c10 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11c20 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
11c30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11c40 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ;.  if( getStmtP
11c50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
11c60 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
11c70 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[2]), &pStmt) )
11c80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11c90 52 3b 0a 20 20 70 53 74 6d 74 20 3d 20 73 71 6c  R;.  pStmt = sql
11ca0 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 28 64  ite3_next_stmt(d
11cb0 62 2c 20 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  b, pStmt);.  if(
11cc0 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
11cd0 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
11ce0 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
11cf0 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
11d00 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11d10 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
11d20 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11d30 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
11d40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
11d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
11d60 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72    sqlite3_stmt_r
11d70 65 61 64 6f 6e 6c 79 20 20 53 54 4d 54 0a 2a 2a  eadonly  STMT.**
11d80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
11d90 69 66 20 53 54 4d 54 20 69 73 20 61 20 4e 55 4c  if STMT is a NUL
11da0 4c 20 70 6f 69 6e 74 65 72 20 6f 72 20 61 20 70  L pointer or a p
11db0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74  ointer to a stat
11dc0 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20 69 73  ement.** that is
11dd0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c   guaranteed to l
11de0 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
11df0 65 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  e unmodified..*/
11e00 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
11e10 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73  TE_TCLAPI test_s
11e20 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20  tmt_readonly(.  
11e30 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
11e40 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
11e50 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
11e60 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
11e70 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
11e80 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
11e90 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
11ea0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
11eb0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
11ec0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11ed0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
11ee0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
11ef0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
11f00 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
11f10 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c  0], 0), " STMT",
11f20 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
11f30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
11f40 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
11f50 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
11f60 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11f70 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
11f80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11f90 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
11fa0 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53  stmt_readonly(pS
11fb0 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  tmt);.  Tcl_SetO
11fc0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
11fd0 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
11fe0 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72  bj(rc));.  retur
11ff0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
12000 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
12010 65 33 5f 73 74 6d 74 5f 62 75 73 79 20 20 53 54  e3_stmt_busy  ST
12020 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  MT.**.** Return 
12030 74 72 75 65 20 69 66 20 53 54 4d 54 20 69 73 20  true if STMT is 
12040 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74  a non-NULL point
12050 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e  er to a statemen
12060 74 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65  t.** that has be
12070 65 6e 20 73 74 65 70 70 65 64 20 62 75 74 20 6e  en stepped but n
12080 6f 74 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  ot to completion
12090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
120a0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
120b0 73 74 5f 73 74 6d 74 5f 62 75 73 79 28 0a 20 20  st_stmt_busy(.  
120c0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
120d0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
120e0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
120f0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
12100 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
12110 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
12120 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
12130 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
12140 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
12150 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
12160 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
12170 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
12180 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
12190 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
121a0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c  0], 0), " STMT",
121b0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
121c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
121d0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
121e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
121f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12200 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
12210 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12220 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
12230 73 74 6d 74 5f 62 75 73 79 28 70 53 74 6d 74 29  stmt_busy(pStmt)
12240 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
12250 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
12260 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
12270 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  c));.  return TC
12280 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
12290 73 61 67 65 3a 20 20 75 73 65 73 5f 73 74 6d 74  sage:  uses_stmt
122a0 5f 6a 6f 75 72 6e 61 6c 20 20 53 54 4d 54 0a 2a  _journal  STMT.*
122b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
122c0 20 69 66 20 53 54 4d 54 20 75 73 65 73 20 61 20   if STMT uses a 
122d0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
122e0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
122f0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 75   SQLITE_TCLAPI u
12300 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c  ses_stmt_journal
12310 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
12320 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
12330 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
12340 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
12350 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
12360 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
12370 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
12380 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
12390 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
123a0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
123b0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
123c0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
123d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
123e0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
123f0 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20  , " STMT", 0);. 
12400 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12410 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
12420 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
12430 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
12440 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
12450 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
12460 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
12470 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e  ite3_stmt_readon
12480 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c  ly(pStmt);.  Tcl
12490 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
124a0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
124b0 6c 65 61 6e 4f 62 6a 28 28 28 56 64 62 65 20 2a  leanObj(((Vdbe *
124c0 29 70 53 74 6d 74 29 2d 3e 75 73 65 73 53 74 6d  )pStmt)->usesStm
124d0 74 4a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 72 65  tJournal));.  re
124e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
124f0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
12500 71 6c 69 74 65 33 5f 72 65 73 65 74 20 20 53 54  qlite3_reset  ST
12510 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74 20  MT .**.** Reset 
12520 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  a statement hand
12530 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
12540 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
12550 74 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f  test_reset(.  vo
12560 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
12570 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
12580 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
12590 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
125a0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
125b0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
125c0 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  tmt;.  int rc;..
125d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
125e0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
125f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
12600 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
12610 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
12620 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
12630 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
12640 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c  , 0), " <STMT>",
12650 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
12660 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
12670 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
12680 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
12690 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
126a0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
126b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
126c0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
126d0 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
126e0 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71   if( pStmt && sq
126f0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
12700 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
12710 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 7b  b(pStmt), rc) ){
12720 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12730 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
12740 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
12750 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
12760 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
12770 53 54 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66  STATIC);./*.  if
12780 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
12790 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
127a0 7d 0a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  }.*/.  return TC
127b0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
127c0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
127d0 78 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a  xpired STMT .**.
127e0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
127f0 66 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  f a recompilatio
12800 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
12810 6e 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65  nt is recommende
12820 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12830 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
12840 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20 20 76  est_expired(.  v
12850 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
12860 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
12870 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
12880 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
12890 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
128a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
128b0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
128c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
128d0 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  tmt;.  if( objc!
128e0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
128f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12900 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
12910 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
12920 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
12930 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
12940 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54  jv[0], 0), " <ST
12950 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  MT>", 0);.    re
12960 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12970 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
12980 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
12990 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
129a0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
129b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
129c0 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
129d0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
129e0 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
129f0 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65  j(sqlite3_expire
12a00 64 28 70 53 74 6d 74 29 29 29 3b 0a 23 65 6e 64  d(pStmt)));.#end
12a10 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
12a20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
12a30 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 74 72 61  ge:  sqlite3_tra
12a40 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 20 46  nsfer_bindings F
12a50 52 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54 0a 2a  ROMSTMT TOSTMT.*
12a60 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 61 6c  *.** Transfer al
12a70 6c 20 62 69 6e 64 69 6e 67 73 20 66 72 6f 6d 20  l bindings from 
12a80 46 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20 74 6f  FROMSTMT over to
12a90 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69   TOSTMT.*/.stati
12aa0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
12ab0 41 50 49 20 74 65 73 74 5f 74 72 61 6e 73 66 65  API test_transfe
12ac0 72 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a  r_bind(.  void *
12ad0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
12ae0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12af0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
12b00 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
12b10 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
12b20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
12b30 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74  PRECATED.  sqlit
12b40 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c  e3_stmt *pStmt1,
12b50 20 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20   *pStmt2;.  if( 
12b60 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
12b70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12b80 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
12b90 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
12ba0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
12bb0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
12bc0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
12bd0 22 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53  " FROM-STMT TO-S
12be0 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
12bf0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12c00 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
12c10 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
12c20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
12c30 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31  bjv[1]), &pStmt1
12c40 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  )) return TCL_ER
12c50 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74  ROR;.  if( getSt
12c60 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
12c70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
12c80 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74  objv[2]), &pStmt
12c90 32 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  2)) return TCL_E
12ca0 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
12cb0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
12cc0 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e   .     Tcl_NewIn
12cd0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61  tObj(sqlite3_tra
12ce0 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70  nsfer_bindings(p
12cf0 53 74 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b  Stmt1,pStmt2)));
12d00 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
12d10 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
12d20 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
12d30 33 5f 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a 0a  3_changes DB.**.
12d40 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
12d50 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20  mber of changes 
12d60 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
12d70 62 61 73 65 20 62 79 20 74 68 65 20 6c 61 73 74  base by the last
12d80 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69 6f   SQL.** executio
12d90 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
12da0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
12db0 65 73 74 5f 63 68 61 6e 67 65 73 28 0a 20 20 76  est_changes(.  v
12dc0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
12dd0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
12de0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
12df0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
12e00 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
12e10 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
12e20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
12e30 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12e40 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
12e50 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
12e60 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
12e70 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
12e80 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
12e90 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
12ea0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
12eb0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
12ec0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
12ed0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
12ee0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
12ef0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
12f00 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
12f10 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
12f20 62 6a 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  bj(sqlite3_chang
12f30 65 73 28 64 62 29 29 29 3b 0a 20 20 72 65 74 75  es(db)));.  retu
12f40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
12f50 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
12f60 22 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  "static_bind_val
12f70 75 65 22 20 74 68 61 74 20 76 61 72 69 61 62 6c  ue" that variabl
12f80 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20  es are bound to 
12f90 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46 4c 41 47  when.** the FLAG
12fa0 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74   option of sqlit
12fb0 65 33 5f 62 69 6e 64 20 69 73 20 22 73 74 61 74  e3_bind is "stat
12fc0 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ic".*/.static ch
12fd0 61 72 20 2a 73 71 6c 69 74 65 5f 73 74 61 74 69  ar *sqlite_stati
12fe0 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20 3d 20 30  c_bind_value = 0
12ff0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ;.static int sql
13000 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
13010 6e 62 79 74 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  nbyte = 0;../*.*
13020 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
13030 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44 58 20  3_bind  VM  IDX 
13040 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a   VALUE  FLAGS.**
13050 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76 61 6c  .** Sets the val
13060 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d 74 68  ue of the IDX-th
13070 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20 22   occurrence of "
13080 3f 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ?" in the origin
13090 61 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e 67  al SQL.** string
130a0 2e 20 20 56 41 4c 55 45 20 69 73 20 74 68 65 20  .  VALUE is the 
130b0 6e 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20 46  new value.  If F
130c0 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68 65  LAGS=="null" the
130d0 6e 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69 67  n VALUE is.** ig
130e0 6e 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76 61  nored and the va
130f0 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  lue is set to NU
13100 4c 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  LL.  If FLAGS=="
13110 73 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a 20  static" then.** 
13120 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74  the value is set
13130 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66   to the value of
13140 20 61 20 73 74 61 74 69 63 20 76 61 72 69 61 62   a static variab
13150 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71 6c  le named.** "sql
13160 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
13170 76 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41 47  value".  If FLAG
13180 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65 6e  S=="normal" then
13190 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68   a copy.** of th
131a0 65 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65 2e  e VALUE is made.
131b0 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 62 6c 6f    If FLAGS=="blo
131c0 62 31 30 22 20 74 68 65 6e 20 61 20 56 41 4c 55  b10" then a VALU
131d0 45 20 69 73 20 69 67 6e 6f 72 65 64 0a 2a 2a 20  E is ignored.** 
131e0 61 6e 20 61 20 31 30 2d 62 79 74 65 20 62 6c 6f  an a 10-byte blo
131f0 62 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30  b "abc\000xyz\00
13200 30 70 71 22 20 69 73 20 69 6e 73 65 72 74 65 64  0pq" is inserted
13210 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13220 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
13230 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20  st_bind(.  void 
13240 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
13250 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
13260 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
13270 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
13280 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
13290 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
132a0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
132b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
132c0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
132d0 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
132e0 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
132f0 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
13300 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
13310 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
13320 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
13330 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
13340 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13350 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
13360 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
13370 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
13380 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 56 4d 20  ], .       " VM 
13390 49 44 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c  IDX VALUE (null|
133a0 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22  static|normal)\"
133b0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
133c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
133d0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
133e0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
133f0 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20 29  gv[1], &pStmt) )
13400 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13410 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
13420 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
13430 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
13440 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13450 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
13460 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29  [4],"null")==0 )
13470 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
13480 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
13490 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73  mt, idx);.  }els
134a0 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
134b0 76 5b 34 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d  v[4],"static")==
134c0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
134d0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
134e0 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69  pStmt, idx, sqli
134f0 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
13500 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  alue, -1, 0);.  
13510 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13520 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63  (argv[4],"static
13530 2d 6e 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a  -nbytes")==0 ){.
13540 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13550 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
13560 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74  , idx, sqlite_st
13570 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c  atic_bind_value,
13580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 73          sqlite_s
135b0 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65  tatic_bind_nbyte
135c0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  , 0);.  }else if
135d0 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
135e0 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20 29 7b  ,"normal")==0 ){
135f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13600 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
13610 74 2c 20 69 64 78 2c 20 61 72 67 76 5b 33 5d 2c  t, idx, argv[3],
13620 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
13630 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 20  SIENT);.  }else 
13640 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
13650 34 5d 2c 22 62 6c 6f 62 31 30 22 29 3d 3d 30 20  4],"blob10")==0 
13660 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
13670 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
13680 74 6d 74 2c 20 69 64 78 2c 20 22 61 62 63 5c 30  tmt, idx, "abc\0
13690 30 30 78 79 7a 5c 30 30 30 70 71 22 2c 20 31 30  00xyz\000pq", 10
136a0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
136b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
136c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
136d0 69 6e 74 65 72 70 2c 20 22 34 74 68 20 61 72 67  interp, "4th arg
136e0 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20  ument should be 
136f0 22 0a 20 20 20 20 20 20 20 20 22 5c 22 6e 75 6c  ".        "\"nul
13700 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74 69 63 5c  l\" or \"static\
13710 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22  " or \"normal\""
13720 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
13730 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
13740 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
13750 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
13760 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
13770 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
13780 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
13790 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  rc ){.    char z
137a0 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c  Buf[50];.    sql
137b0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
137c0 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
137d0 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
137e0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
137f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
13800 66 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  f, sqlite3ErrStr
13810 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
13820 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13830 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
13840 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
13850 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
13860 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  6./*.** Usage: a
13870 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  dd_test_collate 
13880 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20  <db ptr> <utf8> 
13890 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
138a0 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  be>.**.** This f
138b0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
138c0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
138d0 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20  ite selects the 
138e0 63 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f  correct collatio
138f0 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61  n.** sequence ca
13900 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74  llback when mult
13910 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66  iple versions (f
13920 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78  or different tex
13930 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20  t encodings).** 
13940 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  are available..*
13950 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
13960 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  s routine regist
13970 65 72 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ers the collatio
13980 6e 20 73 65 71 75 65 6e 63 65 20 22 74 65 73 74  n sequence "test
13990 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74  _collate".** wit
139a0 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  h database handl
139b0 65 20 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f  e <db>. The seco
139c0 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  nd argument must
139d0 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68   be a list of th
139e0 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76  ree.** boolean v
139f0 61 6c 75 65 73 2e 20 49 66 20 74 68 65 20 66 69  alues. If the fi
13a00 72 73 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  rst is true, the
13a10 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  n a version of t
13a20 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a  est_collate is.*
13a30 2a 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  * registered for
13a40 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73   UTF-8, if the s
13a50 65 63 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61  econd is true, a
13a60 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69   version is regi
13a70 73 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54  stered for.** UT
13a80 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74  F-16le, if the t
13a90 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20  hird is true, a 
13aa0 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e  UTF-16be version
13ab0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
13ac0 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  * Previous versi
13ad0 6f 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c  ons of test_coll
13ae0 61 74 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e  ate are deleted.
13af0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
13b00 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65  tion sequence te
13b10 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d  st_collate is im
13b20 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c  plemented by cal
13b30 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  ling the.** foll
13b40 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  owing TCL script
13b50 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f  :.**.**   "test_
13b60 63 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c  collate <enc> <l
13b70 68 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a  hs> <rhs>".**.**
13b80 20 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c   The <lhs> and <
13b90 72 68 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f  rhs> are the two
13ba0 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f   values being co
13bb0 6d 70 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20  mpared, encoded 
13bc0 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65  in UTF-8..** The
13bd0 20 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72   <enc> parameter
13be0 20 69 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   is the encoding
13bf0 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   of the collatio
13c00 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  n function that.
13c10 2a 2a 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74  ** SQLite select
13c20 65 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20  ed to call. The 
13c30 54 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 20  TCL test script 
13c40 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a  implements the.*
13c50 2a 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  * "test_collate"
13c60 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   proc..**.** Not
13c70 65 20 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c  e that this will
13c80 20 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20   only work with 
13c90 6f 6e 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  one interpreter 
13ca0 61 74 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68  at a time, as th
13cb0 65 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e  e.** interp poin
13cc0 74 65 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ter to use when 
13cd0 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54  evaluating the T
13ce0 43 4c 20 73 63 72 69 70 74 20 69 73 20 73 74 6f  CL script is sto
13cf0 72 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43  red in.** pTestC
13d00 6f 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f  ollateInterp..*/
13d10 0a 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65  .static Tcl_Inte
13d20 72 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65  rp* pTestCollate
13d30 49 6e 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69  Interp;.static i
13d40 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  nt test_collate_
13d50 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43  func(.  void *pC
13d60 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63  tx, .  int nA, c
13d70 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20  onst void *zA,. 
13d80 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76   int nB, const v
13d90 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c  oid *zB.){.  Tcl
13da0 5f 49 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65  _Interp *i = pTe
13db0 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b  stCollateInterp;
13dc0 0a 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 53  .  int encin = S
13dd0 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
13de0 28 70 43 74 78 29 3b 0a 20 20 69 6e 74 20 72 65  (pCtx);.  int re
13df0 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 73  s;.  int n;..  s
13e00 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
13e10 61 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  al;.  Tcl_Obj *p
13e20 58 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  X;..  pX = Tcl_N
13e30 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
13e40 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b  t_collate", -1);
13e50 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
13e60 75 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74  unt(pX);..  swit
13e70 63 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20  ch( encin ){.   
13e80 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46   case SQLITE_UTF
13e90 38 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  8:.      Tcl_Lis
13ea0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
13eb0 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74  t(i,pX,Tcl_NewSt
13ec0 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c  ringObj("UTF-8",
13ed0 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  -1));.      brea
13ee0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
13ef0 54 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20  TE_UTF16LE:.    
13f00 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
13f10 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c  endElement(i,pX,
13f20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
13f30 28 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29  ("UTF-16LE",-1))
13f40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13f50 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
13f60 54 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63  TF16BE:.      Tc
13f70 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
13f80 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f  lement(i,pX,Tcl_
13f90 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
13fa0 46 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20  F-16BE",-1));.  
13fb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
13fc0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
13fd0 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20  sert(0);.  }..  
13fe0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
13ff0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 56  gnMalloc();.  pV
14000 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
14010 65 4e 65 77 28 30 29 3b 0a 20 20 69 66 28 20 70  eNew(0);.  if( p
14020 56 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Val ){.    sqlit
14030 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
14040 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69  al, nA, zA, enci
14050 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
14060 29 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  );.    n = sqlit
14070 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
14080 56 61 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  Val);.    Tcl_Li
14090 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
140a0 6e 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20  nt(i,pX,.       
140b0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
140c0 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
140d0 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
140e0 29 2c 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ),n));.    sqlit
140f0 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
14100 61 6c 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e 63 69  al, nB, zB, enci
14110 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
14120 29 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  );.    n = sqlit
14130 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
14140 56 61 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  Val);.    Tcl_Li
14150 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14160 6e 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20  nt(i,pX,.       
14170 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14180 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
14190 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
141a0 29 2c 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ),n));.    sqlit
141b0 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
141c0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
141d0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
141e0 29 3b 0a 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  );..  Tcl_EvalOb
141f0 6a 45 78 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20  jEx(i, pX, 0);. 
14200 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
14210 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74  t(pX);.  Tcl_Get
14220 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63  IntFromObj(i, Tc
14230 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
14240 29 2c 20 26 72 65 73 29 3b 0a 20 20 72 65 74 75  ), &res);.  retu
14250 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63  rn res;.}.static
14260 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
14270 50 49 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28  PI test_collate(
14280 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
14290 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
142a0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
142b0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
142c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
142d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
142e0 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73  ;.  int val;.  s
142f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
14300 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  al;.  int rc;.. 
14310 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67   if( objc!=5 ) g
14320 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
14330 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
14340 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69  rp = interp;.  i
14350 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
14360 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
14370 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
14380 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
14390 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
143a0 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
143b0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
143c0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
143d0 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
143e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
143f0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
14400 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65  ollation(db, "te
14410 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c  st_collate", SQL
14420 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
14430 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c       (void *)SQL
14440 49 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65  ITE_UTF8, val?te
14450 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
14460 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
14470 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
14480 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31  onst void *zUtf1
14490 36 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f  6;.    if( TCL_O
144a0 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
144b0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
144c0 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20   objv[3], &val) 
144d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
144e0 4f 52 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  OR;.    rc = sql
144f0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
14500 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ation(db, "test_
14510 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45  collate", SQLITE
14520 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20  _UTF16LE, .     
14530 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53         (void *)S
14540 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 76  QLITE_UTF16LE, v
14550 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  al?test_collate_
14560 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66 28  func:0);.    if(
14570 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
14580 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
14590 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
145a0 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
145b0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20 30  CL_ERROR;..#if 0
145c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
145d0 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20 29  _iMallocFail>0 )
145e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
145f0 69 4d 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20  iMallocFail++;. 
14600 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14610 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14620 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
14630 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
14640 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
14650 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
14660 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
14670 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
14680 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
14690 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
146a0 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74    zUtf16 = sqlit
146b0 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
146c0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
146d0 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  TIVE);.    if( d
146e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
146f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
14700 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
14710 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
14720 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
14730 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62 2c  _collation16(db,
14740 20 7a 55 74 66 31 36 2c 20 53 51 4c 49 54 45 5f   zUtf16, SQLITE_
14750 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20  UTF16BE, .      
14760 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
14770 54 45 5f 55 54 46 31 36 42 45 2c 20 76 61 6c 3f  TE_UTF16BE, val?
14780 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
14790 63 3a 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  c:0);.    }.    
147a0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
147b0 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  (pVal);.    sqli
147c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
147d0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
147e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
147f0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
14800 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
14810 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a  n TCL_ERROR;.  .
14820 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14830 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
14840 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
14850 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
14860 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
14870 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14880 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
14890 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73  CL_OK;..bad_args
148a0 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  :.  Tcl_AppendRe
148b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
148c0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
148d0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
148e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
148f0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
14900 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e  ), " <DB> <utf8>
14910 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31   <utf16le> <utf1
14920 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74  6be>", 0);.  ret
14930 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
14940 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  ../*.** Usage: a
14950 64 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e  dd_test_utf16bin
14960 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72  _collate <db ptr
14970 3e 0a 2a 2a 0a 2a 2a 20 41 64 64 20 61 20 75 74  >.**.** Add a ut
14980 66 2d 31 36 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  f-16 collation s
14990 65 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 22 75  equence named "u
149a0 74 66 31 36 62 69 6e 22 20 74 6f 20 74 68 65 20  tf16bin" to the 
149b0 64 61 74 61 62 61 73 65 0a 2a 2a 20 68 61 6e 64  database.** hand
149c0 6c 65 2e 20 54 68 69 73 20 63 6f 6c 6c 61 74 69  le. This collati
149d0 6f 6e 20 73 65 71 75 65 6e 63 65 20 63 6f 6d 70  on sequence comp
149e0 61 72 65 73 20 61 72 67 75 6d 65 6e 74 73 20 69  ares arguments i
149f0 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61  n the same way a
14a00 73 20 74 68 65 0a 2a 2a 20 62 75 69 6c 74 2d 69  s the.** built-i
14a10 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 22 62 69 6e  n collation "bin
14a20 61 72 79 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ary"..*/.static 
14a30 69 6e 74 20 74 65 73 74 5f 75 74 66 31 36 62 69  int test_utf16bi
14a40 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a  n_collate_func(.
14a50 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20    void *pCtx, . 
14a60 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76   int nA, const v
14a70 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
14a80 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  B, const void *z
14a90 42 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  B.){.  int nCmp 
14aa0 3d 20 28 6e 41 3e 6e 42 20 3f 20 6e 42 20 3a 20  = (nA>nB ? nB : 
14ab0 6e 41 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d  nA);.  int res =
14ac0 20 6d 65 6d 63 6d 70 28 7a 41 2c 20 7a 42 2c 20   memcmp(zA, zB, 
14ad0 6e 43 6d 70 29 3b 0a 20 20 69 66 28 20 72 65 73  nCmp);.  if( res
14ae0 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 41 20 2d  ==0 ) res = nA -
14af0 20 6e 42 3b 0a 20 20 72 65 74 75 72 6e 20 72 65   nB;.  return re
14b00 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  s;.}.static int 
14b10 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
14b20 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c  st_utf16bin_coll
14b30 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ate(.  void * cl
14b40 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
14b50 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
14b60 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
14b70 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
14b80 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
14b90 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
14ba0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
14bb0 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a   goto bad_args;.
14bc0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
14bd0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
14be0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
14bf0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
14c00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
14c10 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
14c20 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
14c30 20 22 75 74 66 31 36 62 69 6e 22 2c 20 53 51 4c   "utf16bin", SQL
14c40 49 54 45 5f 55 54 46 31 36 2c 20 30 2c 20 0a 20  ITE_UTF16, 0, . 
14c50 20 20 20 20 20 74 65 73 74 5f 75 74 66 31 36 62       test_utf16b
14c60 69 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 0a  in_collate_func.
14c70 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74    );.  if( sqlit
14c80 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
14c90 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
14ca0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14cb0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
14cc0 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  K;..bad_args:.  
14cd0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
14ce0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
14cf0 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72  , "DB");.  retur
14d00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
14d10 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 63  /*.** When the c
14d20 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
14d30 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
14d40 6b 65 64 2c 20 72 65 63 6f 72 64 20 74 68 65 20  ked, record the 
14d50 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20  name of .** the 
14d60 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
14d70 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 68 65 72  ing function her
14d80 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 65 64  e.  The recorded
14d90 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b 65 64 0a   name is linked.
14da0 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76 61 72 69  ** to a TCL vari
14db0 61 62 6c 65 20 61 6e 64 20 75 73 65 64 20 74 6f  able and used to
14dc0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
14dd0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
14de0 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20  llation.** name 
14df0 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73  is correct..*/.s
14e00 74 61 74 69 63 20 63 68 61 72 20 7a 4e 65 65 64  tatic char zNeed
14e10 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d  edCollation[200]
14e20 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70  ;.static char *p
14e30 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
14e40 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74   = zNeededCollat
14e50 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  ion;.../*.** Cal
14e60 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6c 6c 61  led when a colla
14e70 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  ting sequence is
14e80 20 6e 65 65 64 65 64 2e 20 20 52 65 67 69 73 74   needed.  Regist
14e90 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71  ered using.** sq
14ea0 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
14eb0 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a 2f 0a 73  needed16()..*/.s
14ec0 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
14ed0 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63  collate_needed_c
14ee0 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  b(.  void *pCtx,
14ef0 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c   .  sqlite3 *db,
14f00 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
14f10 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
14f20 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 65 6e  Name.){.  int en
14f30 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 69  c = ENC(db);.  i
14f40 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
14f50 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63 68 61 72  .  for(z = (char
14f60 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a  *)pName, i=0; *z
14f70 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a   || z[1]; z++){.
14f80 20 20 20 20 69 66 28 20 2a 7a 20 29 20 7a 4e 65      if( *z ) zNe
14f90 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b  ededCollation[i+
14fa0 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a  +] = *z;.  }.  z
14fb0 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
14fc0 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  i] = 0;.  sqlite
14fd0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
14fe0 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 74  on(.      db, "t
14ff0 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 45 4e  est_collate", EN
15000 43 28 64 62 29 2c 20 53 51 4c 49 54 45 5f 49 4e  C(db), SQLITE_IN
15010 54 5f 54 4f 5f 50 54 52 28 65 6e 63 29 2c 20 74  T_TO_PTR(enc), t
15020 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
15030 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
15040 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c  e: add_test_coll
15050 61 74 65 5f 6e 65 65 64 65 64 20 44 42 0a 2a 2f  ate_needed DB.*/
15060 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
15070 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63  TE_TCLAPI test_c
15080 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 28 0a 20  ollate_needed(. 
15090 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
150a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
150b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
150c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
150d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
150e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
150f0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
15100 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20   objc!=2 ) goto 
15110 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20  bad_args;.  if( 
15120 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
15130 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
15140 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
15150 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15160 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
15170 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
15180 65 65 64 65 64 31 36 28 64 62 2c 20 30 2c 20 74  eeded16(db, 0, t
15190 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
151a0 65 64 5f 63 62 29 3b 0a 20 20 7a 4e 65 65 64 65  ed_cb);.  zNeede
151b0 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20  dCollation[0] = 
151c0 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
151d0 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
151e0 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
151f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15200 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
15210 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63  ..bad_args:.  Tc
15220 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
15230 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
15240 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  "DB");.  return 
15250 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
15260 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 61 64  .** tclcmd:   ad
15270 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74  d_alignment_test
15280 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20 20 44 42 0a  _collations  DB.
15290 2a 2a 0a 2a 2a 20 41 64 64 20 74 77 6f 20 6e 65  **.** Add two ne
152a0 77 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  w collating sequ
152b0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 64 61 74  ences to the dat
152c0 61 62 61 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20  abase DB.**.**  
152d0 20 20 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64     utf16_aligned
152e0 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 75 6e  .**     utf16_un
152f0 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f  aligned.**.** Bo
15300 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  th collating seq
15310 75 65 6e 63 65 73 20 75 73 65 20 74 68 65 20 73  uences use the s
15320 61 6d 65 20 73 6f 72 74 20 6f 72 64 65 72 20 61  ame sort order a
15330 73 20 42 49 4e 41 52 59 2e 0a 2a 2a 20 54 68 65  s BINARY..** The
15340 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65   only difference
15350 20 69 73 20 74 68 61 74 20 74 68 65 20 75 74 66   is that the utf
15360 31 36 5f 61 6c 69 67 6e 65 64 20 63 6f 6c 6c 61  16_aligned colla
15370 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
15380 20 69 73 20 64 65 63 6c 61 72 65 64 20 77 69 74   is declared wit
15390 68 20 74 68 65 20 53 51 4c 49 54 45 5f 55 54 46  h the SQLITE_UTF
153a0 31 36 5f 41 4c 49 47 4e 45 44 20 66 6c 61 67 2e  16_ALIGNED flag.
153b0 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69  .** Both collati
153c0 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 63  ng functions inc
153d0 72 65 6d 65 6e 74 20 74 68 65 20 75 6e 61 6c 69  rement the unali
153e0 67 6e 65 64 20 75 74 66 31 36 20 63 6f 75 6e 74  gned utf16 count
153f0 65 72 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 74  er.** whenever t
15400 68 65 79 20 73 65 65 20 61 20 73 74 72 69 6e 67  hey see a string
15410 20 74 68 61 74 20 62 65 67 69 6e 73 20 6f 6e 20   that begins on 
15420 61 6e 20 6f 64 64 20 62 79 74 65 20 62 6f 75 6e  an odd byte boun
15430 64 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dary..*/.static 
15440 69 6e 74 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74  int unaligned_st
15450 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 3d 20 30  ring_counter = 0
15460 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 69  ;.static int ali
15470 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a  gnmentCollFunc(.
15480 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
15490 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
154a0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
154b0 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
154c0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
154d0 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a  ){.  int rc, n;.
154e0 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79    n = nKey1<nKey
154f0 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79  2 ? nKey1 : nKey
15500 32 3b 0a 20 20 69 66 28 20 6e 4b 65 79 31 3e 30  2;.  if( nKey1>0
15510 20 26 26 20 31 3d 3d 28 31 26 28 53 51 4c 49 54   && 1==(1&(SQLIT
15520 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65  E_PTR_TO_INT(pKe
15530 79 31 29 29 29 20 29 20 75 6e 61 6c 69 67 6e 65  y1))) ) unaligne
15540 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
15550 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b 65 79 32 3e  ++;.  if( nKey2>
15560 30 20 26 26 20 31 3d 3d 28 31 26 28 53 51 4c 49  0 && 1==(1&(SQLI
15570 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 4b  TE_PTR_TO_INT(pK
15580 65 79 32 29 29 29 20 29 20 75 6e 61 6c 69 67 6e  ey2))) ) unalign
15590 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
155a0 72 2b 2b 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63  r++;.  rc = memc
155b0 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c  mp(pKey1, pKey2,
155c0 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   n);.  if( rc==0
155d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 4b 65   ){.    rc = nKe
155e0 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a  y1 - nKey2;.  }.
155f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
15600 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
15610 5f 54 43 4c 41 50 49 20 61 64 64 5f 61 6c 69 67  _TCLAPI add_alig
15620 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
15630 74 69 6f 6e 73 28 0a 20 20 76 6f 69 64 20 2a 20  tions(.  void * 
15640 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
15650 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
15660 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
15670 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
15680 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
15690 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62  e3 *db;.  if( ob
156a0 6a 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc>=2 ){.    if(
156b0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
156c0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
156d0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
156e0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
156f0 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
15700 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
15710 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 75  ion(db, "utf16_u
15720 6e 61 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54  naligned", SQLIT
15730 45 5f 55 54 46 31 36 2c 20 0a 20 20 20 20 20 20  E_UTF16, .      
15740 20 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f    0, alignmentCo
15750 6c 6c 46 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c  llFunc);.    sql
15760 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
15770 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36  ation(db, "utf16
15780 5f 61 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54  _aligned", SQLIT
15790 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 2c  E_UTF16_ALIGNED,
157a0 20 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69   .        0, ali
157b0 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b  gnmentCollFunc);
157c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
157d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
157e0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
157f0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29  LITE_OMIT_UTF16)
15800 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65   */../*.** Usage
15810 3a 20 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74  : add_test_funct
15820 69 6f 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74  ion <db ptr> <ut
15830 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75  f8> <utf16le> <u
15840 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68  tf16be>.**.** Th
15850 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
15860 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74  sed to test that
15870 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20   SQLite selects 
15880 74 68 65 20 63 6f 72 72 65 63 74 20 75 73 65 72  the correct user
15890 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  .** function cal
158a0 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69  lback when multi
158b0 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f  ple versions (fo
158c0 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74  r different text
158d0 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61   encodings).** a
158e0 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  re available..**
158f0 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
15900 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
15910 72 73 20 75 70 20 74 6f 20 74 68 72 65 65 20 76  rs up to three v
15920 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75  ersions of the u
15930 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ser function.** 
15940 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20  "test_function" 
15950 77 69 74 68 20 64 61 74 61 62 61 73 65 20 68 61  with database ha
15960 6e 64 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74  ndle <db>.  If t
15970 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
15980 6e 74 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74  nt is.** true, t
15990 68 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66  hen a version of
159a0 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69   test_function i
159b0 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
159c0 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a   UTF-8, if the.*
159d0 2a 20 74 68 69 72 64 20 69 73 20 74 72 75 65 2c  * third is true,
159e0 20 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65   a version is re
159f0 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
15a00 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f  -16le, if the fo
15a10 75 72 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c  urth is.** true,
15a20 20 61 20 55 54 46 2d 31 36 62 65 20 76 65 72 73   a UTF-16be vers
15a30 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
15a40 2e 20 20 50 72 65 76 69 6f 75 73 20 76 65 72 73  .  Previous vers
15a50 69 6f 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f  ions of.** test_
15a60 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c  function are del
15a70 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
15a80 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73  user function is
15a90 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
15aa0 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c  calling the foll
15ab0 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  owing TCL script
15ac0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f  :.**.**   "test_
15ad0 66 75 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c  function <enc> <
15ae0 61 72 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72  arg>".**.** Wher
15af0 65 20 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f  e <enc> is one o
15b00 66 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c  f UTF-8, UTF-16L
15b10 45 20 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e  E or UTF16BE, an
15b20 64 20 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a  d <arg> is the.*
15b30 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
15b40 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
15b50 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  SQL function. Th
15b60 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
15b70 20 62 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73   by.** the TCL s
15b80 63 72 69 70 74 20 69 73 20 75 73 65 64 20 61 73  cript is used as
15b90 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
15ba0 65 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e  e of the SQL fun
15bb0 63 74 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20  ction. It.** is 
15bc0 70 61 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65  passed to SQLite
15bd0 20 75 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20   using UTF-16BE 
15be0 66 6f 72 20 61 20 55 54 46 2d 38 20 74 65 73 74  for a UTF-8 test
15bf0 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46  _function(), UTF
15c00 2d 38 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d  -8.** for a UTF-
15c10 31 36 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69  16LE test_functi
15c20 6f 6e 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36  on(), and UTF-16
15c30 4c 45 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d  LE for an implem
15c40 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  entation that.**
15c50 20 70 72 65 66 65 72 73 20 55 54 46 2d 31 36 42   prefers UTF-16B
15c60 45 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  E..*/.#ifndef SQ
15c70 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
15c80 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
15c90 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 28 0a  _function_utf8(.
15ca0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
15cb0 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
15cc0 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
15cd0 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
15ce0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15cf0 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
15d00 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *pX;.  sqlite3_v
15d10 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
15d20 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65  terp = (Tcl_Inte
15d30 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  rp *)sqlite3_use
15d40 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
15d50 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  pX = Tcl_NewStri
15d60 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63  ngObj("test_func
15d70 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63  tion", -1);.  Tc
15d80 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
15d90 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  X);.  Tcl_ListOb
15da0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
15db0 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e  nterp, pX, Tcl_N
15dc0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
15dd0 2d 38 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  -8", -1));.  Tcl
15de0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
15df0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
15e00 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  , .      Tcl_New
15e10 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a  StringObj((char*
15e20 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
15e30 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31  ext(argv[0]), -1
15e40 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
15e50 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  jEx(interp, pX, 
15e60 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
15e70 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73 71  fCount(pX);.  sq
15e80 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
15e90 74 28 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53  t(pCtx, Tcl_GetS
15ea0 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
15eb0 72 70 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  rp), -1, SQLITE_
15ec0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56  TRANSIENT);.  pV
15ed0 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
15ee0 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
15ef0 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
15f00 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53  al, -1, Tcl_GetS
15f10 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
15f20 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49  rp), .      SQLI
15f30 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
15f40 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
15f50 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
15f60 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33  be(pCtx, sqlite3
15f70 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28  _value_text16be(
15f80 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c  pVal),.      -1,
15f90 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
15fa0 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  T);.  sqlite3Val
15fb0 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a  ueFree(pVal);.}.
15fc0 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
15fd0 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c  _function_utf16l
15fe0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  e(.  sqlite3_con
15ff0 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
16000 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
16010 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
16020 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
16030 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f  *interp;.  Tcl_O
16040 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  bj *pX;.  sqlite
16050 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
16060 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49   interp = (Tcl_I
16070 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f  nterp *)sqlite3_
16080 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
16090 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53  .  pX = Tcl_NewS
160a0 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66  tringObj("test_f
160b0 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20  unction", -1);. 
160c0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
160d0 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  t(pX);.  Tcl_Lis
160e0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
160f0 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63  t(interp, pX, Tc
16100 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
16110 55 54 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b  UTF-16LE", -1));
16120 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
16130 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
16140 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54  rp, pX, .      T
16150 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
16160 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
16170 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
16180 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  ]), -1));.  Tcl_
16190 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
161a0 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  , pX, 0);.  Tcl_
161b0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  DecrRefCount(pX)
161c0 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
161d0 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
161e0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
161f0 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63  Str(pVal, -1, Tc
16200 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
16210 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20  t(interp), .    
16220 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
16230 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
16240 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
16250 74 65 78 74 28 70 43 74 78 2c 28 63 68 61 72 2a  text(pCtx,(char*
16260 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
16270 65 78 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c  ext(pVal),-1,SQL
16280 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
16290 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
162a0 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74  ee(pVal);.}.stat
162b0 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
162c0 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20  ction_utf16be(. 
162d0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
162e0 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
162f0 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
16300 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
16310 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
16320 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
16330 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
16340 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
16350 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
16360 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
16370 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
16380 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
16390 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
163a0 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
163b0 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
163c0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
163d0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
163e0 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
163f0 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
16400 31 36 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54  16BE", -1));.  T
16410 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
16420 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
16430 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e  pX, .      Tcl_N
16440 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
16450 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
16460 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20  _text(argv[0]), 
16470 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
16480 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58  ObjEx(interp, pX
16490 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
164a0 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
164b0 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
164c0 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c  lueNew(0);.  sql
164d0 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
164e0 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65  pVal, -1, Tcl_Ge
164f0 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
16500 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51  terp), .      SQ
16510 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
16520 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  E_STATIC);.  sql
16530 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
16540 31 36 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33  16(pCtx, sqlite3
16550 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28  _value_text16le(
16560 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c  pVal),.      -1,
16570 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
16580 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  T);.  sqlite3_re
16590 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70 43  sult_text16be(pC
165a0 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  tx, sqlite3_valu
165b0 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29  e_text16le(pVal)
165c0 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49  ,.      -1, SQLI
165d0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
165e0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
165f0 74 65 78 74 31 36 6c 65 28 70 43 74 78 2c 20 73  text16le(pCtx, s
16600 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
16610 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20  t16le(pVal),.   
16620 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52     -1, SQLITE_TR
16630 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
16640 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
16650 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
16660 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
16670 36 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  6 */.static int 
16680 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
16690 73 74 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  st_function(.  v
166a0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
166b0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
166c0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
166d0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
166e0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
166f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16700 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
16710 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61  e3 *db;.  int va
16720 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
16730 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67  5 ) goto bad_arg
16740 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  s;.  if( getDbPo
16750 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
16760 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
16770 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
16780 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
16790 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
167a0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
167b0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
167c0 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [2], &val) ) ret
167d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
167e0 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20   if( val ){.    
167f0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
16800 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  unction(db, "tes
16810 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20  t_function", 1, 
16820 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20  SQLITE_UTF8, .  
16830 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65        interp, te
16840 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38  st_function_utf8
16850 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
16860 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
16870 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
16880 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
16890 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
168a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
168b0 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  ( val ){.    sql
168c0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
168d0 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66  tion(db, "test_f
168e0 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c  unction", 1, SQL
168f0 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20  ITE_UTF16LE, .  
16900 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65        interp, te
16910 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31  st_function_utf1
16920 36 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  6le, 0, 0);.  }.
16930 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
16940 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
16950 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16960 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [4], &val) ) ret
16970 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16980 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20   if( val ){.    
16990 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
169a0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  unction(db, "tes
169b0 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20  t_function", 1, 
169c0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
169d0 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c  .        interp,
169e0 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
169f0 74 66 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a 20  tf16be, 0, 0);. 
16a00 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
16a10 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a 20  _OK;.bad_args:. 
16a20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16a30 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
16a40 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
16a50 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63  be \"",.      Tc
16a60 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
16a70 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
16a80 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75  " <DB> <utf8> <u
16a90 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65  tf16le> <utf16be
16aa0 3e 22 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  >", 0);.#endif /
16ab0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
16ac0 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
16ad0 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
16ae0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 20 20  .** Usage:      
16af0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
16b00 65 72 72 73 74 72 20 3c 65 72 72 20 63 6f 64 65  errstr <err code
16b10 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 61  >.**.** Test tha
16b20 74 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61  t the english la
16b30 6e 67 75 61 67 65 20 73 74 72 69 6e 67 20 65 71  nguage string eq
16b40 75 69 76 61 6c 65 6e 74 73 20 66 6f 72 20 73 71  uivalents for sq
16b50 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 73  lite error codes
16b60 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20 54 68  .** are sane. Th
16b70 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  e parameter is a
16b80 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
16b90 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  enting an sqlite
16ba0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
16bb0 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  The result is a 
16bc0 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d  list of two elem
16bd0 65 6e 74 73 2c 20 74 68 65 20 73 74 72 69 6e 67  ents, the string
16be0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
16bf0 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20  of the.** error 
16c00 63 6f 64 65 20 61 6e 64 20 74 68 65 20 65 6e 67  code and the eng
16c10 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
16c20 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  planation..*/.st
16c30 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
16c40 54 43 4c 41 50 49 20 74 65 73 74 5f 65 72 72 73  TCLAPI test_errs
16c50 74 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  tr(.  void * cli
16c60 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
16c70 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
16c80 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
16c90 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
16ca0 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  [].){.  char *zC
16cb0 6f 64 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ode;.  int i;.  
16cc0 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20  if( objc!=1 ){. 
16cd0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
16ce0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
16cf0 62 6a 76 2c 20 22 3c 65 72 72 6f 72 20 63 6f 64  bjv, "<error cod
16d00 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a 43 6f  e>");.  }..  zCo
16d10 64 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  de = Tcl_GetStri
16d20 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 66  ng(objv[1]);.  f
16d30 6f 72 28 69 3d 30 3b 20 69 3c 32 30 30 3b 20 69  or(i=0; i<200; i
16d40 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d  ++){.    if( 0==
16d50 73 74 72 63 6d 70 28 74 31 45 72 72 6f 72 4e 61  strcmp(t1ErrorNa
16d60 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29 20 29 20  me(i), zCode) ) 
16d70 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c  break;.  }.  Tcl
16d80 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
16d90 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
16da0 65 33 45 72 72 53 74 72 28 69 29 2c 20 30 29 3b  e3ErrStr(i), 0);
16db0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
16dc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
16dd0 3a 20 20 20 20 62 72 65 61 6b 70 6f 69 6e 74 0a  :    breakpoint.
16de0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16df0 6e 65 20 65 78 69 73 74 73 20 66 6f 72 20 6f 6e  ne exists for on
16e00 65 20 70 75 72 70 6f 73 65 20 2d 20 74 6f 20 70  e purpose - to p
16e10 72 6f 76 69 64 65 20 61 20 70 6c 61 63 65 20 74  rovide a place t
16e20 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72 65 61 6b  o put a.** break
16e30 70 6f 69 6e 74 20 77 69 74 68 20 47 44 42 20 74  point with GDB t
16e40 68 61 74 20 63 61 6e 20 62 65 20 74 72 69 67 67  hat can be trigg
16e50 65 72 65 64 20 75 73 69 6e 67 20 54 43 4c 20 63  ered using TCL c
16e60 6f 64 65 2e 20 20 54 68 65 20 75 73 65 0a 2a 2a  ode.  The use.**
16e70 20 66 6f 72 20 74 68 69 73 20 69 73 20 77 68 65   for this is whe
16e80 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74  n a particular t
16e90 65 73 74 20 66 61 69 6c 73 20 6f 6e 20 28 73 61  est fails on (sa
16ea0 79 29 20 74 68 65 20 31 34 38 35 74 68 20 69 74  y) the 1485th it
16eb0 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 74  eration..** In t
16ec0 68 65 20 54 43 4c 20 74 65 73 74 20 73 63 72 69  he TCL test scri
16ed0 70 74 2c 20 77 65 20 63 61 6e 20 61 64 64 20 63  pt, we can add c
16ee0 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ode like this:.*
16ef0 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24 69 3d  *.**     if {$i=
16f00 3d 31 34 38 35 7d 20 62 72 65 61 6b 70 6f 69 6e  =1485} breakpoin
16f10 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72 75 6e  t.**.** Then run
16f20 20 74 65 73 74 66 69 78 74 75 72 65 20 69 6e 20   testfixture in 
16f30 74 68 65 20 64 65 62 75 67 67 65 72 20 61 6e 64  the debugger and
16f40 20 77 61 69 74 20 66 6f 72 20 74 68 65 20 62 72   wait for the br
16f50 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 66  eakpoint to.** f
16f60 69 72 65 2e 20 20 54 68 65 6e 20 61 64 64 69 74  ire.  Then addit
16f70 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69 6e 74  ional breakpoint
16f80 73 20 63 61 6e 20 62 65 20 73 65 74 20 74 6f 20  s can be set to 
16f90 74 72 61 63 65 20 64 6f 77 6e 20 74 68 65 20 62  trace down the b
16fa0 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
16fb0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
16fc0 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28  test_breakpoint(
16fd0 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
16fe0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16ff0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
17000 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
17010 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
17020 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
17030 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
17040 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17050 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
17060 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
17070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
17080 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
17090 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  ent */.){.  retu
170a0 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20  rn TCL_OK;      
170b0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
170c0 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61   */.}../*.** Usa
170d0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
170e0 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 20 53 54 4d  nd_zeroblob  STM
170f0 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65  T IDX N.**.** Te
17100 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
17110 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 69 6e 74  ind_zeroblob int
17120 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
17130 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
17140 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73  ement..** IDX is
17150 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
17160 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
17170 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
17180 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
17190 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62  d.** binds a N-b
171a0 79 74 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  yte zero-filled 
171b0 42 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64  BLOB to the wild
171c0 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
171d0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
171e0 49 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f  I test_bind_zero
171f0 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63  blob(.  void * c
17200 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
17210 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17220 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
17230 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
17240 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
17250 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
17260 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
17270 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  n;.  int rc;..  
17280 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
17290 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
172a0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
172b0 62 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e  bjv, "STMT IDX N
172c0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
172d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
172e0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
172f0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
17300 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
17310 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
17320 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17330 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
17340 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
17350 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
17360 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17370 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
17380 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
17390 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20  p, objv[3], &n) 
173a0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
173b0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
173c0 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
173d0 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29  b(pStmt, idx, n)
173e0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
173f0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
17400 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
17410 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
17420 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
17430 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17440 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
17450 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
17460 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
17470 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
17480 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
17490 72 6f 62 6c 6f 62 36 34 20 20 53 54 4d 54 20 49  roblob64  STMT I
174a0 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  DX N.**.** Test 
174b0 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
174c0 5f 7a 65 72 6f 62 6c 6f 62 36 34 20 69 6e 74 65  _zeroblob64 inte
174d0 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
174e0 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
174f0 6d 65 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20  ment..** IDX is 
17500 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
17510 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
17520 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
17530 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
17540 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79  .** binds a N-by
17550 74 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42  te zero-filled B
17560 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63  LOB to the wildc
17570 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
17580 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
17590 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
175a0 6c 6f 62 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  lob64(.  void * 
175b0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
175c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
175d0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
175e0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
175f0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
17600 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
17610 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 54 63 6c    int idx;.  Tcl
17620 5f 57 69 64 65 49 6e 74 20 6e 3b 0a 20 20 69 6e  _WideInt n;.  in
17630 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
17640 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
17650 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
17660 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
17670 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a 20 20 20  TMT IDX N");.   
17680 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17690 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
176a0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
176b0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
176c0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
176d0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
176e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
176f0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
17700 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
17710 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
17720 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
17730 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ( Tcl_GetWideInt
17740 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
17750 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72  objv[3], &n) ) r
17760 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17770 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
17780 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34  _bind_zeroblob64
17790 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b  (pStmt, idx, n);
177a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
177b0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
177c0 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
177d0 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
177e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
177f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17800 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
17810 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
17820 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
17830 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
17840 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17850 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
17860 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
17870 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
17880 64 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20 56 41  d_int  STMT N VA
17890 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  LUE.**.** Test t
178a0 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
178b0 69 6e 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20  int interface.  
178c0 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
178d0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
178e0 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
178f0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
17900 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
17910 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
17920 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
17930 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
17940 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77   VALUE to that w
17950 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
17960 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
17970 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 69  LAPI test_bind_i
17980 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
17990 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
179a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
179b0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
179c0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
179d0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
179e0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
179f0 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 76 61  nt idx;.  int va
17a00 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
17a10 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
17a20 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17a30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17a40 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17a50 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
17a60 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17a70 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
17a80 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
17a90 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  ALUE", 0);.    r
17aa0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17ab0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
17ac0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
17ad0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
17ae0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
17af0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
17b00 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
17b10 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
17b20 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
17b30 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
17b40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
17b50 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
17b60 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
17b70 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65 74  ], &value) ) ret
17b80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
17b90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
17ba0 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69  ind_int(pStmt, i
17bb0 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66  dx, value);.  if
17bc0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
17bd0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
17be0 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
17bf0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17c00 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
17c10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17c20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17c30 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
17c40 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
17c50 2a 2a 20 55 73 61 67 65 3a 20 20 20 69 6e 74 61  ** Usage:   inta
17c60 72 72 61 79 5f 61 64 64 72 20 20 49 4e 54 20 20  rray_addr  INT  
17c70 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ....**.** Return
17c80 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
17c90 61 20 43 2d 6c 61 6e 67 75 61 67 65 20 61 72 72  a C-language arr
17ca0 61 79 20 6f 66 20 33 32 2d 62 69 74 20 69 6e 74  ay of 32-bit int
17cb0 65 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  egers..**.** Spa
17cc0 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61  ce to hold the a
17cd0 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64  rray is obtained
17ce0 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20   from malloc(). 
17cf0 20 43 61 6c 6c 20 74 68 69 73 20 70 72 6f 63 65   Call this proce
17d00 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20 77 69 74  dure once.** wit
17d10 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 69  h no arguments i
17d20 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 6c 65 61  n order to relea
17d30 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45 61 63 68  se memory.  Each
17d40 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 70 72   call to this pr
17d50 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76 65 72 77  ocedure.** overw
17d60 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f  rites the previo
17d70 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  us array..*/.sta
17d80 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
17d90 43 4c 41 50 49 20 74 65 73 74 5f 69 6e 74 61 72  CLAPI test_intar
17da0 72 61 79 5f 61 64 64 72 28 0a 20 20 76 6f 69 64  ray_addr(.  void
17db0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
17dc0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
17dd0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
17de0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
17df0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
17e00 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  t i;.  static in
17e10 74 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 73 71 6c  t *p = 0;..  sql
17e20 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
17e30 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a  p = 0;.  if( obj
17e40 63 3e 31 20 29 7b 0a 20 20 20 20 70 20 3d 20 73  c>1 ){.    p = s
17e50 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
17e60 69 7a 65 6f 66 28 70 5b 30 5d 29 2a 28 6f 62 6a  izeof(p[0])*(obj
17e70 63 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20  c-1) );.    if( 
17e80 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  p==0 ) return TC
17e90 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 66 6f 72  L_ERROR;.    for
17ea0 28 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20  (i=0; i<objc-1; 
17eb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
17ec0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
17ed0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
17ee0 2b 69 5d 2c 20 26 70 5b 69 5d 29 20 29 7b 0a 20  +i], &p[i]) ){. 
17ef0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
17f00 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
17f10 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  p = 0;.        r
17f20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17f40 20 7d 20 20 0a 20 20 54 63 6c 5f 53 65 74 4f 62   }  .  Tcl_SetOb
17f50 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
17f60 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
17f70 6a 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  j((sqlite3_int64
17f80 29 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  )p));.  return T
17f90 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55  CL_OK;.}./*.** U
17fa0 73 61 67 65 3a 20 20 20 69 6e 74 61 72 72 61 79  sage:   intarray
17fb0 5f 61 64 64 72 20 20 49 4e 54 20 20 2e 2e 2e 0a  _addr  INT  ....
17fc0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
17fd0 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d   address of a C-
17fe0 6c 61 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f  language array o
17ff0 66 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  f 32-bit integer
18000 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  s..**.** Space t
18010 6f 20 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79  o hold the array
18020 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
18030 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c  m malloc().  Cal
18040 6c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  l this procedure
18050 20 6f 6e 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f   once.** with no
18060 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72   arguments in or
18070 64 65 72 20 74 6f 20 72 65 6c 65 61 73 65 20 6d  der to release m
18080 65 6d 6f 72 79 2e 20 20 45 61 63 68 20 63 61 6c  emory.  Each cal
18090 6c 20 74 6f 20 74 68 69 73 20 70 72 6f 63 65 64  l to this proced
180a0 75 72 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65  ure.** overwrite
180b0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 61  s the previous a
180c0 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
180d0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
180e0 49 20 74 65 73 74 5f 69 6e 74 36 34 61 72 72 61  I test_int64arra
180f0 79 5f 61 64 64 72 28 0a 20 20 76 6f 69 64 20 2a  y_addr(.  void *
18100 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
18110 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18120 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18130 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18140 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
18150 69 3b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  i;.  static sqli
18160 74 65 33 5f 69 6e 74 36 34 20 2a 70 20 3d 20 30  te3_int64 *p = 0
18170 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
18180 65 28 70 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20  e(p);.  p = 0;. 
18190 20 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20   if( objc>1 ){. 
181a0 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d     p = sqlite3_m
181b0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b  alloc( sizeof(p[
181c0 30 5d 29 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a  0])*(objc-1) );.
181d0 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
181e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
181f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
18200 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  objc-1; i++){.  
18210 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
18220 76 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  v;.      if( Tcl
18230 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
18240 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
18250 31 2b 69 5d 2c 20 26 76 29 20 29 7b 0a 20 20 20  1+i], &v) ){.   
18260 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
18270 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20  e(p);.        p 
18280 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
18290 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
182a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 5b 69       }.      p[i
182b0 5d 20 3d 20 76 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = v;.    }.  }
182c0 20 20 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52    .  Tcl_SetObjR
182d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
182e0 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
182f0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
18300 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
18310 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61  _OK;.}./*.** Usa
18320 67 65 3a 20 20 20 64 6f 75 62 6c 65 61 72 72 61  ge:   doublearra
18330 79 5f 61 64 64 72 20 20 49 4e 54 20 20 2e 2e 2e  y_addr  INT  ...
18340 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
18350 65 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 43  e address of a C
18360 2d 6c 61 6e 67 75 61 67 65 20 61 72 72 61 79 20  -language array 
18370 6f 66 20 64 6f 75 62 6c 65 73 2e 0a 2a 2a 0a 2a  of doubles..**.*
18380 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
18390 74 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74  the array is obt
183a0 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
183b0 63 28 29 2e 20 20 43 61 6c 6c 20 74 68 69 73 20  c().  Call this 
183c0 70 72 6f 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a  procedure once.*
183d0 2a 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65  * with no argume
183e0 6e 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  nts in order to 
183f0 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20  release memory. 
18400 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68   Each call to th
18410 69 73 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  is procedure.** 
18420 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20 70  overwrites the p
18430 72 65 76 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a  revious array..*
18440 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
18450 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
18460 64 6f 75 62 6c 65 61 72 72 61 79 5f 61 64 64 72  doublearray_addr
18470 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
18480 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
18490 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
184a0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
184b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
184c0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  .){.  int i;.  s
184d0 74 61 74 69 63 20 64 6f 75 62 6c 65 20 2a 70 20  tatic double *p 
184e0 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  = 0;..  sqlite3_
184f0 66 72 65 65 28 70 29 3b 0a 20 20 70 20 3d 20 30  free(p);.  p = 0
18500 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20 29  ;.  if( objc>1 )
18510 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
18520 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
18530 28 70 5b 30 5d 29 2a 28 6f 62 6a 63 2d 31 29 20  (p[0])*(objc-1) 
18540 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
18550 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18560 4f 52 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  OR;.    for(i=0;
18570 20 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b   i<objc-1; i++){
18580 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
18590 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
185a0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 2b 69  interp, objv[1+i
185b0 5d 2c 20 26 70 5b 69 5d 29 20 29 7b 0a 20 20 20  ], &p[i]) ){.   
185c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
185d0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20  e(p);.        p 
185e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
185f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18600 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18610 20 20 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52    .  Tcl_SetObjR
18620 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
18630 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
18640 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
18650 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
18660 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61  _OK;.}./*.** Usa
18670 67 65 3a 20 20 20 74 65 78 74 61 72 72 61 79 5f  ge:   textarray_
18680 61 64 64 72 20 20 54 45 58 54 20 2e 2e 2e 0a 2a  addr  TEXT ....*
18690 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
186a0 61 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d 6c  address of a C-l
186b0 61 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f 66  anguage array of
186c0 20 73 74 72 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20   strings..**.** 
186d0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
186e0 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69  e array is obtai
186f0 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
18700 29 2e 20 20 43 61 6c 6c 20 74 68 69 73 20 70 72  ).  Call this pr
18710 6f 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20  ocedure once.** 
18720 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
18730 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  s in order to re
18740 6c 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45  lease memory.  E
18750 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ach call to this
18760 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76   procedure.** ov
18770 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
18780 76 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a  vious array..*/.
18790 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
187a0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 74 65  E_TCLAPI test_te
187b0 78 74 61 72 72 61 79 5f 61 64 64 72 28 0a 20 20  xtarray_addr(.  
187c0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
187d0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
187e0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
187f0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18800 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18810 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69    int i;.  stati
18820 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 73  c int n = 0;.  s
18830 74 61 74 69 63 20 63 68 61 72 20 2a 2a 70 20 3d  tatic char **p =
18840 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
18850 69 3c 6e 3b 20 69 2b 2b 29 20 73 71 6c 69 74 65  i<n; i++) sqlite
18860 33 5f 66 72 65 65 28 70 5b 69 5d 29 3b 0a 20 20  3_free(p[i]);.  
18870 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
18880 0a 20 20 70 20 3d 20 30 3b 0a 20 20 69 66 28 20  .  p = 0;.  if( 
18890 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 70 20  objc>1 ){.    p 
188a0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
188b0 28 20 73 69 7a 65 6f 66 28 70 5b 30 5d 29 2a 28  ( sizeof(p[0])*(
188c0 6f 62 6a 63 2d 31 29 20 29 3b 0a 20 20 20 20 69  objc-1) );.    i
188d0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
188e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
188f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d  for(i=0; i<objc-
18900 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  1; i++){.      p
18910 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  [i] = sqlite3_mp
18920 72 69 6e 74 66 28 22 25 73 22 2c 20 54 63 6c 5f  rintf("%s", Tcl_
18930 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
18940 2b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  +i]));.    }.  }
18950 0a 20 20 6e 20 3d 20 6f 62 6a 63 2d 31 3b 0a 20  .  n = objc-1;. 
18960 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
18970 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
18980 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 73 71 6c  wWideIntObj((sql
18990 69 74 65 33 5f 69 6e 74 36 34 29 70 29 29 3b 0a  ite3_int64)p));.
189a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
189b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
189c0 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
189d0 5f 69 6e 74 36 34 20 20 53 54 4d 54 20 4e 20 56  _int64  STMT N V
189e0 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
189f0 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
18a00 5f 69 6e 74 36 34 20 69 6e 74 65 72 66 61 63 65  _int64 interface
18a10 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
18a20 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
18a30 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
18a40 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
18a50 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
18a60 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
18a70 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
18a80 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ds a 64-bit inte
18a90 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61  ger VALUE to tha
18aa0 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  t wildcard..*/.s
18ab0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
18ac0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e  _TCLAPI test_bin
18ad0 64 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20  d_int64(.  void 
18ae0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18af0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18b00 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18b10 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18b20 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
18b30 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
18b40 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 54  ;.  int idx;.  T
18b50 63 6c 5f 57 69 64 65 49 6e 74 20 76 61 6c 75 65  cl_WideInt value
18b60 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
18b70 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
18b80 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
18b90 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
18ba0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
18bb0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
18bc0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
18bd0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
18be0 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
18bf0 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
18c00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18c10 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
18c20 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
18c30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18c40 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
18c50 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18c60 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
18c70 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
18c80 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
18c90 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
18ca0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
18cb0 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
18cc0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
18cd0 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65  3], &value) ) re
18ce0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18cf0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
18d00 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
18d10 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20  , idx, value);. 
18d20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
18d30 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
18d40 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
18d50 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
18d60 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
18d70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18d80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18d90 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
18da0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
18db0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
18dc0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
18dd0 6c 65 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  le  STMT N VALUE
18de0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
18df0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
18e00 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ble interface.  
18e10 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
18e20 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
18e30 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
18e40 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
18e50 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
18e60 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
18e70 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
18e80 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
18e90 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77   VALUE to that w
18ea0 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
18eb0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
18ec0 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 64  LAPI test_bind_d
18ed0 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20  ouble(.  void * 
18ee0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18ef0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18f00 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18f10 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18f20 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18f30 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
18f40 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75    int idx;.  dou
18f50 62 6c 65 20 76 61 6c 75 65 20 3d 20 30 3b 0a 20  ble value = 0;. 
18f60 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
18f70 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 69   char *zVal;.  i
18f80 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63  nt i;.  static c
18f90 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
18fa0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
18fb0 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
18fc0 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
18fd0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
18fe0 61 6c 75 65 20 2a 2f 0a 20 20 20 20 75 6e 73 69  alue */.    unsi
18ff0 67 6e 65 64 20 69 6e 74 20 69 55 70 70 65 72 3b  gned int iUpper;
19000 20 20 20 2f 2a 20 55 70 70 65 72 20 33 32 20 62     /* Upper 32 b
19010 69 74 73 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67  its */.    unsig
19020 6e 65 64 20 69 6e 74 20 69 4c 6f 77 65 72 3b 20  ned int iLower; 
19030 20 20 2f 2a 20 4c 6f 77 65 72 20 33 32 20 62 69    /* Lower 32 bi
19040 74 73 20 2a 2f 0a 20 20 7d 20 61 53 70 65 63 69  ts */.  } aSpeci
19050 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  alFp[] = {.    {
19060 20 20 22 4e 61 4e 22 2c 20 20 20 20 20 20 30 78    "NaN",      0x
19070 37 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66  7fffffff, 0xffff
19080 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22  ffff },.    {  "
19090 53 4e 61 4e 22 2c 20 20 20 20 20 30 78 37 66 66  SNaN",     0x7ff
190a0 37 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66  7ffff, 0xfffffff
190b0 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61  f },.    {  "-Na
190c0 4e 22 2c 20 20 20 20 20 30 78 66 66 66 66 66 66  N",     0xffffff
190d0 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d  ff, 0xffffffff }
190e0 2c 0a 20 20 20 20 7b 20 20 22 2d 53 4e 61 4e 22  ,.    {  "-SNaN"
190f0 2c 20 20 20 20 30 78 66 66 66 37 66 66 66 66 2c  ,    0xfff7ffff,
19100 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20   0xffffffff },. 
19110 20 20 20 7b 20 20 22 2b 49 6e 66 22 2c 20 20 20     {  "+Inf",   
19120 20 20 30 78 37 66 66 30 30 30 30 30 2c 20 30 78    0x7ff00000, 0x
19130 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20  00000000 },.    
19140 7b 20 20 22 2d 49 6e 66 22 2c 20 20 20 20 20 30  {  "-Inf",     0
19150 78 66 66 66 30 30 30 30 30 2c 20 30 78 30 30 30  xfff00000, 0x000
19160 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20  00000 },.    {  
19170 22 45 70 73 69 6c 6f 6e 22 2c 20 20 30 78 30 30  "Epsilon",  0x00
19180 30 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  000000, 0x000000
19190 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 45  01 },.    {  "-E
191a0 70 73 69 6c 6f 6e 22 2c 20 30 78 38 30 30 30 30  psilon", 0x80000
191b0 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 31 20  000, 0x00000001 
191c0 7d 2c 0a 20 20 20 20 7b 20 20 22 4e 61 4e 30 22  },.    {  "NaN0"
191d0 2c 20 20 20 20 20 30 78 37 66 66 38 30 30 30 30  ,     0x7ff80000
191e0 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a  , 0x00000000 },.
191f0 20 20 20 20 7b 20 20 22 2d 4e 61 4e 30 22 2c 20      {  "-NaN0", 
19200 20 20 20 30 78 66 66 66 38 30 30 30 30 2c 20 30     0xfff80000, 0
19210 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d  x00000000 },.  }
19220 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
19230 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
19240 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
19250 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
19260 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
19270 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
19280 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
19290 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
192a0 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  N VALUE", 0);.  
192b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
192c0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
192d0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
192e0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
192f0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
19300 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
19310 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
19320 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
19330 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
19340 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
19350 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
19360 2f 2a 20 49 6e 74 65 72 63 65 70 74 20 74 68 65  /* Intercept the
19370 20 73 74 72 69 6e 67 20 22 4e 61 4e 22 20 61 6e   string "NaN" an
19380 64 20 67 65 6e 65 72 61 74 65 20 61 20 4e 61 4e  d generate a NaN
19390 20 76 61 6c 75 65 20 66 6f 72 20 69 74 2e 0a 20   value for it.. 
193a0 20 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 73 74   ** All other st
193b0 72 69 6e 67 73 20 61 72 65 20 70 61 73 73 65 64  rings are passed
193c0 20 74 68 72 6f 75 67 68 20 74 6f 20 54 63 6c 5f   through to Tcl_
193d0 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
193e0 28 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f 47 65 74  ()..  ** Tcl_Get
193f0 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 20  DoubleFromObj() 
19400 73 68 6f 75 6c 64 20 75 6e 64 65 72 73 74 61 6e  should understan
19410 64 20 22 4e 61 4e 22 20 62 75 74 20 73 6f 6d 65  d "NaN" but some
19420 20 76 65 72 73 69 6f 6e 73 0a 20 20 2a 2a 20 63   versions.  ** c
19430 6f 6e 74 61 69 6e 20 61 20 62 75 67 2e 0a 20 20  ontain a bug..  
19440 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20 54 63 6c 5f  */.  zVal = Tcl_
19450 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
19460 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
19470 3c 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c  <sizeof(aSpecial
19480 46 70 29 2f 73 69 7a 65 6f 66 28 61 53 70 65 63  Fp)/sizeof(aSpec
19490 69 61 6c 46 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b  ialFp[0]); i++){
194a0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
194b0 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e  aSpecialFp[i].zN
194c0 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30 20 29 7b  ame, zVal)==0 ){
194d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75  .      sqlite3_u
194e0 69 6e 74 36 34 20 78 3b 0a 20 20 20 20 20 20 78  int64 x;.      x
194f0 20 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d   = aSpecialFp[i]
19500 2e 69 55 70 70 65 72 3b 0a 20 20 20 20 20 20 78  .iUpper;.      x
19510 20 3c 3c 3d 20 33 32 3b 0a 20 20 20 20 20 20 78   <<= 32;.      x
19520 20 7c 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69   |= aSpecialFp[i
19530 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20 20 20 20 20  ].iLower;.      
19540 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
19550 61 6c 75 65 29 3d 3d 38 20 29 3b 0a 20 20 20 20  alue)==8 );.    
19560 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
19570 28 78 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  (x)==8 );.      
19580 6d 65 6d 63 70 79 28 26 76 61 6c 75 65 2c 20 26  memcpy(&value, &
19590 78 2c 20 38 29 3b 0a 20 20 20 20 20 20 62 72 65  x, 8);.      bre
195a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
195b0 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 53  if( i>=sizeof(aS
195c0 70 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66  pecialFp)/sizeof
195d0 28 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 20  (aSpecialFp[0]) 
195e0 26 26 0a 20 20 20 20 20 20 20 20 20 54 63 6c 5f  &&.         Tcl_
195f0 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
19600 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
19610 2c 20 26 76 61 6c 75 65 29 20 29 7b 0a 20 20 20  , &value) ){.   
19620 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19630 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
19640 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
19650 65 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  e(pStmt, idx, va
19660 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
19670 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
19680 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
19690 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
196a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
196b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
196c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
196d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
196e0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
196f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
19700 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
19710 64 5f 6e 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a  d_null  STMT N.*
19720 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
19730 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20  lite3_bind_null 
19740 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
19750 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
19760 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
19770 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
19780 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
19790 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
197a0 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
197b0 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55  nd.** binds a NU
197c0 4c 4c 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  LL to the wildca
197d0 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
197e0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
197f0 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a  test_bind_null(.
19800 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
19810 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
19820 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
19830 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
19840 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
19850 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
19860 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
19870 64 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  dx;.  int rc;.. 
19880 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
19890 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
198a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
198b0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
198c0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
198d0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
198e0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
198f0 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c 20   0), " STMT N", 
19900 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
19910 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
19920 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
19930 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19940 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19950 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
19960 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19970 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
19980 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
19990 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
199a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
199b0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
199c0 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
199d0 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20  mt, idx);.  if( 
199e0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
199f0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
19a00 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
19a10 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19a20 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
19a30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
19a40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19a50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
19a60 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
19a70 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
19a80 5f 62 69 6e 64 5f 74 65 78 74 20 20 53 54 4d 54  _bind_text  STMT
19a90 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a   N STRING BYTES.
19aa0 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
19ab0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
19ac0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
19ad0 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
19ae0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
19af0 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
19b00 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
19b10 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
19b20 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
19b30 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55  and.** binds a U
19b40 54 46 2d 38 20 73 74 72 69 6e 67 20 53 54 52 49  TF-8 string STRI
19b50 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  NG to the wildca
19b60 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20  rd.  The string 
19b70 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a  is BYTES bytes.*
19b80 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  * long..*/.stati
19b90 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
19ba0 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 74 65  API test_bind_te
19bb0 78 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  xt(.  void * cli
19bc0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
19bd0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
19be0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
19bf0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
19c00 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
19c10 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
19c20 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  nt idx;.  int by
19c30 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
19c40 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
19c50 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
19c60 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19c70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
19c80 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
19c90 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
19ca0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
19cb0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
19cc0 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
19cd0 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  LUE BYTES", 0);.
19ce0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19cf0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
19d00 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
19d10 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
19d20 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
19d30 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
19d40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
19d50 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
19d60 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
19d70 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
19d80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19d90 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29   value = (char*)
19da0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
19db0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
19dc0 20 26 62 79 74 65 73 29 3b 0a 20 20 69 66 28 20   &bytes);.  if( 
19dd0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
19de0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
19df0 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
19e00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
19e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
19e20 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
19e30 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65  idx, value, byte
19e40 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  s, SQLITE_TRANSI
19e50 45 4e 54 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ENT);.  if( sqli
19e60 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
19e70 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
19e80 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
19e90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19ea0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19eb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
19ec0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19ed0 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
19ee0 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
19ef0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19f00 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
19f10 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
19f20 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
19f30 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 3f 2d  3_bind_text16 ?-
19f40 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 53  static? STMT N S
19f50 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a  TRING BYTES.**.*
19f60 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
19f70 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 69  e3_bind_text16 i
19f80 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
19f90 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
19fa0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
19fb0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
19fc0 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
19fd0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
19fe0 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
19ff0 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46  d.** binds a UTF
1a000 2d 31 36 20 73 74 72 69 6e 67 20 53 54 52 49 4e  -16 string STRIN
1a010 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  G to the wildcar
1a020 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69  d.  The string i
1a030 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a  s BYTES bytes.**
1a040 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   long..*/.static
1a050 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1a060 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78  PI test_bind_tex
1a070 74 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t16(.  void * cl
1a080 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1a090 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1a0a0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1a0b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1a0c0 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
1a0d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1a0e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1a0f0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
1a100 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  x;.  int bytes;.
1a110 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20    char *value;. 
1a120 20 69 6e 74 20 72 63 3b 0a 0a 20 20 76 6f 69 64   int rc;..  void
1a130 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20   (*xDel)(void*) 
1a140 3d 20 28 6f 62 6a 63 3d 3d 36 3f 53 51 4c 49 54  = (objc==6?SQLIT
1a150 45 5f 53 54 41 54 49 43 3a 53 51 4c 49 54 45 5f  E_STATIC:SQLITE_
1a160 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 54 63  TRANSIENT);.  Tc
1a170 6c 5f 4f 62 6a 20 2a 6f 53 74 6d 74 20 20 20 20  l_Obj *oStmt    
1a180 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a  = objv[objc-4];.
1a190 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20    Tcl_Obj *oN   
1a1a0 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d      = objv[objc-
1a1b0 33 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  3];.  Tcl_Obj *o
1a1c0 53 74 72 69 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f  String  = objv[o
1a1d0 62 6a 63 2d 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62  bjc-2];.  Tcl_Ob
1a1e0 6a 20 2a 6f 42 79 74 65 73 20 20 20 3d 20 6f 62  j *oBytes   = ob
1a1f0 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69  jv[objc-1];..  i
1a200 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
1a210 6a 63 21 3d 36 29 7b 0a 20 20 20 20 54 63 6c 5f  jc!=6){.    Tcl_
1a220 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a230 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1a240 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a250 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
1a260 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
1a270 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
1a280 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45  TMT N VALUE BYTE
1a290 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
1a2a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a2b0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1a2c0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1a2d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 53  Tcl_GetString(oS
1a2e0 74 6d 74 29 2c 20 26 70 53 74 6d 74 29 20 29 20  tmt), &pStmt) ) 
1a2f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a300 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1a310 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1a320 2c 20 6f 4e 2c 20 26 69 64 78 29 20 29 20 72 65  , oN, &idx) ) re
1a330 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a340 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a    value = (char*
1a350 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61  )Tcl_GetByteArra
1a360 79 46 72 6f 6d 4f 62 6a 28 6f 53 74 72 69 6e 67  yFromObj(oString
1a370 2c 20 30 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  , 0);.  if( Tcl_
1a380 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1a390 74 65 72 70 2c 20 6f 42 79 74 65 73 2c 20 26 62  terp, oBytes, &b
1a3a0 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
1a3b0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
1a3c0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
1a3d0 65 78 74 31 36 28 70 53 74 6d 74 2c 20 69 64 78  ext16(pStmt, idx
1a3e0 2c 20 28 76 6f 69 64 20 2a 29 76 61 6c 75 65 2c  , (void *)value,
1a3f0 20 62 79 74 65 73 2c 20 78 44 65 6c 29 3b 0a 20   bytes, xDel);. 
1a400 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1a410 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
1a420 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
1a430 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
1a440 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
1a450 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a460 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a470 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
1a480 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
1a490 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a4a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1a4b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1a4c0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
1a4d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1a4e0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1a4f0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
1a500 6c 6f 62 20 3f 2d 73 74 61 74 69 63 3f 20 53 54  lob ?-static? ST
1a510 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45 53 0a  MT N DATA BYTES.
1a520 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
1a530 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
1a540 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
1a550 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
1a560 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
1a570 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
1a580 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
1a590 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
1a5a0 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
1a5b0 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 42  and.** binds a B
1a5c0 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63  LOB to the wildc
1a5d0 61 72 64 2e 20 20 54 68 65 20 42 4c 4f 42 20 69  ard.  The BLOB i
1a5e0 73 20 42 59 54 45 53 20 62 79 74 65 73 20 69 6e  s BYTES bytes in
1a5f0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
1a600 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1a610 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f  PI test_bind_blo
1a620 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  b(.  void * clie
1a630 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1a640 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1a650 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1a660 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1a670 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1a680 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1a690 74 20 6c 65 6e 2c 20 69 64 78 3b 0a 20 20 69 6e  t len, idx;.  in
1a6a0 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20  t bytes;.  char 
1a6b0 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63  *value;.  int rc
1a6c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 73 74  ;.  sqlite3_dest
1a6d0 72 75 63 74 6f 72 5f 74 79 70 65 20 78 44 65 73  ructor_type xDes
1a6e0 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45  tructor = SQLITE
1a6f0 5f 54 52 41 4e 53 49 45 4e 54 3b 0a 0a 20 20 69  _TRANSIENT;..  i
1a700 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
1a710 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=6 ){.    Tcl
1a720 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a730 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1a740 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1a750 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
1a760 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
1a770 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
1a780 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45  STMT N DATA BYTE
1a790 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
1a7a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a7b0 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36  }..  if( objc==6
1a7c0 20 29 7b 0a 20 20 20 20 78 44 65 73 74 72 75 63   ){.    xDestruc
1a7d0 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 53 54 41  tor = SQLITE_STA
1a7e0 54 49 43 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b  TIC;.    objv++;
1a7f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1a800 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1a810 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1a820 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1a830 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1a840 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1a850 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1a860 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1a870 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
1a880 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 76 61 6c  CL_ERROR;..  val
1a890 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f  ue = (char*)Tcl_
1a8a0 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
1a8b0 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65  Obj(objv[3], &le
1a8c0 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  n);.  if( Tcl_Ge
1a8d0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1a8e0 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79  rp, objv[4], &by
1a8f0 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
1a900 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
1a910 62 79 74 65 73 3e 6c 65 6e 20 29 7b 0a 20 20 20  bytes>len ){.   
1a920 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
1a930 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1a940 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
1a950 66 29 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20  f), zBuf,.      
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1a970 63 61 6e 6e 6f 74 20 75 73 65 20 25 64 20 62 6c  cannot use %d bl
1a980 6f 62 20 62 79 74 65 73 2c 20 68 61 76 65 20 25  ob bytes, have %
1a990 64 22 2c 20 62 79 74 65 73 2c 20 6c 65 6e 29 3b  d", bytes, len);
1a9a0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1a9b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1a9c0 75 66 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  uf, -1);.    ret
1a9d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a9e0 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
1a9f0 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
1aa00 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20  mt, idx, value, 
1aa10 62 79 74 65 73 2c 20 78 44 65 73 74 72 75 63 74  bytes, xDestruct
1aa20 6f 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  or);.  if( sqlit
1aa30 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
1aa40 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
1aa50 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
1aa60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1aa70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1aa80 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1aa90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1aaa0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1aab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1aac0 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
1aad0 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
1aae0 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74    STMT.**.** Ret
1aaf0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1ab00 66 20 77 69 6c 64 63 61 72 64 73 20 69 6e 20 74  f wildcards in t
1ab10 68 65 20 67 69 76 65 6e 20 73 74 61 74 65 6d 65  he given stateme
1ab20 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1ab30 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1ab40 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
1ab50 74 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  ter_count(.  voi
1ab60 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1ab70 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1ab80 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1ab90 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1aba0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1abb0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1abc0 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
1abd0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1abe0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1abf0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
1ac00 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
1ac10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1ac20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1ac30 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1ac40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1ac50 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1ac60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ac70 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1ac80 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1ac90 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
1aca0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
1acb0 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a  count(pStmt)));.
1acc0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1acd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1ace0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1acf0 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 20 20  parameter_name  
1ad00 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65  STMT  N.**.** Re
1ad10 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
1ad20 20 74 68 65 20 4e 74 68 20 77 69 6c 64 63 61 72   the Nth wildcar
1ad30 64 2e 20 20 54 68 65 20 66 69 72 73 74 20 77 69  d.  The first wi
1ad40 6c 64 63 61 72 64 20 69 73 20 31 2e 0a 2a 2a 20  ldcard is 1..** 
1ad50 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  An empty string 
1ad60 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 4e  is returned if N
1ad70 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
1ad80 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63   or if the wildc
1ad90 61 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65 6c 65  ard.** is namele
1ada0 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ss..*/.static in
1adb0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1adc0 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
1add0 74 65 72 5f 6e 61 6d 65 28 0a 20 20 76 6f 69 64  ter_name(.  void
1ade0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1adf0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1ae00 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1ae10 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1ae20 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1ae30 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1ae40 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  t;.  int i;..  i
1ae50 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1ae60 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1ae70 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1ae80 6a 76 2c 20 22 53 54 4d 54 20 4e 22 29 3b 0a 20  jv, "STMT N");. 
1ae90 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1aea0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1aeb0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1aec0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1aed0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1aee0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1aef0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1af00 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1af10 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1af20 5d 2c 20 26 69 29 20 29 20 72 65 74 75 72 6e 20  ], &i) ) return 
1af30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
1af40 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1af50 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f  terp, .     Tcl_
1af60 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
1af70 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
1af80 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  ter_name(pStmt,i
1af90 29 2c 2d 31 29 0a 20 20 29 3b 0a 20 20 72 65 74  ),-1).  );.  ret
1afa0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1afb0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
1afc0 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
1afd0 65 74 65 72 5f 69 6e 64 65 78 20 20 53 54 4d 54  eter_index  STMT
1afe0 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74    NAME.**.** Ret
1aff0 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1b000 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 61   the wildcard ca
1b010 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 52 65 74 75  lled NAME.  Retu
1b020 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 69 73  rn 0 if there is
1b030 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 77 69 6c 64  .** no such wild
1b040 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
1b050 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
1b060 49 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61  I test_bind_para
1b070 6d 65 74 65 72 5f 69 6e 64 65 78 28 0a 20 20 76  meter_index(.  v
1b080 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1b090 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1b0a0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1b0b0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1b0c0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1b0d0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1b0e0 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
1b0f0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1b100 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1b110 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
1b120 54 4d 54 20 4e 41 4d 45 22 29 3b 0a 20 20 20 20  TMT NAME");.    
1b130 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b140 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
1b150 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1b160 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1b170 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1b180 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1b190 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
1b1a0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1b1b0 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49  , .     Tcl_NewI
1b1c0 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20 20 73 71  ntObj(.       sq
1b1d0 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
1b1e0 65 74 65 72 5f 69 6e 64 65 78 28 70 53 74 6d 74  eter_index(pStmt
1b1f0 2c 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  ,Tcl_GetString(o
1b200 62 6a 76 5b 32 5d 29 29 0a 20 20 20 20 20 29 0a  bjv[2])).     ).
1b210 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43    );.  return TC
1b220 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1b230 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1b240 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 53  clear_bindings S
1b250 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  TMT.**.*/.static
1b260 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1b270 50 49 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69  PI test_clear_bi
1b280 6e 64 69 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a  ndings(.  void *
1b290 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1b2a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1b2b0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1b2c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1b2d0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1b2e0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1b2f0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1b300 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1b310 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1b320 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29  1, objv, "STMT")
1b330 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1b340 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1b350 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1b360 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1b370 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1b380 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1b390 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1b3a0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1b3b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1b3c0 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c  ntObj(sqlite3_cl
1b3d0 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74  ear_bindings(pSt
1b3e0 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
1b3f0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  TCL_OK;.}../*. *
1b400 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
1b410 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
1b420 73 20 53 54 4d 54 0a 20 2a 2a 0a 20 2a 2f 0a 73  s STMT. **. */.s
1b430 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1b440 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 5f 6e 75  lear_bindings_nu
1b450 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ll(.  void * cli
1b460 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1b470 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1b480 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1b490 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1b4a0 5b 5d 0a 29 7b 20 20 0a 20 20 69 66 28 20 6f 62  [].){  .  if( ob
1b4b0 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 72 65 74  jc!=1 ){.    ret
1b4c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b4d0 20 7d 0a 20 20 2f 2a 20 74 65 73 74 20 66 6f 72   }.  /* test for
1b4e0 20 68 61 6e 64 6c 69 6e 67 20 4e 55 4c 4c 20 3c   handling NULL <
1b4f0 72 64 61 72 3a 2f 2f 70 72 6f 62 6c 65 6d 2f 36  rdar://problem/6
1b500 36 34 36 33 33 31 3e 20 2a 2f 0a 20 20 54 63 6c  646331> */.  Tcl
1b510 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1b520 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1b530 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61  Obj(sqlite3_clea
1b540 72 5f 62 69 6e 64 69 6e 67 73 28 30 29 29 29 3b  r_bindings(0)));
1b550 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1b560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1b570 3a 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65  :   sqlite3_slee
1b580 70 20 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a  p MILLISECONDS.*
1b590 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1b5a0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1b5b0 73 6c 65 65 70 28 0a 20 20 76 6f 69 64 20 2a 20  sleep(.  void * 
1b5c0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1b5d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b5e0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1b5f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1b600 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d  bjv[].){.  int m
1b610 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  s;..  if( objc!=
1b620 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1b630 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1b640 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c  , 1, objv, "MILL
1b650 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20  ISECONDS");.    
1b660 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b670 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
1b680 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1b690 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
1b6a0 6d 73 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ms) ){.    retur
1b6b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b6c0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1b6d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1b6e0 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
1b6f0 33 5f 73 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20  3_sleep(ms)));. 
1b700 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1b710 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1b720 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1b730 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a  _errcode DB.**.*
1b740 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72  * Return the str
1b750 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
1b760 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
1b770 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20  ecent sqlite3_* 
1b780 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  API.** error cod
1b790 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f  e. e.g. "SQLITE_
1b7a0 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69  ERROR"..*/.stati
1b7b0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
1b7c0 41 50 49 20 74 65 73 74 5f 65 78 5f 65 72 72 63  API test_ex_errc
1b7d0 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ode(.  void * cl
1b7e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1b7f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1b800 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1b810 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1b820 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1b830 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
1b840 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1b850 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1b860 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1b870 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1b880 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1b890 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1b8a0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
1b8b0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
1b8c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b8d0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1b8e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1b8f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1b900 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
1b910 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b920 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 74  rc = sqlite3_ext
1b930 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 64 62  ended_errcode(db
1b940 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
1b950 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1b960 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
1b970 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
1b980 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
1b990 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1b9a0 69 74 65 33 5f 65 72 72 63 6f 64 65 20 44 42 0a  ite3_errcode DB.
1b9b0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1b9c0 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
1b9d0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  tation of the mo
1b9e0 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
1b9f0 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72  3_* API.** error
1ba00 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c   code. e.g. "SQL
1ba10 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73  ITE_ERROR"..*/.s
1ba20 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1ba30 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 65 72 72  _TCLAPI test_err
1ba40 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  code(.  void * c
1ba50 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1ba60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1ba70 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1ba80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1ba90 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1baa0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
1bab0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1bac0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1bad0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1bae0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1baf0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1bb00 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1bb10 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1bb20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1bb30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1bb40 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1bb50 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1bb60 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1bb70 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1bb80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1bb90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
1bba0 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c  rcode(db);.  Tcl
1bbb0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1bbc0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
1bbd0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
1bbe0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1bbf0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1bc00 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 65 72  ge:   sqlite3_er
1bc10 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  rmsg DB.**.** Re
1bc20 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 38 20  turns the UTF-8 
1bc30 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
1bc40 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
1bc50 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74  age string for t
1bc60 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
1bc70 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20  t sqlite3_* API 
1bc80 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
1bc90 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
1bca0 49 20 74 65 73 74 5f 65 72 72 6d 73 67 28 0a 20  I test_errmsg(. 
1bcb0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1bcc0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1bcd0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1bce0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1bcf0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1bd00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1bd10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
1bd20 72 72 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rr;..  if( objc!
1bd30 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1bd40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1bd50 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1bd60 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1bd70 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1bd80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1bd90 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
1bda0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1bdb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1bdc0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1bdd0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1bde0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1bdf0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1be00 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69  ;..  zErr = sqli
1be10 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a  te3_errmsg(db);.
1be20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1be30 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1be40 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72  ewStringObj(zErr
1be50 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e  , -1));.  return
1be60 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1be70 2a 20 55 73 61 67 65 3a 20 20 20 74 65 73 74 5f  * Usage:   test_
1be80 65 72 72 6d 73 67 31 36 20 44 42 0a 2a 2a 0a 2a  errmsg16 DB.**.*
1be90 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54  * Returns the UT
1bea0 46 2d 31 36 20 72 65 70 72 65 73 65 6e 74 61 74  F-16 representat
1beb0 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72  ion of the error
1bec0 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20   message string 
1bed0 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  for the.** most 
1bee0 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a  recent sqlite3_*
1bef0 20 41 50 49 20 63 61 6c 6c 2e 20 54 68 69 73 20   API call. This 
1bf00 69 73 20 61 20 62 79 74 65 20 61 72 72 61 79 20  is a byte array 
1bf10 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 54 43  object at the TC
1bf20 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e 64  L .** level, and
1bf30 20 69 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65   it includes the
1bf40 20 30 78 30 30 20 30 78 30 30 20 74 65 72 6d 69   0x00 0x00 termi
1bf50 6e 61 74 6f 72 20 62 79 74 65 73 20 61 74 20 74  nator bytes at t
1bf60 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
1bf70 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a   UTF-16 string..
1bf80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1bf90 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
1bfa0 5f 65 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69  _errmsg16(.  voi
1bfb0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1bfc0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1bfd0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1bfe0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1bff0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1c000 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c010 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
1c020 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   *db;.  const vo
1c030 69 64 20 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73  id *zErr;.  cons
1c040 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
1c050 20 62 79 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69   bytes = 0;..  i
1c060 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1c070 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1c080 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1c090 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1c0a0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1c0b0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1c0c0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
1c0d0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1c0e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1c0f0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1c100 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1c110 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1c120 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1c130 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72  CL_ERROR;..  zEr
1c140 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  r = sqlite3_errm
1c150 73 67 31 36 28 64 62 29 3b 0a 20 20 69 66 28 20  sg16(db);.  if( 
1c160 7a 45 72 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20  zErr ){.    z = 
1c170 7a 45 72 72 3b 0a 20 20 20 20 66 6f 72 28 62 79  zErr;.    for(by
1c180 74 65 73 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20  tes=0; z[bytes] 
1c190 7c 7c 20 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62  || z[bytes+1]; b
1c1a0 79 74 65 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20  ytes+=2){}.  }. 
1c1b0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1c1c0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1c1d0 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45  wByteArrayObj(zE
1c1e0 72 72 2c 20 62 79 74 65 73 29 29 3b 0a 23 65 6e  rr, bytes));.#en
1c1f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1c200 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
1c210 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c220 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1c230 69 74 65 33 5f 70 72 65 70 61 72 65 20 44 42 20  ite3_prepare DB 
1c240 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76  sql bytes ?tailv
1c250 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  ar?.**.** Compil
1c260 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
1c270 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
1c280 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
1c290 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
1c2a0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1c2b0 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
1c2c0 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
1c2d0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
1c2e0 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
1c2f0 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
1c300 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
1c310 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
1c320 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
1c330 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
1c340 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1c350 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1c360 20 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20   test_prepare(. 
1c370 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1c380 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1c390 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1c3a0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1c3b0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1c3c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1c3d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1c3e0 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  ql;.  int bytes;
1c3f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1c400 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Tail = 0;.  sqli
1c410 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1c420 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
1c430 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
1c440 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
1c450 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
1c460 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1c470 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1c480 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1c490 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1c4a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c4b0 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
1c4c0 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
1c4d0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1c4e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1c4f0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1c500 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1c510 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1c520 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
1c530 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
1c540 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sql = Tcl_GetStr
1c550 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
1c560 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1c570 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1c580 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
1c590 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c5a0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
1c5b0 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a  e3_prepare(db, z
1c5c0 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
1c5d0 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a  mt, objc>=5 ? &z
1c5e0 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 54 63 6c  Tail : 0);.  Tcl
1c5f0 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
1c600 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  erp);.  if( sqli
1c610 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
1c620 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
1c630 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c640 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26  R;.  if( zTail &
1c650 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20  & objc>=5 ){.   
1c660 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b   if( bytes>=0 ){
1c670 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62  .      bytes = b
1c680 79 74 65 73 20 2d 20 28 69 6e 74 29 28 7a 54 61  ytes - (int)(zTa
1c690 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  il-zSql);.    }.
1c6a0 20 20 20 20 69 66 28 20 28 69 6e 74 29 73 74 72      if( (int)str
1c6b0 6c 65 6e 28 7a 54 61 69 6c 29 3c 62 79 74 65 73  len(zTail)<bytes
1c6c0 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20   ){.      bytes 
1c6d0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  = (int)strlen(zT
1c6e0 61 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ail);.    }.    
1c6f0 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
1c700 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
1c710 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  0, Tcl_NewString
1c720 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73  Obj(zTail, bytes
1c730 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ), 0);.  }.  if(
1c740 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c750 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
1c760 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tmt==0 );.    sq
1c770 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1c780 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
1c790 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
1c7a0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1c7b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1c7c0 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
1c7d0 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
1c7e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c7f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
1c800 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
1c810 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1c820 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1c830 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
1c840 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c850 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1c860 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1c870 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
1c880 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c890 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1c8a0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20  ite3_prepare_v2 
1c8b0 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
1c8c0 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ilvar?.**.** Com
1c8d0 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65  pile up to <byte
1c8e0 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  s> bytes of the 
1c8f0 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72  supplied SQL str
1c900 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a  ing <sql> using.
1c910 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
1c920 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72  le <DB>. The par
1c930 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e  ameter <tailval>
1c940 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
1c950 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69  a global.** vari
1c960 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74  able that is set
1c970 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70   to the unused p
1c980 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20  ortion of <sql> 
1c990 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53  (if any). A.** S
1c9a0 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65  TMT handle is re
1c9b0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1c9c0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
1c9d0 41 50 49 20 74 65 73 74 5f 70 72 65 70 61 72 65  API test_prepare
1c9e0 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  _v2(.  void * cl
1c9f0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1ca00 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1ca10 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1ca20 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1ca30 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1ca40 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
1ca50 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
1ca60 20 2a 7a 43 6f 70 79 20 3d 20 30 3b 20 20 20 20   *zCopy = 0;    
1ca70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d              /* m
1ca80 61 6c 6c 6f 63 28 29 20 63 6f 70 79 20 6f 66 20  alloc() copy of 
1ca90 7a 53 71 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 79  zSql */.  int by
1caa0 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  tes;.  const cha
1cab0 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20  r *zTail = 0;.  
1cac0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1cad0 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
1cae0 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20  zBuf[50];.  int 
1caf0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
1cb00 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =5 && objc!=4 ){
1cb10 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1cb20 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1cb30 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1cb40 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1cb50 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1cb60 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
1cb70 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76   sql bytes tailv
1cb80 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ar", 0);.    ret
1cb90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1cba0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1cbb0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1cbc0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1cbd0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1cbe0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1cbf0 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zSql = Tcl_GetS
1cc00 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
1cc10 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1cc20 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1cc30 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
1cc40 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1cc50 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e 73 74 65  ROR;..  /* Inste
1cc60 61 64 20 6f 66 20 75 73 69 6e 67 20 7a 53 71 6c  ad of using zSql
1cc70 20 64 69 72 65 63 74 6c 79 2c 20 6d 61 6b 65 20   directly, make 
1cc80 61 20 63 6f 70 79 20 69 6e 74 6f 20 61 20 62 75  a copy into a bu
1cc90 66 66 65 72 20 6f 62 74 61 69 6e 65 64 0a 20 20  ffer obtained.  
1cca0 2a 2a 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ** directly from
1ccb0 20 6d 61 6c 6c 6f 63 28 29 2e 20 54 68 65 20 69   malloc(). The i
1ccc0 64 65 61 20 69 73 20 74 6f 20 6d 61 6b 65 20 69  dea is to make i
1ccd0 74 20 65 61 73 69 65 72 20 66 6f 72 20 76 61 6c  t easier for val
1cce0 67 72 69 6e 64 0a 20 20 2a 2a 20 74 6f 20 73 70  grind.  ** to sp
1ccf0 6f 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65  ot buffer overre
1cd00 61 64 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 62  ads.  */.  if( b
1cd10 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 7a  ytes>=0 ){.    z
1cd20 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63 28 62 79  Copy = malloc(by
1cd30 74 65 73 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  tes);.    memcpy
1cd40 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 62 79  (zCopy, zSql, by
1cd50 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tes);.  }else{. 
1cd60 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29     int n = (int)
1cd70 73 74 72 6c 65 6e 28 7a 53 71 6c 29 20 2b 20 31  strlen(zSql) + 1
1cd80 3b 0a 20 20 20 20 7a 43 6f 70 79 20 3d 20 6d 61  ;.    zCopy = ma
1cd90 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20 20 6d 65 6d  lloc(n);.    mem
1cda0 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c  cpy(zCopy, zSql,
1cdb0 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   n);.  }.  rc = 
1cdc0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1cdd0 76 32 28 64 62 2c 20 7a 43 6f 70 79 2c 20 62 79  v2(db, zCopy, by
1cde0 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a  tes, &pStmt, obj
1cdf0 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20  c>=5 ? &zTail : 
1ce00 30 29 3b 0a 20 20 66 72 65 65 28 7a 43 6f 70 79  0);.  free(zCopy
1ce10 29 3b 0a 20 20 7a 54 61 69 6c 20 3d 20 26 7a 53  );.  zTail = &zS
1ce20 71 6c 5b 28 7a 54 61 69 6c 20 2d 20 7a 43 6f 70  ql[(zTail - zCop
1ce30 79 29 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 72  y)];..  assert(r
1ce40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
1ce50 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 54 63 6c  pStmt==0);.  Tcl
1ce60 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
1ce70 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  erp);.  if( sqli
1ce80 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
1ce90 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
1cea0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ceb0 52 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  R;.  if( rc==SQL
1cec0 49 54 45 5f 4f 4b 20 26 26 20 7a 54 61 69 6c 20  ITE_OK && zTail 
1ced0 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20  && objc>=5 ){.  
1cee0 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29    if( bytes>=0 )
1cef0 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20  {.      bytes = 
1cf00 62 79 74 65 73 20 2d 20 28 69 6e 74 29 28 7a 54  bytes - (int)(zT
1cf10 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ail-zSql);.    }
1cf20 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56  .    Tcl_ObjSetV
1cf30 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  ar2(interp, objv
1cf40 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53  [4], 0, Tcl_NewS
1cf50 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20  tringObj(zTail, 
1cf60 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a  bytes), 0);.  }.
1cf70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cf80 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1cf90 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t( pStmt==0 );. 
1cfa0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1cfb0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
1cfc0 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  , zBuf, "(%d) ",
1cfd0 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
1cfe0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1cff0 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
1d000 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
1d010 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d020 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1d030 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
1d040 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
1d050 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
1d060 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
1d070 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1d080 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70  RROR;.    Tcl_Ap
1d090 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1d0a0 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d  p, zBuf, 0);.  }
1d0b0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1d0c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1d0d0 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
1d0e0 65 5f 74 6b 74 33 31 33 34 20 44 42 0a 2a 2a 0a  e_tkt3134 DB.**.
1d0f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 70 72  ** Generate a pr
1d100 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1d110 20 66 6f 72 20 61 20 7a 65 72 6f 2d 62 79 74 65   for a zero-byte
1d120 20 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 73   string as a tes
1d130 74 0a 2a 2a 20 66 6f 72 20 74 69 63 6b 65 74 20  t.** for ticket 
1d140 23 33 31 33 34 2e 20 20 54 68 65 20 73 74 72 69  #3134.  The stri
1d150 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65  ng should be pre
1d160 63 65 64 65 64 20 62 79 20 61 20 7a 65 72 6f 20  ceded by a zero 
1d170 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
1d180 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
1d190 49 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74  I test_prepare_t
1d1a0 6b 74 33 31 33 34 28 0a 20 20 76 6f 69 64 20 2a  kt3134(.  void *
1d1b0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1d1c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1d1d0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1d1e0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1d1f0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1d200 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 61 74 69  te3 *db;.  stati
1d210 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 53 71  c const char zSq
1d220 6c 5b 5d 20 3d 20 22 5c 30 30 30 53 45 4c 45 43  l[] = "\000SELEC
1d230 54 20 31 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f  T 1";.  sqlite3_
1d240 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1d250 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1d260 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1d270 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1d280 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1d290 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1d2a0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1d2b0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1d2c0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d2d0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
1d2e0 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22  l bytes tailvar"
1d2f0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1d300 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1d310 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1d320 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1d330 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1d340 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1d350 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1d360 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1d370 72 65 5f 76 32 28 64 62 2c 20 26 7a 53 71 6c 5b  re_v2(db, &zSql[
1d380 31 5d 2c 20 30 2c 20 26 70 53 74 6d 74 2c 20 30  1], 0, &pStmt, 0
1d390 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d  );.  assert(rc==
1d3a0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74  SQLITE_OK || pSt
1d3b0 6d 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 73 71  mt==0);.  if( sq
1d3c0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
1d3d0 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
1d3e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d3f0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
1d400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d410 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30  assert( pStmt==0
1d420 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
1d430 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
1d440 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 28 25  zBuf), zBuf, "(%
1d450 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
1d460 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1d470 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
1d480 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
1d490 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1d4a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1d4b0 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
1d4c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
1d4d0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1d4e0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1d4f0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1d500 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
1d510 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1d520 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1d530 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
1d540 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1d550 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
1d560 72 65 70 61 72 65 31 36 20 44 42 20 73 71 6c 20  repare16 DB sql 
1d570 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a  bytes tailvar.**
1d580 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74  .** Compile up t
1d590 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20  o <bytes> bytes 
1d5a0 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
1d5b0 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e  SQL string <sql>
1d5c0 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61   using.** databa
1d5d0 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20  se handle <DB>. 
1d5e0 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74  The parameter <t
1d5f0 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e  ailval> is the n
1d600 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a  ame of a global.
1d610 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  ** variable that
1d620 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75   is set to the u
1d630 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  nused portion of
1d640 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e   <sql> (if any).
1d650 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c   A.** STMT handl
1d660 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
1d670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1d680 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1d690 70 72 65 70 61 72 65 31 36 28 0a 20 20 76 6f 69  prepare16(.  voi
1d6a0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1d6b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1d6c0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1d6d0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1d6e0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1d6f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d700 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
1d710 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   *db;.  const vo
1d720 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73  id *zSql;.  cons
1d730 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20  t void *zTail = 
1d740 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54  0;.  Tcl_Obj *pT
1d750 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
1d760 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
1d770 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
1d780 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a  50]; .  int rc;.
1d790 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20    int bytes;    
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d7b0 68 65 20 69 6e 74 65 67 65 72 20 73 70 65 63 69  he integer speci
1d7c0 66 69 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f  fied as arg 3 */
1d7d0 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20  .  int objlen;  
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d7f0 54 68 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c  The byte-array l
1d800 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a  ength of arg 2 *
1d810 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  /..  if( objc!=5
1d820 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
1d830 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1d840 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1d850 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1d860 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1d870 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1d880 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73  objv[0]), " DB s
1d890 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61  ql bytes ?tailva
1d8a0 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  r?", 0);.    ret
1d8b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d8c0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1d8d0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1d8e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1d8f0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1d900 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d910 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42   zSql = Tcl_GetB
1d920 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
1d930 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e  objv[2], &objlen
1d940 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
1d950 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1d960 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74  p, objv[3], &byt
1d970 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
1d980 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
1d990 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
1d9a0 36 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65  6(db, zSql, byte
1d9b0 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e  s, &pStmt, objc>
1d9c0 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29  =5 ? &zTail : 0)
1d9d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1d9e0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
1d9f0 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
1da00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1da10 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1da20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1da30 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63  .  }..  if( objc
1da40 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  >=5 ){.    if( z
1da50 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62  Tail ){.      ob
1da60 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20  jlen = objlen - 
1da70 28 69 6e 74 29 28 28 75 38 20 2a 29 7a 54 61 69  (int)((u8 *)zTai
1da80 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20  l-(u8 *)zSql);. 
1da90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1daa0 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  objlen = 0;.    
1dab0 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54 63  }.    pTail = Tc
1dac0 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
1dad0 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f  j((u8 *)zTail, o
1dae0 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  bjlen);.    Tcl_
1daf0 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61  IncrRefCount(pTa
1db00 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  il);.    Tcl_Obj
1db10 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
1db20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69  objv[4], 0, pTai
1db30 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44  l, 0);.    Tcl_D
1db40 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ecrRefCount(pTai
1db50 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  l);.  }..  if( p
1db60 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
1db70 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1db80 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1db90 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
1dba0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1dbb0 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  R;.  }.  Tcl_App
1dbc0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1dbd0 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64  , zBuf, 0);.#end
1dbe0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1dbf0 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1dc00 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1dc10 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1dc20 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32  te3_prepare16_v2
1dc30 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
1dc40 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f  ailvar?.**.** Co
1dc50 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74  mpile up to <byt
1dc60 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65  es> bytes of the
1dc70 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74   supplied SQL st
1dc80 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67  ring <sql> using
1dc90 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
1dca0 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61  dle <DB>. The pa
1dcb0 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c  rameter <tailval
1dcc0 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  > is the name of
1dcd0 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72   a global.** var
1dce0 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65  iable that is se
1dcf0 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20  t to the unused 
1dd00 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e  portion of <sql>
1dd10 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20   (if any). A.** 
1dd20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72  STMT handle is r
1dd30 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1dd40 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
1dd50 4c 41 50 49 20 74 65 73 74 5f 70 72 65 70 61 72  LAPI test_prepar
1dd60 65 31 36 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a  e16_v2(.  void *
1dd70 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1dd80 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1dd90 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1dda0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1ddb0 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
1ddc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1ddd0 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
1dde0 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
1ddf0 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76  *zSql;.  const v
1de00 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  oid *zTail = 0;.
1de10 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c    Tcl_Obj *pTail
1de20 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1de30 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1de40 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1de50 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ; .  int rc;.  i
1de60 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20  nt bytes;       
1de70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1de80 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65  integer specifie
1de90 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20  d as arg 3 */.  
1dea0 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20  int objlen;     
1deb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dec0 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67   byte-array leng
1ded0 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a  th of arg 2 */..
1dee0 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
1def0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1df00 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1df10 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1df20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1df30 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1df40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1df50 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
1df60 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22  bytes ?tailvar?"
1df70 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1df80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1df90 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1dfa0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1dfb0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1dfc0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1dfd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
1dfe0 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ql = Tcl_GetByte
1dff0 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
1e000 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a  v[2], &objlen);.
1e010 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1e020 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1e030 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
1e040 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1e050 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
1e060 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76  ite3_prepare16_v
1e070 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65  2(db, zSql, byte
1e080 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e  s, &pStmt, objc>
1e090 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29  =5 ? &zTail : 0)
1e0a0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1e0b0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
1e0c0 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
1e0d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e0e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1e0f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e100 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63  .  }..  if( objc
1e110 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  >=5 ){.    if( z
1e120 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62  Tail ){.      ob
1e130 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20  jlen = objlen - 
1e140 28 69 6e 74 29 28 28 75 38 20 2a 29 7a 54 61 69  (int)((u8 *)zTai
1e150 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20  l-(u8 *)zSql);. 
1e160 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e170 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  objlen = 0;.    
1e180 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54 63  }.    pTail = Tc
1e190 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
1e1a0 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f  j((u8 *)zTail, o
1e1b0 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  bjlen);.    Tcl_
1e1c0 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61  IncrRefCount(pTa
1e1d0 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  il);.    Tcl_Obj
1e1e0 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
1e1f0 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69  objv[4], 0, pTai
1e200 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44  l, 0);.    Tcl_D
1e210 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ecrRefCount(pTai
1e220 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  l);.  }..  if( p
1e230 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
1e240 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1e250 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1e260 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
1e270 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e280 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  R;.  }.  Tcl_App
1e290 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1e2a0 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64  , zBuf, 0);.#end
1e2b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1e2c0 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1e2d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1e2e0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1e2f0 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e 61 6d  te3_open filenam
1e300 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 3f  e ?options-list?
1e310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1e320 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
1e330 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64 20 2a  t_open(.  void *
1e340 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1e350 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1e360 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1e370 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1e380 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73  objv[].){.  cons
1e390 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1e3a0 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
1e3b0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
1e3c0 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
1e3d0 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 26 26  =3 && objc!=2 &&
1e3e0 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
1e3f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1e400 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1e410 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1e420 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1e430 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1e440 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d  v[0]), " filenam
1e450 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c  e options-list",
1e460 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1e470 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1e480 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6f 62    zFilename = ob
1e490 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65 74 53 74  jc>1 ? Tcl_GetSt
1e4a0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 20 3a 20  ring(objv[1]) : 
1e4b0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  0;.  sqlite3_ope
1e4c0 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62  n(zFilename, &db
1e4d0 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69  );.  .  if( sqli
1e4e0 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1e4f0 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
1e500 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e  uf, db) ) return
1e510 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
1e520 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1e530 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1e540 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1e550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1e560 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  : sqlite3_open_v
1e570 32 20 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47 53  2 FILENAME FLAGS
1e580 20 56 46 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69   VFS.*/.static i
1e590 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1e5a0 20 74 65 73 74 5f 6f 70 65 6e 5f 76 32 28 0a 20   test_open_v2(. 
1e5b0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1e5c0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1e5d0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1e5e0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1e5f0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1e600 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e610 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 6f 6e 73  Filename;.  cons
1e620 74 20 63 68 61 72 20 2a 7a 56 66 73 3b 0a 20 20  t char *zVfs;.  
1e630 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20  int flags = 0;. 
1e640 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e650 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
1e660 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 6e 74  Buf[100];..  int
1e670 20 6e 46 6c 61 67 3b 0a 20 20 54 63 6c 5f 4f 62   nFlag;.  Tcl_Ob
1e680 6a 20 2a 2a 61 70 46 6c 61 67 3b 0a 20 20 69 6e  j **apFlag;.  in
1e690 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  t i;..  if( objc
1e6a0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
1e6b0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1e6c0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49  rp, 1, objv, "FI
1e6d0 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20 56 46 53  LENAME FLAGS VFS
1e6e0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1e6f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1e700 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f  zFilename = Tcl_
1e710 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1e720 5d 29 3b 0a 20 20 7a 56 66 73 20 3d 20 54 63 6c  ]);.  zVfs = Tcl
1e730 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1e740 33 5d 29 3b 0a 20 20 69 66 28 20 7a 56 66 73 5b  3]);.  if( zVfs[
1e750 30 5d 3d 3d 30 78 30 30 20 29 20 7a 56 66 73 20  0]==0x00 ) zVfs 
1e760 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c  = 0;..  rc = Tcl
1e770 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  _ListObjGetEleme
1e780 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  nts(interp, objv
1e790 5b 32 5d 2c 20 26 6e 46 6c 61 67 2c 20 26 61 70  [2], &nFlag, &ap
1e7a0 46 6c 61 67 29 3b 0a 20 20 69 66 28 20 72 63 21  Flag);.  if( rc!
1e7b0 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e  =TCL_OK ) return
1e7c0 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   rc;.  for(i=0; 
1e7d0 69 3c 6e 46 6c 61 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFlag; i++){. 
1e7e0 20 20 20 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20     int iFlag;.  
1e7f0 20 20 73 74 72 75 63 74 20 4f 70 65 6e 46 6c 61    struct OpenFla
1e800 67 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  g {.      const 
1e810 63 68 61 72 20 2a 7a 46 6c 61 67 3b 0a 20 20 20  char *zFlag;.   
1e820 20 20 20 69 6e 74 20 66 6c 61 67 3b 0a 20 20 20     int flag;.   
1e830 20 7d 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 0a 20   } aFlag[] = {. 
1e840 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1e850 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 22 2c 20 53  PEN_READONLY", S
1e860 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1e870 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  NLY },.      { "
1e880 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1e890 57 52 49 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f  WRITE", SQLITE_O
1e8a0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c  PEN_READWRITE },
1e8b0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1e8c0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 22 2c 20 53  _OPEN_CREATE", S
1e8d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1e8e0 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  E },.      { "SQ
1e8f0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
1e900 4f 4e 43 4c 4f 53 45 22 2c 20 53 51 4c 49 54 45  ONCLOSE", SQLITE
1e910 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
1e920 4f 53 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  OSE },.      { "
1e930 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1e940 55 53 49 56 45 22 2c 20 53 51 4c 49 54 45 5f 4f  USIVE", SQLITE_O
1e950 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7d 2c  PEN_EXCLUSIVE },
1e960 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1e970 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 22  _OPEN_AUTOPROXY"
1e980 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55  , SQLITE_OPEN_AU
1e990 54 4f 50 52 4f 58 59 20 7d 2c 0a 20 20 20 20 20  TOPROXY },.     
1e9a0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1e9b0 4d 41 49 4e 5f 44 42 22 2c 20 53 51 4c 49 54 45  MAIN_DB", SQLITE
1e9c0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7d 2c  _OPEN_MAIN_DB },
1e9d0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1e9e0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 22 2c 20  _OPEN_TEMP_DB", 
1e9f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1ea00 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  _DB },.      { "
1ea10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
1ea20 53 49 45 4e 54 5f 44 42 22 2c 20 53 51 4c 49 54  SIENT_DB", SQLIT
1ea30 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
1ea40 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  _DB },.      { "
1ea50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1ea60 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54  _JOURNAL", SQLIT
1ea70 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1ea80 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  NAL },.      { "
1ea90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1eaa0 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54  _JOURNAL", SQLIT
1eab0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
1eac0 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  NAL },.      { "
1ead0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
1eae0 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f  OURNAL", SQLITE_
1eaf0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
1eb00 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1eb10 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
1eb20 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f  OURNAL", SQLITE_
1eb30 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1eb40 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  NAL },.      { "
1eb50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
1eb60 54 45 58 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  TEX", SQLITE_OPE
1eb70 4e 5f 4e 4f 4d 55 54 45 58 20 7d 2c 0a 20 20 20  N_NOMUTEX },.   
1eb80 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1eb90 4e 5f 46 55 4c 4c 4d 55 54 45 58 22 2c 20 53 51  N_FULLMUTEX", SQ
1eba0 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
1ebb0 54 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  TEX },.      { "
1ebc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
1ebd0 45 44 43 41 43 48 45 22 2c 20 53 51 4c 49 54 45  EDCACHE", SQLITE
1ebe0 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
1ebf0 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  E },.      { "SQ
1ec00 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
1ec10 45 43 41 43 48 45 22 2c 20 53 51 4c 49 54 45 5f  ECACHE", SQLITE_
1ec20 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
1ec30 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  E },.      { "SQ
1ec40 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 22 2c 20  LITE_OPEN_WAL", 
1ec50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
1ec60 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1ec70 54 45 5f 4f 50 45 4e 5f 55 52 49 22 2c 20 53 51  TE_OPEN_URI", SQ
1ec80 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 7d 2c  LITE_OPEN_URI },
1ec90 0a 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a  .      { 0, 0 }.
1eca0 20 20 20 20 7d 3b 0a 20 20 20 20 72 63 20 3d 20      };.    rc = 
1ecb0 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
1ecc0 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72 70  ObjStruct(interp
1ecd0 2c 20 61 70 46 6c 61 67 5b 69 5d 2c 20 61 46 6c  , apFlag[i], aFl
1ece0 61 67 2c 20 73 69 7a 65 6f 66 28 61 46 6c 61 67  ag, sizeof(aFlag
1ecf0 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 22  [0]), .        "
1ed00 66 6c 61 67 22 2c 20 30 2c 20 26 69 46 6c 61 67  flag", 0, &iFlag
1ed10 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
1ed20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74  rc!=TCL_OK ) ret
1ed30 75 72 6e 20 72 63 3b 0a 20 20 20 20 66 6c 61 67  urn rc;.    flag
1ed40 73 20 7c 3d 20 61 46 6c 61 67 5b 69 46 6c 61 67  s |= aFlag[iFlag
1ed50 5d 2e 66 6c 61 67 3b 0a 20 20 7d 0a 0a 20 20 72  ].flag;.  }..  r
1ed60 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
1ed70 5f 76 32 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  _v2(zFilename, &
1ed80 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29  db, flags, zVfs)
1ed90 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1eda0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1edb0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1edc0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1edd0 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70  _ERROR;.  Tcl_Ap
1ede0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1edf0 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
1ee00 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1ee10 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1ee20 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20 66 69 6c  lite3_open16 fil
1ee30 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f  ename options.*/
1ee40 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1ee50 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6f  TE_TCLAPI test_o
1ee60 70 65 6e 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  pen16(.  void * 
1ee70 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1ee80 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ee90 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1eea0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1eeb0 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1eec0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1eed0 31 36 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  16.  const void 
1eee0 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71  *zFilename;.  sq
1eef0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
1ef00 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20  r zBuf[100];..  
1ef10 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1ef20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1ef30 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1ef40 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1ef50 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1ef60 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1ef70 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65  objv[0]), " file
1ef80 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73  name options-lis
1ef90 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  t", 0);.    retu
1efa0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1efb0 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  }..  zFilename =
1efc0 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
1efd0 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  yFromObj(objv[1]
1efe0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
1eff0 6f 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65  open16(zFilename
1f000 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28  , &db);.  .  if(
1f010 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1f020 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1f030 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72  p, zBuf, db) ) r
1f040 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f050 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1f060 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1f070 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
1f080 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1f090 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
1f0a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1f0b0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1f0c0 6d 70 6c 65 74 65 31 36 20 3c 55 54 46 2d 31 36  mplete16 <UTF-16
1f0d0 20 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52   string>.**.** R
1f0e0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 73  eturn 1 if the s
1f0f0 75 70 70 6c 69 65 64 20 61 72 67 75 6d 65 6e 74  upplied argument
1f100 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53   is a complete S
1f110 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72  QL statement, or
1f120 20 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69   zero.** otherwi
1f130 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1f140 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1f150 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 28  test_complete16(
1f160 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1f170 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1f180 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1f190 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1f1a0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1f1b0 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ){.#if !defined(
1f1c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
1f1d0 4c 45 54 45 29 20 26 26 20 21 64 65 66 69 6e 65  LETE) && !define
1f1e0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  d(SQLITE_OMIT_UT
1f1f0 46 31 36 29 0a 20 20 63 68 61 72 20 2a 7a 42 75  F16).  char *zBu
1f200 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  f;..  if( objc!=
1f210 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1f220 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1f230 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66  , 1, objv, "<utf
1f240 2d 31 36 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20  -16 sql>");.    
1f250 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f260 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20  ;.  }..  zBuf = 
1f270 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79  (char*)Tcl_GetBy
1f280 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
1f290 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63  bjv[1], 0);.  Tc
1f2a0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1f2b0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1f2c0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6d  tObj(sqlite3_com
1f2d0 70 6c 65 74 65 31 36 28 7a 42 75 66 29 29 29 3b  plete16(zBuf)));
1f2e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1f2f0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20  E_OMIT_COMPLETE 
1f300 26 26 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  && SQLITE_OMIT_U
1f310 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
1f320 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1f330 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1f340 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  _step STMT.**.**
1f350 20 41 64 76 61 6e 63 65 20 74 68 65 20 73 74 61   Advance the sta
1f360 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65  tement to the ne
1f370 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  xt row..*/.stati
1f380 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
1f390 41 50 49 20 74 65 73 74 5f 73 74 65 70 28 0a 20  API test_step(. 
1f3a0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1f3b0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1f3c0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1f3d0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1f3e0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1f3f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1f400 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
1f410 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1f420 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1f430 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1f440 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1f450 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1f460 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1f470 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1f480 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
1f490 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f4a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1f4b0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1f4c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1f4d0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1f4e0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1f4f0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1f500 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1f510 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63  t);..  /* if( rc
1f520 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26  !=SQLITE_DONE &&
1f530 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
1f540 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1f550 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74  OR; */.  Tcl_Set
1f560 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
1f570 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
1f580 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
1f590 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1f5a0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1f5b0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 71  E_TCLAPI test_sq
1f5c0 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  l(.  void * clie
1f5d0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1f5e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1f5f0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1f600 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1f610 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1f620 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
1f630 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1f640 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1f650 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1f660 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
1f670 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f680 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1f690 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1f6a0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1f6b0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1f6c0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1f6d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
1f6e0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1f6f0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1f700 5f 73 71 6c 28 70 53 74 6d 74 29 2c 20 54 43 4c  _sql(pStmt), TCL
1f710 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65  _VOLATILE);.  re
1f720 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73  turn TCL_OK;.}.s
1f730 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1f740 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 65 78 5f  _TCLAPI test_ex_
1f750 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  sql(.  void * cl
1f760 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1f770 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1f780 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1f790 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1f7a0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1f7b0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1f7c0 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20  char *z;..  if( 
1f7d0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1f7e0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1f7f0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1f800 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
1f810 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1f820 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1f830 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1f840 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1f850 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1f860 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1f870 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  RROR;.  z = sqli
1f880 74 65 33 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c  te3_expanded_sql
1f890 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53  (pStmt);.  Tcl_S
1f8a0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1f8b0 20 7a 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45   z, TCL_VOLATILE
1f8c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1f8d0 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  e(z);.  return T
1f8e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1f8f0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1f900 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d 54  olumn_count STMT
1f910 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74   .**.** Return t
1f920 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
1f930 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
1f940 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65   the sql stateme
1f950 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74  nt STMT..*/.stat
1f960 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
1f970 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c 75 6d 6e  LAPI test_column
1f980 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a  _count(.  void *
1f990 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1f9a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1f9b0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1f9c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1f9d0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1f9e0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1f9f0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1fa00 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1fa10 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1fa20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1fa30 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1fa40 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1fa50 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1fa60 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1fa70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1fa80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1fa90 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1faa0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1fab0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1fac0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1fad0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1fae0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1faf0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1fb00 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
1fb10 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
1fb20 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
1fb30 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1fb40 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1fb50 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54 4d 54  column_type STMT
1fb60 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
1fb70 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 6f 66  turn the type of
1fb80 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c   the data in col
1fb90 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20  umn 'column' of 
1fba0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
1fbb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1fbc0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
1fbd0 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a 20  t_column_type(. 
1fbe0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1fbf0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1fc00 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1fc10 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1fc20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1fc30 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1fc40 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
1fc50 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a 0a 20 20  l;.  int tp;..  
1fc60 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1fc70 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1fc80 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1fc90 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1fca0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1fcb0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1fcc0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1fcd0 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1fce0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1fcf0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1fd00 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1fd10 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1fd20 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1fd30 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1fd40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1fd50 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1fd60 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1fd70 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
1fd80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1fd90 74 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tp = sqlite3_col
1fda0 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
1fdb0 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63 68 28 20  col);.  switch( 
1fdc0 74 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  tp ){.    case S
1fdd0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 0a  QLITE_INTEGER: .
1fde0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
1fdf0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 4e 54  ult(interp, "INT
1fe00 45 47 45 52 22 2c 20 54 43 4c 5f 53 54 41 54 49  EGER", TCL_STATI
1fe10 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
1fe20 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1fe30 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 54 63  E_NULL:.      Tc
1fe40 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1fe50 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f  rp, "NULL", TCL_
1fe60 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
1fe70 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1fe80 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20  SQLITE_FLOAT:.  
1fe90 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1fea0 74 28 69 6e 74 65 72 70 2c 20 22 46 4c 4f 41 54  t(interp, "FLOAT
1feb0 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1fec0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fed0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1fee0 58 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  XT:.      Tcl_Se
1fef0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1ff00 22 54 45 58 54 22 2c 20 54 43 4c 5f 53 54 41 54  "TEXT", TCL_STAT
1ff10 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
1ff20 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1ff30 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 54  TE_BLOB:.      T
1ff40 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1ff50 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20 54 43 4c  erp, "BLOB", TCL
1ff60 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
1ff70 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
1ff80 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
1ff90 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  t(0);.  }..  ret
1ffa0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1ffb0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1ffc0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
1ffd0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1ffe0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
1fff0 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f  ta in column 'co
20000 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72  lumn' of the cur
20010 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73  rent row cast as
20020 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28 36 34 2d   an.** wide (64-
20030 62 69 74 29 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  bit) integer..*/
20040 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
20050 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63  TE_TCLAPI test_c
20060 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76  olumn_int64(.  v
20070 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
20080 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
20090 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
200a0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
200b0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
200c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
200d0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
200e0 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20  .  i64 iVal;..  
200f0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
20100 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
20110 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
20120 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
20130 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
20140 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
20150 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
20160 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
20170 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
20180 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
20190 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
201a0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
201b0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
201c0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
201d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
201e0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
201f0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
20200 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
20210 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
20220 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  iVal = sqlite3_c
20230 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
20240 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
20250 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
20260 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
20270 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20  ntObj(iVal));.  
20280 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
20290 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
202a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
202b0 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  ob STMT column.*
202c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
202d0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
202e0 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76  column_blob(.  v
202f0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
20300 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
20310 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
20320 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
20330 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
20340 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
20350 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
20360 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63  ..  int len;.  c
20370 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
20380 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
20390 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
203a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
203b0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
203c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
203d0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
203e0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
203f0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
20400 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
20410 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
20420 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
20430 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
20440 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
20450 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
20460 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
20470 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
20480 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
20490 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
204a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
204b0 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  ;..  len = sqlit
204c0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
204d0 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 70  pStmt, col);.  p
204e0 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
204f0 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
20500 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
20510 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
20520 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  p, Tcl_NewByteAr
20530 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65  rayObj(pBlob, le
20540 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  n));.  return TC
20550 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
20560 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
20570 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54  lumn_double STMT
20580 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
20590 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e  turn the data in
205a0 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
205b0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
205c0 72 6f 77 20 63 61 73 74 20 61 73 20 61 20 64 6f  row cast as a do
205d0 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uble..*/.static 
205e0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
205f0 49 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f  I test_column_do
20600 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  uble(.  void * c
20610 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
20620 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
20630 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
20640 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
20650 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
20660 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
20670 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62   int col;.  doub
20680 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20  le rVal;..  if( 
20690 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
206a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
206b0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
206c0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
206d0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
206e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
206f0 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
20700 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
20710 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20720 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
20730 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
20740 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
20750 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
20760 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
20770 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
20780 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
20790 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
207a0 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
207b0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c  L_ERROR;..  rVal
207c0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
207d0 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  n_double(pStmt, 
207e0 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  col);.  Tcl_SetO
207f0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
20800 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62   Tcl_NewDoubleOb
20810 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65 74 75  j(rVal));.  retu
20820 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
20830 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
20840 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53 54  e3_data_count ST
20850 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  MT .**.** Return
20860 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
20870 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
20880 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65  by the sql state
20890 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74  ment STMT..*/.st
208a0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
208b0 54 43 4c 41 50 49 20 74 65 73 74 5f 64 61 74 61  TCLAPI test_data
208c0 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a  _count(.  void *
208d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
208e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
208f0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
20900 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
20910 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
20920 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
20930 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
20940 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
20950 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
20960 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
20970 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
20980 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
20990 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
209a0 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
209b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
209c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
209d0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
209e0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
209f0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
20a00 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
20a10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
20a20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
20a30 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
20a40 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
20a50 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74  data_count(pStmt
20a60 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
20a70 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
20a80 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
20a90 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63  lumn_text STMT c
20aa0 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
20ab0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
20ac0 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20  n_decltype STMT 
20ad0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
20ae0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
20af0 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c  mn_name STMT col
20b00 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
20b10 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
20b20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a  test_stmt_utf8(.
20b30 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
20b40 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ata,        /* P
20b50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65  ointer to SQLite
20b60 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f   API function to
20b70 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20   be invoke */.  
20b80 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
20b90 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
20ba0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
20bb0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
20bc0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
20bd0 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63  ;.  int col;.  c
20be0 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75  onst char *(*xFu
20bf0 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
20c00 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73 74  *, int);.  const
20c10 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20   char *zRet;..  
20c20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 63  xFunc = (const c
20c30 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74 65 33  har *(*)(sqlite3
20c40 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69  _stmt*, int))cli
20c50 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f  entData;.  if( o
20c60 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
20c70 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
20c80 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
20c90 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
20ca0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
20cb0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
20cc0 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
20cd0 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
20ce0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
20cf0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
20d00 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
20d10 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
20d20 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
20d30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
20d40 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
20d50 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
20d60 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
20d70 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
20d80 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d  _ERROR;.  zRet =
20d90 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
20da0 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29  l);.  if( zRet )
20db0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
20dc0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
20dd0 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20  r *)zRet, 0);.  
20de0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
20df0 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
20e00 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
20e10 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  est_global_recov
20e20 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  er(.  void * cli
20e30 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
20e40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
20e50 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
20e60 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
20e70 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
20e80 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
20e90 41 54 45 44 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ATED.  int rc;. 
20ea0 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a   if( objc!=1 ){.
20eb0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
20ec0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
20ed0 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72  objv, "");.    r
20ee0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20ef0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
20f00 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  te3_global_recov
20f10 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  er();.  Tcl_SetR
20f20 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
20f30 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
20f40 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
20f50 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  C);.#endif.  ret
20f60 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
20f70 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
20f80 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20  te3_column_text 
20f90 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
20fa0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
20fb0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
20fc0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
20fd0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
20fe0 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54  3_column_name ST
20ff0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61  MT column.*/.sta
21000 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
21010 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d 74 5f  CLAPI test_stmt_
21020 75 74 66 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  utf16(.  void * 
21030 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  clientData,     
21040 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51  /* Pointer to SQ
21050 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f  Lite API functio
21060 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
21070 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
21080 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
21090 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
210a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
210b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
210c0 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
210d0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
210e0 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 54 63  .  int col;.  Tc
210f0 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20 63  l_Obj *pRet;.  c
21100 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65  onst void *zName
21110 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  16;.  const void
21120 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74   *(*xFunc)(sqlit
21130 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a  e3_stmt*, int);.
21140 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73  .  xFunc = (cons
21150 74 20 76 6f 69 64 20 2a 28 2a 29 28 73 71 6c 69  t void *(*)(sqli
21160 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29  te3_stmt*, int))
21170 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66  clientData;.  if
21180 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
21190 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
211a0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
211b0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
211c0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
211d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
211e0 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
211f0 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
21200 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
21210 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
21220 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
21230 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
21240 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
21250 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
21260 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
21270 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
21280 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
21290 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
212a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 4e  TCL_ERROR;..  zN
212b0 61 6d 65 31 36 20 3d 20 78 46 75 6e 63 28 70 53  ame16 = xFunc(pS
212c0 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28  tmt, col);.  if(
212d0 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20 20 20 20   zName16 ){.    
212e0 69 6e 74 20 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  int n;.    const
212f0 20 63 68 61 72 20 2a 7a 20 3d 20 7a 4e 61 6d 65   char *z = zName
21300 31 36 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b  16;.    for(n=0;
21310 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b 31 5d 3b   z[n] || z[n+1];
21320 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20 20 70 52 65   n+=2){}.    pRe
21330 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  t = Tcl_NewByteA
21340 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c  rrayObj(zName16,
21350 20 6e 2b 32 29 3b 0a 20 20 20 20 54 63 6c 5f 53   n+2);.    Tcl_S
21360 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
21370 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23  rp, pRet);.  }.#
21380 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
21390 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 20  OMIT_UTF16 */.. 
213a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
213b0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
213c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
213d0 6e 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  nt STMT column.*
213e0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
213f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
21400 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
21410 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
21420 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36  3_column_bytes16
21430 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
21440 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
21450 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
21460 5f 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69  _stmt_int(.  voi
21470 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  d * clientData, 
21480 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
21490 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63   SQLite API func
214a0 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
214b0 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
214c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
214d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
214e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
214f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
21500 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
21510 63 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75  col;.  int (*xFu
21520 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
21530 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e  *, int);..  xFun
21540 63 20 3d 20 28 69 6e 74 20 28 2a 29 28 73 71 6c  c = (int (*)(sql
21550 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
21560 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69  )clientData;.  i
21570 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
21580 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
21590 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
215a0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
215b0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
215c0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
215d0 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
215e0 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
215f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21600 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
21610 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
21620 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
21630 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
21640 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
21650 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
21660 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
21670 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
21680 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
21690 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54   TCL_ERROR;..  T
216a0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
216b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
216c0 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70 53 74 6d  ntObj(xFunc(pStm
216d0 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72 65 74  t, col)));.  ret
216e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
216f0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
21700 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 44  ite_set_magic  D
21710 42 20 20 4d 41 47 49 43 2d 4e 55 4d 42 45 52 0a  B  MAGIC-NUMBER.
21720 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 62  **.** Set the db
21730 2d 3e 6d 61 67 69 63 20 76 61 6c 75 65 2e 20 20  ->magic value.  
21740 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
21750 74 65 73 74 20 65 72 72 6f 72 20 72 65 63 6f 76  test error recov
21760 65 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74  ery logic..*/.st
21770 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
21780 54 43 4c 41 50 49 20 73 71 6c 69 74 65 5f 73 65  TCLAPI sqlite_se
21790 74 5f 6d 61 67 69 63 28 0a 20 20 76 6f 69 64 20  t_magic(.  void 
217a0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
217b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
217c0 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
217d0 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
217e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
217f0 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
21800 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
21810 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
21820 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
21830 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
21840 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 22 20  [0],.         " 
21850 44 42 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20  DB MAGIC", 0);. 
21860 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
21870 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
21880 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
21890 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
218a0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
218b0 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63  RROR;.  if( strc
218c0 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
218d0 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29  ITE_MAGIC_OPEN")
218e0 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
218f0 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
21900 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73  GIC_OPEN;.  }els
21910 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
21920 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41  v[2], "SQLITE_MA
21930 47 49 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20  GIC_CLOSED")==0 
21940 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
21950 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
21960 43 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  CLOSED;.  }else 
21970 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
21980 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
21990 43 5f 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20  C_BUSY")==0 ){. 
219a0 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
219b0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
219c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
219d0 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53  rcmp(argv[2], "S
219e0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f  QLITE_MAGIC_ERRO
219f0 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  R")==0 ){.    db
21a00 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
21a10 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20  _MAGIC_ERROR;.  
21a20 7d 65 6c 73 65 20 69 66 28 20 54 63 6c 5f 47 65  }else if( Tcl_Ge
21a30 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
21a40 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26 64 62 2d  v[2], (int*)&db-
21a50 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20 20 20 72  >magic) ){.    r
21a60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
21a70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
21a80 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
21a90 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 69  sage:  sqlite3_i
21aa0 6e 74 65 72 72 75 70 74 20 20 44 42 20 0a 2a 2a  nterrupt  DB .**
21ab0 0a 2a 2a 20 54 72 69 67 67 65 72 20 61 6e 20 69  .** Trigger an i
21ac0 6e 74 65 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a  nterrupt on DB.*
21ad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
21ae0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
21af0 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76 6f 69  interrupt(.  voi
21b00 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
21b10 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
21b20 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
21b30 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
21b40 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
21b50 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
21b60 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
21b70 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
21b80 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
21b90 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
21ba0 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20 30 29  gv[0], " DB", 0)
21bb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
21bc0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
21bd0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
21be0 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
21bf0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
21c00 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
21c10 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29  e3_interrupt(db)
21c20 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
21c30 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 38 20  K;.}..static u8 
21c40 2a 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62  *sqlite3_stack_b
21c50 61 73 65 6c 69 6e 65 20 3d 20 30 3b 0a 0a 2f 2a  aseline = 0;../*
21c60 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 73 74 61  .** Fill the sta
21c70 63 6b 20 77 69 74 68 20 61 20 6b 6e 6f 77 6e 20  ck with a known 
21c80 62 69 74 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 73  bitpattern..*/.s
21c90 74 61 74 69 63 20 76 6f 69 64 20 70 72 65 70 53  tatic void prepS
21ca0 74 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e  tack(void){.  in
21cb0 74 20 69 3b 0a 20 20 75 33 32 20 62 69 67 42 75  t i;.  u32 bigBu
21cc0 66 5b 36 35 35 33 36 5d 3b 0a 20 20 66 6f 72 28  f[65536];.  for(
21cd0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 62 69  i=0; i<sizeof(bi
21ce0 67 42 75 66 29 2f 73 69 7a 65 6f 66 28 62 69 67  gBuf)/sizeof(big
21cf0 42 75 66 5b 30 5d 29 3b 20 69 2b 2b 29 20 62 69  Buf[0]); i++) bi
21d00 67 42 75 66 5b 69 5d 20 3d 20 30 78 64 65 61 64  gBuf[i] = 0xdead
21d10 62 65 65 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  beef;.  sqlite3_
21d20 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d  stack_baseline =
21d30 20 28 75 38 2a 29 26 62 69 67 42 75 66 5b 36 35   (u8*)&bigBuf[65
21d40 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  536];.}../*.** G
21d50 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  et the current s
21d60 74 61 63 6b 20 64 65 70 74 68 2e 20 20 55 73 65  tack depth.  Use
21d70 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
21d80 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c  only..*/.u64 sql
21d90 69 74 65 33 53 74 61 63 6b 44 65 70 74 68 28 76  ite3StackDepth(v
21da0 6f 69 64 29 7b 0a 20 20 75 38 20 78 3b 0a 20 20  oid){.  u8 x;.  
21db0 72 65 74 75 72 6e 20 28 75 36 34 29 28 73 71 6c  return (u64)(sql
21dc0 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c  ite3_stack_basel
21dd0 69 6e 65 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a  ine - &x);.}../*
21de0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
21df0 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 20 44  te3_stack_used D
21e00 42 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20  B SQL.**.** Try 
21e10 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20 61  to measure the a
21e20 6d 6f 75 6e 74 20 6f 66 20 73 74 61 63 6b 20 73  mount of stack s
21e30 70 61 63 65 20 75 73 65 64 20 62 79 20 61 20 63  pace used by a c
21e40 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
21e50 78 65 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  xec.*/.static in
21e60 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
21e70 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65 64 28  test_stack_used(
21e80 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
21e90 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
21ea0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
21eb0 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
21ec0 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
21ed0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b  e3 *db;.  int i;
21ee0 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
21ef0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
21f00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
21f10 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
21f20 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
21f30 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
21f40 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20   DB SQL", 0);.  
21f50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
21f60 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
21f70 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
21f80 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
21f90 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
21fa0 52 4f 52 3b 0a 20 20 70 72 65 70 53 74 61 63 6b  ROR;.  prepStack
21fb0 28 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69  ();.  (void)sqli
21fc0 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61 72 67  te3_exec(db, arg
21fd0 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  v[2], 0, 0, 0);.
21fe0 20 20 66 6f 72 28 69 3d 36 35 35 33 35 3b 20 69    for(i=65535; i
21ff0 3e 3d 30 20 26 26 20 28 28 75 33 32 2a 29 73 71  >=0 && ((u32*)sq
22000 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65  lite3_stack_base
22010 6c 69 6e 65 29 5b 2d 69 5d 3d 3d 30 78 64 65 61  line)[-i]==0xdea
22020 64 62 65 65 66 3b 20 69 2d 2d 29 7b 7d 0a 20 20  dbeef; i--){}.  
22030 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
22040 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
22050 49 6e 74 4f 62 6a 28 69 2a 34 29 29 3b 0a 20 20  IntObj(i*4));.  
22060 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
22070 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
22080 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e  qlite_delete_fun
22090 63 74 69 6f 6e 20 44 42 20 66 75 6e 63 74 69 6f  ction DB functio
220a0 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c  n-name.**.** Del
220b0 65 74 65 20 74 68 65 20 75 73 65 72 20 66 75 6e  ete the user fun
220c0 63 74 69 6f 6e 20 27 66 75 6e 63 74 69 6f 6e 2d  ction 'function-
220d0 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62  name' from datab
220e0 61 73 65 20 68 61 6e 64 6c 65 20 44 42 2e 20 49  ase handle DB. I
220f0 74 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65 64 20  t.** is assumed 
22100 74 68 61 74 20 74 68 65 20 75 73 65 72 20 66 75  that the user fu
22110 6e 63 74 69 6f 6e 20 77 61 73 20 63 72 65 61 74  nction was creat
22120 65 64 20 61 73 20 55 54 46 38 2c 20 61 6e 79 20  ed as UTF8, any 
22130 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67  number of.** arg
22140 75 6d 65 6e 74 73 20 28 74 68 65 20 77 61 79 20  uments (the way 
22150 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63  the TCL interfac
22160 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73  e does it)..*/.s
22170 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
22180 5f 54 43 4c 41 50 49 20 64 65 6c 65 74 65 5f 66  _TCLAPI delete_f
22190 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20  unction(.  void 
221a0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
221b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
221c0 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
221d0 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
221e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
221f0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
22200 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
22210 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
22220 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
22230 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
22240 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
22250 20 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e          " DB fun
22260 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b  ction-name", 0);
22270 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
22280 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
22290 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
222a0 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
222b0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
222c0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
222d0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
222e0 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b  nction(db, argv[
222f0 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  2], -1, SQLITE_U
22300 54 46 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  TF8, 0, 0, 0, 0)
22310 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
22320 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
22330 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
22340 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
22350 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
22360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
22370 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63   sqlite_delete_c
22380 6f 6c 6c 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c  ollation DB coll
22390 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a  ation-name.**.**
223a0 20 44 65 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c   Delete the coll
223b0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 27  ation sequence '
223c0 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20  collation-name' 
223d0 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61  from database ha
223e0 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20  ndle .** DB. It 
223f0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
22400 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
22410 71 75 65 6e 63 65 20 77 61 73 20 63 72 65 61 74  quence was creat
22420 65 64 20 61 73 20 55 54 46 38 20 28 74 68 65 20  ed as UTF8 (the 
22430 0a 2a 2a 20 77 61 79 20 74 68 65 20 54 43 4c 20  .** way the TCL 
22440 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 69  interface does i
22450 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  t)..*/.static in
22460 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
22470 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  delete_collation
22480 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
22490 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
224a0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
224b0 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
224c0 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
224d0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
224e0 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  b;.  if( argc!=3
224f0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
22500 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
22510 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
22520 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
22530 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
22540 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e   " DB function-n
22550 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ame", 0);.    re
22560 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
22570 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
22580 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
22590 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
225a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
225b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
225c0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
225d0 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51  (db, argv[2], SQ
225e0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 29  LITE_UTF8, 0, 0)
225f0 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
22600 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
22610 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
22620 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
22630 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
22640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
22650 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
22660 6f 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a  ocommit DB.**.**
22670 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
22680 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20  the database DB 
22690 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
226a0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65  auto-commit mode
226b0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
226c0 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
226d0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
226e0 43 4c 41 50 49 20 67 65 74 5f 61 75 74 6f 63 6f  CLAPI get_autoco
226f0 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  mmit(.  void * c
22700 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
22710 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22720 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
22730 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
22740 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
22750 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
22760 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
22770 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
22780 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
22790 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
227a0 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
227b0 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
227c0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
227d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
227e0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
227f0 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
22800 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
22810 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22820 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
22830 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
22840 42 75 66 2c 20 22 25 64 22 2c 20 73 71 6c 69 74  Buf, "%d", sqlit
22850 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
22860 74 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70  t(db));.  Tcl_Ap
22870 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
22880 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
22890 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
228a0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
228b0 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
228c0 75 74 20 44 42 20 4d 53 0a 2a 2a 0a 2a 2a 20 53  ut DB MS.**.** S
228d0 65 74 20 74 68 65 20 62 75 73 79 20 74 69 6d 65  et the busy time
228e0 6f 75 74 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  out.  This is mo
228f0 72 65 20 65 61 73 69 6c 79 20 64 6f 6e 65 20 75  re easily done u
22900 73 69 6e 67 20 74 68 65 20 74 69 6d 65 6f 75 74  sing the timeout
22910 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  .** method of th
22920 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 2e  e TCL interface.
22930 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 61 20    But we need a 
22940 77 61 79 20 74 6f 20 74 65 73 74 20 74 68 65 20  way to test the 
22950 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20 69 74  case.** where it
22960 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
22970 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73 74 61 74 69  MISUSE..*/.stati
22980 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
22990 41 50 49 20 74 65 73 74 5f 62 75 73 79 5f 74 69  API test_busy_ti
229a0 6d 65 6f 75 74 28 0a 20 20 76 6f 69 64 20 2a 20  meout(.  void * 
229b0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
229c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
229d0 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
229e0 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
229f0 20 69 6e 74 20 72 63 2c 20 6d 73 3b 0a 20 20 73   int rc, ms;.  s
22a00 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
22a10 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
22a20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
22a30 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
22a40 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
22a50 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
22a60 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 22 2c   .        " DB",
22a70 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
22a80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
22a90 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
22aa0 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
22ab0 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
22ac0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
22ad0 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
22ae0 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6d  erp, argv[2], &m
22af0 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
22b00 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
22b10 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
22b20 75 74 28 64 62 2c 20 6d 73 29 3b 0a 20 20 54 63  ut(db, ms);.  Tc
22b30 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
22b40 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
22b50 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
22b60 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
22b70 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
22b80 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79   tcl_variable_ty
22b90 70 65 20 56 41 52 49 41 42 4c 45 4e 41 4d 45 0a  pe VARIABLENAME.
22ba0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
22bb0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 74   name of the int
22bc0 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61  ernal representa
22bd0 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20  tion for the.** 
22be0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 67 69 76  value of the giv
22bf0 65 6e 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  en variable..*/.
22c00 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
22c10 45 5f 54 43 4c 41 50 49 20 74 63 6c 5f 76 61 72  E_TCLAPI tcl_var
22c20 69 61 62 6c 65 5f 74 79 70 65 28 0a 20 20 76 6f  iable_type(.  vo
22c30 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
22c40 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
22c50 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
22c60 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
22c70 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
22c80 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 3b 0a 20  Tcl_Obj *pVar;. 
22c90 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
22ca0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
22cb0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
22cc0 6f 62 6a 76 2c 20 22 56 41 52 49 41 42 4c 45 22  objv, "VARIABLE"
22cd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
22ce0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
22cf0 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72  Var = Tcl_GetVar
22d00 32 45 78 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  2Ex(interp, Tcl_
22d10 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
22d20 5d 29 2c 20 30 2c 20 54 43 4c 5f 4c 45 41 56 45  ]), 0, TCL_LEAVE
22d30 5f 45 52 52 5f 4d 53 47 29 3b 0a 20 20 69 66 28  _ERR_MSG);.  if(
22d40 20 70 56 61 72 3d 3d 30 20 29 20 72 65 74 75 72   pVar==0 ) retur
22d50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
22d60 66 28 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72  f( pVar->typePtr
22d70 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
22d80 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
22d90 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
22da0 6a 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d  j(pVar->typePtr-
22db0 3e 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d  >name, -1));.  }
22dc0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
22dd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
22de0 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  :  sqlite3_relea
22df0 73 65 5f 6d 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a  se_memory ?N?.**
22e00 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72  .** Attempt to r
22e10 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 63 75  elease memory cu
22e20 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 75 74  rrently held but
22e30 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 72 65   not actually re
22e40 71 75 69 72 65 64 2e 0a 2a 2a 20 54 68 65 20 69  quired..** The i
22e50 6e 74 65 67 65 72 20 4e 20 69 73 20 74 68 65 20  nteger N is the 
22e60 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
22e70 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
22e80 20 72 65 6c 65 61 73 65 2e 20 20 54 68 65 20 0a   release.  The .
22e90 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
22ea0 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
22eb0 20 6d 65 6d 6f 72 79 20 61 63 74 75 61 6c 6c 79   memory actually
22ec0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74   released..*/.st
22ed0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
22ee0 54 43 4c 41 50 49 20 74 65 73 74 5f 72 65 6c 65  TCLAPI test_rele
22ef0 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f  ase_memory(.  vo
22f00 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
22f10 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
22f20 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
22f30 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
22f40 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
22f50 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
22f60 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
22f70 41 4e 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64  ANAGEMENT) && !d
22f80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
22f90 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74  IT_DISKIO).  int
22fa0 20 4e 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20   N;.  int amt;. 
22fb0 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20   if( objc!=1 && 
22fc0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
22fd0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
22fe0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
22ff0 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74   "?N?");.    ret
23000 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23010 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32   }.  if( objc==2
23020 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f   ){.    if( Tcl_
23030 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
23040 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
23050 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  N) ) return TCL_
23060 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
23070 20 20 20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a      N = -1;.  }.
23080 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f    amt = sqlite3_
23090 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e  release_memory(N
230a0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
230b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
230c0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29  l_NewIntObj(amt)
230d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
230e0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
230f0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
23100 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
23110 6d 65 6d 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20  memory DB.**.** 
23120 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61  Attempt to relea
23130 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  se memory curren
23140 74 6c 79 20 68 65 6c 64 20 62 79 20 64 61 74 61  tly held by data
23150 62 61 73 65 20 44 42 2e 20 20 52 65 74 75 72 6e  base DB.  Return
23160 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
23170 6f 64 65 20 28 77 68 69 63 68 20 69 6e 20 74 68  ode (which in th
23180 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
23190 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 6c 77 61  entation is alwa
231a0 79 73 20 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61  ys zero)..*/.sta
231b0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
231c0 43 4c 41 50 49 20 74 65 73 74 5f 64 62 5f 72 65  CLAPI test_db_re
231d0 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20  lease_memory(.  
231e0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
231f0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
23200 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
23210 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
23220 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
23230 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
23240 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f   int rc;.  if( o
23250 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
23260 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
23270 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
23280 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  "DB");.    retur
23290 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
232a0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
232b0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
232c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
232d0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
232e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
232f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  c = sqlite3_db_r
23300 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62  elease_memory(db
23310 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
23320 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
23330 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
23340 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
23350 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
23360 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  e:  sqlite3_db_c
23370 61 63 68 65 66 6c 75 73 68 20 44 42 0a 2a 2a 0a  acheflush DB.**.
23380 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6c  ** Attempt to fl
23390 75 73 68 20 61 6e 79 20 64 69 72 74 79 20 70 61  ush any dirty pa
233a0 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ges to disk..*/.
233b0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
233c0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64 62  E_TCLAPI test_db
233d0 5f 63 61 63 68 65 66 6c 75 73 68 28 0a 20 20 76  _cacheflush(.  v
233e0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
233f0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
23400 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
23410 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
23420 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
23430 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
23440 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62  int rc;.  if( ob
23450 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
23460 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
23470 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
23480 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
23490 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
234a0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
234b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
234c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
234d0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
234e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
234f0 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 61   = sqlite3_db_ca
23500 63 68 65 66 6c 75 73 68 28 64 62 29 3b 0a 20 20  cheflush(db);.  
23510 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63  if( rc ){.    Tc
23520 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
23530 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
23540 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 54  te3ErrStr(rc), T
23550 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
23560 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23570 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73  ;.  }..  Tcl_Res
23580 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
23590 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
235a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
235b0 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 74  e:  sqlite3_syst
235c0 65 6d 5f 65 72 72 6e 6f 20 44 42 0a 2a 2a 0a 2a  em_errno DB.**.*
235d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 6f 77  * Return the low
235e0 2d 6c 65 76 65 6c 20 73 79 73 74 65 6d 20 65 72  -level system er
235f0 72 6e 6f 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  rno value..*/.st
23600 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
23610 54 43 4c 41 50 49 20 74 65 73 74 5f 73 79 73 74  TCLAPI test_syst
23620 65 6d 5f 65 72 72 6e 6f 28 0a 20 20 76 6f 69 64  em_errno(.  void
23630 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
23640 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
23650 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
23660 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
23670 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
23680 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
23690 20 69 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f   iErrno;.  if( o
236a0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
236b0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
236c0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
236d0 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  "DB");.    retur
236e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
236f0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
23700 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
23710 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
23720 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
23730 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
23740 45 72 72 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f  Errno = sqlite3_
23750 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 64 62 29  system_errno(db)
23760 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
23770 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
23780 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 45 72 72 6e  _NewIntObj(iErrn
23790 6f 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  o));.  return TC
237a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
237b0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64  sage:  sqlite3_d
237c0 62 5f 66 69 6c 65 6e 61 6d 65 20 44 42 20 44 42  b_filename DB DB
237d0 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  NAME.**.** Retur
237e0 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
237f0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
23800 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 2e  with a database.
23810 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
23820 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
23830 74 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 0a 20  t_db_filename(. 
23840 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
23850 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
23860 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
23870 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
23880 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
23890 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
238a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
238b0 62 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a  bName;.  if( obj
238c0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
238d0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
238e0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
238f0 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20  B DBNAME");.    
23900 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23910 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
23920 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
23930 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
23940 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
23950 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23960 3b 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63  ;.  zDbName = Tc
23970 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
23980 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
23990 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
239a0 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65   sqlite3_db_file
239b0 6e 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  name(db, zDbName
239c0 29 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20  ), (void*)0);.  
239d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
239e0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
239f0 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
23a00 6e 6c 79 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a  nly DB DBNAME.**
23a10 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 72 20  .** Return 1 or 
23a20 30 20 69 66 20 44 42 4e 41 4d 45 20 69 73 20 72  0 if DBNAME is r
23a30 65 61 64 6f 6e 6c 79 20 6f 72 20 6e 6f 74 2e 20  eadonly or not. 
23a40 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 44 42   Return -1 if DB
23a50 4e 41 4d 45 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  NAME does.** not
23a60 20 65 78 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69   exist..*/.stati
23a70 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
23a80 41 50 49 20 74 65 73 74 5f 64 62 5f 72 65 61 64  API test_db_read
23a90 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20 63  only(.  void * c
23aa0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
23ab0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
23ac0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
23ad0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
23ae0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
23af0 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
23b00 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20  har *zDbName;.  
23b10 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
23b20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
23b30 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
23b40 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22  bjv, "DB DBNAME"
23b50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
23b60 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
23b70 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
23b80 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
23b90 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
23ba0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
23bb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61  L_ERROR;.  zDbNa
23bc0 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
23bd0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54  ng(objv[2]);.  T
23be0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
23bf0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
23c00 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 62  ntObj(sqlite3_db
23c10 5f 72 65 61 64 6f 6e 6c 79 28 64 62 2c 20 7a 44  _readonly(db, zD
23c20 62 4e 61 6d 65 29 29 29 3b 0a 20 20 72 65 74 75  bName)));.  retu
23c30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
23c40 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
23c50 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  te3_soft_heap_li
23c60 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75  mit ?N?.**.** Qu
23c70 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 73  ery or set the s
23c80 6f 66 74 20 68 65 61 70 20 6c 69 6d 69 74 20 66  oft heap limit f
23c90 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
23ca0 68 72 65 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c  hread.  The.** l
23cb0 69 6d 69 74 20 69 73 20 6f 6e 6c 79 20 63 68 61  imit is only cha
23cc0 6e 67 65 64 20 69 66 20 74 68 65 20 4e 20 69 73  nged if the N is
23cd0 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 70   present.  The p
23ce0 72 65 76 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a  revious limit.**
23cf0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
23d00 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
23d10 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73  TE_TCLAPI test_s
23d20 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a  oft_heap_limit(.
23d30 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
23d40 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
23d50 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
23d60 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
23d70 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
23d80 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
23d90 34 20 61 6d 74 3b 0a 20 20 54 63 6c 5f 57 69 64  4 amt;.  Tcl_Wid
23da0 65 49 6e 74 20 4e 20 3d 20 2d 31 3b 0a 20 20 69  eInt N = -1;.  i
23db0 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62  f( objc!=1 && ob
23dc0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
23dd0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
23de0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
23df0 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ?N?");.    retur
23e00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
23e10 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
23e20 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
23e30 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
23e40 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
23e50 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &N) ) return TC
23e60 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  L_ERROR;.  }.  a
23e70 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 6f 66  mt = sqlite3_sof
23e80 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e  t_heap_limit64(N
23e90 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
23ea0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
23eb0 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
23ec0 61 6d 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  amt));.  return 
23ed0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
23ee0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
23ef0 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
23f00 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
23f10 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
23f20 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a 73  leanup API..*/.s
23f30 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
23f40 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 74 68 72  _TCLAPI test_thr
23f50 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a 20 20 76  ead_cleanup(.  v
23f60 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
23f70 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
23f80 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
23f90 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
23fa0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
23fb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23fc0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
23fd0 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
23fe0 6c 65 61 6e 75 70 28 29 3b 0a 23 65 6e 64 69 66  leanup();.#endif
23ff0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
24000 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
24010 3a 20 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65  :   sqlite3_page
24020 72 5f 72 65 66 63 6f 75 6e 74 73 20 20 44 42 0a  r_refcounts  DB.
24030 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c  **.** Return a l
24040 69 73 74 20 6f 66 20 6e 75 6d 62 65 72 73 20 77  ist of numbers w
24050 68 69 63 68 20 61 72 65 20 74 68 65 20 50 61 67  hich are the Pag
24060 65 72 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 61  erRefcount for a
24070 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20 6f 6e 20  ll.** pagers on 
24080 65 61 63 68 20 64 61 74 61 62 61 73 65 20 63 6f  each database co
24090 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
240a0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
240b0 43 4c 41 50 49 20 74 65 73 74 5f 70 61 67 65 72  CLAPI test_pager
240c0 5f 72 65 66 63 6f 75 6e 74 73 28 0a 20 20 76 6f  _refcounts(.  vo
240d0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
240e0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
240f0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
24100 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
24110 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
24120 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
24130 6e 74 20 69 3b 0a 20 20 69 6e 74 20 76 2c 20 2a  nt i;.  int v, *
24140 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  a;.  Tcl_Obj *pR
24150 65 73 75 6c 74 3b 0a 0a 20 20 69 66 28 20 6f 62  esult;..  if( ob
24160 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
24170 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
24180 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
24190 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
241a0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
241b0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
241c0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
241d0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
241e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
241f0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
24200 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
24210 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
24220 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
24230 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
24240 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4e   pResult = Tcl_N
24250 65 77 4f 62 6a 28 29 3b 0a 20 20 66 6f 72 28 69  ewObj();.  for(i
24260 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
24270 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
24280 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[i].pBt==0 )
24290 7b 0a 20 20 20 20 20 20 76 20 3d 20 2d 31 3b 0a  {.      v = -1;.
242a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
242b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
242c0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
242d0 0a 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74  .      a = sqlit
242e0 65 33 50 61 67 65 72 53 74 61 74 73 28 73 71 6c  e3PagerStats(sql
242f0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
24300 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b  b->aDb[i].pBt));
24310 0a 20 20 20 20 20 20 76 20 3d 20 61 5b 30 5d 3b  .      v = a[0];
24320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
24330 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
24340 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
24350 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
24360 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
24370 73 75 6c 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  sult, Tcl_NewInt
24380 4f 62 6a 28 76 29 29 3b 0a 20 20 7d 0a 20 20 54  Obj(v));.  }.  T
24390 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
243a0 69 6e 74 65 72 70 2c 20 70 52 65 73 75 6c 74 29  interp, pResult)
243b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
243c0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  K;.}.../*.** tcl
243d0 63 6d 64 3a 20 20 20 77 6f 72 6b 69 6e 67 5f 36  cmd:   working_6
243e0 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a 20 53  4bit_int.**.** S
243f0 6f 6d 65 20 54 43 4c 20 62 75 69 6c 64 73 20 28  ome TCL builds (
24400 65 78 3a 20 63 79 67 77 69 6e 29 20 64 6f 20 6e  ex: cygwin) do n
24410 6f 74 20 73 75 70 70 6f 72 74 20 36 34 2d 62 69  ot support 64-bi
24420 74 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68 69  t integers.  Thi
24430 73 0a 2a 2a 20 6c 65 61 64 73 20 74 6f 20 61 20  s.** leads to a 
24440 6e 75 6d 62 65 72 20 6f 66 20 74 65 73 74 20 66  number of test f
24450 61 69 6c 75 72 65 73 2e 20 20 54 68 65 20 70 72  ailures.  The pr
24460 65 73 65 6e 74 20 63 6f 6d 6d 61 6e 64 20 63 68  esent command ch
24470 65 63 6b 73 20 74 68 65 0a 2a 2a 20 54 43 4c 20  ecks the.** TCL 
24480 62 75 69 6c 64 20 74 6f 20 73 65 65 20 77 68 65  build to see whe
24490 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 73  ther or not it s
244a0 75 70 70 6f 72 74 73 20 36 34 2d 62 69 74 20 69  upports 64-bit i
244b0 6e 74 65 67 65 72 73 2e 20 20 49 74 0a 2a 2a 20  ntegers.  It.** 
244c0 72 65 74 75 72 6e 73 20 54 52 55 45 20 69 66 20  returns TRUE if 
244d0 69 74 20 64 6f 65 73 20 61 6e 64 20 46 41 4c 53  it does and FALS
244e0 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  E if not..**.** 
244f0 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
24500 75 73 65 64 20 74 6f 20 77 61 72 6e 20 75 73 65  used to warn use
24510 72 73 20 74 68 61 74 20 74 68 65 69 72 20 54 43  rs that their TC
24520 4c 20 62 75 69 6c 64 20 69 73 20 64 65 66 65 63  L build is defec
24530 74 69 76 65 0a 2a 2a 20 61 6e 64 20 74 68 61 74  tive.** and that
24540 20 74 68 65 20 65 72 72 6f 72 73 20 74 68 65 79   the errors they
24550 20 61 72 65 20 73 65 65 69 6e 67 20 69 6e 20 74   are seeing in t
24560 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73 20  he test scripts 
24570 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 72 65  might be.** a re
24580 73 75 6c 74 20 6f 66 20 74 68 65 69 72 20 64 65  sult of their de
24590 66 65 63 74 69 76 65 20 54 43 4c 20 72 61 74 68  fective TCL rath
245a0 65 72 20 74 68 61 6e 20 70 72 6f 62 6c 65 6d 73  er than problems
245b0 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73   in SQLite..*/.s
245c0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
245d0 5f 54 43 4c 41 50 49 20 77 6f 72 6b 69 6e 67 5f  _TCLAPI working_
245e0 36 34 62 69 74 5f 69 6e 74 28 0a 20 20 43 6c 69  64bit_int(.  Cli
245f0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
24600 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
24610 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
24620 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
24630 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
24640 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
24650 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
24660 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
24670 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
24680 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
24690 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
246a0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
246b0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
246c0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
246d0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
246e0 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  /.){.  Tcl_Obj *
246f0 70 54 65 73 74 4f 62 6a 3b 0a 20 20 69 6e 74 20  pTestObj;.  int 
24700 77 6f 72 6b 69 6e 67 20 3d 20 30 3b 0a 0a 20 20  working = 0;..  
24710 70 54 65 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e  pTestObj = Tcl_N
24720 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 31 30 30  ewWideIntObj(100
24730 30 30 30 30 2a 28 69 36 34 29 31 32 33 34 35 36  0000*(i64)123456
24740 37 38 39 30 29 3b 0a 20 20 77 6f 72 6b 69 6e 67  7890);.  working
24750 20 3d 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65   = strcmp(Tcl_Ge
24760 74 53 74 72 69 6e 67 28 70 54 65 73 74 4f 62 6a  tString(pTestObj
24770 29 2c 20 22 31 32 33 34 35 36 37 38 39 30 30 30  ), "123456789000
24780 30 30 30 30 22 29 3d 3d 30 3b 0a 20 20 54 63 6c  0000")==0;.  Tcl
24790 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _DecrRefCount(pT
247a0 65 73 74 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 53  estObj);.  Tcl_S
247b0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
247c0 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
247d0 61 6e 4f 62 6a 28 77 6f 72 6b 69 6e 67 29 29 3b  anObj(working));
247e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
247f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ;.}.../*.** tclc
24800 6d 64 3a 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b  md:   vfs_unlink
24810 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73  _test.**.** This
24820 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75 6e 72   TCL command unr
24830 65 67 69 73 74 65 72 73 20 74 68 65 20 70 72 69  egisters the pri
24840 6d 61 72 79 20 56 46 53 20 61 6e 64 20 74 68 65  mary VFS and the
24850 6e 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 69  n registers.** i
24860 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 20 20 54  t back again.  T
24870 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
24880 65 73 74 20 74 68 65 20 61 62 69 6c 69 74 79 20  est the ability 
24890 74 6f 20 72 65 67 69 73 74 65 72 20 61 0a 2a 2a  to register a.**
248a0 20 56 46 53 20 77 68 65 6e 20 6e 6f 6e 65 20 61   VFS when none a
248b0 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  re previously re
248c0 67 69 73 74 65 72 65 64 2c 20 61 6e 64 20 74 68  gistered, and th
248d0 65 20 61 62 69 6c 69 74 79 20 74 6f 20 0a 2a 2a  e ability to .**
248e0 20 75 6e 72 65 67 69 73 74 65 72 20 74 68 65 20   unregister the 
248f0 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 56  only available V
24900 46 53 2e 20 20 54 69 63 6b 65 74 20 23 32 37 33  FS.  Ticket #273
24910 38 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  8.*/.static int 
24920 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 76 66  SQLITE_TCLAPI vf
24930 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 28 0a 20  s_unlink_test(. 
24940 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
24950 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
24960 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
24970 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
24980 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
24990 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
249a0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
249b0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
249c0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
249d0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
249e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
249f0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
24a00 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
24a10 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
24a20 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
24a30 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
24a40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
24a50 2a 70 4d 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65  *pMain;.  sqlite
24a60 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d  3_vfs *apVfs[20]
24a70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
24a80 6f 6e 65 2c 20 74 77 6f 3b 0a 0a 20 20 73 71 6c  one, two;..  sql
24a90 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
24aa0 74 65 72 28 30 29 3b 20 20 20 2f 2a 20 55 6e 72  ter(0);   /* Unr
24ab0 65 67 69 73 74 65 72 20 6f 66 20 4e 55 4c 4c 20  egister of NULL 
24ac0 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20  is harmless */. 
24ad0 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f   one.zName = "__
24ae0 6f 6e 65 22 3b 0a 20 20 74 77 6f 2e 7a 4e 61 6d  one";.  two.zNam
24af0 65 20 3d 20 22 5f 5f 74 77 6f 22 3b 0a 0a 20 20  e = "__two";..  
24b00 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74  /* Calling sqlit
24b10 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 20  e3_vfs_register 
24b20 77 69 74 68 20 32 6e 64 20 61 72 67 75 6d 65 6e  with 2nd argumen
24b30 74 20 6f 66 20 30 20 64 6f 65 73 20 6e 6f 74 0a  t of 0 does not.
24b40 20 20 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20    ** change the 
24b50 64 65 66 61 75 6c 74 20 56 46 53 0a 20 20 2a 2f  default VFS.  */
24b60 0a 20 20 70 4d 61 69 6e 20 3d 20 73 71 6c 69 74  .  pMain = sqlit
24b70 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
24b80 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
24b90 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b  gister(&one, 0);
24ba0 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e  .  assert( pMain
24bb0 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71  ==0 || pMain==sq
24bc0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
24bd0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ) );.  sqlite3_v
24be0 66 73 5f 72 65 67 69 73 74 65 72 28 26 74 77 6f  fs_register(&two
24bf0 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
24c00 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69  pMain==0 || pMai
24c10 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  n==sqlite3_vfs_f
24c20 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ind(0) );..  /* 
24c30 57 65 20 63 61 6e 20 66 69 6e 64 20 61 20 56 46  We can find a VF
24c40 53 20 62 79 20 69 74 73 20 6e 61 6d 65 20 2a 2f  S by its name */
24c50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24c60 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f  e3_vfs_find("__o
24c70 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20  ne")==&one );.  
24c80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
24c90 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22  vfs_find("__two"
24ca0 29 3d 3d 26 74 77 6f 20 29 3b 0a 0a 20 20 2f 2a  )==&two );..  /*
24cb0 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 5f   Calling sqlite_
24cc0 76 66 73 5f 72 65 67 69 73 74 65 72 20 77 69 74  vfs_register wit
24cd0 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73 65 63 6f 6e  h non-zero secon
24ce0 64 20 70 61 72 61 6d 65 74 65 72 20 63 68 61 6e  d parameter chan
24cf0 67 65 73 20 74 68 65 0a 20 20 2a 2a 20 64 65 66  ges the.  ** def
24d00 61 75 6c 74 20 56 46 53 2c 20 65 76 65 6e 20 69  ault VFS, even i
24d10 66 20 74 68 65 20 31 73 74 20 70 61 72 61 6d 65  f the 1st parame
24d20 74 65 72 20 69 73 20 61 6e 20 65 78 69 73 74 69  ter is an existi
24d30 67 20 56 46 53 20 74 68 61 74 20 69 73 0a 20 20  g VFS that is.  
24d40 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  ** previously re
24d50 67 69 73 74 65 72 65 64 20 61 73 20 74 68 65 20  gistered as the 
24d60 6e 6f 6e 2d 64 65 66 61 75 6c 74 2e 0a 20 20 2a  non-default..  *
24d70 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  /.  sqlite3_vfs_
24d80 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 31  register(&one, 1
24d90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
24da0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
24db0 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a  _one")==&one );.
24dc0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24dd0 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77  3_vfs_find("__tw
24de0 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61  o")==&two );.  a
24df0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
24e00 66 73 5f 66 69 6e 64 28 30 29 3d 3d 26 6f 6e 65  fs_find(0)==&one
24e10 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   );.  sqlite3_vf
24e20 73 5f 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c  s_register(&two,
24e30 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73   1);.  assert( s
24e40 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
24e50 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29  "__one")==&one )
24e60 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
24e70 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
24e80 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20  two")==&two );. 
24e90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24ea0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 26 74  _vfs_find(0)==&t
24eb0 77 6f 20 29 3b 0a 20 20 69 66 28 20 70 4d 61 69  wo );.  if( pMai
24ec0 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
24ed0 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d  _vfs_register(pM
24ee0 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  ain, 1);.    ass
24ef0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
24f00 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d  _find("__one")==
24f10 26 6f 6e 65 20 29 3b 0a 20 20 20 20 61 73 73 65  &one );.    asse
24f20 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
24f30 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26  find("__two")==&
24f40 74 77 6f 20 29 3b 0a 20 20 20 20 61 73 73 65 72  two );.    asser
24f50 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
24f60 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b  ind(0)==pMain );
24f70 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 55 6e 6c  .  }.  .  /* Unl
24f80 69 6e 6b 20 74 68 65 20 64 65 66 61 75 6c 74 20  ink the default 
24f90 56 46 53 2e 20 20 52 65 70 65 61 74 20 75 6e 74  VFS.  Repeat unt
24fa0 69 6c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  il there are no 
24fb0 6d 6f 72 65 20 56 46 53 65 73 0a 20 20 2a 2a 20  more VFSes.  ** 
24fc0 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20 2a 2f  registered..  */
24fd0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
24fe0 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a 65  zeof(apVfs)/size
24ff0 6f 66 28 61 70 56 66 73 5b 30 5d 29 3b 20 69 2b  of(apVfs[0]); i+
25000 2b 29 7b 0a 20 20 20 20 61 70 56 66 73 5b 69 5d  +){.    apVfs[i]
25010 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
25020 69 6e 64 28 30 29 3b 0a 20 20 20 20 69 66 28 20  ind(0);.    if( 
25030 61 70 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20  apVfs[i] ){.    
25040 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b    assert( apVfs[
25050 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  i]==sqlite3_vfs_
25060 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a  find(apVfs[i]->z
25070 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 20 20 73  Name) );.      s
25080 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67  qlite3_vfs_unreg
25090 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 29 3b  ister(apVfs[i]);
250a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
250b0 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
250c0 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61  nd(apVfs[i]->zNa
250d0 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  me) );.    }.  }
250e0 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71  .  assert( 0==sq
250f0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
25100 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 52 65 67  ) );.  .  /* Reg
25110 69 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56  ister the main V
25120 46 53 20 61 73 20 6e 6f 6e 2d 64 65 66 61 75 6c  FS as non-defaul
25130 74 20 28 77 69 6c 6c 20 62 65 20 6d 61 64 65 20  t (will be made 
25140 64 65 66 61 75 6c 74 2c 20 73 69 6e 63 65 0a 20  default, since. 
25150 20 2a 2a 20 69 74 27 6c 6c 20 62 65 20 74 68 65   ** it'll be the
25160 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 20 65 78 69   only one in exi
25170 73 74 65 6e 63 65 29 2e 0a 20 20 2a 2f 0a 20 20  stence)..  */.  
25180 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
25190 73 74 65 72 28 70 4d 61 69 6e 2c 20 30 29 3b 0a  ster(pMain, 0);.
251a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
251b0 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70  3_vfs_find(0)==p
251c0 4d 61 69 6e 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  Main );.  .  /* 
251d0 55 6e 2d 72 65 67 69 73 74 65 72 20 74 68 65 20  Un-register the 
251e0 6d 61 69 6e 20 56 46 53 20 61 67 61 69 6e 20 74  main VFS again t
251f0 6f 20 72 65 73 74 6f 72 65 20 61 6e 20 65 6d 70  o restore an emp
25200 74 79 20 56 46 53 20 6c 69 73 74 20 2a 2f 0a 20  ty VFS list */. 
25210 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
25220 65 67 69 73 74 65 72 28 70 4d 61 69 6e 29 3b 0a  egister(pMain);.
25230 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
25240 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
25250 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 69 6e 6b   );..  /* Relink
25260 20 61 6c 6c 20 56 46 53 65 73 20 69 6e 20 72 65   all VFSes in re
25270 76 65 72 73 65 20 6f 72 64 65 72 2e 20 2a 2f 20  verse order. */ 
25280 20 0a 20 20 66 6f 72 28 69 3d 73 69 7a 65 6f 66   .  for(i=sizeof
25290 28 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61  (apVfs)/sizeof(a
252a0 70 56 66 73 5b 30 5d 29 2d 31 3b 20 69 3e 3d 30  pVfs[0])-1; i>=0
252b0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  ; i--){.    if( 
252c0 61 70 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20  apVfs[i] ){.    
252d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
252e0 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c  gister(apVfs[i],
252f0 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
25300 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c  t( apVfs[i]==sql
25310 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
25320 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
25330 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69  ( apVfs[i]==sqli
25340 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56  te3_vfs_find(apV
25350 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b  fs[i]->zName) );
25360 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
25370 20 55 6e 72 65 67 69 73 74 65 72 20 6f 75 74 20   Unregister out 
25380 73 61 6d 70 6c 65 20 56 46 53 65 73 2e 20 2a 2f  sample VFSes. */
25390 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
253a0 6e 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b  nregister(&one);
253b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
253c0 6e 72 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b  nregister(&two);
253d0 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65  ..  /* Unregiste
253e0 72 69 6e 67 20 61 20 56 46 53 20 74 68 61 74 20  ring a VFS that 
253f0 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
25400 20 72 65 67 69 73 74 65 72 65 64 20 69 73 20 68   registered is h
25410 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 73 71 6c  armless */.  sql
25420 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
25430 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c  ter(&one);.  sql
25440 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
25450 74 65 72 28 26 74 77 6f 29 3b 0a 20 20 61 73 73  ter(&two);.  ass
25460 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
25470 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d  _find("__one")==
25480 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
25490 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
254a0 22 5f 5f 74 77 6f 22 29 3d 3d 30 20 29 3b 0a 0a  "__two")==0 );..
254b0 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 62    /* We should b
254c0 65 20 6c 65 66 74 20 77 69 74 68 20 74 68 65 20  e left with the 
254d0 6f 72 69 67 69 6e 61 6c 20 64 65 66 61 75 6c 74  original default
254e0 20 56 46 53 20 62 61 63 6b 20 61 73 20 74 68 65   VFS back as the
254f0 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 2a  .  ** original *
25500 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
25510 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d  te3_vfs_find(0)=
25520 3d 70 4d 61 69 6e 20 29 3b 0a 0a 20 20 72 65 74  =pMain );..  ret
25530 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
25540 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76  *.** tclcmd:   v
25550 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74  fs_initfail_test
25560 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
25570 63 6f 6d 6d 61 6e 64 20 61 74 74 65 6d 70 74 73  command attempts
25580 20 74 6f 20 76 66 73 5f 66 69 6e 64 20 61 6e 64   to vfs_find and
25590 20 76 66 73 5f 72 65 67 69 73 74 65 72 20 77 68   vfs_register wh
255a0 65 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  en the.** sqlite
255b0 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
255c0 6e 74 65 72 66 61 63 65 20 69 73 20 66 61 69 6c  nterface is fail
255d0 69 6e 67 2e 20 20 41 6c 6c 20 63 61 6c 6c 73 20  ing.  All calls 
255e0 73 68 6f 75 6c 64 20 66 61 69 6c 2e 0a 2a 2f 0a  should fail..*/.
255f0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
25600 45 5f 54 43 4c 41 50 49 20 76 66 73 5f 69 6e 69  E_TCLAPI vfs_ini
25610 74 66 61 69 6c 5f 74 65 73 74 28 0a 20 20 43 6c  tfail_test(.  Cl
25620 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
25630 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
25640 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
25650 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
25660 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
25670 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
25680 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
25690 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
256a0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
256b0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
256c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
256d0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
256e0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
256f0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
25700 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
25710 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
25720 76 66 73 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a  vfs one;.  one.z
25730 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a  Name = "__one";.
25740 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
25750 66 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74  fs_find(0) ) ret
25760 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
25770 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
25780 69 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a  ister(&one, 0);.
25790 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66    if( sqlite3_vf
257a0 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75  s_find(0) ) retu
257b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
257c0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
257d0 73 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20  ster(&one, 1);. 
257e0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73   if( sqlite3_vfs
257f0 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72  _find(0) ) retur
25800 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
25810 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
25820 0a 2f 2a 0a 2a 2a 20 53 61 76 65 64 20 56 46 53  ./*.** Saved VFS
25830 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  es.*/.static sql
25840 69 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73 5b  ite3_vfs *apVfs[
25850 32 30 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  20];.static int 
25860 6e 56 66 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  nVfs = 0;../*.**
25870 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75   tclcmd:   vfs_u
25880 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a  nregister_all.**
25890 0a 2a 2a 20 55 6e 72 65 67 69 73 74 65 72 20 61  .** Unregister a
258a0 6c 6c 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61  ll VFSes..*/.sta
258b0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
258c0 43 4c 41 50 49 20 76 66 73 5f 75 6e 72 65 67 69  CLAPI vfs_unregi
258d0 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65  ster_all(.  Clie
258e0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
258f0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
25900 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
25910 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
25920 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
25930 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
25940 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
25950 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
25960 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
25970 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
25980 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25990 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
259a0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
259b0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
259c0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
259d0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
259e0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
259f0 69 7a 65 28 61 70 56 66 73 29 3b 20 69 2b 2b 29  ize(apVfs); i++)
25a00 7b 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d  {.    apVfs[i] =
25a10 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
25a20 64 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70  d(0);.    if( ap
25a30 56 66 73 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61  Vfs[i]==0 ) brea
25a40 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  k;.    sqlite3_v
25a50 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70  fs_unregister(ap
25a60 56 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e  Vfs[i]);.  }.  n
25a70 56 66 73 20 3d 20 69 3b 0a 20 20 72 65 74 75 72  Vfs = i;.  retur
25a80 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  n TCL_OK;.}./*.*
25a90 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f  * tclcmd:   vfs_
25aa0 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a  reregister_all.*
25ab0 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c  *.** Restore all
25ac0 20 56 46 53 65 73 20 74 68 61 74 20 77 65 72 65   VFSes that were
25ad0 20 72 65 6d 6f 76 65 64 20 75 73 69 6e 67 20 76   removed using v
25ae0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c  fs_unregister_al
25af0 6c 2e 20 54 61 6b 69 6e 67 0a 2a 2a 20 63 61 72  l. Taking.** car
25b00 65 20 74 6f 20 70 75 74 20 74 68 65 20 6c 69 6e  e to put the lin
25b10 6b 65 64 20 6c 69 73 74 20 62 61 63 6b 20 74 6f  ked list back to
25b20 67 65 74 68 65 72 20 69 6e 20 74 68 65 20 73 61  gether in the sa
25b30 6d 65 20 6f 72 64 65 72 20 61 73 20 69 74 20 77  me order as it w
25b40 61 73 0a 2a 2a 20 69 6e 20 62 65 66 6f 72 65 20  as.** in before 
25b50 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
25b60 6c 6c 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a  ll was invoked..
25b70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
25b80 4c 49 54 45 5f 54 43 4c 41 50 49 20 76 66 73 5f  LITE_TCLAPI vfs_
25b90 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a  reregister_all(.
25ba0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
25bb0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
25bc0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
25bd0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
25be0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
25bf0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
25c00 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
25c10 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
25c20 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
25c30 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
25c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25c50 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25c60 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
25c70 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
25c80 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
25c90 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
25ca0 69 3b 0a 20 20 66 6f 72 28 69 3d 6e 56 66 73 2d  i;.  for(i=nVfs-
25cb0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
25cc0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
25cd0 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d  egister(apVfs[i]
25ce0 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
25cf0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
25d00 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
25d10 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74  ile_control_test
25d20 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54   DB.**.** This T
25d30 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
25d40 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
25d50 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
25d60 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
25d70 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
25d80 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65  tion of the same
25d90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25da0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69  SQLITE_TCLAPI fi
25db0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 28  le_control_test(
25dc0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
25dd0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
25de0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
25df0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
25e00 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
25e10 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
25e20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
25e30 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
25e40 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
25e50 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
25e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25e70 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
25e80 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
25e90 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
25ea0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
25eb0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
25ec0 20 69 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c   iArg = 0;.  sql
25ed0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
25ee0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
25ef0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
25f00 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
25f10 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
25f20 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
25f30 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
25f40 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
25f50 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22  jv[0], 0), " DB"
25f60 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
25f70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
25f80 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
25f90 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
25fa0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
25fb0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
25fc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
25fd0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
25fe0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20 30  control(db, 0, 0
25ff0 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65  , &iArg);.  asse
26000 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
26010 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20 72 63 20  OTFOUND );.  rc 
26020 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
26030 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e 6f 74 61  ontrol(db, "nota
26040 64 61 74 61 62 61 73 65 22 2c 20 53 51 4c 49 54  database", SQLIT
26050 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
26060 45 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73  E, &iArg);.  ass
26070 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
26080 45 52 52 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20  ERROR );.  rc = 
26090 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
260a0 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c  trol(db, "main",
260b0 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20 20 61   -1, &iArg);.  a
260c0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
260d0 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20  E_NOTFOUND );.  
260e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
260f0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 74  e_control(db, "t
26100 65 6d 70 22 2c 20 2d 31 2c 20 26 69 41 72 67 29  emp", -1, &iArg)
26110 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
26120 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
26130 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  || rc==SQLITE_ER
26140 52 4f 52 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ROR );..  return
26150 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
26160 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
26170 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72  e_control_laster
26180 72 6e 6f 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a  rno_test DB.**.*
26190 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
261a0 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
261b0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
261c0 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a   interface and.*
261d0 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65  * verifies corre
261e0 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
261f0 74 68 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  the SQLITE_LAST_
26200 45 52 52 4e 4f 20 76 65 72 62 2e 0a 2a 2f 0a 73  ERRNO verb..*/.s
26210 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
26220 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e  _TCLAPI file_con
26230 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74  trol_lasterrno_t
26240 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
26250 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
26260 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
26270 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
26280 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
26290 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
262a0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
262b0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
262c0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
262d0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
262e0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
262f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
26300 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
26310 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
26320 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
26330 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
26340 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20   int iArg = 0;. 
26350 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
26360 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
26370 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
26380 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
26390 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
263a0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
263b0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
263c0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
263d0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
263e0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
263f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
26400 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
26410 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
26420 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
26430 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
26440 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
26450 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
26460 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
26470 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53  trol(db, NULL, S
26480 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
26490 2c 20 26 69 41 72 67 29 3b 0a 20 20 69 66 28 20  , &iArg);.  if( 
264a0 72 63 20 29 7b 20 0a 20 20 20 20 54 63 6c 5f 53  rc ){ .    Tcl_S
264b0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
264c0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
264d0 6a 28 72 63 29 29 3b 20 0a 20 20 20 20 72 65 74  j(rc)); .    ret
264e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 0a  urn TCL_ERROR; .
264f0 20 20 7d 0a 20 20 69 66 28 20 69 41 72 67 21 3d    }.  if( iArg!=
26500 30 20 29 20 7b 0a 20 20 20 20 54 63 6c 5f 41 70  0 ) {.    Tcl_Ap
26510 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
26520 70 2c 20 22 55 6e 65 78 70 65 63 74 65 64 20 6e  p, "Unexpected n
26530 6f 6e 2d 7a 65 72 6f 20 65 72 72 6e 6f 3a 20 22  on-zero errno: "
26540 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26550 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
26560 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
26570 4e 65 77 49 6e 74 4f 62 6a 28 69 41 72 67 29 2c  NewIntObj(iArg),
26580 20 30 29 2c 20 22 20 22 2c 20 30 29 3b 0a 20 20   0), " ", 0);.  
26590 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
265a0 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
265b0 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23 69   TCL_OK;  .}..#i
265c0 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 2f  fdef __APPLE__./
265d0 2a 20 46 72 6f 6d 20 73 71 6c 69 74 65 33 5f 70  * From sqlite3_p
265e0 72 69 76 61 74 65 2e 68 20 2a 2f 0a 23 20 69 66  rivate.h */.# if
265f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 52 55 4e  ndef SQLITE_TRUN
26600 43 41 54 45 5f 44 41 54 41 42 41 53 45 0a 23 20  CATE_DATABASE.# 
26610 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52  define SQLITE_TR
26620 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45 20  UNCATE_DATABASE 
26630 20 20 20 20 20 31 30 31 0a 23 20 64 65 66 69 6e       101.# defin
26640 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  e SQLITE_TRUNCAT
26650 45 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  E_JOURNALMODE_WA
26660 4c 20 20 20 20 20 20 20 20 20 20 20 28 30 78 31  L           (0x1
26670 3c 3c 30 29 0a 23 20 64 65 66 69 6e 65 20 53 51  <<0).# define SQ
26680 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 41 55  LITE_TRUNCATE_AU
26690 54 4f 56 41 43 55 55 4d 5f 4d 41 53 4b 20 20 20  TOVACUUM_MASK   
266a0 20 20 20 20 20 20 20 20 28 30 78 33 3c 3c 32 29          (0x3<<2)
266b0 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
266c0 5f 54 52 55 4e 43 41 54 45 5f 41 55 54 4f 56 41  _TRUNCATE_AUTOVA
266d0 43 55 55 4d 5f 4f 46 46 20 20 20 20 20 20 20 20  CUUM_OFF        
266e0 20 20 20 20 28 30 78 31 3c 3c 32 29 0a 23 20 64      (0x1<<2).# d
266f0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55  efine SQLITE_TRU
26700 4e 43 41 54 45 5f 41 55 54 4f 56 41 43 55 55 4d  NCATE_AUTOVACUUM
26710 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 20 20 20  _FULL           
26720 28 30 78 32 3c 3c 32 29 0a 23 20 64 65 66 69 6e  (0x2<<2).# defin
26730 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  e SQLITE_TRUNCAT
26740 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
26750 52 45 4d 45 4e 54 41 4c 20 20 20 20 28 30 78 33  REMENTAL    (0x3
26760 3c 3c 32 29 0a 23 20 64 65 66 69 6e 65 20 53 51  <<2).# define SQ
26770 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50 41  LITE_TRUNCATE_PA
26780 47 45 53 49 5a 45 5f 4d 41 53 4b 20 20 20 20 20  GESIZE_MASK     
26790 20 20 20 20 20 20 20 20 28 30 78 37 3c 3c 34 29          (0x7<<4)
267a0 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
267b0 5f 54 52 55 4e 43 41 54 45 5f 50 41 47 45 53 49  _TRUNCATE_PAGESI
267c0 5a 45 5f 31 30 32 34 20 20 20 20 20 20 20 20 20  ZE_1024         
267d0 20 20 20 20 28 30 78 31 3c 3c 34 29 0a 23 20 64      (0x1<<4).# d
267e0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55  efine SQLITE_TRU
267f0 4e 43 41 54 45 5f 50 41 47 45 53 49 5a 45 5f 32  NCATE_PAGESIZE_2
26800 30 34 38 20 20 20 20 20 20 20 20 20 20 20 20 20  048             
26810 28 30 78 32 3c 3c 34 29 0a 23 20 64 65 66 69 6e  (0x2<<4).# defin
26820 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  e SQLITE_TRUNCAT
26830 45 5f 50 41 47 45 53 49 5a 45 5f 34 30 39 36 20  E_PAGESIZE_4096 
26840 20 20 20 20 20 20 20 20 20 20 20 20 28 30 78 33              (0x3
26850 3c 3c 34 29 0a 23 20 64 65 66 69 6e 65 20 53 51  <<4).# define SQ
26860 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50 41  LITE_TRUNCATE_PA
26870 47 45 53 49 5a 45 5f 38 31 39 32 20 20 20 20 20  GESIZE_8192     
26880 20 20 20 20 20 20 20 20 28 30 78 34 3c 3c 34 29          (0x4<<4)
26890 0a 23 20 65 6e 64 69 66 0a 23 20 69 66 6e 64 65  .# endif.# ifnde
268a0 66 20 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45  f SQLITE_REPLACE
268b0 5f 44 41 54 41 42 41 53 45 0a 23 20 64 65 66 69  _DATABASE.# defi
268c0 6e 65 20 53 51 4c 49 54 45 5f 52 45 50 4c 41 43  ne SQLITE_REPLAC
268d0 45 5f 44 41 54 41 42 41 53 45 20 20 20 20 20 20  E_DATABASE      
268e0 20 31 30 32 0a 23 20 65 6e 64 69 66 0a 0a 2f 2a   102.# endif../*
268f0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
26900 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 72 75 6e 63  le_control_trunc
26910 61 74 65 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a  ate_test DB.**.*
26920 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
26930 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
26940 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
26950 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a   interface and.*
26960 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65  * verifies corre
26970 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
26980 74 68 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43  the SQLITE_TRUNC
26990 41 54 45 5f 44 41 54 41 42 41 53 45 20 76 65 72  ATE_DATABASE ver
269a0 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  b..*/.static int
269b0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 72   file_control_tr
269c0 75 6e 63 61 74 65 5f 74 65 73 74 28 0a 20 20 43  uncate_test(.  C
269d0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
269e0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
269f0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
26a00 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
26a10 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
26a20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
26a30 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
26a40 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
26a50 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
26a60 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
26a70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
26a80 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
26a90 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
26aa0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
26ab0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
26ac0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
26ad0 20 2a 64 62 3b 0a 20 20 69 6e 74 20 66 6c 61 67   *db;.  int flag
26ae0 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a  s;.  int rc;.  .
26af0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
26b00 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
26b10 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
26b20 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
26b30 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
26b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
26b60 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
26b70 29 2c 20 22 20 44 42 20 46 4c 41 47 53 22 2c 20  ), " DB FLAGS", 
26b80 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
26b90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
26ba0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
26bb0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
26bc0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
26bd0 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
26be0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
26bf0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
26c00 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
26c10 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 66 6c 61  p, objv[2], &fla
26c20 67 73 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  gs) ){.    retur
26c30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
26c40 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
26c50 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
26c60 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 54 52   NULL, SQLITE_TR
26c70 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45 2c  UNCATE_DATABASE,
26c80 20 26 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20   &flags);.  if( 
26c90 72 63 20 29 7b 20 0a 20 20 20 20 54 63 6c 5f 53  rc ){ .    Tcl_S
26ca0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
26cb0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
26cc0 6a 28 72 63 29 29 3b 20 0a 20 20 20 20 72 65 74  j(rc)); .    ret
26cd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 0a  urn TCL_ERROR; .
26ce0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
26cf0 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
26d00 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
26d10 6f 6e 74 72 6f 6c 5f 72 65 70 6c 61 63 65 5f 74  ontrol_replace_t
26d20 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69  est DB.**.** Thi
26d30 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
26d40 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
26d50 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
26d60 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
26d70 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
26d80 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53  eration of the S
26d90 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 5f 44 41  QLITE_REPLACE_DA
26da0 54 41 42 41 53 45 20 76 65 72 62 2e 0a 2a 2f 0a  TABASE verb..*/.
26db0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
26dc0 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c 61 63 65 5f  control_replace_
26dd0 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
26de0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
26df0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
26e00 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
26e10 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
26e20 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
26e30 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
26e40 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
26e50 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
26e60 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
26e70 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
26e80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
26e90 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
26ea0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
26eb0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
26ec0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
26ed0 20 20 73 71 6c 69 74 65 33 20 2a 73 72 63 5f 64    sqlite3 *src_d
26ee0 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 73  b;.  sqlite3 *ds
26ef0 74 5f 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  t_db;.  int rc;.
26f00 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33    .  if( objc!=3
26f10 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
26f20 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
26f30 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
26f40 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f60 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
26f70 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
26f80 2c 20 30 29 2c 20 22 20 44 53 54 5f 44 42 20 53  , 0), " DST_DB S
26f90 52 43 5f 44 42 22 2c 20 30 29 3b 0a 20 20 20 20  RC_DB", 0);.    
26fa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
26fb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
26fc0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
26fd0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
26fe0 62 6a 76 5b 31 5d 29 2c 20 26 64 73 74 5f 64 62  bjv[1]), &dst_db
26ff0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
27000 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
27010 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
27020 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
27030 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
27040 2c 20 26 73 72 63 5f 64 62 29 20 29 7b 0a 20 20  , &src_db) ){.  
27050 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
27060 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
27070 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
27080 72 6f 6c 28 64 73 74 5f 64 62 2c 20 4e 55 4c 4c  rol(dst_db, NULL
27090 2c 20 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45  , SQLITE_REPLACE
270a0 5f 44 41 54 41 42 41 53 45 2c 20 73 72 63 5f 64  _DATABASE, src_d
270b0 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 20  b);.  if( rc ){ 
270c0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
270d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
270e0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
270f0 3b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ; .    return TC
27100 4c 5f 45 52 52 4f 52 3b 20 0a 20 20 7d 0a 20 20  L_ERROR; .  }.  
27110 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
27120 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 41  .}.#endif /* __A
27130 50 50 4c 45 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  PPLE__ */../*.**
27140 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
27150 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a  control_chunksiz
27160 65 5f 74 65 73 74 20 44 42 20 44 42 4e 41 4d 45  e_test DB DBNAME
27170 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73   SIZE.**.** This
27180 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
27190 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
271a0 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
271b0 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69  face and.** veri
271c0 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65  fies correct ope
271d0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51  ration of the SQ
271e0 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
271f0 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51  XYFILE and.** SQ
27200 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
27210 58 59 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f  XYFILE verbs..*/
27220 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
27230 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63  TE_TCLAPI file_c
27240 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65  ontrol_chunksize
27250 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
27260 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
27270 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
27280 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
27290 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
272a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
272b0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
272c0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
272d0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
272e0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
272f0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
27300 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
27310 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
27320 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
27330 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
27340 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
27350 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20  .  int nSize;   
27360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27370 20 20 20 2f 2a 20 4e 65 77 20 63 68 75 6e 6b 20     /* New chunk 
27380 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  size */.  char *
27390 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
273a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20            /* Db 
273b0 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  name ("main", "t
273c0 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20  emp" etc.) */.  
273d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
273e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273f0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
27400 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27420 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f          /* file_
27430 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e  control() return
27440 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20   code */..  if( 
27450 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
27460 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
27470 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
27480 20 22 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45   "DB DBNAME SIZE
27490 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
274a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
274b0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
274c0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
274d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
274e0 20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c   &db) .   || Tcl
274f0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
27500 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
27510 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20  &nSize).  ){.   
27520 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27530 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63  ;.  }.  zDb = Tc
27540 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
27550 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b  [2]);.  if( zDb[
27560 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d  0]=='\0' ) zDb =
27570 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73   NULL;..  rc = s
27580 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
27590 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c  rol(db, zDb, SQL
275a0 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f  ITE_FCNTL_CHUNK_
275b0 53 49 5a 45 2c 20 28 76 6f 69 64 20 2a 29 26 6e  SIZE, (void *)&n
275c0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
275d0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
275e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
275f0 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e  ar *)sqlite3ErrN
27600 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
27610 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
27620 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
27630 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
27640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
27650 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
27660 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 44  _sizehint_test D
27670 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a  B DBNAME SIZE.**
27680 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
27690 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
276a0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
276b0 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 0a 2a 2a  ol interface .**
276c0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 46 43 4e   with SQLITE_FCN
276d0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a  TL_SIZE_HINT.*/.
276e0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
276f0 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f  E_TCLAPI file_co
27700 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
27710 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
27720 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
27730 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
27740 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
27750 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
27760 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
27770 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
27780 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
27790 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
277a0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
277b0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
277c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
277d0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
277e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
277f0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
27800 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
27810 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e 53 69   Tcl_WideInt nSi
27820 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
27830 20 2f 2a 20 48 69 6e 74 65 64 20 73 69 7a 65 20   /* Hinted size 
27840 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20  */.  char *zDb; 
27850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27860 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20       /* Db name 
27870 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20  ("main", "temp" 
27880 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74  etc.) */.  sqlit
27890 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
278a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
278b0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
278c0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
278d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278e0 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72     /* file_contr
278f0 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65  ol() return code
27900 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
27910 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
27920 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
27930 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
27940 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20  DBNAME SIZE");. 
27950 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
27960 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
27970 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
27980 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
27990 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
279a0 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 57   .   || Tcl_GetW
279b0 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
279c0 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
279d0 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72  nSize).  ){.   r
279e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
279f0 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c  .  }.  zDb = Tcl
27a00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
27a10 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30  2]);.  if( zDb[0
27a20 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20  ]=='\0' ) zDb = 
27a30 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71  NULL;..  rc = sq
27a40 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
27a50 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  ol(db, zDb, SQLI
27a60 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
27a70 4e 54 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69  NT, (void *)&nSi
27a80 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ze);.  if( rc ){
27a90 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
27aa0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
27ab0 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d   *)sqlite3ErrNam
27ac0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
27ad0 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
27ae0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
27af0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
27b00 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
27b10 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c    file_control_l
27b20 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 20 44 42  ockproxy_test DB
27b30 20 50 57 44 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   PWD.**.** This 
27b40 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
27b50 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
27b60 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
27b70 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
27b80 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
27b90 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ation of the SQL
27ba0 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
27bb0 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c  YFILE and.** SQL
27bc0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
27bd0 59 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a  YFILE verbs..*/.
27be0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
27bf0 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f  E_TCLAPI file_co
27c00 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f  ntrol_lockproxy_
27c10 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
27c20 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
27c30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
27c40 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
27c50 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
27c60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
27c70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
27c80 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
27c90 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
27ca0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
27cb0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
27cc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
27cd0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
27ce0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
27cf0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
27d00 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
27d10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
27d20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20   .  if( objc!=3 
27d30 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
27d40 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
27d50 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
27d60 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
27d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d80 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
27d90 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
27da0 20 30 29 2c 20 22 20 44 42 20 50 57 44 22 2c 20   0), " DB PWD", 
27db0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
27dc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
27dd0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
27de0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
27df0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
27e00 20 26 64 62 29 20 29 7b 0a 20 20 20 72 65 74 75   &db) ){.   retu
27e10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27e20 7d 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  }.  .#if !define
27e30 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
27e40 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23  LOCKING_STYLE).#
27e50 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41    if defined(__A
27e60 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66  PPLE__).#    def
27e70 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
27e80 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
27e90 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
27ea0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41  efine SQLITE_ENA
27eb0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
27ec0 45 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  E 0.#  endif.#en
27ed0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
27ee0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
27ef0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
27f00 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 7b 0a 20 20  _APPLE__).  {.  
27f10 20 20 63 68 61 72 20 2a 74 65 73 74 50 61 74 68    char *testPath
27f20 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  ;.    int rc;.  
27f30 20 20 69 6e 74 20 6e 50 77 64 3b 0a 20 20 20 20    int nPwd;.    
27f40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 77 64  const char *zPwd
27f50 3b 0a 20 20 20 20 63 68 61 72 20 70 72 6f 78 79  ;.    char proxy
27f60 50 61 74 68 5b 34 30 30 5d 3b 0a 20 20 20 20 0a  Path[400];.    .
27f70 20 20 20 20 7a 50 77 64 20 3d 20 54 63 6c 5f 47      zPwd = Tcl_G
27f80 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
27f90 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50 77 64 29 3b  objv[2], &nPwd);
27fa0 0a 20 20 20 20 69 66 28 20 73 69 7a 65 6f 66 28  .    if( sizeof(
27fb0 70 72 6f 78 79 50 61 74 68 29 3c 6e 50 77 64 2b  proxyPath)<nPwd+
27fc0 32 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  20 ){.      Tcl_
27fd0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
27fe0 65 72 70 2c 20 22 50 57 44 20 74 6f 6f 20 62 69  erp, "PWD too bi
27ff0 67 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20  g", (void*)0);. 
28000 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
28010 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
28020 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
28030 66 28 73 69 7a 65 6f 66 28 70 72 6f 78 79 50 61  f(sizeof(proxyPa
28040 74 68 29 2c 20 70 72 6f 78 79 50 61 74 68 2c 20  th), proxyPath, 
28050 22 25 73 2f 74 65 73 74 2e 70 72 6f 78 79 22 2c  "%s/test.proxy",
28060 20 7a 50 77 64 29 3b 0a 20 20 20 20 72 63 20 3d   zPwd);.    rc =
28070 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
28080 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
28090 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
280a0 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50  ROXYFILE, proxyP
280b0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ath);.    if( rc
280c0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
280d0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
280e0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
280f0 28 72 63 29 29 3b 20 0a 20 20 20 20 20 20 72 65  (rc)); .      re
28100 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
28110 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
28120 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
28130 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
28140 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
28150 58 59 46 49 4c 45 2c 20 26 74 65 73 74 50 61 74  XYFILE, &testPat
28160 68 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e  h);.    if( strn
28170 63 6d 70 28 70 72 6f 78 79 50 61 74 68 2c 74 65  cmp(proxyPath,te
28180 73 74 50 61 74 68 2c 31 31 29 20 29 7b 0a 20 20  stPath,11) ){.  
28190 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
281a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4c 6f  sult(interp, "Lo
281b0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20 64 69  ck proxy file di
281c0 64 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  d not match the 
281d0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
281e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281f0 20 22 70 72 65 76 69 6f 75 73 6c 79 20 61 73 73   "previously ass
28200 69 67 6e 65 64 20 76 61 6c 75 65 22 2c 20 30 29  igned value", 0)
28210 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
28220 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
28230 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
28240 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
28250 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
28260 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
28270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
28280 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
28290 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
282a0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
282b0 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45   NULL, SQLITE_SE
282c0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
282d0 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20   proxyPath);.   
282e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
282f0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
28300 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
28310 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20  wIntObj(rc));.  
28320 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
28330 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
28340 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
28350 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23 69 66  TCL_OK;  .}..#if
28360 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 23 69  def __APPLE__.#i
28370 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72 61  nclude <sys/para
28380 6d 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  m.h>.#include <s
28390 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 69 6e 63  ys/mount.h>.#inc
283a0 6c 75 64 65 20 3c 73 79 73 2f 65 72 72 6e 6f 2e  lude <sys/errno.
283b0 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  h>.#endif../*. *
283c0 2a 20 74 63 6c 63 6d 64 3a 20 20 20 70 61 74 68  * tclcmd:   path
283d0 5f 69 73 5f 6c 6f 63 61 6c 20 50 57 44 0a 20 2a  _is_local PWD. *
283e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 74  /.static int pat
283f0 68 5f 69 73 5f 6c 6f 63 61 6c 28 0a 20 20 43 6c  h_is_local(.  Cl
28400 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
28410 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
28420 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
28430 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
28440 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
28450 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
28460 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
28470 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
28480 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
28490 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
284a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
284b0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
284c0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
284d0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
284e0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
284f0 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 5f 5f 41  */.){.#ifdef __A
28500 50 50 4c 45 5f 5f 0a 20 20 63 6f 6e 73 74 20 63  PPLE__.  const c
28510 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 69 6e  har *zPath;.  in
28520 74 20 6e 50 61 74 68 3b 0a 20 20 73 74 72 75 63  t nPath;.  struc
28530 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
28540 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
28550 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
28560 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
28570 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
28580 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285a0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
285b0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
285c0 5d 2c 20 30 29 2c 20 22 20 50 41 54 48 22 2c 20  ], 0), " PATH", 
285d0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
285e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
285f0 7a 50 61 74 68 20 3d 20 54 63 6c 5f 47 65 74 53  zPath = Tcl_GetS
28600 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
28610 76 5b 31 5d 2c 20 26 6e 50 61 74 68 29 3b 0a 20  v[1], &nPath);. 
28620 20 69 66 28 20 73 74 61 74 66 73 28 7a 50 61 74   if( statfs(zPat
28630 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
28640 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72  1 ){.    int err
28650 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 54 63   = errno;.    Tc
28660 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
28670 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 20 63 61  nterp, "Error ca
28680 6c 6c 69 6e 67 20 73 74 61 74 66 73 20 6f 6e 20  lling statfs on 
28690 70 61 74 68 22 2c 0a 20 20 20 20 20 20 20 20 20  path",.         
286a0 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
286b0 4e 65 77 49 6e 74 4f 62 6a 28 65 72 72 29 2c 20  NewIntObj(err), 
286c0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
286d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
286e0 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  if( fsInfo.f_fla
286f0 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 20 29 7b 0a  gs&MNT_LOCAL ){.
28700 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
28710 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
28720 5f 4e 65 77 49 6e 74 4f 62 6a 28 31 29 29 3b 20  _NewIntObj(1)); 
28730 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
28740 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
28750 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
28760 49 6e 74 4f 62 6a 28 30 29 29 3b 20 0a 20 20 7d  IntObj(0)); .  }
28770 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74  .#else.  Tcl_Set
28780 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
28790 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
287a0 31 29 29 3b 20 0a 23 65 6e 64 69 66 0a 20 20 0a  1)); .#endif.  .
287b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
287c0 20 20 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 74 63 6c    .}../*. ** tcl
287d0 63 6d 64 3a 20 20 20 70 61 74 68 5f 69 73 5f 64  cmd:   path_is_d
287e0 6f 73 20 50 57 44 0a 20 2a 2f 0a 73 74 61 74 69  os PWD. */.stati
287f0 63 20 69 6e 74 20 70 61 74 68 5f 69 73 5f 64 6f  c int path_is_do
28800 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  s(.  ClientData 
28810 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
28820 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
28830 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
28840 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
28850 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
28860 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
28870 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
28880 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
28890 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
288a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
288b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
288c0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
288d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
288e0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
288f0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 23 69 66  uments */.){.#if
28900 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20  def __APPLE__.  
28910 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
28920 68 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 3b 0a  h;.  int nPath;.
28930 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
28940 66 73 49 6e 66 6f 3b 0a 20 20 0a 20 20 69 66 28  fsInfo;.  .  if(
28950 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
28960 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
28970 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
28980 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
28990 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  e \"",.         
289a0 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
289b0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
289c0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
289d0 50 41 54 48 22 2c 20 30 29 3b 0a 20 20 20 20 72  PATH", 0);.    r
289e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
289f0 0a 20 20 7d 0a 20 20 7a 50 61 74 68 20 3d 20 54  .  }.  zPath = T
28a00 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
28a10 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6e 50  Obj(objv[1], &nP
28a20 61 74 68 29 3b 0a 20 20 69 66 28 20 73 74 61 74  ath);.  if( stat
28a30 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66  fs(zPath, &fsInf
28a40 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) == -1 ){.    
28a50 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
28a60 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
28a70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
28a80 72 72 6f 72 20 63 61 6c 6c 69 6e 67 20 73 74 61  rror calling sta
28a90 74 66 73 20 6f 6e 20 70 61 74 68 22 2c 0a 20 20  tfs on path",.  
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a     Tcl_NewIntObj
28ac0 28 65 72 72 29 2c 20 30 29 3b 0a 20 20 20 20 72  (err), 0);.    r
28ad0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28ae0 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20  .  }.  if (0 == 
28af0 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c  strncmp("msdos",
28b00 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65   fsInfo.f_fstype
28b10 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20  name, 5)) {.    
28b20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
28b30 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
28b40 49 6e 74 4f 62 6a 28 31 29 29 3b 20 0a 20 20 7d  IntObj(1)); .  }
28b50 20 65 6c 73 65 20 69 66 20 28 30 20 3d 3d 20 73   else if (0 == s
28b60 74 72 6e 63 6d 70 28 22 65 78 66 61 74 22 2c 20  trncmp("exfat", 
28b70 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
28b80 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 54  ame, 5)) {.    T
28b90 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
28ba0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
28bb0 6e 74 4f 62 6a 28 31 29 29 3b 20 0a 20 20 7d 20  ntObj(1)); .  } 
28bc0 65 6c 73 65 20 7b 0a 20 20 20 20 54 63 6c 5f 53  else {.    Tcl_S
28bd0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
28be0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
28bf0 6a 28 30 29 29 3b 20 0a 20 20 7d 0a 23 65 6c 73  j(0)); .  }.#els
28c00 65 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  e.  Tcl_SetObjRe
28c10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
28c20 5f 4e 65 77 49 6e 74 4f 62 6a 28 30 29 29 3b 20  _NewIntObj(0)); 
28c30 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74  .#endif.  .  ret
28c40 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
28c50 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
28c60 49 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  IN./*.** tclcmd:
28c70 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
28c80 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 20 44  win32_av_retry D
28c90 42 20 20 4e 52 45 54 52 59 20 20 44 45 4c 41 59  B  NRETRY  DELAY
28ca0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
28cb0 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
28cc0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
28cd0 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
28ce0 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
28cf0 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
28d00 56 5f 52 45 54 52 59 20 6f 70 63 6f 64 65 2e 0a  V_RETRY opcode..
28d10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
28d20 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65  LITE_TCLAPI file
28d30 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61  _control_win32_a
28d40 76 5f 72 65 74 72 79 28 0a 20 20 43 6c 69 65 6e  v_retry(.  Clien
28d50 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
28d60 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
28d70 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
28d80 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
28d90 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
28da0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
28db0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
28dc0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
28dd0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
28de0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
28df0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28e00 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
28e10 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
28e20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
28e30 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
28e40 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
28e50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
28e60 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72 20 7a  t a[2];.  char z
28e70 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
28e80 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
28e90 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
28ea0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
28eb0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
28ec0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
28ed0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
28ee0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
28ef0 44 42 20 4e 52 45 54 52 59 20 44 45 4c 41 59 22  DB NRETRY DELAY"
28f00 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
28f10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
28f20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
28f30 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
28f40 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
28f50 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
28f60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28f70 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
28f80 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
28f90 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 61  erp, objv[2], &a
28fa0 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  [0]) ) return TC
28fb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
28fc0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
28fd0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
28fe0 2c 20 26 61 5b 31 5d 29 20 29 20 72 65 74 75 72  , &a[1]) ) retur
28ff0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
29000 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
29010 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
29020 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  L, SQLITE_FCNTL_
29030 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 2c 20  WIN32_AV_RETRY, 
29040 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73 71 6c  (void*)a);.  sql
29050 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
29060 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20  zeof(z), z, "%d 
29070 25 64 20 25 64 22 2c 20 72 63 2c 20 61 5b 30 5d  %d %d", rc, a[0]
29080 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[1]);.  Tcl_A
29090 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
290a0 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
290b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
290c0 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
290d0 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
290e0 74 72 6f 6c 5f 77 69 6e 33 32 5f 67 65 74 5f 68  trol_win32_get_h
290f0 61 6e 64 6c 65 20 44 42 0a 2a 2a 0a 2a 2a 20 54  andle DB.**.** T
29100 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
29110 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
29120 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
29130 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20  terface with.** 
29140 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
29150 5f 57 49 4e 33 32 5f 47 45 54 5f 48 41 4e 44 4c  _WIN32_GET_HANDL
29160 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  E opcode..*/.sta
29170 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
29180 74 72 6f 6c 5f 77 69 6e 33 32 5f 67 65 74 5f 68  trol_win32_get_h
29190 61 6e 64 6c 65 28 0a 20 20 43 6c 69 65 6e 74 44  andle(.  ClientD
291a0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
291b0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
291c0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
291d0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
291e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
291f0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
29200 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
29210 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
29220 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
29230 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
29240 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
29250 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
29260 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
29270 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
29280 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
29290 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
292a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 48 41 4e 44    int rc;.  HAND
292b0 4c 45 20 68 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  LE hFile = NULL;
292c0 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a  .  char z[100];.
292d0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
292e0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
292f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
29300 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
29310 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
29320 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
29330 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
29340 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29  ], 0), " DB", 0)
29350 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
29360 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
29370 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
29380 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
29390 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
293a0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
293b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
293c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
293d0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
293e0 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43   NULL, SQLITE_FC
293f0 4e 54 4c 5f 57 49 4e 33 32 5f 47 45 54 5f 48 41  NTL_WIN32_GET_HA
29400 4e 44 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20  NDLE,.          
29410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29420 20 20 28 76 6f 69 64 2a 29 26 68 46 69 6c 65 29    (void*)&hFile)
29430 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
29440 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
29450 7a 2c 20 22 25 64 20 25 70 22 2c 20 72 63 2c 20  z, "%d %p", rc, 
29460 28 76 6f 69 64 2a 29 68 46 69 6c 65 29 3b 0a 20  (void*)hFile);. 
29470 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
29480 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68  t(interp, z, (ch
29490 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  ar*)0);.  return
294a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
294b0 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
294c0 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73  _control_win32_s
294d0 65 74 5f 68 61 6e 64 6c 65 20 44 42 20 48 41 4e  et_handle DB HAN
294e0 44 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  DLE.**.** This T
294f0 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
29500 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
29510 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
29520 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53  ce with.** the S
29530 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
29540 32 5f 53 45 54 5f 48 41 4e 44 4c 45 20 6f 70 63  2_SET_HANDLE opc
29550 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
29560 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
29570 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
29580 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 28 0a  n32_set_handle(.
29590 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
295a0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
295b0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
295c0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
295d0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
295e0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
295f0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
29600 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
29610 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
29620 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
29630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29640 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
29650 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
29660 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
29670 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
29680 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
29690 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
296a0 63 3b 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6c  c;.  HANDLE hFil
296b0 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72  e = NULL;.  char
296c0 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
296d0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
296e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
296f0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
29700 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
29710 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
29720 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
29730 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
29740 22 20 44 42 20 48 41 4e 44 4c 45 22 2c 20 30 29  " DB HANDLE", 0)
29750 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
29760 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
29770 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
29780 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
29790 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
297a0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
297b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
297c0 0a 20 20 69 66 28 20 67 65 74 57 69 6e 33 32 48  .  if( getWin32H
297d0 61 6e 64 6c 65 28 69 6e 74 65 72 70 2c 20 54 63  andle(interp, Tc
297e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
297f0 5b 32 5d 29 2c 20 26 68 46 69 6c 65 29 20 29 7b  [2]), &hFile) ){
29800 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
29810 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
29820 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
29830 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
29840 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
29850 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 2c 0a  N32_SET_HANDLE,.
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29870 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
29880 64 2a 29 26 68 46 69 6c 65 29 3b 0a 20 20 73 71  d*)&hFile);.  sq
29890 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
298a0 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64  izeof(z), z, "%d
298b0 20 25 70 22 2c 20 72 63 2c 20 28 76 6f 69 64 2a   %p", rc, (void*
298c0 29 68 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 41  )hFile);.  Tcl_A
298d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
298e0 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
298f0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
29900 4b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  K;  .}.#endif../
29910 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
29920 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73  ile_control_pers
29930 69 73 74 5f 77 61 6c 20 44 42 20 50 45 52 53 49  ist_wal DB PERSI
29940 53 54 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68  ST-FLAG.**.** Th
29950 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
29960 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
29970 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
29980 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74  erface with.** t
29990 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
299a0 50 45 52 53 49 53 54 5f 57 41 4c 20 6f 70 63 6f  PERSIST_WAL opco
299b0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
299c0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
299d0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72  file_control_per
299e0 73 69 73 74 5f 77 61 6c 28 0a 20 20 43 6c 69 65  sist_wal(.  Clie
299f0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
29a00 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
29a10 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
29a20 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
29a30 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
29a40 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
29a50 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
29a60 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
29a70 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
29a80 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
29a90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29aa0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
29ab0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
29ac0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
29ad0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
29ae0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
29af0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
29b00 6e 74 20 62 50 65 72 73 69 73 74 3b 0a 20 20 63  nt bPersist;.  c
29b10 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69  har z[100];..  i
29b20 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
29b30 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
29b40 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
29b50 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
29b60 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
29b70 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
29b80 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
29b90 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c 20 30  ), " DB FLAG", 0
29ba0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
29bb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
29bc0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
29bd0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
29be0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
29bf0 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
29c00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
29c10 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
29c20 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
29c30 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 65 72  , objv[2], &bPer
29c40 73 69 73 74 29 20 29 20 72 65 74 75 72 6e 20 54  sist) ) return T
29c50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
29c60 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
29c70 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
29c80 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
29c90 53 49 53 54 5f 57 41 4c 2c 20 28 76 6f 69 64 2a  SIST_WAL, (void*
29ca0 29 26 62 50 65 72 73 69 73 74 29 3b 0a 20 20 73  )&bPersist);.  s
29cb0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
29cc0 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
29cd0 64 20 25 64 22 2c 20 72 63 2c 20 62 50 65 72 73  d %d", rc, bPers
29ce0 69 73 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ist);.  Tcl_Appe
29cf0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
29d00 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20   z, (char*)0);. 
29d10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
29d20 20 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64   .}./*.** tclcmd
29d30 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
29d40 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77  _powersafe_overw
29d50 72 69 74 65 20 44 42 20 50 53 4f 57 2d 46 4c 41  rite DB PSOW-FLA
29d60 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  G.**.** This TCL
29d70 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
29d80 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
29d90 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
29da0 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c   with.** the SQL
29db0 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53  ITE_FCNTL_POWERS
29dc0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6f 70  AFE_OVERWRITE op
29dd0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
29de0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
29df0 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70  I file_control_p
29e00 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69  owersafe_overwri
29e10 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
29e20 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
29e30 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
29e40 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
29e50 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
29e60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
29e70 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
29e80 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
29e90 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
29ea0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
29eb0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
29ec0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
29ed0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
29ee0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
29ef0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
29f00 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
29f10 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
29f20 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 3b 0a  nt rc;.  int b;.
29f30 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a    char z[100];..
29f40 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
29f50 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
29f60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
29f70 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
29f80 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
29f90 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
29fa0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
29fb0 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47 22  , 0), " DB FLAG"
29fc0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
29fd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29fe0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
29ff0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
2a000 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
2a010 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
2a020 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2a030 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
2a040 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
2a050 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62  erp, objv[2], &b
2a060 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2a070 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
2a080 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
2a090 6c 28 64 62 2c 4e 55 4c 4c 2c 53 51 4c 49 54 45  l(db,NULL,SQLITE
2a0a0 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45  _FCNTL_POWERSAFE
2a0b0 5f 4f 56 45 52 57 52 49 54 45 2c 28 76 6f 69 64  _OVERWRITE,(void
2a0c0 2a 29 26 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  *)&b);.  sqlite3
2a0d0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2a0e0 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 22 2c  (z), z, "%d %d",
2a0f0 20 72 63 2c 20 62 29 3b 0a 20 20 54 63 6c 5f 41   rc, b);.  Tcl_A
2a100 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2a110 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
2a120 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2a130 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  K;  .}.../*.** t
2a140 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
2a150 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 20 44 42  ntrol_vfsname DB
2a160 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52   ?AUXDB?.**.** R
2a170 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
2a180 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
2a190 65 20 73 74 61 63 6b 20 6f 66 20 56 46 53 65 73  e stack of VFSes
2a1a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a1b0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69  SQLITE_TCLAPI fi
2a1c0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61  le_control_vfsna
2a1d0 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  me(.  ClientData
2a1e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2a1f0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
2a200 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
2a210 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
2a220 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2a230 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2a240 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2a250 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2a260 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2a270 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2a280 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2a290 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2a2a0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2a2b0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2a2c0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2a2d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
2a2e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
2a2f0 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63  me = "main";.  c
2a300 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20 3d 20  har *zVfsName = 
2a310 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
2a320 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
2a330 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2a340 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
2a350 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
2a360 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
2a370 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
2a380 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
2a390 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44 42   0), " DB ?AUXDB
2a3a0 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
2a3b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a3c0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
2a3d0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2a3e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2a3f0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
2a400 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2a410 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
2a420 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e  c==3 ){.    zDbN
2a430 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
2a440 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
2a450 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  }.  sqlite3_file
2a460 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
2a470 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  Name, SQLITE_FCN
2a480 54 4c 5f 56 46 53 4e 41 4d 45 2c 28 76 6f 69 64  TL_VFSNAME,(void
2a490 2a 29 26 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20  *)&zVfsName);.  
2a4a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2a4b0 28 69 6e 74 65 72 70 2c 20 7a 56 66 73 4e 61 6d  (interp, zVfsNam
2a4c0 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
2a4d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 56 66  sqlite3_free(zVf
2a4e0 73 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  sName);.  return
2a4f0 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
2a500 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
2a510 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66  le_control_tempf
2a520 69 6c 65 6e 61 6d 65 20 44 42 20 3f 41 55 58 44  ilename DB ?AUXD
2a530 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  B?.**.** Return 
2a540 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  a string that is
2a550 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2a560 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63 20  ename.*/.static 
2a570 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2a580 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74  I file_control_t
2a590 65 6d 70 66 69 6c 65 6e 61 6d 65 28 0a 20 20 43  empfilename(.  C
2a5a0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2a5b0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
2a5c0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
2a5d0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
2a5e0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
2a5f0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2a600 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2a610 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2a620 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2a630 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
2a640 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a650 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2a660 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
2a670 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
2a680 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2a690 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
2a6a0 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
2a6b0 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22 6d  ar *zDbName = "m
2a6c0 61 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a 54  ain";.  char *zT
2a6d0 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Name = 0;..  if(
2a6e0 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
2a6f0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
2a700 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2a710 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2a720 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2a730 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
2a740 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
2a750 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
2a760 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b 0a 20   ?AUXDB?", 0);. 
2a770 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2a780 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2a790 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2a7a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2a7b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
2a7c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
2a7d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2a7e0 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
2a7f0 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c     zDbName = Tcl
2a800 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2a810 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  2]);.  }.  sqlit
2a820 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
2a830 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c  db, zDbName, SQL
2a840 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
2a850 4c 45 4e 41 4d 45 2c 20 28 76 6f 69 64 2a 29 26  LENAME, (void*)&
2a860 7a 54 4e 61 6d 65 29 3b 0a 20 20 54 63 6c 5f 41  zTName);.  Tcl_A
2a870 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2a880 72 70 2c 20 7a 54 4e 61 6d 65 2c 20 28 63 68 61  rp, zTName, (cha
2a890 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  r*)0);.  sqlite3
2a8a0 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20  _free(zTName);. 
2a8b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
2a8c0 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63   .}.../*.** tclc
2a8d0 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 76 66  md:   sqlite3_vf
2a8e0 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20 52  s_list.**.**   R
2a8f0 65 74 75 72 6e 20 61 20 74 63 6c 20 6c 69 73 74  eturn a tcl list
2a900 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2a910 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 72 65 67  names of all reg
2a920 69 73 74 65 72 65 64 20 76 66 73 27 73 2e 0a 2a  istered vfs's..*
2a930 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
2a940 49 54 45 5f 54 43 4c 41 50 49 20 76 66 73 5f 6c  ITE_TCLAPI vfs_l
2a950 69 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ist(.  ClientDat
2a960 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2a970 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
2a980 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
2a990 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
2a9a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2a9b0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2a9c0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2a9d0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2a9e0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2a9f0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2aa00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2aa10 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2aa20 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2aa30 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2aa40 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2aa50 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2aa60 66 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  fs;.  Tcl_Obj *p
2aa70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
2aa80 28 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ();.  if( objc!=
2aa90 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
2aaa0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2aab0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 1, objv, "");.
2aac0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2aad0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
2aae0 70 56 66 73 3d 73 71 6c 69 74 65 33 5f 76 66 73  pVfs=sqlite3_vfs
2aaf0 5f 66 69 6e 64 28 30 29 3b 20 70 56 66 73 3b 20  _find(0); pVfs; 
2ab00 70 56 66 73 3d 70 56 66 73 2d 3e 70 4e 65 78 74  pVfs=pVfs->pNext
2ab10 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ){.    Tcl_ListO
2ab20 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2ab30 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
2ab40 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
2ab50 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 29  Vfs->zName, -1))
2ab60 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
2ab70 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2ab80 20 70 52 65 74 29 3b 0a 20 20 72 65 74 75 72 6e   pRet);.  return
2ab90 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
2aba0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71  .** tclcmd:   sq
2abb0 6c 69 74 65 33 5f 6c 69 6d 69 74 20 44 42 20 49  lite3_limit DB I
2abc0 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 68  D VALUE.**.** Th
2abd0 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
2abe0 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
2abf0 6c 69 6d 69 74 20 69 6e 74 65 72 66 61 63 65 20  limit interface 
2ac00 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20  and.** verifies 
2ac10 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
2ac20 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a  n of the same..*
2ac30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
2ac40 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
2ac50 6c 69 6d 69 74 28 0a 20 20 43 6c 69 65 6e 74 44  limit(.  ClientD
2ac60 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2ac70 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
2ac80 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
2ac90 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
2aca0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2acb0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2acc0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2acd0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2ace0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2acf0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2ad00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ad10 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2ad20 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2ad30 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2ad40 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2ad50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2ad60 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 61 74    int rc;.  stat
2ad70 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
2ad80 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  {.     char *zNa
2ad90 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 69 64 3b  me;.     int id;
2ada0 0a 20 20 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a 20  .  } aId[] = {. 
2adb0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
2adc0 49 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20  IT_LENGTH",     
2add0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2ade0 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20  LIMIT_LENGTH    
2adf0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2ae00 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
2ae10 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 22 2c 20 20  T_SQL_LENGTH",  
2ae20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
2ae30 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  IMIT_SQL_LENGTH 
2ae40 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2ae50 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
2ae60 5f 43 4f 4c 55 4d 4e 22 2c 20 20 20 20 20 20 20  _COLUMN",       
2ae70 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
2ae80 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20  MIT_COLUMN      
2ae90 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2aea0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
2aeb0 45 58 50 52 5f 44 45 50 54 48 22 2c 20 20 20 20  EXPR_DEPTH",    
2aec0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
2aed0 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20 20  IT_EXPR_DEPTH   
2aee0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2aef0 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43   "SQLITE_LIMIT_C
2af00 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 22 2c  OMPOUND_SELECT",
2af10 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2af20 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
2af30 54 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  T      },.    { 
2af40 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44  "SQLITE_LIMIT_VD
2af50 42 45 5f 4f 50 22 2c 20 20 20 20 20 20 20 20 20  BE_OP",         
2af60 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2af70 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20 20  _VDBE_OP        
2af80 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2af90 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e  SQLITE_LIMIT_FUN
2afa0 43 54 49 4f 4e 5f 41 52 47 22 2c 20 20 20 20 20  CTION_ARG",     
2afb0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2afc0 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20 20  FUNCTION_ARG    
2afd0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
2afe0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41  QLITE_LIMIT_ATTA
2aff0 43 48 45 44 22 2c 20 20 20 20 20 20 20 20 20 20  CHED",          
2b000 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41    SQLITE_LIMIT_A
2b010 54 54 41 43 48 45 44 20 20 20 20 20 20 20 20 20  TTACHED         
2b020 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
2b030 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
2b040 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 22 2c  PATTERN_LENGTH",
2b050 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49   SQLITE_LIMIT_LI
2b060 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
2b070 48 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c  H  },.    { "SQL
2b080 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
2b090 4c 45 5f 4e 55 4d 42 45 52 22 2c 20 20 20 20 20  LE_NUMBER",     
2b0a0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
2b0b0 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20  IABLE_NUMBER    
2b0c0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
2b0d0 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
2b0e0 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20 20 53  _DEPTH",       S
2b0f0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
2b100 47 45 52 5f 44 45 50 54 48 20 20 20 20 20 20 20  GER_DEPTH       
2b110 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
2b120 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
2b130 48 52 45 41 44 53 22 2c 20 20 20 20 20 20 53 51  HREADS",      SQ
2b140 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
2b150 52 5f 54 48 52 45 41 44 53 20 20 20 20 20 20 20  R_THREADS       
2b160 7d 2c 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4f  },.    .    /* O
2b170 75 74 20 6f 66 20 72 61 6e 67 65 20 74 65 73 74  ut of range test
2b180 20 63 61 73 65 73 20 2a 2f 0a 20 20 20 20 7b 20   cases */.    { 
2b190 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f  "SQLITE_LIMIT_TO
2b1a0 4f 53 4d 41 4c 4c 22 2c 20 20 20 20 20 20 20 20  OSMALL",        
2b1b0 20 20 20 20 2d 31 2c 20 20 20 20 20 20 20 20 20      -1,         
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1d0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2b1e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f  SQLITE_LIMIT_TOO
2b1f0 42 49 47 22 2c 20 20 20 20 20 20 20 20 20 20 20  BIG",           
2b200 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2b210 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2b 31  WORKER_THREADS+1
2b220 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
2b230 6e 74 20 69 2c 20 69 64 20 3d 20 30 3b 0a 20 20  nt i, id = 0;.  
2b240 69 6e 74 20 76 61 6c 3b 0a 20 20 63 6f 6e 73 74  int val;.  const
2b250 20 63 68 61 72 20 2a 7a 49 64 3b 0a 0a 20 20 69   char *zId;..  i
2b260 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
2b270 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2b280 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
2b290 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
2b2a0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
2b2b0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
2b2c0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
2b2d0 29 2c 20 22 20 44 42 20 49 44 20 56 41 4c 55 45  ), " DB ID VALUE
2b2e0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2b2f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2b300 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2b310 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
2b320 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
2b330 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
2b340 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
2b350 49 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Id = Tcl_GetStri
2b360 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66  ng(objv[2]);.  f
2b370 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
2b380 28 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49 64  (aId)/sizeof(aId
2b390 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
2b3a0 69 66 28 20 73 74 72 63 6d 70 28 7a 49 64 2c 20  if( strcmp(zId, 
2b3b0 61 49 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  aId[i].zName)==0
2b3c0 20 29 7b 0a 20 20 20 20 20 20 69 64 20 3d 20 61   ){.      id = a
2b3d0 49 64 5b 69 5d 2e 69 64 3b 0a 20 20 20 20 20 20  Id[i].id;.      
2b3e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
2b3f0 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66  .  if( i>=sizeof
2b400 28 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49 64  (aId)/sizeof(aId
2b410 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  [0]) ){.    Tcl_
2b420 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2b430 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69  erp, "unknown li
2b440 6d 69 74 20 74 79 70 65 3a 20 22 2c 20 7a 49 64  mit type: ", zId
2b450 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
2b460 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2b470 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
2b480 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
2b490 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
2b4a0 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
2b4b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
2b4c0 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64   sqlite3_limit(d
2b4d0 62 2c 20 69 64 2c 20 76 61 6c 29 3b 0a 20 20 54  b, id, val);.  T
2b4e0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2b4f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
2b500 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65  ntObj(rc));.  re
2b510 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
2b520 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
2b530 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65   save_prng_state
2b540 0a 2a 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  .**.** Save the 
2b550 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 73 65  state of the pse
2b560 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  udo-random numbe
2b570 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20  r generator..** 
2b580 41 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  At the same time
2b590 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 73 71  , verify that sq
2b5a0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2b5b0 6f 6c 20 77 6f 72 6b 73 20 65 76 65 6e 20 77 68  ol works even wh
2b5c0 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74  en.** called wit
2b5d0 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 72 61 6e 67  h an out-of-rang
2b5e0 65 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  e opcode..*/.sta
2b5f0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2b600 43 4c 41 50 49 20 73 61 76 65 5f 70 72 6e 67 5f  CLAPI save_prng_
2b610 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  state(.  ClientD
2b620 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2b630 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
2b640 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
2b650 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
2b660 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2b670 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2b680 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2b690 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2b6a0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2b6b0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2b6c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b6d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2b6e0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2b6f0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2b700 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2b710 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
2b720 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2b730 28 39 39 39 39 29 3b 0a 20 20 61 73 73 65 72 74  (9999);.  assert
2b740 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 72 63 20  ( rc==0 );.  rc 
2b750 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
2b760 6f 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20 20 61 73  ontrol(-1);.  as
2b770 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20  sert( rc==0 );. 
2b780 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2b790 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
2b7a0 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 29  TCTRL_PRNG_SAVE)
2b7b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2b7c0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  K;.}./*.** tclcm
2b7d0 64 3a 20 20 72 65 73 74 6f 72 65 5f 70 72 6e 67  d:  restore_prng
2b7e0 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63  _state.*/.static
2b7f0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2b800 50 49 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f  PI restore_prng_
2b810 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  state(.  ClientD
2b820 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2b830 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
2b840 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
2b850 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
2b860 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2b870 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2b880 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2b890 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2b8a0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2b8b0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2b8c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b8d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2b8e0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2b8f0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2b900 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2b910 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
2b920 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2b930 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
2b940 54 4f 52 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TORE);.  return 
2b950 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  TCL_OK;.}./*.** 
2b960 74 63 6c 63 6d 64 3a 20 20 72 65 73 65 74 5f 70  tclcmd:  reset_p
2b970 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61  rng_state.*/.sta
2b980 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2b990 43 4c 41 50 49 20 72 65 73 65 74 5f 70 72 6e 67  CLAPI reset_prng
2b9a0 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74  _state(.  Client
2b9b0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2b9c0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2b9d0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
2b9e0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
2b9f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2ba00 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2ba10 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2ba20 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2ba30 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2ba40 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2ba50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ba60 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2ba70 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2ba80 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2ba90 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2baa0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  {.  sqlite3_test
2bab0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2bac0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
2bad0 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  SET);.  return T
2bae0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2baf0 74 63 6c 63 6d 64 3a 20 20 64 61 74 61 62 61 73  tclcmd:  databas
2bb00 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74  e_may_be_corrupt
2bb10 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20  .**.** Indicate 
2bb20 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69  that database fi
2bb30 6c 65 73 20 6d 69 67 68 74 20 62 65 20 63 6f 72  les might be cor
2bb40 72 75 70 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  rupt.  In other 
2bb50 77 6f 72 64 73 2c 20 73 65 74 20 74 68 65 20 6e  words, set the n
2bb60 6f 72 6d 61 6c 0a 2a 2a 20 73 74 61 74 65 20 6f  ormal.** state o
2bb70 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  f operation..*/.
2bb80 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
2bb90 45 5f 54 43 4c 41 50 49 20 64 61 74 61 62 61 73  E_TCLAPI databas
2bba0 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74  e_may_be_corrupt
2bbb0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
2bbc0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
2bbd0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
2bbe0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
2bbf0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
2bc00 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2bc10 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2bc20 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2bc30 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2bc40 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
2bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bc60 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2bc70 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
2bc80 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
2bc90 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
2bca0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
2bcb0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2bcc0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
2bcd0 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54  RL_NEVER_CORRUPT
2bce0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
2bcf0 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74  CL_OK;.}./*.** t
2bd00 63 6c 63 6d 64 3a 20 20 64 61 74 61 62 61 73 65  clcmd:  database
2bd10 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 0a 2a  _never_corrupt.*
2bd20 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
2bd30 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  at database file
2bd40 73 20 61 72 65 20 61 6c 77 61 79 73 20 77 65 6c  s are always wel
2bd50 6c 2d 66 6f 72 6d 65 64 2e 20 20 54 68 69 73 20  l-formed.  This 
2bd60 65 6e 61 62 6c 65 73 20 65 78 74 72 61 20 61 73  enables extra as
2bd70 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d  sert().** statem
2bd80 65 6e 74 73 20 74 68 61 74 20 74 65 73 74 20 63  ents that test c
2bd90 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 61  onditions that a
2bda0 72 65 20 61 6c 77 61 79 73 20 74 72 75 65 20 66  re always true f
2bdb0 6f 72 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  or well-formed d
2bdc0 61 74 61 62 61 73 65 73 2e 0a 2a 2f 0a 73 74 61  atabases..*/.sta
2bdd0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2bde0 43 4c 41 50 49 20 64 61 74 61 62 61 73 65 5f 6e  CLAPI database_n
2bdf0 65 76 65 72 5f 63 6f 72 72 75 70 74 28 0a 20 20  ever_corrupt(.  
2be00 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2be10 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
2be20 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
2be30 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
2be40 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
2be50 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2be60 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2be70 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2be80 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2be90 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
2bea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2beb0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2bec0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
2bed0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
2bee0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
2bef0 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
2bf00 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
2bf10 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
2bf20 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 31 29  EVER_CORRUPT, 1)
2bf30 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2bf40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
2bf50 6d 64 3a 20 20 70 63 61 63 68 65 5f 73 74 61 74  md:  pcache_stat
2bf60 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
2bf70 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
2bf80 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73 28  st_pcache_stats(
2bf90 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
2bfa0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
2bfb0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
2bfc0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
2bfd0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
2bfe0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2bff0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2c000 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2c010 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2c020 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
2c030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c040 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2c050 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
2c060 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2c070 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2c080 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
2c090 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20 6e 4d 61   nMin;.  int nMa
2c0a0 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e  x;.  int nCurren
2c0b0 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63 79 63 6c  t;.  int nRecycl
2c0c0 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  able;.  Tcl_Obj 
2c0d0 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c 69 74 65  *pRet;..  sqlite
2c0e0 33 50 63 61 63 68 65 53 74 61 74 73 28 26 6e 43  3PcacheStats(&nC
2c0f0 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78 2c 20 26  urrent, &nMax, &
2c100 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63 6c 61 62  nMin, &nRecyclab
2c110 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20 3d 20 54  le);..  pRet = T
2c120 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54  cl_NewObj();.  T
2c130 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2c140 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2c150 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
2c160 69 6e 67 4f 62 6a 28 22 63 75 72 72 65 6e 74 22  ingObj("current"
2c170 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
2c180 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2c190 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
2c1a0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
2c1b0 43 75 72 72 65 6e 74 29 29 3b 0a 20 20 54 63 6c  Current));.  Tcl
2c1c0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2c1d0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
2c1e0 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
2c1f0 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d 31 29 29  gObj("max", -1))
2c200 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
2c210 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2c220 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
2c230 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78 29 29 3b  ewIntObj(nMax));
2c240 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
2c250 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2c260 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
2c270 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 22  wStringObj("min"
2c280 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
2c290 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2c2a0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
2c2b0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
2c2c0 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Min));.  Tcl_Lis
2c2d0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2c2e0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
2c2f0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2c300 28 22 72 65 63 79 63 6c 61 62 6c 65 22 2c 20 2d  ("recyclable", -
2c310 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
2c320 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2c330 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
2c340 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 52 65 63  l_NewIntObj(nRec
2c350 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20 20 54 63  yclable));..  Tc
2c360 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2c370 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20  nterp, pRet);.. 
2c380 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2c390 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2c3a0 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e  _ENABLE_UNLOCK_N
2c3b0 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f 69  OTIFY.static voi
2c3c0 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f  d test_unlock_no
2c3d0 74 69 66 79 5f 63 62 28 76 6f 69 64 20 2a 2a 61  tify_cb(void **a
2c3e0 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b 0a  Arg, int nArg){.
2c3f0 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28    int ii;.  for(
2c400 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67 3b 20 69  ii=0; ii<nArg; i
2c410 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 45 76  i++){.    Tcl_Ev
2c420 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74 65 72 70  alEx((Tcl_Interp
2c430 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20 22 75 6e   *)aArg[ii], "un
2c440 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 2d 31  lock_notify", -1
2c450 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  , TCL_EVAL_GLOBA
2c460 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  L);.  }.}.#endif
2c470 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
2c480 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 20  E_UNLOCK_NOTIFY 
2c490 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  */../*.** tclcmd
2c4a0 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63  :  sqlite3_unloc
2c4b0 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a 2f 0a 23  k_notify db.*/.#
2c4c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2c4d0 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
2c4e0 59 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  Y.static int SQL
2c4f0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
2c500 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 0a 20  unlock_notify(. 
2c510 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
2c520 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65  ntData, /* Unuse
2c530 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
2c540 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
2c550 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
2c560 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2c570 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
2c580 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
2c590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2c5a0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2c5b0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
2c5c0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
2c5d0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
2c5e0 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
2c5f0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
2c600 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
2c610 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2c620 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2c630 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
2c640 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2c650 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
2c660 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2c670 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2c680 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
2c690 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
2c6a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2c6b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2c6c0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 64 62  unlock_notify(db
2c6d0 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f  , test_unlock_no
2c6e0 74 69 66 79 5f 63 62 2c 20 28 76 6f 69 64 20 2a  tify_cb, (void *
2c6f0 29 69 6e 74 65 72 70 29 3b 0a 20 20 54 63 6c 5f  )interp);.  Tcl_
2c700 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
2c710 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
2c720 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
2c730 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
2c740 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
2c750 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  f../*.** tclcmd:
2c760 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68    sqlite3_wal_ch
2c770 65 63 6b 70 6f 69 6e 74 20 64 62 20 3f 4e 41 4d  eckpoint db ?NAM
2c780 45 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E?.*/.static int
2c790 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
2c7a0 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  est_wal_checkpoi
2c7b0 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  nt(.  ClientData
2c7c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2c7d0 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
2c7e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2c7f0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2c800 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2c810 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2c820 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2c830 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2c840 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2c850 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2c860 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2c870 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2c880 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2c890 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20  char *zDb = 0;. 
2c8a0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2c8b0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
2c8c0 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
2c8d0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
2c8e0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2c8f0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 3f  , 1, objv, "DB ?
2c900 4e 41 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65 74  NAME?");.    ret
2c910 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2c920 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50   }..  if( getDbP
2c930 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
2c940 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2c950 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
2c960 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2c970 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
2c980 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44  bjc==3 ){.    zD
2c990 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
2c9a0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a  g(objv[2]);.  }.
2c9b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
2c9c0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  al_checkpoint(db
2c9d0 2c 20 7a 44 62 29 3b 0a 20 20 54 63 6c 5f 53 65  , zDb);.  Tcl_Se
2c9e0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
2c9f0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
2ca00 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
2ca10 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
2ca20 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2ca30 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
2ca40 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
2ca50 76 32 20 64 62 20 4d 4f 44 45 20 3f 4e 41 4d 45  v2 db MODE ?NAME
2ca60 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d  ?.**.** This com
2ca70 6d 61 6e 64 20 63 61 6c 6c 73 20 74 68 65 20 77  mand calls the w
2ca80 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
2ca90 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  () function with
2caa0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
2cab0 2a 20 6d 6f 64 65 20 61 72 67 75 6d 65 6e 74 20  * mode argument 
2cac0 28 70 61 73 73 69 76 65 2c 20 66 75 6c 6c 20 6f  (passive, full o
2cad0 72 20 72 65 73 74 61 72 74 29 2e 20 49 66 20 70  r restart). If p
2cae0 72 65 73 65 6e 74 2c 20 74 68 65 20 64 61 74 61  resent, the data
2caf0 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 4e 41 4d  base name.** NAM
2cb00 45 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  E is passed as t
2cb10 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2cb20 6e 74 20 74 6f 20 77 61 6c 5f 63 68 65 63 6b 70  nt to wal_checkp
2cb30 6f 69 6e 74 5f 76 32 28 29 2e 20 49 66 20 69 74  oint_v2(). If it
2cb40 20 74 68 65 0a 2a 2a 20 4e 41 4d 45 20 61 72 67   the.** NAME arg
2cb50 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ument is not pre
2cb60 73 65 6e 74 2c 20 61 20 4e 55 4c 4c 20 70 6f 69  sent, a NULL poi
2cb70 6e 74 65 72 20 69 73 20 70 61 73 73 65 64 20 69  nter is passed i
2cb80 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
2cb90 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f   wal_checkpoint_
2cba0 76 32 28 29 20 72 65 74 75 72 6e 73 20 61 6e 79  v2() returns any
2cbb0 20 76 61 6c 75 65 20 6f 74 68 65 72 20 74 68 61   value other tha
2cbc0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72  n SQLITE_BUSY or
2cbd0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74  .** SQLITE_OK, t
2cbe0 68 65 6e 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  hen this command
2cbf0 20 72 65 74 75 72 6e 73 20 54 43 4c 5f 45 52 52   returns TCL_ERR
2cc00 4f 52 2e 20 54 68 65 20 54 63 6c 20 72 65 73 75  OR. The Tcl resu
2cc10 6c 74 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20  lt is set.** to 
2cc20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
2cc30 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
2cc40 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
2cc50 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
2cc60 65 2c 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  e, this command 
2cc70 72 65 74 75 72 6e 73 20 61 20 6c 69 73 74 20 6f  returns a list o
2cc80 66 20 74 68 72 65 65 20 69 6e 74 65 67 65 72 73  f three integers
2cc90 2e 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65  . The first inte
2cca0 67 65 72 0a 2a 2a 20 69 73 20 31 20 69 66 20 53  ger.** is 1 if S
2ccb0 51 4c 49 54 45 5f 42 55 53 59 20 77 61 73 20 72  QLITE_BUSY was r
2ccc0 65 74 75 72 6e 65 64 2c 20 6f 72 20 30 20 6f 74  eturned, or 0 ot
2ccd0 68 65 72 77 69 73 65 2e 20 54 68 65 20 66 6f 6c  herwise. The fol
2cce0 6c 6f 77 69 6e 67 20 74 77 6f 20 69 6e 74 65 67  lowing two integ
2ccf0 65 72 73 0a 2a 2a 20 61 72 65 20 74 68 65 20 76  ers.** are the v
2cd00 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 76  alues returned v
2cd10 69 61 20 74 68 65 20 6f 75 74 70 75 74 20 70 61  ia the output pa
2cd20 72 61 6d 65 74 65 72 73 20 62 79 20 77 61 6c 5f  rameters by wal_
2cd30 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20  checkpoint_v2() 
2cd40 2d 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  -.** the number 
2cd50 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  of frames in the
2cd60 20 6c 6f 67 20 61 6e 64 20 74 68 65 20 6e 75 6d   log and the num
2cd70 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e  ber of frames in
2cd80 20 74 68 65 20 6c 6f 67 0a 2a 2a 20 74 68 61 74   the log.** that
2cd90 20 68 61 76 65 20 62 65 65 6e 20 63 68 65 63 6b   have been check
2cda0 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  pointed..*/.stat
2cdb0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2cdc0 4c 41 50 49 20 74 65 73 74 5f 77 61 6c 5f 63 68  LAPI test_wal_ch
2cdd0 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 43  eckpoint_v2(.  C
2cde0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2cdf0 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20  Data, /* Unused 
2ce00 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
2ce10 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2ce20 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2ce30 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2ce40 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2ce50 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
2ce60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ce70 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2ce80 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
2ce90 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
2cea0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2ceb0 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
2cec0 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  Db = 0;.  sqlite
2ced0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
2cee0 0a 0a 20 20 69 6e 74 20 65 4d 6f 64 65 3b 0a 20  ..  int eMode;. 
2cef0 20 69 6e 74 20 6e 4c 6f 67 20 3d 20 2d 35 35 35   int nLog = -555
2cf00 3b 0a 20 20 69 6e 74 20 6e 43 6b 70 74 20 3d 20  ;.  int nCkpt = 
2cf10 2d 35 35 35 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  -555;.  Tcl_Obj 
2cf20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20  *pRet;..  const 
2cf30 63 68 61 72 20 2a 20 61 4d 6f 64 65 5b 5d 20 3d  char * aMode[] =
2cf40 20 7b 20 22 70 61 73 73 69 76 65 22 2c 20 22 66   { "passive", "f
2cf50 75 6c 6c 22 2c 20 22 72 65 73 74 61 72 74 22 2c  ull", "restart",
2cf60 20 22 74 72 75 6e 63 61 74 65 22 2c 20 30 20 7d   "truncate", 0 }
2cf70 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2cf80 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
2cf90 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73  SSIVE==0 );.  as
2cfa0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
2cfb0 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20  CKPOINT_FULL==1 
2cfc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2cfd0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
2cfe0 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61  ESTART==2 );.  a
2cff0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
2d000 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
2d010 45 3d 3d 33 20 29 3b 0a 0a 20 20 69 66 28 20 6f  E==3 );..  if( o
2d020 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
2d030 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
2d040 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2d050 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4d  , 1, objv, "DB M
2d060 4f 44 45 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20  ODE ?NAME?");.  
2d070 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2d080 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f  OR;.  }..  if( o
2d090 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 44  bjc==4 ){.    zD
2d0a0 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
2d0b0 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a  g(objv[3]);.  }.
2d0c0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2d0d0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
2d0e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
2d0f0 29 2c 20 26 64 62 29 20 7c 7c 20 28 0a 20 20 20  ), &db) || (.   
2d100 20 20 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47     TCL_OK!=Tcl_G
2d110 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20  etIntFromObj(0, 
2d120 6f 62 6a 76 5b 32 5d 2c 20 26 65 4d 6f 64 65 29  objv[2], &eMode)
2d130 0a 20 20 20 26 26 20 54 43 4c 5f 4f 4b 21 3d 54  .   && TCL_OK!=T
2d140 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
2d150 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2d160 32 5d 2c 20 61 4d 6f 64 65 2c 20 22 6d 6f 64 65  2], aMode, "mode
2d170 22 2c 20 30 2c 20 26 65 4d 6f 64 65 29 20 0a 20  ", 0, &eMode) . 
2d180 20 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   )){.    return 
2d190 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
2d1a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
2d1b0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
2d1c0 28 64 62 2c 20 7a 44 62 2c 20 65 4d 6f 64 65 2c  (db, zDb, eMode,
2d1d0 20 26 6e 4c 6f 67 2c 20 26 6e 43 6b 70 74 29 3b   &nLog, &nCkpt);
2d1e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2d1f0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
2d200 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 63  TE_BUSY ){.    c
2d210 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 43  onst char *zErrC
2d220 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 45 72 72  ode = sqlite3Err
2d230 4e 61 6d 65 28 72 63 29 3b 0a 20 20 20 20 54 63  Name(rc);.    Tc
2d240 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
2d250 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41  terp);.    Tcl_A
2d260 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2d270 72 70 2c 20 7a 45 72 72 43 6f 64 65 2c 20 22 20  rp, zErrCode, " 
2d280 2d 20 22 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  - ", (char *)sql
2d290 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
2d2a0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2d2b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
2d2c0 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
2d2d0 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Obj();.  Tcl_Lis
2d2e0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2d2f0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
2d300 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
2d310 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 3f 31 3a  ==SQLITE_BUSY?1:
2d320 30 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  0));.  Tcl_ListO
2d330 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2d340 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
2d350 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4c 6f 67  l_NewIntObj(nLog
2d360 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
2d370 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2d380 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
2d390 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 6b 70 74  _NewIntObj(nCkpt
2d3a0 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ));.  Tcl_SetObj
2d3b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
2d3c0 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Ret);..  return 
2d3d0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2d3e0 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65   tclcmd:  sqlite
2d3f0 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
2d400 6f 69 6e 74 20 64 62 20 56 41 4c 55 45 0a 2a 2f  oint db VALUE.*/
2d410 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
2d420 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 77  TE_TCLAPI test_w
2d430 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
2d440 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
2d450 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
2d460 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
2d470 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2d480 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2d490 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2d4a0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2d4b0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2d4c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2d4d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2d4e0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2d4f0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2d500 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2d510 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
2d520 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
2d530 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 56 61 6c  t rc;.  int iVal
2d540 3b 0a 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;...  if( objc!=
2d550 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
2d560 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2d570 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 56  , 1, objv, "DB V
2d580 41 4c 55 45 22 29 3b 0a 20 20 20 20 72 65 74 75  ALUE");.    retu
2d590 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2d5a0 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  }..  if( getDbPo
2d5b0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2d5c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2d5d0 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20 20 7c  [1]), &db) .   |
2d5e0 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  | Tcl_GetIntFrom
2d5f0 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d 2c 20  Obj(0, objv[2], 
2d600 26 69 56 61 6c 29 0a 20 20 29 7b 0a 20 20 20 20  &iVal).  ){.    
2d610 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2d620 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
2d630 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
2d640 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 56 61  eckpoint(db, iVa
2d650 6c 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  l);.  Tcl_ResetR
2d660 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
2d670 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d680 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
2d690 63 68 61 72 20 2a 7a 45 72 72 43 6f 64 65 20 3d  char *zErrCode =
2d6a0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
2d6b0 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rc);.    Tcl_Set
2d6c0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2d6d0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2d6e0 62 6a 28 7a 45 72 72 43 6f 64 65 2c 20 2d 31 29  bj(zErrCode, -1)
2d6f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2d700 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2d710 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2d720 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .../*.** tclcmd:
2d730 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c    test_sqlite3_l
2d740 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a 73  og ?SCRIPT?.*/.s
2d750 74 61 74 69 63 20 73 74 72 75 63 74 20 4c 6f 67  tatic struct Log
2d760 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20 54 63 6c  Callback {.  Tcl
2d770 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65 72 70  _Interp *pInterp
2d780 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62  ;.  Tcl_Obj *pOb
2d790 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62 61 63 6b  j;.} logcallback
2d7a0 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74 61 74 69   = {0, 0};.stati
2d7b0 63 20 76 6f 69 64 20 78 4c 6f 67 63 61 6c 6c 62  c void xLogcallb
2d7c0 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75 73 65 64  ack(void *unused
2d7d0 2c 20 69 6e 74 20 65 72 72 2c 20 63 68 61 72 20  , int err, char 
2d7e0 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c 5f 4f 62  *zMsg){.  Tcl_Ob
2d7f0 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c 5f 44 75  j *pNew = Tcl_Du
2d800 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f 67 63 61  plicateObj(logca
2d810 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20  llback.pObj);.  
2d820 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2d830 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c 5f 4c 69  (pNew);.  Tcl_Li
2d840 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2d850 6e 74 28 0a 20 20 20 20 20 20 30 2c 20 70 4e 65  nt(.      0, pNe
2d860 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  w, Tcl_NewString
2d870 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61  Obj(sqlite3ErrNa
2d880 6d 65 28 65 72 72 29 2c 20 2d 31 29 0a 20 20 29  me(err), -1).  )
2d890 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
2d8a0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
2d8b0 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pNew, Tcl_NewStr
2d8c0 69 6e 67 4f 62 6a 28 7a 4d 73 67 2c 20 2d 31 29  ingObj(zMsg, -1)
2d8d0 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
2d8e0 45 78 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  Ex(logcallback.p
2d8f0 49 6e 74 65 72 70 2c 20 70 4e 65 77 2c 20 54 43  Interp, pNew, TC
2d900 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43  L_EVAL_GLOBAL|TC
2d910 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
2d920 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
2d930 6e 74 28 70 4e 65 77 29 3b 0a 7d 0a 73 74 61 74  nt(pNew);.}.stat
2d940 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2d950 4c 41 50 49 20 74 65 73 74 5f 73 71 6c 69 74 65  LAPI test_sqlite
2d960 33 5f 6c 6f 67 28 0a 20 20 43 6c 69 65 6e 74 44  3_log(.  ClientD
2d970 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  ata clientData,.
2d980 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2d990 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2d9a0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2d9b0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2d9c0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2d9d0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
2d9e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d9f0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2da00 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2da10 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
2da20 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2da30 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 32  .){.  if( objc>2
2da40 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2da50 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2da60 20 31 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49 50   1, objv, "SCRIP
2da70 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
2da80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2da90 20 69 66 28 20 6c 6f 67 63 61 6c 6c 62 61 63 6b   if( logcallback
2daa0 2e 70 4f 62 6a 20 29 7b 0a 20 20 20 20 54 63 6c  .pObj ){.    Tcl
2dab0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f  _DecrRefCount(lo
2dac0 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b  gcallback.pObj);
2dad0 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b  .    logcallback
2dae0 2e 70 4f 62 6a 20 3d 20 30 3b 0a 20 20 20 20 6c  .pObj = 0;.    l
2daf0 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65  ogcallback.pInte
2db00 72 70 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  rp = 0;.    sqli
2db10 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
2db20 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 28 76  E_CONFIG_LOG, (v
2db30 6f 69 64 2a 29 30 2c 20 28 76 6f 69 64 2a 29 30  oid*)0, (void*)0
2db40 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  );.  }.  if( obj
2db50 63 3e 31 20 29 7b 0a 20 20 20 20 6c 6f 67 63 61  c>1 ){.    logca
2db60 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 6f 62  llback.pObj = ob
2db70 6a 76 5b 31 5d 3b 0a 20 20 20 20 54 63 6c 5f 49  jv[1];.    Tcl_I
2db80 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 67 63  ncrRefCount(logc
2db90 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20  allback.pObj);. 
2dba0 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70     logcallback.p
2dbb0 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  Interp = interp;
2dbc0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .    sqlite3_con
2dbd0 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
2dbe0 47 5f 4c 4f 47 2c 20 78 4c 6f 67 63 61 6c 6c 62  G_LOG, xLogcallb
2dbf0 61 63 6b 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a  ack, (void*)0);.
2dc00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
2dc10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20  _OK;.}../*.**   
2dc20 20 20 74 63 6c 5f 6f 62 6a 70 72 6f 63 20 43 4f    tcl_objproc CO
2dc30 4d 4d 41 4e 44 4e 41 4d 45 20 41 52 47 53 2e 2e  MMANDNAME ARGS..
2dc40 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 61 20 54 43  ..**.** Run a TC
2dc50 4c 20 63 6f 6d 6d 61 6e 64 20 75 73 69 6e 67 20  L command using 
2dc60 69 74 73 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65  its objProc inte
2dc70 72 66 61 63 65 2e 20 20 54 68 72 6f 77 20 61 6e  rface.  Throw an
2dc80 20 65 72 72 6f 72 20 69 66 0a 2a 2a 20 74 68 65   error if.** the
2dc90 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20   command has no 
2dca0 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63  objProc interfac
2dcb0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2dcc0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 72   SQLITE_TCLAPI r
2dcd0 75 6e 41 73 4f 62 6a 50 72 6f 63 28 0a 20 20 76  unAsObjProc(.  v
2dce0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
2dcf0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2dd00 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2dd10 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2dd20 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2dd30 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
2dd40 49 6e 66 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Info;.  if( objc
2dd50 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
2dd60 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2dd70 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 4f 4d  p, 1, objv, "COM
2dd80 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20  MAND ...");.    
2dd90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2dda0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 54 63 6c  ;.  }.  if( !Tcl
2ddb0 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28  _GetCommandInfo(
2ddc0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2ddd0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2dde0 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20  &cmdInfo) ){.   
2ddf0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2de00 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61  t(interp, "comma
2de10 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c  nd not found: ",
2de20 0a 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  .           Tcl_
2de30 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
2de40 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ]), (char*)0);. 
2de50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2de60 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  ROR;.  }.  if( c
2de70 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 3d 3d  mdInfo.objProc==
2de80 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
2de90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2dea0 2c 20 22 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e  , "command has n
2deb0 6f 20 6f 62 6a 50 72 6f 63 3a 20 22 2c 0a 20 20  o objProc: ",.  
2dec0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
2ded0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
2dee0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2def0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2df00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
2df10 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 28 63  mdInfo.objProc(c
2df20 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
2df30 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62  Data, interp, ob
2df40 6a 63 2d 31 2c 20 6f 62 6a 76 2b 31 29 3b 0a 7d  jc-1, objv+1);.}
2df50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2df60 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
2df70 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 65  .** WARNING: The
2df80 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
2df90 69 6f 6e 2c 20 70 72 69 6e 74 45 78 70 6c 61 69  ion, printExplai
2dfa0 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69 73 20  nQueryPlan() is 
2dfb0 61 6e 20 65 78 61 63 74 0a 2a 2a 20 63 6f 70 79  an exact.** copy
2dfc0 20 6f 66 20 65 78 61 6d 70 6c 65 20 63 6f 64 65   of example code
2dfd0 20 66 72 6f 6d 20 65 71 70 2e 69 6e 20 28 65 71   from eqp.in (eq
2dfe0 70 2e 68 74 6d 6c 29 2e 20 49 66 20 74 68 69 73  p.html). If this
2dff0 20 63 6f 64 65 20 69 73 20 6d 6f 64 69 66 69 65   code is modifie
2e000 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 64  d,.** then the d
2e010 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 70  ocumentation cop
2e020 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f  y needs to be mo
2e030 64 69 66 69 65 64 20 61 73 20 77 65 6c 6c 2e 0a  dified as well..
2e040 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  */./*.** Argumen
2e050 74 20 70 53 74 6d 74 20 69 73 20 61 20 70 72 65  t pStmt is a pre
2e060 70 61 72 65 64 20 53 51 4c 20 73 74 61 74 65 6d  pared SQL statem
2e070 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ent. This functi
2e080 6f 6e 20 63 6f 6d 70 69 6c 65 73 0a 2a 2a 20 61  on compiles.** a
2e090 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
2e0a0 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  PLAN command to 
2e0b0 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 70 72  report on the pr
2e0c0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
2e0d0 2c 0a 2a 2a 20 61 6e 64 20 70 72 69 6e 74 73 20  ,.** and prints 
2e0e0 74 68 65 20 72 65 70 6f 72 74 20 74 6f 20 73 74  the report to st
2e0f0 64 6f 75 74 20 75 73 69 6e 67 20 70 72 69 6e 74  dout using print
2e100 66 28 29 2e 0a 2a 2f 0a 69 6e 74 20 70 72 69 6e  f()..*/.int prin
2e110 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61  tExplainQueryPla
2e120 6e 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  n(sqlite3_stmt *
2e130 70 53 74 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20  pStmt){.  const 
2e140 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
2e150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
2e160 75 74 20 53 51 4c 20 2a 2f 0a 20 20 63 68 61 72  ut SQL */.  char
2e170 20 2a 7a 45 78 70 6c 61 69 6e 3b 20 20 20 20 20   *zExplain;     
2e180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2e190 51 4c 20 77 69 74 68 20 45 58 50 4c 41 49 4e 20  QL with EXPLAIN 
2e1a0 51 55 45 52 59 20 50 4c 41 4e 20 70 72 65 70 65  QUERY PLAN prepe
2e1b0 6e 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nded */.  sqlite
2e1c0 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e  3_stmt *pExplain
2e1d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  ;         /* Com
2e1e0 70 69 6c 65 64 20 45 58 50 4c 41 49 4e 20 51 55  piled EXPLAIN QU
2e1f0 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64  ERY PLAN command
2e200 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e220 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2e230 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  code from sqlite
2e240 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 2a  3_prepare_v2() *
2e250 2f 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  /..  zSql = sqli
2e260 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a  te3_sql(pStmt);.
2e270 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
2e280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2e290 52 4f 52 3b 0a 0a 20 20 7a 45 78 70 6c 61 69 6e  ROR;..  zExplain
2e2a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e2b0 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52  tf("EXPLAIN QUER
2e2c0 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 71 6c  Y PLAN %s", zSql
2e2d0 29 3b 0a 20 20 69 66 28 20 7a 45 78 70 6c 61 69  );.  if( zExplai
2e2e0 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  n==0 ) return SQ
2e2f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 72  LITE_NOMEM;..  r
2e300 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
2e310 61 72 65 5f 76 32 28 73 71 6c 69 74 65 33 5f 64  are_v2(sqlite3_d
2e320 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 2c  b_handle(pStmt),
2e330 20 7a 45 78 70 6c 61 69 6e 2c 20 2d 31 2c 20 26   zExplain, -1, &
2e340 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
2e350 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 78  sqlite3_free(zEx
2e360 70 6c 61 69 6e 29 3b 0a 20 20 69 66 28 20 72 63  plain);.  if( rc
2e370 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
2e380 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c  turn rc;..  whil
2e390 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
2e3a0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
2e3b0 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 69 6e 74  lain) ){.    int
2e3c0 20 69 53 65 6c 65 63 74 69 64 20 3d 20 73 71 6c   iSelectid = sql
2e3d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
2e3e0 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
2e3f0 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d 20 73    int iOrder = s
2e400 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2e410 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a  t(pExplain, 1);.
2e420 20 20 20 20 69 6e 74 20 69 46 72 6f 6d 20 3d 20      int iFrom = 
2e430 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2e440 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 32 29 3b  nt(pExplain, 2);
2e450 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2e460 2a 7a 44 65 74 61 69 6c 20 3d 20 28 63 6f 6e 73  *zDetail = (cons
2e470 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
2e480 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78  _column_text(pEx
2e490 70 6c 61 69 6e 2c 20 33 29 3b 0a 0a 20 20 20 20  plain, 3);..    
2e4a0 70 72 69 6e 74 66 28 22 25 64 20 25 64 20 25 64  printf("%d %d %d
2e4b0 20 25 73 5c 6e 22 2c 20 69 53 65 6c 65 63 74 69   %s\n", iSelecti
2e4c0 64 2c 20 69 4f 72 64 65 72 2c 20 69 46 72 6f 6d  d, iOrder, iFrom
2e4d0 2c 20 7a 44 65 74 61 69 6c 29 3b 0a 20 20 7d 0a  , zDetail);.  }.
2e4e0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2e4f0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
2e500 61 69 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ain);.}..static 
2e510 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2e520 49 20 74 65 73 74 5f 70 72 69 6e 74 5f 65 71 70  I test_print_eqp
2e530 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2e540 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2e550 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2e560 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2e570 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2e580 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
2e590 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2e5a0 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
2e5b0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2e5c0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2e5d0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
2e5e0 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  MT");.    return
2e5f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2e600 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
2e610 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2e620 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2e630 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
2e640 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2e650 0a 20 20 72 63 20 3d 20 70 72 69 6e 74 45 78 70  .  rc = printExp
2e660 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 70 53  lainQueryPlan(pS
2e670 74 6d 74 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20  tmt);.  /* This 
2e680 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e  is needed on Win
2e690 64 6f 77 73 20 73 6f 20 74 68 61 74 20 61 20 74  dows so that a t
2e6a0 65 73 74 20 63 61 73 65 20 75 73 69 6e 67 20 74  est case using t
2e6b0 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63 74 69  his .  ** functi
2e6c0 6f 6e 20 63 61 6e 20 6f 70 65 6e 20 61 20 72 65  on can open a re
2e6d0 61 64 20 70 69 70 65 20 61 6e 64 20 67 65 74 20  ad pipe and get 
2e6e0 74 68 65 20 6f 75 74 70 75 74 20 6f 66 0a 20 20  the output of.  
2e6f0 2a 2a 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51  ** printExplainQ
2e700 75 65 72 79 50 6c 61 6e 28 29 20 69 6d 6d 65 64  ueryPlan() immed
2e710 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 66  iately..  */.  f
2e720 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
2e730 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
2e740 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
2e750 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
2e760 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
2e770 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
2e780 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
2e790 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 73  LAIN */../*.** s
2e7a0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2e7b0 72 6f 6c 20 56 45 52 42 20 41 52 47 53 2e 2e 2e  rol VERB ARGS...
2e7c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
2e7d0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
2e7e0 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 0a  t_test_control(.
2e7f0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
2e800 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2e810 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2e820 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2e830 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2e840 7b 0a 20 20 73 74 72 75 63 74 20 56 65 72 62 20  {.  struct Verb 
2e850 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2e860 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74   *zName;.    int
2e870 20 69 3b 0a 20 20 7d 20 61 56 65 72 62 5b 5d 20   i;.  } aVerb[] 
2e880 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54  = {.    { "SQLIT
2e890 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
2e8a0 54 49 4d 45 5f 46 41 55 4c 54 22 2c 20 53 51 4c  TIME_FAULT", SQL
2e8b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
2e8c0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 20 7d 2c 20  ALTIME_FAULT }, 
2e8d0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 54  .    { "SQLITE_T
2e8e0 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
2e8f0 4d 41 50 22 2c 20 20 20 20 20 53 51 4c 49 54 45  MAP",     SQLITE
2e900 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52  _TESTCTRL_SORTER
2e910 5f 4d 4d 41 50 20 20 20 20 20 7d 2c 20 0a 20 20  _MMAP     }, .  
2e920 20 20 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54    { "SQLITE_TEST
2e930 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 22 2c 20  CTRL_IMPOSTER", 
2e940 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
2e950 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20  STCTRL_IMPOSTER 
2e960 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20         },.  };. 
2e970 20 69 6e 74 20 69 56 65 72 62 3b 0a 20 20 69 6e   int iVerb;.  in
2e980 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e 74 20 72  t iFlag;.  int r
2e990 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32  c;..  if( objc<2
2e9a0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2e9b0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2e9c0 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45 52 42 20   1, objv, "VERB 
2e9d0 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  ARGS...");.    r
2e9e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2e9f0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54 63 6c  .  }..  rc = Tcl
2ea00 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
2ea10 53 74 72 75 63 74 28 0a 20 20 20 20 20 20 69 6e  Struct(.      in
2ea20 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 61  terp, objv[1], a
2ea30 56 65 72 62 2c 20 73 69 7a 65 6f 66 28 61 56 65  Verb, sizeof(aVe
2ea40 72 62 5b 30 5d 29 2c 20 22 56 45 52 42 22 2c 20  rb[0]), "VERB", 
2ea50 30 2c 20 26 69 56 65 72 62 0a 20 20 29 3b 0a 20  0, &iVerb.  );. 
2ea60 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
2ea70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
2ea80 69 46 6c 61 67 20 3d 20 61 56 65 72 62 5b 69 56  iFlag = aVerb[iV
2ea90 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69 74 63 68  erb].i;.  switch
2eaa0 28 20 69 46 6c 61 67 20 29 7b 0a 20 20 20 20 63  ( iFlag ){.    c
2eab0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
2eac0 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
2ead0 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULT: {.      int
2eae0 20 76 61 6c 3b 0a 20 20 20 20 20 20 69 66 28 20   val;.      if( 
2eaf0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
2eb00 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2eb10 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
2eb20 62 6a 76 2c 20 22 4f 4e 4f 46 46 22 29 3b 0a 20  bjv, "ONOFF");. 
2eb30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
2eb40 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
2eb50 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
2eb60 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
2eb70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
2eb80 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
2eb90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2eba0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
2ebb0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
2ebc0 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
2ebd0 5f 46 41 55 4c 54 2c 20 76 61 6c 29 3b 0a 20 20  _FAULT, val);.  
2ebe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2ebf0 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
2ec00 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
2ec10 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20  R_MMAP: {.      
2ec20 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 73  int val;.      s
2ec30 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20  qlite3 *db;.    
2ec40 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
2ec50 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
2ec60 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2ec70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4c  , 2, objv, "DB L
2ec80 49 4d 49 54 22 29 3b 0a 20 20 20 20 20 20 20 20  IMIT");.        
2ec90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2eca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ecb0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
2ecc0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
2ecd0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
2ece0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2ecf0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
2ed00 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
2ed10 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
2ed20 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
2ed30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2ed40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
2ed50 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
2ed60 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
2ed70 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 76 61 6c  ER_MMAP, db, val
2ed80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2ed90 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
2eda0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2edb0 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20  IMPOSTER: {.    
2edc0 20 20 69 6e 74 20 6f 6e 4f 66 66 2c 20 74 6e 75    int onOff, tnu
2edd0 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  m;.      const c
2ede0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20  har *zDbName;.  
2edf0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b      sqlite3 *db;
2ee00 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
2ee10 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =6 ){.        Tc
2ee20 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2ee30 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
2ee40 22 44 42 20 64 62 4e 61 6d 65 20 6f 6e 4f 66 66  "DB dbName onOff
2ee50 20 74 6e 75 6d 22 29 3b 0a 20 20 20 20 20 20 20   tnum");.       
2ee60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2ee70 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
2ee80 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2ee90 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
2eea0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
2eeb0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
2eec0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
2eed0 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47   zDbName = Tcl_G
2eee0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
2eef0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  );.      if( Tcl
2ef00 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
2ef10 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
2ef20 26 6f 6e 4f 66 66 29 20 29 20 72 65 74 75 72 6e  &onOff) ) return
2ef30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2ef40 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
2ef50 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2ef60 6f 62 6a 76 5b 35 5d 2c 20 26 74 6e 75 6d 29 20  objv[5], &tnum) 
2ef70 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2ef80 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  OR;.      sqlite
2ef90 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
2efa0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
2efb0 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20 7a 44 62  MPOSTER, db, zDb
2efc0 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75  Name, onOff, tnu
2efd0 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
2efe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63  .    }.  }..  Tc
2eff0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
2f000 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
2f010 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  TCL_OK;.}..#if S
2f020 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 23 69  QLITE_OS_UNIX.#i
2f030 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65  nclude <sys/time
2f040 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
2f050 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 73  s/resource.h>..s
2f060 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
2f070 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 67 65 74  _TCLAPI test_get
2f080 72 75 73 61 67 65 28 0a 20 20 76 6f 69 64 20 2a  rusage(.  void *
2f090 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
2f0a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2f0b0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2f0c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2f0d0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72  objv[].){.  char
2f0e0 20 62 75 66 5b 31 30 32 34 5d 3b 0a 20 20 73 74   buf[1024];.  st
2f0f0 72 75 63 74 20 72 75 73 61 67 65 20 72 3b 0a 20  ruct rusage r;. 
2f100 20 6d 65 6d 73 65 74 28 26 72 2c 20 30 2c 20 73   memset(&r, 0, s
2f110 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 67 65 74  izeof(r));.  get
2f120 72 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45  rusage(RUSAGE_SE
2f130 4c 46 2c 20 26 72 29 3b 0a 0a 20 20 73 71 6c 69  LF, &r);..  sqli
2f140 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2f150 65 6f 66 28 62 75 66 29 2c 20 62 75 66 2c 0a 20  eof(buf), buf,. 
2f160 20 20 20 22 72 75 5f 75 74 69 6d 65 3d 25 64 2e     "ru_utime=%d.
2f170 25 30 36 64 20 72 75 5f 73 74 69 6d 65 3d 25 64  %06d ru_stime=%d
2f180 2e 25 30 36 64 20 72 75 5f 6d 69 6e 66 6c 74 3d  .%06d ru_minflt=
2f190 25 64 20 72 75 5f 6d 61 6a 66 6c 74 3d 25 64 22  %d ru_majflt=%d"
2f1a0 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75  , .    (int)r.ru
2f1b0 5f 75 74 69 6d 65 2e 74 76 5f 73 65 63 2c 20 28  _utime.tv_sec, (
2f1c0 69 6e 74 29 72 2e 72 75 5f 75 74 69 6d 65 2e 74  int)r.ru_utime.t
2f1d0 76 5f 75 73 65 63 2c 20 0a 20 20 20 20 28 69 6e  v_usec, .    (in
2f1e0 74 29 72 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f  t)r.ru_stime.tv_
2f1f0 73 65 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f 73  sec, (int)r.ru_s
2f200 74 69 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20  time.tv_usec, . 
2f210 20 20 20 28 69 6e 74 29 72 2e 72 75 5f 6d 69 6e     (int)r.ru_min
2f220 66 6c 74 2c 20 28 69 6e 74 29 72 2e 72 75 5f 6d  flt, (int)r.ru_m
2f230 61 6a 66 6c 74 0a 20 20 29 3b 0a 20 20 54 63 6c  ajflt.  );.  Tcl
2f240 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
2f250 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
2f260 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29  ingObj(buf, -1))
2f270 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2f280 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
2f290 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f   SQLITE_OS_WIN./
2f2a0 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  *.** Information
2f2b0 20 70 61 73 73 65 64 20 66 72 6f 6d 20 74 68 65   passed from the
2f2c0 20 6d 61 69 6e 20 74 68 72 65 61 64 20 69 6e 74   main thread int
2f2d0 6f 20 74 68 65 20 77 69 6e 64 6f 77 73 20 66 69  o the windows fi
2f2e0 6c 65 20 6c 6f 63 6b 65 72 0a 2a 2a 20 62 61 63  le locker.** bac
2f2f0 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 2e 0a  kground thread..
2f300 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 33 32 46  */.struct win32F
2f310 69 6c 65 4c 6f 63 6b 65 72 20 7b 0a 20 20 63 68  ileLocker {.  ch
2f320 61 72 20 2a 65 76 4e 61 6d 65 3b 20 20 20 20 20  ar *evName;     
2f330 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 65 76 65    /* Name of eve
2f340 6e 74 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 72  nt to signal thr
2f350 65 61 64 20 73 74 61 72 74 75 70 20 2a 2f 0a 20  ead startup */. 
2f360 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20   HANDLE h;      
2f370 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
2f380 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  f the file to be
2f390 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74   locked */.  int
2f3a0 20 64 65 6c 61 79 31 3b 20 20 20 20 20 20 20 20   delay1;        
2f3b0 20 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f 72 65   /* Delay before
2f3c0 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   locking */.  in
2f3d0 74 20 64 65 6c 61 79 32 3b 20 20 20 20 20 20 20  t delay2;       
2f3e0 20 20 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f 72    /* Delay befor
2f3f0 65 20 75 6e 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  e unlocking */. 
2f400 20 69 6e 74 20 6f 6b 3b 20 20 20 20 20 20 20 20   int ok;        
2f410 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 65 64       /* Finished
2f420 20 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72   ok */.  int err
2f430 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2f440 54 72 75 65 20 69 66 20 61 6e 20 65 72 72 6f 72  True if an error
2f450 20 6f 63 63 75 72 73 20 2a 2f 0a 7d 3b 0a 23 65   occurs */.};.#e
2f460 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54  ndif...#if SQLIT
2f470 45 5f 4f 53 5f 57 49 4e 0a 23 69 6e 63 6c 75 64  E_OS_WIN.#includ
2f480 65 20 3c 70 72 6f 63 65 73 73 2e 68 3e 0a 2f 2a  e <process.h>./*
2f490 0a 2a 2a 20 54 68 65 20 62 61 63 6b 67 72 6f 75  .** The backgrou
2f4a0 6e 64 20 74 68 72 65 61 64 20 74 68 61 74 20 64  nd thread that d
2f4b0 6f 65 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oes file locking
2f4c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f4d0 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 77 69   SQLITE_CDECL wi
2f4e0 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 28  n32_file_locker(
2f4f0 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
2f500 0a 20 20 73 74 72 75 63 74 20 77 69 6e 33 32 46  .  struct win32F
2f510 69 6c 65 4c 6f 63 6b 65 72 20 2a 70 20 3d 20 28  ileLocker *p = (
2f520 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65  struct win32File
2f530 4c 6f 63 6b 65 72 2a 29 70 41 70 70 44 61 74 61  Locker*)pAppData
2f540 3b 0a 20 20 69 66 28 20 70 2d 3e 65 76 4e 61 6d  ;.  if( p->evNam
2f550 65 20 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  e ){.    HANDLE 
2f560 65 76 20 3d 20 4f 70 65 6e 45 76 65 6e 74 28 45  ev = OpenEvent(E
2f570 56 45 4e 54 5f 4d 4f 44 49 46 59 5f 53 54 41 54  VENT_MODIFY_STAT
2f580 45 2c 20 46 41 4c 53 45 2c 20 70 2d 3e 65 76 4e  E, FALSE, p->evN
2f590 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 20 65  ame);.    if ( e
2f5a0 76 20 29 7b 0a 20 20 20 20 20 20 53 65 74 45 76  v ){.      SetEv
2f5b0 65 6e 74 28 65 76 29 3b 0a 20 20 20 20 20 20 43  ent(ev);.      C
2f5c0 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a  loseHandle(ev);.
2f5d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2f5e0 70 2d 3e 64 65 6c 61 79 31 20 29 20 53 6c 65 65  p->delay1 ) Slee
2f5f0 70 28 70 2d 3e 64 65 6c 61 79 31 29 3b 0a 20 20  p(p->delay1);.  
2f600 69 66 28 20 4c 6f 63 6b 46 69 6c 65 28 70 2d 3e  if( LockFile(p->
2f610 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30  h, 0, 0, 1000000
2f620 30 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 53 6c  00, 0) ){.    Sl
2f630 65 65 70 28 70 2d 3e 64 65 6c 61 79 32 29 3b 0a  eep(p->delay2);.
2f640 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70      UnlockFile(p
2f650 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30  ->h, 0, 0, 10000
2f660 30 30 30 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d  0000, 0);.    p-
2f670 3e 6f 6b 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  >ok = 1;.  }else
2f680 7b 0a 20 20 20 20 70 2d 3e 65 72 72 20 3d 20 31  {.    p->err = 1
2f690 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e  ;.  }.  CloseHan
2f6a0 64 6c 65 28 70 2d 3e 68 29 3b 0a 20 20 70 2d 3e  dle(p->h);.  p->
2f6b0 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61  h = 0;.  p->dela
2f6c0 79 31 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c  y1 = 0;.  p->del
2f6d0 61 79 32 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ay2 = 0;.}.#endi
2f6e0 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
2f6f0 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  _WIN./*.**      
2f700 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 20  lock_win32_file 
2f710 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20  FILENAME DELAY1 
2f720 44 45 4c 41 59 32 0a 2a 2a 0a 2a 2a 20 47 65 74  DELAY2.**.** Get
2f730 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 61   an exclusive ma
2f740 6e 64 69 74 6f 72 79 20 6c 6f 63 6b 20 6f 6e 20  nditory lock on 
2f750 66 69 6c 65 20 66 6f 72 20 44 45 4c 41 59 32 20  file for DELAY2 
2f760 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 0a 2a 2a  milliseconds..**
2f770 20 57 61 69 74 20 44 45 4c 41 59 31 20 6d 69 6c   Wait DELAY1 mil
2f780 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65  liseconds before
2f790 20 61 63 71 75 69 72 69 6e 67 20 74 68 65 20 6c   acquiring the l
2f7a0 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
2f7b0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
2f7c0 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b   win32_file_lock
2f7d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2f7e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2f7f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2f800 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2f810 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2f820 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  .){.  static str
2f830 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63  uct win32FileLoc
2f840 6b 65 72 20 78 20 3d 20 7b 20 22 77 69 6e 33 32  ker x = { "win32
2f850 5f 66 69 6c 65 5f 6c 6f 63 6b 22 2c 20 30 2c 20  _file_lock", 0, 
2f860 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
2f870 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2f880 65 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 42  ename;.  char zB
2f890 75 66 5b 32 30 30 5d 3b 0a 20 20 69 6e 74 20 72  uf[200];.  int r
2f8a0 65 74 72 79 20 3d 20 30 3b 0a 20 20 48 41 4e 44  etry = 0;.  HAND
2f8b0 4c 45 20 65 76 3b 0a 20 20 44 57 4f 52 44 20 77  LE ev;.  DWORD w
2f8c0 52 65 73 75 6c 74 3b 0a 20 20 0a 20 20 69 66 28  Result;.  .  if(
2f8d0 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63   objc!=4 && objc
2f8e0 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
2f8f0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2f900 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49  rp, 1, objv, "FI
2f910 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45  LENAME DELAY1 DE
2f920 4c 41 59 32 22 29 3b 0a 20 20 20 20 72 65 74 75  LAY2");.    retu
2f930 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2f940 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 31 20  }.  if( objc==1 
2f950 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
2f960 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2f970 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 20  Buf), zBuf, "%d 
2f980 25 64 20 25 64 20 25 64 20 25 64 22 2c 0a 20 20  %d %d %d %d",.  
2f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9a0 20 20 20 78 2e 6f 6b 2c 20 78 2e 65 72 72 2c 20     x.ok, x.err, 
2f9b0 78 2e 64 65 6c 61 79 31 2c 20 78 2e 64 65 6c 61  x.delay1, x.dela
2f9c0 79 32 2c 20 78 2e 68 29 3b 0a 20 20 20 20 54 63  y2, x.h);.    Tc
2f9d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2f9e0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68  nterp, zBuf, (ch
2f9f0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
2fa00 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20  rn TCL_OK;.  }. 
2fa10 20 77 68 69 6c 65 28 20 78 2e 68 20 26 26 20 72   while( x.h && r
2fa20 65 74 72 79 3c 33 30 20 29 7b 0a 20 20 20 20 72  etry<30 ){.    r
2fa30 65 74 72 79 2b 2b 3b 0a 20 20 20 20 53 6c 65 65  etry++;.    Slee
2fa40 70 28 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66  p(100);.  }.  if
2fa50 28 20 78 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c  ( x.h ){.    Tcl
2fa60 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2fa70 74 65 72 70 2c 20 22 62 75 73 79 22 2c 20 28 63  terp, "busy", (c
2fa80 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
2fa90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2faa0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
2fab0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
2fac0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 78 2e 64  p, objv[2], &x.d
2fad0 65 6c 61 79 31 29 20 29 20 72 65 74 75 72 6e 20  elay1) ) return 
2fae0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
2faf0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
2fb00 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2fb10 33 5d 2c 20 26 78 2e 64 65 6c 61 79 32 29 20 29  3], &x.delay2) )
2fb20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2fb30 52 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  R;.  zFilename =
2fb40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2fb50 62 6a 76 5b 31 5d 29 3b 0a 20 20 78 2e 68 20 3d  bjv[1]);.  x.h =
2fb60 20 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c   CreateFile(zFil
2fb70 65 6e 61 6d 65 2c 20 47 45 4e 45 52 49 43 5f 52  ename, GENERIC_R
2fb80 45 41 44 7c 47 45 4e 45 52 49 43 5f 57 52 49 54  EAD|GENERIC_WRIT
2fb90 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
2fba0 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
2fbb0 7c 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54  |FILE_SHARE_WRIT
2fbc0 45 2c 20 30 2c 20 4f 50 45 4e 5f 41 4c 57 41 59  E, 0, OPEN_ALWAY
2fbd0 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
2fbe0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
2fbf0 4e 4f 52 4d 41 4c 2c 20 30 29 3b 0a 20 20 69 66  NORMAL, 0);.  if
2fc00 28 20 21 78 2e 68 20 29 7b 0a 20 20 20 20 54 63  ( !x.h ){.    Tc
2fc10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2fc20 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f  nterp, "cannot o
2fc30 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69  pen file: ", zFi
2fc40 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30  lename, (char*)0
2fc50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2fc60 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65  L_ERROR;.  }.  e
2fc70 76 20 3d 20 43 72 65 61 74 65 45 76 65 6e 74 28  v = CreateEvent(
2fc80 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 46 41 4c 53  NULL, TRUE, FALS
2fc90 45 2c 20 78 2e 65 76 4e 61 6d 65 29 3b 0a 20 20  E, x.evName);.  
2fca0 69 66 20 28 20 21 65 76 20 29 7b 0a 20 20 20 20  if ( !ev ){.    
2fcb0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2fcc0 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74  (interp, "cannot
2fcd0 20 63 72 65 61 74 65 20 65 76 65 6e 74 3a 20 22   create event: "
2fce0 2c 20 78 2e 65 76 4e 61 6d 65 2c 20 28 63 68 61  , x.evName, (cha
2fcf0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
2fd00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2fd10 0a 20 20 5f 62 65 67 69 6e 74 68 72 65 61 64 28  .  _beginthread(
2fd20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65  win32_file_locke
2fd30 72 2c 20 30 2c 20 28 76 6f 69 64 2a 29 26 78 29  r, 0, (void*)&x)
2fd40 3b 0a 20 20 53 6c 65 65 70 28 30 29 3b 0a 20 20  ;.  Sleep(0);.  
2fd50 69 66 20 28 20 28 77 52 65 73 75 6c 74 20 3d 20  if ( (wResult = 
2fd60 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
2fd70 65 63 74 28 65 76 2c 20 31 30 30 30 30 29 29 21  ect(ev, 10000))!
2fd80 3d 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 29  =WAIT_OBJECT_0 )
2fd90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2fda0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
2fdb0 75 66 29 2c 20 7a 42 75 66 2c 20 22 30 78 25 78  uf), zBuf, "0x%x
2fdc0 22 2c 20 77 52 65 73 75 6c 74 29 3b 0a 20 20 20  ", wResult);.   
2fdd0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2fde0 74 28 69 6e 74 65 72 70 2c 20 22 77 61 69 74 20  t(interp, "wait 
2fdf0 66 61 69 6c 65 64 3a 20 22 2c 20 7a 42 75 66 2c  failed: ", zBuf,
2fe00 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2fe10 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b  CloseHandle(ev);
2fe20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2fe30 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 43 6c 6f  ERROR;.  }.  Clo
2fe40 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20  seHandle(ev);.  
2fe50 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2fe60 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 65 78 69  ../*.**      exi
2fe70 73 74 73 5f 77 69 6e 33 32 5f 70 61 74 68 20 50  sts_win32_path P
2fe80 41 54 48 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ATH.**.** Return
2fe90 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
2fea0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
2feb0 20 65 78 69 73 74 73 2c 20 77 68 6f 73 65 20 66   exists, whose f
2fec0 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e  ully qualified n
2fed0 61 6d 65 0a 2a 2a 20 6d 61 79 20 65 78 63 65 65  ame.** may excee
2fee0 64 20 32 36 30 20 63 68 61 72 61 63 74 65 72 73  d 260 characters
2fef0 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78   if it is prefix
2ff00 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a  ed with "\\?\"..
2ff10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2ff20 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 69 6e 33  LITE_TCLAPI win3
2ff30 32 5f 65 78 69 73 74 73 5f 70 61 74 68 28 0a 20  2_exists_path(. 
2ff40 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
2ff50 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2ff60 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
2ff70 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
2ff80 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
2ff90 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2ffa0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2ffb0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2ffc0 20 6f 62 6a 76 2c 20 22 50 41 54 48 22 29 3b 0a   objv, "PATH");.
2ffd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2ffe0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
2fff0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
30000 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  erp, Tcl_NewBool
30010 65 61 6e 4f 62 6a 28 0a 20 20 20 20 20 20 47 65  eanObj(.      Ge
30020 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
30030 28 20 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65  ( Tcl_GetUnicode
30040 28 6f 62 6a 76 5b 31 5d 29 29 21 3d 49 4e 56 41  (objv[1]))!=INVA
30050 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
30060 54 45 53 20 29 29 3b 0a 20 20 72 65 74 75 72 6e  TES ));.  return
30070 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
30080 2a 20 20 20 20 20 20 66 69 6e 64 5f 77 69 6e 33  *      find_win3
30090 32 5f 66 69 6c 65 20 50 41 54 54 45 52 4e 0a 2a  2_file PATTERN.*
300a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 61 20 6c  *.** Returns a l
300b0 69 73 74 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ist of entries i
300c0 6e 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 68  n a directory th
300d0 61 74 20 6d 61 74 63 68 20 74 68 65 20 73 70 65  at match the spe
300e0 63 69 66 69 65 64 20 70 61 74 74 65 72 6e 2c 0a  cified pattern,.
300f0 2a 2a 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71  ** whose fully q
30100 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61  ualified name ma
30110 79 20 65 78 63 65 65 64 20 32 34 38 20 63 68 61  y exceed 248 cha
30120 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73  racters if it is
30130 20 70 72 65 66 69 78 65 64 20 77 69 74 68 0a 2a   prefixed with.*
30140 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61  * "\\?\"..*/.sta
30150 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
30160 43 4c 41 50 49 20 77 69 6e 33 32 5f 66 69 6e 64  CLAPI win32_find
30170 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20 2a 63  _file(.  void *c
30180 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
30190 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
301a0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
301b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
301c0 6a 76 5b 5d 0a 29 7b 0a 20 20 48 41 4e 44 4c 45  jv[].){.  HANDLE
301d0 20 68 46 69 6e 64 46 69 6c 65 20 3d 20 49 4e 56   hFindFile = INV
301e0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
301f0 45 3b 0a 20 20 57 49 4e 33 32 5f 46 49 4e 44 5f  E;.  WIN32_FIND_
30200 44 41 54 41 57 20 66 69 6e 64 44 61 74 61 3b 0a  DATAW findData;.
30210 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f    Tcl_Obj *listO
30220 62 6a 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  bj;.  DWORD last
30230 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 62 6a  Errno;.  if( obj
30240 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
30250 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
30260 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50  erp, 1, objv, "P
30270 41 54 54 45 52 4e 22 29 3b 0a 20 20 20 20 72 65  ATTERN");.    re
30280 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
30290 20 20 7d 0a 20 20 68 46 69 6e 64 46 69 6c 65 20    }.  hFindFile 
302a0 3d 20 46 69 6e 64 46 69 72 73 74 46 69 6c 65 57  = FindFirstFileW
302b0 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28  (Tcl_GetUnicode(
302c0 6f 62 6a 76 5b 31 5d 29 2c 20 26 66 69 6e 64 44  objv[1]), &findD
302d0 61 74 61 29 3b 0a 20 20 69 66 28 20 68 46 69 6e  ata);.  if( hFin
302e0 64 46 69 6c 65 3d 3d 49 4e 56 41 4c 49 44 5f 48  dFile==INVALID_H
302f0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
30300 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
30310 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
30320 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65  NewWideIntObj(Ge
30330 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a  tLastError()));.
30340 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
30350 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6c 69 73 74  RROR;.  }.  list
30360 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Obj = Tcl_NewObj
30370 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  ();.  Tcl_IncrRe
30380 66 43 6f 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b  fCount(listObj);
30390 0a 20 20 64 6f 20 7b 0a 20 20 20 20 54 63 6c 5f  .  do {.    Tcl_
303a0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
303b0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
303c0 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 55 6e 69  tObj, Tcl_NewUni
303d0 63 6f 64 65 4f 62 6a 28 0a 20 20 20 20 20 20 20  codeObj(.       
303e0 20 66 69 6e 64 44 61 74 61 2e 63 46 69 6c 65 4e   findData.cFileN
303f0 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ame, -1));.    T
30400 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
30410 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
30420 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  listObj, Tcl_New
30430 57 69 64 65 49 6e 74 4f 62 6a 28 0a 20 20 20 20  WideIntObj(.    
30440 20 20 20 20 66 69 6e 64 44 61 74 61 2e 64 77 46      findData.dwF
30450 69 6c 65 41 74 74 72 69 62 75 74 65 73 29 29 3b  ileAttributes));
30460 0a 20 20 7d 20 77 68 69 6c 65 28 20 46 69 6e 64  .  } while( Find
30470 4e 65 78 74 46 69 6c 65 57 28 68 46 69 6e 64 46  NextFileW(hFindF
30480 69 6c 65 2c 20 26 66 69 6e 64 44 61 74 61 29 20  ile, &findData) 
30490 29 3b 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d  );.  lastErrno =
304a0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
304b0 0a 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f  .  if( lastErrno
304c0 21 3d 4e 4f 5f 45 52 52 4f 52 20 26 26 20 6c 61  !=NO_ERROR && la
304d0 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 4e  stErrno!=ERROR_N
304e0 4f 5f 4d 4f 52 45 5f 46 49 4c 45 53 20 29 7b 0a  O_MORE_FILES ){.
304f0 20 20 20 20 46 69 6e 64 43 6c 6f 73 65 28 68 46      FindClose(hF
30500 69 6e 64 46 69 6c 65 29 3b 0a 20 20 20 20 54 63  indFile);.    Tc
30510 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6c  l_DecrRefCount(l
30520 69 73 74 4f 62 6a 29 3b 0a 20 20 20 20 54 63 6c  istObj);.    Tcl
30530 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
30540 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
30550 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45  eIntObj(GetLastE
30560 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65  rror()));.    re
30570 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
30580 20 20 7d 0a 20 20 46 69 6e 64 43 6c 6f 73 65 28    }.  FindClose(
30590 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20 54 63  hFindFile);.  Tc
305a0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
305b0 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 29 3b  nterp, listObj);
305c0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
305d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  ;.}../*.**      
305e0 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c  delete_win32_fil
305f0 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a  e FILENAME.**.**
30600 20 44 65 6c 65 74 65 73 20 74 68 65 20 73 70 65   Deletes the spe
30610 63 69 66 69 65 64 20 66 69 6c 65 2c 20 77 68 6f  cified file, who
30620 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  se fully qualifi
30630 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65  ed name may exce
30640 65 64 20 32 36 30 0a 2a 2a 20 63 68 61 72 61 63  ed 260.** charac
30650 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72  ters if it is pr
30660 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f  efixed with "\\?
30670 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  \"..*/.static in
30680 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
30690 77 69 6e 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c  win32_delete_fil
306a0 65 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e  e(.  void *clien
306b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
306c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
306d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
306e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
306f0 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .){.  if( objc!=
30700 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
30710 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
30720 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45  , 1, objv, "FILE
30730 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
30740 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
30750 7d 0a 20 20 69 66 28 20 21 44 65 6c 65 74 65 46  }.  if( !DeleteF
30760 69 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e 69 63  ileW(Tcl_GetUnic
30770 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b  ode(objv[1])) ){
30780 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
30790 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
307a0 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
307b0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29  GetLastError()))
307c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
307d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
307e0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
307f0 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
30800 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
30810 20 20 20 20 20 20 6d 61 6b 65 5f 77 69 6e 33 32        make_win32
30820 5f 64 69 72 20 44 49 52 45 43 54 4f 52 59 0a 2a  _dir DIRECTORY.*
30830 2a 0a 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65  *.** Creates the
30840 20 73 70 65 63 69 66 69 65 64 20 64 69 72 65 63   specified direc
30850 74 6f 72 79 2c 20 77 68 6f 73 65 20 66 75 6c 6c  tory, whose full
30860 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  y qualified name
30870 20 6d 61 79 20 65 78 63 65 65 64 20 32 34 38 0a   may exceed 248.
30880 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 66  ** characters if
30890 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20   it is prefixed 
308a0 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a  with "\\?\"..*/.
308b0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
308c0 45 5f 54 43 4c 41 50 49 20 77 69 6e 33 32 5f 6d  E_TCLAPI win32_m
308d0 6b 64 69 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c  kdir(.  void *cl
308e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
308f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
30900 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
30910 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
30920 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a  v[].){.  if( obj
30930 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
30940 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
30950 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
30960 49 52 45 43 54 4f 52 59 22 29 3b 0a 20 20 20 20  IRECTORY");.    
30970 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
30980 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 43 72 65  ;.  }.  if( !Cre
30990 61 74 65 44 69 72 65 63 74 6f 72 79 57 28 54 63  ateDirectoryW(Tc
309a0 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a  l_GetUnicode(obj
309b0 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 20 29 7b 0a  v[1]), NULL) ){.
309c0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
309d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
309e0 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47  _NewWideIntObj(G
309f0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b  etLastError()));
30a00 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
30a10 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
30a20 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
30a30 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
30a40 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
30a50 20 20 20 20 20 72 65 6d 6f 76 65 5f 77 69 6e 33       remove_win3
30a60 32 5f 64 69 72 20 44 49 52 45 43 54 4f 52 59 0a  2_dir DIRECTORY.
30a70 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 73 20 74 68  **.** Removes th
30a80 65 20 73 70 65 63 69 66 69 65 64 20 64 69 72 65  e specified dire
30a90 63 74 6f 72 79 2c 20 77 68 6f 73 65 20 66 75 6c  ctory, whose ful
30aa0 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d  ly qualified nam
30ab0 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 34 38  e may exceed 248
30ac0 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69  .** characters i
30ad0 66 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64  f it is prefixed
30ae0 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f   with "\\?\"..*/
30af0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
30b00 54 45 5f 54 43 4c 41 50 49 20 77 69 6e 33 32 5f  TE_TCLAPI win32_
30b10 72 6d 64 69 72 28 0a 20 20 76 6f 69 64 20 2a 63  rmdir(.  void *c
30b20 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
30b30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
30b40 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
30b50 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
30b60 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62  jv[].){.  if( ob
30b70 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
30b80 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
30b90 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
30ba0 44 49 52 45 43 54 4f 52 59 22 29 3b 0a 20 20 20  DIRECTORY");.   
30bb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
30bc0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 52 65  R;.  }.  if( !Re
30bd0 6d 6f 76 65 44 69 72 65 63 74 6f 72 79 57 28 54  moveDirectoryW(T
30be0 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62  cl_GetUnicode(ob
30bf0 6a 76 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 54  jv[1])) ){.    T
30c00 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
30c10 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
30c20 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73  ideIntObj(GetLas
30c30 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20  tError()));.    
30c40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
30c50 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65  ;.  }.  Tcl_Rese
30c60 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
30c70 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
30c80 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
30c90 2a 2a 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61  **      optimiza
30ca0 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20 44 42 20  tion_control DB 
30cb0 4f 50 54 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a  OPT BOOLEAN.**.*
30cc0 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
30cd0 62 6c 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  ble query optimi
30ce0 7a 61 74 69 6f 6e 73 20 75 73 69 6e 67 20 74 68  zations using th
30cf0 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  e sqlite3_test_c
30d00 6f 6e 74 72 6f 6c 28 29 0a 2a 2a 20 69 6e 74 65  ontrol().** inte
30d10 72 66 61 63 65 2e 20 20 44 69 73 61 62 6c 65 20  rface.  Disable 
30d20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20 66 61  if BOOLEAN is fa
30d30 6c 73 65 20 61 6e 64 20 65 6e 61 62 6c 65 20 69  lse and enable i
30d40 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20 74 72 75  f BOOLEAN is tru
30d50 65 2e 0a 2a 2a 20 4f 50 54 20 69 73 20 74 68 65  e..** OPT is the
30d60 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74   name of the opt
30d70 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 62 65 20  imization to be 
30d80 64 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a 73 74 61  disabled..*/.sta
30d90 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
30da0 43 4c 41 50 49 20 6f 70 74 69 6d 69 7a 61 74 69  CLAPI optimizati
30db0 6f 6e 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f  on_control(.  vo
30dc0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
30dd0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
30de0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
30df0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
30e00 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
30e10 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
30e20 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
30e30 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 69 6e 74 20  ar *zOpt;.  int 
30e40 6f 6e 6f 66 66 3b 0a 20 20 69 6e 74 20 6d 61 73  onoff;.  int mas
30e50 6b 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  k = 0;.  static 
30e60 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
30e70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
30e80 4f 70 74 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74  OptName;.    int
30e90 20 6d 61 73 6b 3b 0a 20 20 7d 20 61 4f 70 74 5b   mask;.  } aOpt[
30ea0 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6c 6c  ] = {.    { "all
30eb0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
30ec0 20 20 20 53 51 4c 49 54 45 5f 41 6c 6c 4f 70 74     SQLITE_AllOpt
30ed0 73 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  s        },.    
30ee0 7b 20 22 6e 6f 6e 65 22 2c 20 20 20 20 20 20 20  { "none",       
30ef0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
30f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
30f10 2c 0a 20 20 20 20 7b 20 22 71 75 65 72 79 2d 66  ,.    { "query-f
30f20 6c 61 74 74 65 6e 65 72 22 2c 20 20 20 20 20 53  lattener",     S
30f30 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
30f40 65 6e 65 72 20 7d 2c 0a 20 20 20 20 7b 20 22 63  ener },.    { "c
30f50 6f 6c 75 6d 6e 2d 63 61 63 68 65 22 2c 20 20 20  olumn-cache",   
30f60 20 20 20 20 20 53 51 4c 49 54 45 5f 43 6f 6c 75       SQLITE_Colu
30f70 6d 6e 43 61 63 68 65 20 20 20 20 7d 2c 0a 20 20  mnCache    },.  
30f80 20 20 7b 20 22 67 72 6f 75 70 62 79 2d 6f 72 64    { "groupby-ord
30f90 65 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54  er",       SQLIT
30fa0 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 20  E_GroupByOrder  
30fb0 20 7d 2c 0a 20 20 20 20 7b 20 22 66 61 63 74 6f   },.    { "facto
30fc0 72 2d 63 6f 6e 73 74 61 6e 74 73 22 2c 20 20 20  r-constants",   
30fd0 20 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75   SQLITE_FactorOu
30fe0 74 43 6f 6e 73 74 20 7d 2c 0a 20 20 20 20 7b 20  tConst },.    { 
30ff0 22 64 69 73 74 69 6e 63 74 2d 6f 70 74 22 2c 20  "distinct-opt", 
31000 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 69         SQLITE_Di
31010 73 74 69 6e 63 74 4f 70 74 20 20 20 20 7d 2c 0a  stinctOpt    },.
31020 20 20 20 20 7b 20 22 63 6f 76 65 72 2d 69 64 78      { "cover-idx
31030 2d 73 63 61 6e 22 2c 20 20 20 20 20 20 53 51 4c  -scan",      SQL
31040 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e  ITE_CoverIdxScan
31050 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 72 64     },.    { "ord
31060 65 72 2d 62 79 2d 69 64 78 2d 6a 6f 69 6e 22 2c  er-by-idx-join",
31070 20 20 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42     SQLITE_OrderB
31080 79 49 64 78 4a 6f 69 6e 20 7d 2c 0a 20 20 20 20  yIdxJoin },.    
31090 7b 20 22 74 72 61 6e 73 69 74 69 76 65 22 2c 20  { "transitive", 
310a0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
310b0 54 72 61 6e 73 69 74 69 76 65 20 20 20 20 20 7d  Transitive     }
310c0 2c 0a 20 20 20 20 7b 20 22 73 75 62 71 75 65 72  ,.    { "subquer
310d0 79 2d 63 6f 72 6f 75 74 69 6e 65 22 2c 20 20 53  y-coroutine",  S
310e0 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74  QLITE_SubqCorout
310f0 69 6e 65 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f  ine  },.    { "o
31100 6d 69 74 2d 6e 6f 6f 70 2d 6a 6f 69 6e 22 2c 20  mit-noop-join", 
31110 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 6d 69 74       SQLITE_Omit
31120 4e 6f 6f 70 4a 6f 69 6e 20 20 20 7d 2c 0a 20 20  NoopJoin   },.  
31130 20 20 7b 20 22 73 74 61 74 33 22 2c 20 20 20 20    { "stat3",    
31140 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
31150 45 5f 53 74 61 74 33 34 20 20 20 20 20 20 20 20  E_Stat34        
31160 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 61 74 34   },.    { "stat4
31170 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
31180 20 53 51 4c 49 54 45 5f 53 74 61 74 33 34 20 20   SQLITE_Stat34  
31190 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a         },.  };..
311a0 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
311b0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
311c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
311d0 20 6f 62 6a 76 2c 20 22 44 42 20 4f 50 54 20 42   objv, "DB OPT B
311e0 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65  OOLEAN");.    re
311f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
31200 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
31210 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
31220 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
31230 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
31240 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
31250 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
31260 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
31270 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e  rp, objv[3], &on
31280 6f 66 66 29 20 29 20 72 65 74 75 72 6e 20 54 43  off) ) return TC
31290 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 74 20  L_ERROR;.  zOpt 
312a0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
312b0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28  objv[2]);.  for(
312c0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f  i=0; i<sizeof(aO
312d0 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b  pt)/sizeof(aOpt[
312e0 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
312f0 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20  f( strcmp(zOpt, 
31300 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65  aOpt[i].zOptName
31310 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 61  )==0 ){.      ma
31320 73 6b 20 3d 20 61 4f 70 74 5b 69 5d 2e 6d 61 73  sk = aOpt[i].mas
31330 6b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  k;.      break;.
31340 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
31350 6f 6e 6f 66 66 20 29 20 6d 61 73 6b 20 3d 20 7e  onoff ) mask = ~
31360 6d 61 73 6b 3b 0a 20 20 69 66 28 20 69 3e 3d 73  mask;.  if( i>=s
31370 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65  izeof(aOpt)/size
31380 6f 66 28 61 4f 70 74 5b 30 5d 29 20 29 7b 0a 20  of(aOpt[0]) ){. 
31390 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
313a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b  ult(interp, "unk
313b0 6e 6f 77 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  nown optimizatio
313c0 6e 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e  n - should be on
313d0 65 20 6f 66 3a 22 2c 0a 20 20 20 20 20 20 20 20  e of:",.        
313e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
313f0 61 72 2a 29 30 29 3b 0a 20 20 20 20 66 6f 72 28  ar*)0);.    for(
31400 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f  i=0; i<sizeof(aO
31410 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b  pt)/sizeof(aOpt[
31420 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
31430 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
31440 74 28 69 6e 74 65 72 70 2c 20 22 20 22 2c 20 61  t(interp, " ", a
31450 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 2c  Opt[i].zOptName,
31460 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
31470 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
31480 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
31490 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
314a0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
314b0 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
314c0 2c 20 64 62 2c 20 6d 61 73 6b 29 3b 0a 20 20 72  , db, mask);.  r
314d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
314e0 0a 2f 2a 0a 2a 2a 20 20 20 20 20 6c 6f 61 64 5f  ./*.**     load_
314f0 73 74 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e  static_extension
31500 20 44 42 20 4e 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a   DB NAME ....**.
31510 2a 2a 20 4c 6f 61 64 20 6f 6e 65 20 6f 72 20 6d  ** Load one or m
31520 6f 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ore statically l
31530 69 6e 6b 65 64 20 65 78 74 65 6e 73 69 6f 6e 73  inked extensions
31540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31550 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 63  SQLITE_TCLAPI tc
31560 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65 6e  lLoadStaticExten
31570 73 69 6f 6e 43 6d 64 28 0a 20 20 76 6f 69 64 20  sionCmd(.  void 
31580 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
31590 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
315a0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
315b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
315c0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74   objv[].){.  ext
315d0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
315e0 61 6d 61 74 63 68 5f 69 6e 69 74 28 73 71 6c 69  amatch_init(sqli
315f0 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
31600 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
31610 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
31620 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  rn int sqlite3_c
31630 61 72 72 61 79 5f 69 6e 69 74 28 73 71 6c 69 74  array_init(sqlit
31640 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
31650 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
31660 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
31670 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  n int sqlite3_cl
31680 6f 73 75 72 65 5f 69 6e 69 74 28 73 71 6c 69 74  osure_init(sqlit
31690 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
316a0 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
316b0 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
316c0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 73  n int sqlite3_cs
316d0 76 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  v_init(sqlite3*,
316e0 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
316f0 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
31700 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
31710 74 20 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69  t sqlite3_eval_i
31720 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
31730 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
31740 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
31750 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
31760 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e  qlite3_fileio_in
31770 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
31780 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
31790 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
317a0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
317b0 6c 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69  lite3_fuzzer_ini
317c0 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
317d0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
317e0 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
317f0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
31800 69 74 65 33 5f 69 65 65 65 5f 69 6e 69 74 28 73  ite3_ieee_init(s
31810 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
31820 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
31830 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
31840 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
31850 33 5f 6e 65 78 74 63 68 61 72 5f 69 6e 69 74 28  3_nextchar_init(
31860 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
31870 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
31880 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
31890 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
318a0 65 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e  e3_percentile_in
318b0 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
318c0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
318d0 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
318e0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
318f0 6c 69 74 65 33 5f 72 65 67 65 78 70 5f 69 6e 69  lite3_regexp_ini
31900 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
31910 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
31920 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
31930 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
31940 69 74 65 33 5f 72 65 6d 65 6d 62 65 72 5f 69 6e  ite3_remember_in
31950 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
31960 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
31970 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
31980 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
31990 6c 69 74 65 33 5f 73 65 72 69 65 73 5f 69 6e 69  lite3_series_ini
319a0 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
319b0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
319c0 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
319d0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
319e0 69 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e  ite3_spellfix_in
319f0 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
31a00 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
31a10 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
31a20 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
31a30 6c 69 74 65 33 5f 74 6f 74 79 70 65 5f 69 6e 69  lite3_totype_ini
31a40 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
31a50 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
31a60 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
31a70 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
31a80 69 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72  ite3_wholenumber
31a90 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63  _init(sqlite3*,c
31aa0 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69  har**,const sqli
31ab0 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
31ac0 2a 29 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  *);.  static con
31ad0 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
31ae0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 74  const char *zExt
31af0 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 28 2a  Name;.    int (*
31b00 70 49 6e 69 74 29 28 73 71 6c 69 74 65 33 2a 2c  pInit)(sqlite3*,
31b10 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
31b20 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
31b30 73 2a 29 3b 0a 20 20 7d 20 61 45 78 74 65 6e 73  s*);.  } aExtens
31b40 69 6f 6e 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  ion[] = {.    { 
31b50 22 61 6d 61 74 63 68 22 2c 20 20 20 20 20 20 20  "amatch",       
31b60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31b70 5f 61 6d 61 74 63 68 5f 69 6e 69 74 20 20 20 20  _amatch_init    
31b80 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
31b90 20 20 7b 20 22 63 61 72 72 61 79 22 2c 20 20 20    { "carray",   
31ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
31bb0 69 74 65 33 5f 63 61 72 72 61 79 5f 69 6e 69 74  ite3_carray_init
31bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
31bd0 2c 0a 20 20 20 20 7b 20 22 63 6c 6f 73 75 72 65  ,.    { "closure
31be0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
31bf0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72 65   sqlite3_closure
31c00 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
31c10 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 73 76     },.    { "csv
31c20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
31c30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 73 76       sqlite3_csv
31c40 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
31c50 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
31c60 22 65 76 61 6c 22 2c 20 20 20 20 20 20 20 20 20  "eval",         
31c70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31c80 5f 65 76 61 6c 5f 69 6e 69 74 20 20 20 20 20 20  _eval_init      
31c90 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
31ca0 20 20 7b 20 22 66 69 6c 65 69 6f 22 2c 20 20 20    { "fileio",   
31cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
31cc0 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74  ite3_fileio_init
31cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
31ce0 2c 0a 20 20 20 20 7b 20 22 66 75 7a 7a 65 72 22  ,.    { "fuzzer"
31cf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31d00 20 73 71 6c 69 74 65 33 5f 66 75 7a 7a 65 72 5f   sqlite3_fuzzer_
31d10 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
31d20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 65 65     },.    { "iee
31d30 65 37 35 34 22 2c 20 20 20 20 20 20 20 20 20 20  e754",          
31d40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 65 65       sqlite3_iee
31d50 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  e_init          
31d60 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
31d70 22 6e 65 78 74 63 68 61 72 22 2c 20 20 20 20 20  "nextchar",     
31d80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31d90 5f 6e 65 78 74 63 68 61 72 5f 69 6e 69 74 20 20  _nextchar_init  
31da0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
31db0 20 20 7b 20 22 70 65 72 63 65 6e 74 69 6c 65 22    { "percentile"
31dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,            sql
31dd0 69 74 65 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f  ite3_percentile_
31de0 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 7d  init           }
31df0 2c 0a 20 20 20 20 7b 20 22 72 65 67 65 78 70 22  ,.    { "regexp"
31e00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31e10 20 73 71 6c 69 74 65 33 5f 72 65 67 65 78 70 5f   sqlite3_regexp_
31e20 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
31e30 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 65 6d     },.    { "rem
31e40 65 6d 62 65 72 22 2c 20 20 20 20 20 20 20 20 20  ember",         
31e50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6d       sqlite3_rem
31e60 65 6d 62 65 72 5f 69 6e 69 74 20 20 20 20 20 20  ember_init      
31e70 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
31e80 22 73 65 72 69 65 73 22 2c 20 20 20 20 20 20 20  "series",       
31e90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31ea0 5f 73 65 72 69 65 73 5f 69 6e 69 74 20 20 20 20  _series_init    
31eb0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
31ec0 20 20 7b 20 22 73 70 65 6c 6c 66 69 78 22 2c 20    { "spellfix", 
31ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
31ee0 69 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e  ite3_spellfix_in
31ef0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  it             }
31f00 2c 0a 20 20 20 20 7b 20 22 74 6f 74 79 70 65 22  ,.    { "totype"
31f10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31f20 20 73 71 6c 69 74 65 33 5f 74 6f 74 79 70 65 5f   sqlite3_totype_
31f30 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
31f40 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 68 6f     },.    { "who
31f50 6c 65 6e 75 6d 62 65 72 22 2c 20 20 20 20 20 20  lenumber",      
31f60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 68 6f       sqlite3_who
31f70 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74 20 20 20  lenumber_init   
31f80 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20         },.  };. 
31f90 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
31fa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
31fb0 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 72  e;.  int i, j, r
31fc0 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  c;.  char *zErrM
31fd0 73 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62  sg = 0;.  if( ob
31fe0 6a 63 3c 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<3 ){.    Tcl_
31ff0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
32000 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
32010 42 20 4e 41 4d 45 20 2e 2e 2e 22 29 3b 0a 20 20  B NAME ...");.  
32020 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
32030 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
32040 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
32050 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
32060 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
32070 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
32080 4f 52 3b 0a 20 20 66 6f 72 28 6a 3d 32 3b 20 6a  OR;.  for(j=2; j
32090 3c 6f 62 6a 63 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <objc; j++){.   
320a0 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
320b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6a 5d 29 3b  String(objv[j]);
320c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
320d0 41 72 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e  ArraySize(aExten
320e0 73 69 6f 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  sion); i++){.   
320f0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
32100 61 6d 65 2c 20 61 45 78 74 65 6e 73 69 6f 6e 5b  ame, aExtension[
32110 69 5d 2e 7a 45 78 74 4e 61 6d 65 29 3d 3d 30 20  i].zExtName)==0 
32120 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
32130 20 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53     if( i>=ArrayS
32140 69 7a 65 28 61 45 78 74 65 6e 73 69 6f 6e 29 20  ize(aExtension) 
32150 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
32160 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
32170 2c 20 22 6e 6f 20 73 75 63 68 20 65 78 74 65 6e  , "no such exten
32180 73 69 6f 6e 3a 20 22 2c 20 7a 4e 61 6d 65 2c 20  sion: ", zName, 
32190 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
321a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
321b0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
321c0 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 70   aExtension[i].p
321d0 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63  Init ){.      rc
321e0 20 3d 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69 5d   = aExtension[i]
321f0 2e 70 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72  .pInit(db, &zErr
32200 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Msg, 0);.    }el
32210 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
32220 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
32230 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32240 54 45 5f 4f 4b 20 7c 7c 20 7a 45 72 72 4d 73 67  TE_OK || zErrMsg
32250 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
32260 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
32270 70 2c 20 22 69 6e 69 74 69 61 6c 69 7a 61 74 69  p, "initializati
32280 6f 6e 20 6f 66 20 22 2c 20 7a 4e 61 6d 65 2c 20  on of ", zName, 
32290 22 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a 45 72  " failed: ", zEr
322a0 72 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rMsg,.          
322b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
322c0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
322d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
322e0 73 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  sg);.      retur
322f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
32300 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
32310 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
32320 20 20 20 20 20 73 6f 72 74 65 72 5f 74 65 73 74       sorter_test
32330 5f 66 61 6b 65 68 65 61 70 20 42 4f 4f 4c 0a 2a  _fakeheap BOOL.*
32340 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
32350 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 6f  SQLITE_TCLAPI so
32360 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65  rter_test_fakehe
32370 61 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ap(.  void * cli
32380 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
32390 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
323a0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
323b0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
323c0 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 62 41 72 67  [].){.  int bArg
323d0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
323e0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
323f0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
32400 31 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 22 29  1, objv, "BOOL")
32410 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
32420 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
32430 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
32440 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
32450 20 6f 62 6a 76 5b 31 5d 2c 20 26 62 41 72 67 29   objv[1], &bArg)
32460 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
32470 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
32480 20 69 66 28 20 62 41 72 67 20 29 7b 0a 20 20 20   if( bArg ){.   
32490 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
324a0 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d  alConfig.pHeap==
324b0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
324c0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
324d0 48 65 61 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e  Heap = SQLITE_IN
324e0 54 5f 54 4f 5f 50 54 52 28 2d 31 29 3b 0a 20 20  T_TO_PTR(-1);.  
324f0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
32500 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
32510 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d  alConfig.pHeap==
32520 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
32530 52 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 73  R(-1) ){.      s
32540 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
32550 69 67 2e 70 48 65 61 70 20 3d 20 30 3b 0a 20 20  ig.pHeap = 0;.  
32560 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52    }.  }..  Tcl_R
32570 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
32580 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
32590 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20  _OK;.}../*.**   
325a0 20 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f    sorter_test_so
325b0 72 74 34 5f 68 65 6c 70 65 72 20 44 42 20 53 51  rt4_helper DB SQ
325c0 4c 31 20 4e 53 54 45 50 20 53 51 4c 32 0a 2a 2a  L1 NSTEP SQL2.**
325d0 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 53 51 4c 20  .** Compile SQL 
325e0 73 74 61 74 65 6d 65 6e 74 20 24 53 51 4c 31 20  statement $SQL1 
325f0 61 6e 64 20 73 74 65 70 20 69 74 20 24 4e 53 54  and step it $NST
32600 45 50 20 74 69 6d 65 73 2e 20 46 6f 72 20 65 61  EP times. For ea
32610 63 68 20 72 6f 77 2c 20 0a 2a 2a 20 63 68 65 63  ch row, .** chec
32620 6b 20 74 68 61 74 20 74 68 65 20 6c 65 66 74 6d  k that the leftm
32630 6f 73 74 20 61 6e 64 20 72 69 67 68 74 6d 6f 73  ost and rightmos
32640 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  t columns return
32650 65 64 20 61 72 65 20 62 6f 74 68 20 69 6e 74 65  ed are both inte
32660 67 65 72 73 2c 0a 2a 2a 20 61 6e 64 20 74 68 61  gers,.** and tha
32670 74 20 62 6f 74 68 20 63 6f 6e 74 61 69 6e 20 74  t both contain t
32680 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 0a 2a  he same value..*
32690 2a 0a 2a 2a 20 54 68 65 6e 20 65 78 65 63 75 74  *.** Then execut
326a0 65 20 73 74 61 74 65 6d 65 6e 74 20 24 53 51 4c  e statement $SQL
326b0 32 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  2. Check that th
326c0 65 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  e statement retu
326d0 72 6e 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  rns the same.** 
326e0 73 65 74 20 6f 66 20 69 6e 74 65 67 65 72 73 20  set of integers 
326f0 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65  in the same orde
32700 72 20 61 73 20 69 6e 20 74 68 65 20 70 72 65 76  r as in the prev
32710 69 6f 75 73 20 73 74 65 70 20 28 75 73 69 6e 67  ious step (using
32720 20 24 53 51 4c 31 29 2e 0a 2a 2f 0a 73 74 61 74   $SQL1)..*/.stat
32730 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
32740 4c 41 50 49 20 73 6f 72 74 65 72 5f 74 65 73 74  LAPI sorter_test
32750 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 28 0a 20  _sort4_helper(. 
32760 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
32770 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
32780 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
32790 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
327a0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
327b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
327c0 53 71 6c 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Sql1;.  const ch
327d0 61 72 20 2a 7a 53 71 6c 32 3b 0a 20 20 69 6e 74  ar *zSql2;.  int
327e0 20 6e 53 74 65 70 3b 20 0a 20 20 69 6e 74 20 69   nStep; .  int i
327f0 53 74 65 70 3b 20 0a 20 20 75 6e 73 69 67 6e 65  Step; .  unsigne
32800 64 20 69 6e 74 20 69 43 6b 73 75 6d 31 20 3d 20  d int iCksum1 = 
32810 30 3b 20 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  0; .  unsigned i
32820 6e 74 20 69 43 6b 73 75 6d 32 20 3d 20 30 3b 20  nt iCksum2 = 0; 
32830 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
32840 20 69 42 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   iB;.  sqlite3 *
32850 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  db;.  sqlite3_st
32860 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 0a 20 20  mt *pStmt;.  .  
32870 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
32880 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
32890 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
328a0 62 6a 76 2c 20 22 44 42 20 53 51 4c 31 20 4e 53  bjv, "DB SQL1 NS
328b0 54 45 50 20 53 51 4c 32 22 29 3b 0a 20 20 20 20  TEP SQL2");.    
328c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
328d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
328e0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
328f0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
32900 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
32910 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
32920 52 3b 0a 20 20 7a 53 71 6c 31 20 3d 20 54 63 6c  R;.  zSql1 = Tcl
32930 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
32940 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  2]);.  if( Tcl_G
32950 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
32960 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
32970 53 74 65 70 29 20 29 20 72 65 74 75 72 6e 20 54  Step) ) return T
32980 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
32990 32 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  2 = Tcl_GetStrin
329a0 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20 20 72  g(objv[4]);..  r
329b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
329c0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 31  are_v2(db, zSql1
329d0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
329e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
329f0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c  TE_OK ) goto sql
32a00 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 42 20 3d 20  _error;..  iB = 
32a10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
32a20 6f 75 6e 74 28 70 53 74 6d 74 29 2d 31 3b 0a 20  ount(pStmt)-1;. 
32a30 20 66 6f 72 28 69 53 74 65 70 3d 30 3b 20 69 53   for(iStep=0; iS
32a40 74 65 70 3c 6e 53 74 65 70 20 26 26 20 53 51 4c  tep<nStep && SQL
32a50 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
32a60 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 20 69 53  _step(pStmt); iS
32a70 74 65 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  tep++){.    int 
32a80 61 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  a = sqlite3_colu
32a90 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
32aa0 3b 0a 20 20 20 20 69 66 28 20 61 21 3d 73 71 6c  ;.    if( a!=sql
32ab0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
32ac0 70 53 74 6d 74 2c 20 69 42 29 20 29 7b 0a 20 20  pStmt, iB) ){.  
32ad0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
32ae0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 64 61  sult(interp, "da
32af0 74 61 20 65 72 72 6f 72 3a 20 28 61 21 3d 62 29  ta error: (a!=b)
32b00 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
32b10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
32b20 20 20 20 7d 0a 0a 20 20 20 20 69 43 6b 73 75 6d     }..    iCksum
32b30 31 20 2b 3d 20 28 69 43 6b 73 75 6d 31 20 3c 3c  1 += (iCksum1 <<
32b40 20 33 29 20 2b 20 28 75 6e 73 69 67 6e 65 64 20   3) + (unsigned 
32b50 69 6e 74 29 61 3b 0a 20 20 7d 0a 20 20 72 63 20  int)a;.  }.  rc 
32b60 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
32b70 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
32b80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32b90 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b   goto sql_error;
32ba0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
32bb0 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
32bc0 7a 53 71 6c 32 2c 20 2d 31 2c 20 26 70 53 74 6d  zSql2, -1, &pStm
32bd0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
32be0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
32bf0 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 20 20 66  o sql_error;.  f
32c00 6f 72 28 69 53 74 65 70 3d 30 3b 20 53 51 4c 49  or(iStep=0; SQLI
32c10 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
32c20 73 74 65 70 28 70 53 74 6d 74 29 3b 20 69 53 74  step(pStmt); iSt
32c30 65 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61  ep++){.    int a
32c40 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
32c50 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
32c60 0a 20 20 20 20 69 43 6b 73 75 6d 32 20 2b 3d 20  .    iCksum2 += 
32c70 28 69 43 6b 73 75 6d 32 20 3c 3c 20 33 29 20 2b  (iCksum2 << 3) +
32c80 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 61   (unsigned int)a
32c90 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
32ca0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
32cb0 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  tmt);.  if( rc!=
32cc0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
32cd0 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 69   sql_error;..  i
32ce0 66 28 20 69 43 6b 73 75 6d 31 21 3d 69 43 6b 73  f( iCksum1!=iCks
32cf0 75 6d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  um2 ){.    Tcl_A
32d00 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
32d10 72 70 2c 20 22 63 68 65 63 6b 73 75 6d 20 6d 69  rp, "checksum mi
32d20 73 6d 61 74 63 68 22 2c 20 30 29 3b 0a 20 20 20  smatch", 0);.   
32d30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
32d40 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
32d50 20 54 43 4c 5f 4f 4b 3b 0a 20 73 71 6c 5f 65 72   TCL_OK;. sql_er
32d60 72 6f 72 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e  ror:.  Tcl_Appen
32d70 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
32d80 22 73 71 6c 20 65 72 72 6f 72 3a 20 22 2c 20 73  "sql error: ", s
32d90 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
32da0 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
32db0 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 0a 23  TCL_ERROR;.}...#
32dc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
32dd0 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
32de0 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
32df0 65 33 75 73 65 72 61 75 74 68 2e 68 22 0a 2f 2a  e3userauth.h"./*
32e00 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
32e10 69 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e  ite3_user_authen
32e20 74 69 63 61 74 65 20 44 42 20 55 53 45 52 4e 41  ticate DB USERNA
32e30 4d 45 20 50 41 53 53 57 4f 52 44 0a 2a 2f 0a 73  ME PASSWORD.*/.s
32e40 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
32e50 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 75 73 65  _TCLAPI test_use
32e60 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28 0a  r_authenticate(.
32e70 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
32e80 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73  entData, /* Unus
32e90 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
32ea0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
32eb0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
32ec0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
32ed0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
32ee0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
32ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
32f00 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
32f10 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
32f20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
32f30 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
32f40 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  nts */.){.  char
32f50 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20 63   *zUser = 0;.  c
32f60 68 61 72 20 2a 7a 50 61 73 73 77 64 20 3d 20 30  har *zPasswd = 0
32f70 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73 77 64 20  ;.  int nPasswd 
32f80 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
32f90 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
32fa0 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
32fb0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
32fc0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
32fd0 6f 62 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41  objv, "DB USERNA
32fe0 4d 45 20 50 41 53 53 57 4f 52 44 22 29 3b 0a 20  ME PASSWORD");. 
32ff0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
33000 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
33010 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
33020 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
33030 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
33040 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
33050 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
33060 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53  zUser = Tcl_GetS
33070 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
33080 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f    zPasswd = Tcl_
33090 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
330a0 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73  (objv[3], &nPass
330b0 77 64 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  wd);.  rc = sqli
330c0 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  te3_user_authent
330d0 69 63 61 74 65 28 64 62 2c 20 7a 55 73 65 72 2c  icate(db, zUser,
330e0 20 7a 50 61 73 73 77 64 2c 20 6e 50 61 73 73 77   zPasswd, nPassw
330f0 64 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  d);.  Tcl_SetRes
33100 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
33110 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
33120 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
33130 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
33140 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
33150 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
33160 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  NTICATION */..#i
33170 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52  fdef SQLITE_USER
33180 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
33190 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
331a0 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64 20  qlite3_user_add 
331b0 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53  DB USERNAME PASS
331c0 57 4f 52 44 20 49 53 41 44 4d 49 4e 0a 2a 2f 0a  WORD ISADMIN.*/.
331d0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
331e0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 75 73  E_TCLAPI test_us
331f0 65 72 5f 61 64 64 28 0a 20 20 43 6c 69 65 6e 74  er_add(.  Client
33200 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
33210 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20   /* Unused */.  
33220 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
33230 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
33240 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
33250 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
33260 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
33270 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
33280 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33290 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
332a0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
332b0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
332c0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
332d0 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20  {.  char *zUser 
332e0 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61  = 0;.  char *zPa
332f0 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sswd = 0;.  int 
33300 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69  nPasswd = 0;.  i
33310 6e 74 20 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a  nt isAdmin = 0;.
33320 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
33330 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
33340 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  objc!=5 ){.    T
33350 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
33360 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
33370 20 22 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41   "DB USERNAME PA
33380 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 22 29  SSWORD ISADMIN")
33390 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
333a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
333b0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
333c0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
333d0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
333e0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
333f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
33400 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47  .  zUser = Tcl_G
33410 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
33420 29 3b 0a 20 20 7a 50 61 73 73 77 64 20 3d 20 54  );.  zPasswd = T
33430 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
33440 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50  Obj(objv[3], &nP
33450 61 73 73 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65  asswd);.  Tcl_Ge
33460 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
33470 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
33480 20 26 69 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63   &isAdmin);.  rc
33490 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
334a0 61 64 64 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a  add(db, zUser, z
334b0 50 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c  Passwd, nPasswd,
334c0 20 69 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c   isAdmin);.  Tcl
334d0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
334e0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
334f0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
33500 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
33510 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
33520 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45  if /* SQLITE_USE
33530 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
33540 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
33550 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
33560 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c  CATION./*.** tcl
33570 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73  cmd:  sqlite3_us
33580 65 72 5f 63 68 61 6e 67 65 20 44 42 20 55 53 45  er_change DB USE
33590 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49  RNAME PASSWORD I
335a0 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63  SADMIN.*/.static
335b0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
335c0 50 49 20 74 65 73 74 5f 75 73 65 72 5f 63 68 61  PI test_user_cha
335d0 6e 67 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  nge(.  ClientDat
335e0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
335f0 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
33600 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
33610 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
33620 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
33630 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
33640 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
33650 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
33660 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
33670 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
33680 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
33690 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
336a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
336b0 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30   char *zUser = 0
336c0 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77  ;.  char *zPassw
336d0 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61  d = 0;.  int nPa
336e0 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sswd = 0;.  int 
336f0 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73  isAdmin = 0;.  s
33700 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
33710 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
33720 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
33730 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
33740 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
33750 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57  B USERNAME PASSW
33760 4f 52 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20  ORD ISADMIN");. 
33770 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
33780 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
33790 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
337a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
337b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
337c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
337d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
337e0 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53  zUser = Tcl_GetS
337f0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
33800 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f    zPasswd = Tcl_
33810 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
33820 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73  (objv[3], &nPass
33830 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f  wd);.  Tcl_GetBo
33840 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
33850 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69  erp, objv[4], &i
33860 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20  sAdmin);.  rc = 
33870 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61  sqlite3_user_cha
33880 6e 67 65 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a  nge(db, zUser, z
33890 50 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c  Passwd, nPasswd,
338a0 20 69 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c   isAdmin);.  Tcl
338b0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
338c0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
338d0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
338e0 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
338f0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
33900 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45  if /* SQLITE_USE
33910 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
33920 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
33930 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
33940 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c  CATION./*.** tcl
33950 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73  cmd:  sqlite3_us
33960 65 72 5f 64 65 6c 65 74 65 20 44 42 20 55 53 45  er_delete DB USE
33970 52 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20  RNAME.*/.static 
33980 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
33990 49 20 74 65 73 74 5f 75 73 65 72 5f 64 65 6c 65  I test_user_dele
339a0 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
339b0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
339c0 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
339d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
339e0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
339f0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
33a00 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
33a10 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
33a20 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
33a30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
33a40 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
33a50 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
33a60 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
33a70 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
33a80 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b  char *zUser = 0;
33a90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
33aa0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
33ab0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
33ac0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
33ad0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
33ae0 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45 22 29  , "DB USERNAME")
33af0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
33b00 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
33b10 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
33b20 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
33b30 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
33b40 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
33b50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
33b60 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47  .  zUser = Tcl_G
33b70 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
33b80 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
33b90 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 64 62  3_user_delete(db
33ba0 2c 20 7a 55 73 65 72 29 3b 0a 20 20 54 63 6c 5f  , zUser);.  Tcl_
33bb0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
33bc0 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
33bd0 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
33be0 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
33bf0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
33c00 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52  f /* SQLITE_USER
33c10 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20  _AUTHENTICATION 
33c20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  */../*.** tclcmd
33c30 3a 20 62 61 64 5f 62 65 68 61 76 69 6f 72 20 54  : bad_behavior T
33c40 59 50 45 0a 2a 2a 0a 2a 2a 20 44 6f 20 73 6f 6d  YPE.**.** Do som
33c50 65 20 74 68 69 6e 67 73 20 74 68 61 74 20 73 68  e things that sh
33c60 6f 75 6c 64 20 74 72 69 67 67 65 72 20 61 20 76  ould trigger a v
33c70 61 6c 67 72 69 6e 64 20 6f 72 20 2d 66 73 61 6e  algrind or -fsan
33c80 69 74 69 7a 65 3d 75 6e 64 65 66 69 6e 65 64 0a  itize=undefined.
33c90 2a 2a 20 77 61 72 6e 69 6e 67 2e 20 20 54 68 69  ** warning.  Thi
33ca0 73 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72  s is used to ver
33cb0 69 66 79 20 74 68 61 74 20 65 72 72 6f 72 73 20  ify that errors 
33cc0 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 6f 75 74  and warnings out
33cd0 70 75 74 20 62 79 20 74 68 6f 73 65 0a 2a 2a 20  put by those.** 
33ce0 74 6f 6f 6c 73 20 61 72 65 20 64 65 74 65 63 74  tools are detect
33cf0 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73  ed by the test s
33d00 63 72 69 70 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  cripts..**.**   
33d10 20 20 20 20 54 59 50 45 20 20 20 20 20 20 20 42      TYPE       B
33d20 45 48 41 56 49 4f 52 0a 2a 2a 20 20 20 20 20 20  EHAVIOR.**      
33d30 20 31 20 20 20 20 20 20 20 20 20 20 4f 76 65 72   1          Over
33d40 66 6c 6f 77 20 61 20 73 69 67 6e 65 64 20 69 6e  flow a signed in
33d50 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 32  teger.**       2
33d60 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 62            Jump b
33d70 61 73 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69  ased on an unini
33d80 74 69 61 6c 69 7a 65 64 20 76 61 72 69 61 62 6c  tialized variabl
33d90 65 0a 2a 2a 20 20 20 20 20 20 20 33 20 20 20 20  e.**       3    
33da0 20 20 20 20 20 20 52 65 61 64 20 61 66 74 65 72        Read after
33db0 20 66 72 65 65 0a 2a 2a 20 20 20 20 20 20 20 34   free.**       4
33dc0 20 20 20 20 20 20 20 20 20 20 50 61 6e 69 63 0a            Panic.
33dd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
33de0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
33df0 5f 62 61 64 5f 62 65 68 61 76 69 6f 72 28 0a 20  _bad_behavior(. 
33e00 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
33e10 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
33e20 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
33e30 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
33e40 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
33e50 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
33e60 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
33e70 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
33e80 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
33e90 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
33ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
33eb0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
33ec0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
33ed0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
33ee0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
33ef0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 54  s */.){.  int iT
33f00 79 70 65 3b 0a 20 20 69 6e 74 20 78 79 7a 3b 0a  ype;.  int xyz;.
33f10 20 20 69 6e 74 20 69 20 3d 20 2a 28 69 6e 74 2a    int i = *(int*
33f20 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69  )clientData;.  i
33f30 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 77 5b 31 30  nt j;.  int w[10
33f40 5d 3b 0a 20 20 69 6e 74 20 2a 61 3b 0a 20 20 69  ];.  int *a;.  i
33f50 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
33f60 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
33f70 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
33f80 6a 76 2c 20 22 54 59 50 45 22 29 3b 0a 20 20 20  jv, "TYPE");.   
33f90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
33fa0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
33fb0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
33fc0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
33fd0 26 69 54 79 70 65 29 20 29 20 72 65 74 75 72 6e  &iType) ) return
33fe0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 77   TCL_ERROR;.  sw
33ff0 69 74 63 68 28 20 69 54 79 70 65 20 29 7b 0a 20  itch( iType ){. 
34000 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20     case 1: {.   
34010 20 20 20 78 79 7a 20 3d 20 30 78 37 66 66 66 66     xyz = 0x7ffff
34020 66 30 30 20 2d 20 69 3b 0a 20 20 20 20 20 20 78  f00 - i;.      x
34030 79 7a 20 2b 3d 20 30 78 31 30 30 3b 0a 20 20 20  yz += 0x100;.   
34040 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
34050 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
34060 4e 65 77 49 6e 74 4f 62 6a 28 78 79 7a 29 29 3b  NewIntObj(xyz));
34070 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
34080 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
34090 7b 0a 20 20 20 20 20 20 77 5b 31 5d 20 3d 20 35  {.      w[1] = 5
340a0 3b 0a 20 20 20 20 20 20 69 66 28 20 77 5b 69 5d  ;.      if( w[i]
340b0 3e 30 20 29 20 77 5b 31 5d 2b 2b 3b 0a 20 20 20  >0 ) w[1]++;.   
340c0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
340d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
340e0 4e 65 77 49 6e 74 4f 62 6a 28 77 5b 31 5d 29 29  NewIntObj(w[1]))
340f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
34100 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
34110 20 7b 0a 20 20 20 20 20 20 61 20 3d 20 6d 61 6c   {.      a = mal
34120 6c 6f 63 28 20 73 69 7a 65 6f 66 28 69 6e 74 29  loc( sizeof(int)
34130 2a 31 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  *10 );.      for
34140 28 6a 3d 30 3b 20 6a 3c 31 30 3b 20 6a 2b 2b 29  (j=0; j<10; j++)
34150 20 61 5b 6a 5d 20 3d 20 6a 3b 0a 20 20 20 20 20   a[j] = j;.     
34160 20 66 72 65 65 28 61 29 3b 0a 20 20 20 20 20 20   free(a);.      
34170 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
34180 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
34190 49 6e 74 4f 62 6a 28 61 5b 69 5d 29 29 3b 0a 20  IntObj(a[i]));. 
341a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
341b0 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a  }.    case 4: {.
341c0 20 20 20 20 20 20 54 63 6c 5f 50 61 6e 69 63 28        Tcl_Panic(
341d0 22 44 65 6c 69 62 65 72 61 74 65 20 70 61 6e 69  "Deliberate pani
341e0 63 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  c");.      break
341f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
34200 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 20 20  turn TCL_OK;.}  
34210 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
34220 20 20 72 65 67 69 73 74 65 72 5f 64 62 73 74 61    register_dbsta
34230 74 5f 76 74 61 62 20 44 42 0a 2a 2a 0a 2a 2a 20  t_vtab DB.**.** 
34240 43 61 75 73 65 20 74 68 65 20 64 62 73 74 61 74  Cause the dbstat
34250 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
34260 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 6f  o be available o
34270 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
34280 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   DB.*/.static in
34290 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
342a0 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 64 62  test_register_db
342b0 73 74 61 74 5f 76 74 61 62 28 0a 20 20 76 6f 69  stat_vtab(.  voi
342c0 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
342d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
342e0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
342f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
34300 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 64  T objv[].){.#ifd
34310 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
34320 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 54 63  IRTUALTABLE.  Tc
34330 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
34340 6e 74 65 72 70 2c 20 22 64 62 73 74 61 74 20 6e  nterp, "dbstat n
34350 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 62 65 63  ot available bec
34360 61 75 73 65 20 6f 66 20 22 0a 20 20 20 20 20 20  ause of ".      
34370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34380 20 20 20 20 20 22 53 51 4c 49 54 45 5f 4f 4d 49       "SQLITE_OMI
34390 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 22 2c  T_VIRTUALTABLE",
343a0 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72 65   (void*)0);.  re
343b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
343c0 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 53  #else.  struct S
343d0 71 6c 69 74 65 44 62 20 7b 20 73 71 6c 69 74 65  qliteDb { sqlite
343e0 33 20 2a 64 62 3b 20 7d 3b 0a 20 20 63 68 61 72  3 *db; };.  char
343f0 20 2a 7a 44 62 3b 0a 20 20 54 63 6c 5f 43 6d 64   *zDb;.  Tcl_Cmd
34400 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 0a 20  Info cmdInfo;.. 
34410 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
34420 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
34430 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
34440 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20  objv, "DB");.   
34450 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
34460 52 3b 0a 20 20 7d 0a 0a 20 20 7a 44 62 20 3d 20  R;.  }..  zDb = 
34470 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
34480 6a 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[1]);.  if( Tc
34490 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f  l_GetCommandInfo
344a0 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63  (interp, zDb, &c
344b0 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 73  mdInfo) ){.    s
344c0 71 6c 69 74 65 33 2a 20 64 62 20 3d 20 28 28 73  qlite3* db = ((s
344d0 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29  truct SqliteDb*)
344e0 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e  cmdInfo.objClien
344f0 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 20 20  tData)->db;.    
34500 73 71 6c 69 74 65 33 44 62 73 74 61 74 52 65 67  sqlite3DbstatReg
34510 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 20  ister(db);.  }. 
34520 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
34530 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
34540 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
34550 4c 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  LE */.}../*.** t
34560 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33  clcmd:   sqlite3
34570 5f 64 62 5f 63 6f 6e 66 69 67 20 44 42 20 53 45  _db_config DB SE
34580 54 54 49 4e 47 20 56 41 4c 55 45 0a 2a 2a 0a 2a  TTING VALUE.**.*
34590 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  * Invoke sqlite3
345a0 5f 64 62 5f 63 6f 6e 66 69 67 28 29 20 66 6f 72  _db_config() for
345b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 65 74 74   one of the sett
345c0 69 6e 67 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73  ing values..*/.s
345d0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
345e0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 71 6c  _TCLAPI test_sql
345f0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 0a  ite3_db_config(.
34600 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
34610 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
34620 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
34630 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
34640 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
34650 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
34660 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
34670 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
34680 20 20 20 20 69 6e 74 20 65 56 61 6c 3b 0a 20 20      int eVal;.  
34690 7d 20 61 53 65 74 74 69 6e 67 5b 5d 20 3d 20 7b  } aSetting[] = {
346a0 0a 20 20 20 20 7b 20 22 46 4b 45 59 22 2c 20 20  .    { "FKEY",  
346b0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
346c0 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
346d0 5f 46 4b 45 59 20 7d 2c 0a 20 20 20 20 7b 20 22  _FKEY },.    { "
346e0 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20 20  TRIGGER",       
346f0 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
34700 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52  G_ENABLE_TRIGGER
34710 20 7d 2c 0a 20 20 20 20 7b 20 22 46 54 53 33 5f   },.    { "FTS3_
34720 54 4f 4b 45 4e 49 5a 45 52 22 2c 20 20 53 51 4c  TOKENIZER",  SQL
34730 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
34740 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a  BLE_FTS3_TOKENIZ
34750 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 4c 4f 41  ER },.    { "LOA
34760 44 5f 45 58 54 45 4e 53 49 4f 4e 22 2c 20 20 53  D_EXTENSION",  S
34770 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
34780 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
34790 53 49 4f 4e 20 7d 2c 0a 20 20 20 20 7b 20 22 4e  SION },.    { "N
347a0 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45 22  O_CKPT_ON_CLOSE"
347b0 2c 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47  ,SQLITE_DBCONFIG
347c0 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53  _NO_CKPT_ON_CLOS
347d0 45 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  E },.  };.  int 
347e0 69 3b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 63 6f  i;.  int v;.  co
347f0 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 74 74 69  nst char *zSetti
34800 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ng;.  sqlite3 *d
34810 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  b;..  if( objc!=
34820 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
34830 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
34840 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 53  , 1, objv, "DB S
34850 45 54 54 49 4e 47 20 56 41 4c 55 45 22 29 3b 0a  ETTING VALUE");.
34860 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
34870 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
34880 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
34890 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
348a0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
348b0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
348c0 52 52 4f 52 3b 0a 20 20 7a 53 65 74 74 69 6e 67  RROR;.  zSetting
348d0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
348e0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
348f0 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
34900 28 22 53 51 4c 49 54 45 5f 2a 22 2c 20 7a 53 65  ("SQLITE_*", zSe
34910 74 74 69 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74  tting)==0 ) zSet
34920 74 69 6e 67 20 2b 3d 20 37 3b 0a 20 20 69 66 28  ting += 7;.  if(
34930 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
34940 28 22 44 42 43 4f 4e 46 49 47 5f 2a 22 2c 20 7a  ("DBCONFIG_*", z
34950 53 65 74 74 69 6e 67 29 3d 3d 30 20 29 20 7a 53  Setting)==0 ) zS
34960 65 74 74 69 6e 67 20 2b 3d 20 39 3b 0a 20 20 69  etting += 9;.  i
34970 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
34980 6f 62 28 22 45 4e 41 42 4c 45 5f 2a 22 2c 20 7a  ob("ENABLE_*", z
34990 53 65 74 74 69 6e 67 29 3d 3d 30 20 29 20 7a 53  Setting)==0 ) zS
349a0 65 74 74 69 6e 67 20 2b 3d 20 37 3b 0a 20 20 66  etting += 7;.  f
349b0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
349c0 69 7a 65 28 61 53 65 74 74 69 6e 67 29 3b 20 69  ize(aSetting); i
349d0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
349e0 63 6d 70 28 7a 53 65 74 74 69 6e 67 2c 20 61 53  cmp(zSetting, aS
349f0 65 74 74 69 6e 67 5b 69 5d 2e 7a 4e 61 6d 65 29  etting[i].zName)
34a00 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ==0 ) break;.  }
34a10 0a 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53  .  if( i>=ArrayS
34a20 69 7a 65 28 61 53 65 74 74 69 6e 67 29 20 29 7b  ize(aSetting) ){
34a30 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
34a40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20  esult(interp,.  
34a50 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
34a60 67 4f 62 6a 28 22 75 6e 6b 6e 6f 77 6e 20 73 71  gObj("unknown sq
34a70 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 20  lite3_db_config 
34a80 73 65 74 74 69 6e 67 22 2c 20 2d 31 29 29 3b 0a  setting", -1));.
34a90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
34aa0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
34ab0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
34ac0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
34ad0 5d 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  ], &v) ) return 
34ae0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
34af0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64  ite3_db_config(d
34b00 62 2c 20 61 53 65 74 74 69 6e 67 5b 69 5d 2e 65  b, aSetting[i].e
34b10 56 61 6c 2c 20 76 2c 20 26 76 29 3b 0a 20 20 54  Val, v, &v);.  T
34b20 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
34b30 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
34b40 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 72 65 74  ntObj(v));.  ret
34b50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
34b60 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
34b70 6e 61 6d 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  name of the main
34b80 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
34b90 20 66 72 6f 6d 20 22 6d 61 69 6e 22 20 74 6f 20   from "main" to 
34ba0 22 69 63 65 63 75 62 65 22 2e 0a 2a 2f 0a 73 74  "icecube"..*/.st
34bb0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
34bc0 54 43 4c 41 50 49 20 74 65 73 74 5f 64 62 63 6f  TCLAPI test_dbco
34bd0 6e 66 69 67 5f 6d 61 69 6e 64 62 6e 61 6d 65 5f  nfig_maindbname_
34be0 69 63 65 63 75 62 65 28 0a 20 20 76 6f 69 64 20  icecube(.  void 
34bf0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
34c00 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
34c10 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
34c20 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
34c30 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
34c40 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
34c50 64 62 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  db;.  extern int
34c60 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63   getDbPointer(Tc
34c70 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 74  l_Interp*, const
34c80 20 63 68 61 72 2a 2c 20 73 71 6c 69 74 65 33 2a   char*, sqlite3*
34c90 2a 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  *);.  if( objc!=
34ca0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
34cb0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
34cc0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29  , 1, objv, "DB")
34cd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
34ce0 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
34cf0 0a 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f  .    if( getDbPo
34d00 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
34d10 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
34d20 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
34d30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
34d40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
34d50 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51  db_config(db, SQ
34d60 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41  LITE_DBCONFIG_MA
34d70 49 4e 44 42 4e 41 4d 45 2c 20 22 69 63 65 63 75  INDBNAME, "icecu
34d80 62 65 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  be");.    Tcl_Se
34d90 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
34da0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
34db0 28 72 63 29 29 3b 0a 20 20 20 20 72 65 74 75 72  (rc));.    retur
34dc0 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  n TCL_OK;.  }.}.
34dd0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
34de0 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74 68  commands with th
34df0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
34e00 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65  r..*/.int Sqlite
34e10 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49  test1_Init(Tcl_I
34e20 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
34e30 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
34e40 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
34e50 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
34e60 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f  sqlite3_found_co
34e70 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
34e80 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  t sqlite3_interr
34e90 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  upt_count;.  ext
34ea0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
34eb0 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b  open_file_count;
34ec0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
34ed0 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74  lite3_sort_count
34ee0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
34ef0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
34f00 69 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ime;.#if SQLITE_
34f10 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e  OS_UNIX && defin
34f20 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
34f30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
34f40 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65  OCKING_STYLE.  e
34f50 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
34f60 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b 0a 23 65  3_hostid_num;.#e
34f70 6e 64 69 66 0a 20 20 65 78 74 65 72 6e 20 69 6e  ndif.  extern in
34f80 74 20 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c  t sqlite3_max_bl
34f90 6f 62 73 69 7a 65 3b 0a 20 20 65 78 74 65 72 6e  obsize;.  extern
34fa0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
34fb0 50 49 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  PI sqlite3BtreeS
34fc0 68 61 72 65 64 43 61 63 68 65 52 65 70 6f 72 74  haredCacheReport
34fd0 28 76 6f 69 64 2a 2c 0a 20 20 20 20 20 20 20 20  (void*,.        
34fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35000 20 20 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 69 6e    Tcl_Interp*,in
35010 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f 4e 53 54 2a  t,Tcl_Obj*CONST*
35020 29 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  );.  static int 
35030 69 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 73 74 61  iZero = 0;.  sta
35040 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
35050 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
35060 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20      Tcl_CmdProc 
35070 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64  *xProc;.  } aCmd
35080 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64  [] = {.     { "d
35090 62 5f 65 6e 74 65 72 22 2c 20 20 20 20 20 20 20  b_enter",       
350a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
350b0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f  Tcl_CmdProc*)db_
350c0 65 6e 74 65 72 20 20 20 20 20 20 20 20 20 20 20  enter           
350d0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64      },.     { "d
350e0 62 5f 6c 65 61 76 65 22 2c 20 20 20 20 20 20 20  b_leave",       
350f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
35100 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f  Tcl_CmdProc*)db_
35110 6c 65 61 76 65 20 20 20 20 20 20 20 20 20 20 20  leave           
35120 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
35130 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
35140 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  nt",           (
35150 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
35160 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
35170 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
35180 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
35190 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 28  nt64",         (
351a0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
351b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
351c0 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  64  },.     { "s
351d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c  qlite3_mprintf_l
351e0 6f 6e 67 22 2c 20 20 20 20 20 20 20 20 20 20 28  ong",          (
351f0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
35200 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e  ite3_mprintf_lon
35210 67 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  g   },.     { "s
35220 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
35230 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  tr",           (
35240 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
35250 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
35260 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
35270 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
35280 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  str",          (
35290 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
352a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74  ite3_snprintf_st
352b0 72 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  r   },.     { "s
352c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
352d0 74 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28  tronly",       (
352e0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
352f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
35300 6f 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73  only},.     { "s
35310 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
35320 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28  ouble",        (
35330 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
35340 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
35350 62 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ble },.     { "s
35360 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
35370 63 61 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28  caled",        (
35380 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
35390 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
353a0 6c 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  led },.     { "s
353b0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68  qlite3_mprintf_h
353c0 65 78 64 6f 75 62 6c 65 22 2c 20 20 20 28 54 63  exdouble",   (Tc
353d0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
353e0 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f  e3_mprintf_hexdo
353f0 75 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73  uble},.     { "s
35400 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a  qlite3_mprintf_z
35410 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28  _test",        (
35420 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
35430 74 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20  t_mprintf_z     
35440 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
35450 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f  lite3_mprintf_n_
35460 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54  test",        (T
35470 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
35480 5f 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20 20 20  _mprintf_n      
35490 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
354a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e  ite3_snprintf_in
354b0 74 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  t",          (Tc
354c0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
354d0 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20  snprintf_int    
354e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
354f0 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
35500 72 6f 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c  rowid",     (Tcl
35510 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c  _CmdProc*)test_l
35520 61 73 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20  ast_rowid       
35530 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
35540 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c  e3_exec_printf",
35550 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
35560 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78  CmdProc*)test_ex
35570 65 63 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d  ec_printf      }
35580 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
35590 33 5f 65 78 65 63 5f 68 65 78 22 2c 20 20 20 20  3_exec_hex",    
355a0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
355b0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
355c0 63 5f 68 65 78 20 20 20 20 20 20 20 20 20 7d 2c  c_hex         },
355d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
355e0 5f 65 78 65 63 22 2c 20 20 20 20 20 20 20 20 20  _exec",         
355f0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
35600 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
35610 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
35620 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
35630 65 78 65 63 5f 6e 72 22 2c 20 20 20 20 20 20 20  exec_nr",       
35640 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
35650 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f  Proc*)test_exec_
35660 6e 72 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23  nr          },.#
35670 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
35680 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 20 20 20  IT_GET_TABLE.   
35690 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74    { "sqlite3_get
356a0 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20  _table_printf", 
356b0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
356c0 63 2a 29 74 65 73 74 5f 67 65 74 5f 74 61 62 6c  c*)test_get_tabl
356d0 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64  e_printf },.#end
356e0 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
356f0 65 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20  e3_close",      
35700 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
35710 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f  CmdProc*)sqlite_
35720 74 65 73 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d  test_close     }
35730 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
35740 33 5f 63 6c 6f 73 65 5f 76 32 22 2c 20 20 20 20  3_close_v2",    
35750 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
35760 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74  mdProc*)sqlite_t
35770 65 73 74 5f 63 6c 6f 73 65 5f 76 32 20 20 7d 2c  est_close_v2  },
35780 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
35790 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
357a0 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ",       (Tcl_Cm
357b0 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61  dProc*)test_crea
357c0 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a  te_function  },.
357d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
357e0 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
357f0 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ",      (Tcl_Cmd
35800 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74  Proc*)test_creat
35810 65 5f 61 67 67 72 65 67 61 74 65 20 7d 2c 0a 20  e_aggregate },. 
35820 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 72 65      { "sqlite_re
35830 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63  gister_test_func
35840 74 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50  tion", (Tcl_CmdP
35850 72 6f 63 2a 29 74 65 73 74 5f 72 65 67 69 73 74  roc*)test_regist
35860 65 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20  er_func    },.  
35870 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f     { "sqlite_abo
35880 72 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rt",            
35890 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
358a0 6f 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72 74  oc*)sqlite_abort
358b0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
358c0 20 20 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e 64    { "sqlite_bind
358d0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
358e0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
358f0 63 2a 29 74 65 73 74 5f 62 69 6e 64 20 20 20 20  c*)test_bind    
35900 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
35910 20 7b 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c   { "breakpoint",
35920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35930 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
35940 2a 29 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e  *)test_breakpoin
35950 74 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  t       },.     
35960 7b 20 22 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c  { "sqlite3_key",
35970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35980 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
35990 29 74 65 73 74 5f 6b 65 79 20 20 20 20 20 20 20  )test_key       
359a0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
359b0 20 22 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 22   "sqlite3_rekey"
359c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
359d0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
359e0 74 65 73 74 5f 72 65 6b 65 79 20 20 20 20 20 20  test_rekey      
359f0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
35a00 22 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69  "sqlite_set_magi
35a10 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
35a20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
35a30 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20  qlite_set_magic 
35a40 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
35a50 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
35a60 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
35a70 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
35a80 73 74 5f 69 6e 74 65 72 72 75 70 74 20 20 20 20  st_interrupt    
35a90 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
35aa0 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e  qlite_delete_fun
35ab0 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 28  ction",        (
35ac0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c  Tcl_CmdProc*)del
35ad0 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20  ete_function    
35ae0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
35af0 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c  lite_delete_coll
35b00 61 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54  ation",       (T
35b10 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65  cl_CmdProc*)dele
35b20 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20  te_collation    
35b30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
35b40 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
35b50 6d 69 74 22 2c 20 20 20 20 20 20 20 20 28 54 63  mit",        (Tc
35b60 6c 5f 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61  l_CmdProc*)get_a
35b70 75 74 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20  utocommit       
35b80 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
35b90 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c  te3_stack_used",
35ba0 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
35bb0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73  _CmdProc*)test_s
35bc0 74 61 63 6b 5f 75 73 65 64 20 20 20 20 20 20 20  tack_used       
35bd0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
35be0 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 22  e3_busy_timeout"
35bf0 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
35c00 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 75  CmdProc*)test_bu
35c10 73 79 5f 74 69 6d 65 6f 75 74 20 20 20 20 20 7d  sy_timeout     }
35c20 2c 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74 66  ,.     { "printf
35c30 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
35c40 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
35c50 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 70 72 69  mdProc*)test_pri
35c60 6e 74 66 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ntf           },
35c70 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
35c80 49 6f 54 72 61 63 65 22 2c 20 20 20 20 20 20 20  IoTrace",       
35c90 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
35ca0 72 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61  roc*)test_io_tra
35cb0 63 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  ce         },.  
35cc0 20 20 20 7b 20 22 63 6c 61 6e 67 5f 73 61 6e 69     { "clang_sani
35cd0 74 69 7a 65 5f 61 64 64 72 65 73 73 22 2c 20 20  tize_address",  
35ce0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
35cf0 6f 63 2a 29 63 6c 61 6e 67 5f 73 61 6e 69 74 69  oc*)clang_saniti
35d00 7a 65 5f 61 64 64 72 65 73 73 20 7d 2c 0a 20 20  ze_address },.  
35d10 7d 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  };.  static stru
35d20 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
35d30 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f  zName;.     Tcl_
35d40 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f  ObjCmdProc *xPro
35d50 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c  c;.     void *cl
35d60 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f  ientData;.  } aO
35d70 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  bjCmd[] = {.    
35d80 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 63   { "sqlite3_db_c
35d90 6f 6e 66 69 67 22 2c 20 20 20 20 20 20 20 20 20  onfig",         
35da0 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33      test_sqlite3
35db0 5f 64 62 5f 63 6f 6e 66 69 67 2c 20 30 20 7d 2c  _db_config, 0 },
35dc0 0a 20 20 20 20 20 7b 20 22 62 61 64 5f 62 65 68  .     { "bad_beh
35dd0 61 76 69 6f 72 22 2c 20 20 20 20 20 20 20 20 20  avior",         
35de0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 61           test_ba
35df0 64 5f 62 65 68 61 76 69 6f 72 2c 20 20 28 76 6f  d_behavior,  (vo
35e00 69 64 2a 29 26 69 5a 65 72 6f 20 7d 2c 0a 20 20  id*)&iZero },.  
35e10 20 20 20 7b 20 22 72 65 67 69 73 74 65 72 5f 64     { "register_d
35e20 62 73 74 61 74 5f 76 74 61 62 22 2c 20 20 20 20  bstat_vtab",    
35e30 20 20 20 20 20 20 74 65 73 74 5f 72 65 67 69 73        test_regis
35e40 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62 20  ter_dbstat_vtab 
35e50 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
35e60 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70  te3_connection_p
35e70 6f 69 6e 74 65 72 22 2c 20 20 20 20 67 65 74 5f  ointer",    get_
35e80 73 71 6c 69 74 65 5f 70 6f 69 6e 74 65 72 2c 20  sqlite_pointer, 
35e90 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e 74  0 },.     { "int
35ea0 61 72 72 61 79 5f 61 64 64 72 22 2c 20 20 20 20  array_addr",    
35eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
35ec0 74 5f 69 6e 74 61 72 72 61 79 5f 61 64 64 72 2c  t_intarray_addr,
35ed0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e   0 },.     { "in
35ee0 74 36 34 61 72 72 61 79 5f 61 64 64 72 22 2c 20  t64array_addr", 
35ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
35f00 73 74 5f 69 6e 74 36 34 61 72 72 61 79 5f 61 64  st_int64array_ad
35f10 64 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  dr, 0 },.     { 
35f20 22 64 6f 75 62 6c 65 61 72 72 61 79 5f 61 64 64  "doublearray_add
35f30 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
35f40 20 74 65 73 74 5f 64 6f 75 62 6c 65 61 72 72 61   test_doublearra
35f50 79 5f 61 64 64 72 2c 20 30 20 7d 2c 0a 20 20 20  y_addr, 0 },.   
35f60 20 20 7b 20 22 74 65 78 74 61 72 72 61 79 5f 61    { "textarray_a
35f70 64 64 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ddr",           
35f80 20 20 20 20 20 74 65 73 74 5f 74 65 78 74 61 72       test_textar
35f90 72 61 79 5f 61 64 64 72 2c 20 30 20 7d 2c 0a 20  ray_addr, 0 },. 
35fa0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
35fb0 69 6e 64 5f 69 6e 74 22 2c 20 20 20 20 20 20 20  ind_int",       
35fc0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
35fd0 5f 69 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a  _int,      0 },.
35fe0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
35ff0 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20  bind_zeroblob", 
36000 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
36010 64 5f 7a 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c  d_zeroblob, 0 },
36020 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
36030 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34  _bind_zeroblob64
36040 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 62 69  ",       test_bi
36050 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 2c 20 30  nd_zeroblob64, 0
36060 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
36070 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 22 2c  te3_bind_int64",
36080 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
36090 5f 62 69 6e 64 5f 69 6e 74 36 34 2c 20 20 20 20  _bind_int64,    
360a0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
360b0 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
360c0 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
360d0 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 2c 20 20  t_bind_double,  
360e0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
360f0 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22  lite3_bind_null"
36100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
36110 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 20 20  st_bind_null    
36120 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
36130 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
36140 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
36150 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 20 20 20  est_bind_text   
36160 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
36170 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
36180 74 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  t16",           
36190 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36  test_bind_text16
361a0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
361b0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c  "sqlite3_bind_bl
361c0 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ob",            
361d0 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 20   test_bind_blob 
361e0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
361f0 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70   "sqlite3_bind_p
36200 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 22 2c  arameter_count",
36210 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61    test_bind_para
36220 6d 65 74 65 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c  meter_count, 0},
36230 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
36240 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
36250 6e 61 6d 65 22 2c 20 20 20 74 65 73 74 5f 62 69  name",   test_bi
36260 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
36270 65 2c 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  e,  0},.     { "
36280 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
36290 61 6d 65 74 65 72 5f 69 6e 64 65 78 22 2c 20 20  ameter_index",  
362a0 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
362b0 74 65 72 5f 69 6e 64 65 78 2c 20 30 7d 2c 0a 20  ter_index, 0},. 
362c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
362d0 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20  lear_bindings", 
362e0 20 20 20 20 20 20 20 74 65 73 74 5f 63 6c 65 61         test_clea
362f0 72 5f 62 69 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a  r_bindings, 0},.
36300 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
36310 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 5f 6e  clear_bindings_n
36320 75 6c 6c 22 2c 20 20 20 74 65 73 74 5f 63 6c 65  ull",   test_cle
36330 61 72 5f 62 69 6e 64 69 6e 67 73 5f 6e 75 6c 6c  ar_bindings_null
36340 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  , 0},.     { "sq
36350 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c 20 20 20  lite3_sleep",   
36360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
36370 73 74 5f 73 6c 65 65 70 2c 20 20 20 20 20 20 20  st_sleep,       
36380 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
36390 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c  qlite3_errcode",
363a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
363b0 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20  est_errcode     
363c0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
363d0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
363e0 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20 20 20  _errcode",      
363f0 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 20  test_ex_errcode 
36400 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
36410 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 22  "sqlite3_errmsg"
36420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36430 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20 20 20   test_errmsg    
36440 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
36450 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   "sqlite3_errmsg
36460 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  16",            
36470 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20    test_errmsg16 
36480 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
36490 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22  { "sqlite3_open"
364a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
364b0 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20 20 20     test_open    
364c0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
364d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e   { "sqlite3_open
364e0 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  16",            
364f0 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31 36 20      test_open16 
36500 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
36510 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
36520 6e 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  n_v2",          
36530 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 5f 76       test_open_v
36540 32 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  2       ,0 },.  
36550 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
36560 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20 20 20  mplete16",      
36570 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d 70 6c        test_compl
36580 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a 0a  ete16    ,0 },..
36590 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
365a0 70 72 65 70 61 72 65 22 2c 20 20 20 20 20 20 20  prepare",       
365b0 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65          test_pre
365c0 70 61 72 65 20 20 20 20 20 20 20 2c 30 20 7d 2c  pare       ,0 },
365d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
365e0 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20 20 20  _prepare16",    
365f0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
36600 65 70 61 72 65 31 36 20 20 20 20 20 2c 30 20 7d  epare16     ,0 }
36610 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
36620 33 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20 20  3_prepare_v2",  
36630 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
36640 72 65 70 61 72 65 5f 76 32 20 20 20 20 2c 30 20  repare_v2    ,0 
36650 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
36660 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31  e3_prepare_tkt31
36670 33 34 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  34",       test_
36680 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 2c  prepare_tkt3134,
36690 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
366a0 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76  ite3_prepare16_v
366b0 32 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  2",          tes
366c0 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 20  t_prepare16_v2  
366d0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
366e0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22 2c  lite3_finalize",
366f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
36700 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20 20  st_finalize     
36710 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
36720 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
36730 75 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  us",           t
36740 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 20  est_stmt_status 
36750 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
36760 73 71 6c 69 74 65 33 5f 72 65 73 65 74 22 2c 20  sqlite3_reset", 
36770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36780 74 65 73 74 5f 72 65 73 65 74 20 20 20 20 20 20  test_reset      
36790 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
367a0 22 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64  "sqlite3_expired
367b0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
367c0 20 74 65 73 74 5f 65 78 70 69 72 65 64 20 20 20   test_expired   
367d0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
367e0 20 22 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66   "sqlite3_transf
367f0 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20  er_bindings",   
36800 20 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f    test_transfer_
36810 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20 20 20  bind ,0 },.     
36820 7b 20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  { "sqlite3_chang
36830 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  es",            
36840 20 20 20 74 65 73 74 5f 63 68 61 6e 67 65 73 20     test_changes 
36850 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
36860 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 65 70   { "sqlite3_step
36870 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
36880 20 20 20 20 74 65 73 74 5f 73 74 65 70 20 20 20      test_step   
36890 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
368a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 71 6c    { "sqlite3_sql
368b0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
368c0 20 20 20 20 20 74 65 73 74 5f 73 71 6c 20 20 20       test_sql   
368d0 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
368e0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
368f0 70 61 6e 64 65 64 5f 73 71 6c 22 2c 20 20 20 20  panded_sql",    
36900 20 20 20 20 20 20 74 65 73 74 5f 65 78 5f 73 71        test_ex_sq
36910 6c 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  l        ,0 },. 
36920 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6e      { "sqlite3_n
36930 65 78 74 5f 73 74 6d 74 22 2c 20 20 20 20 20 20  ext_stmt",      
36940 20 20 20 20 20 20 20 74 65 73 74 5f 6e 65 78 74         test_next
36950 5f 73 74 6d 74 20 20 20 20 20 2c 30 20 7d 2c 0a  _stmt     ,0 },.
36960 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
36970 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 22 2c 20  stmt_readonly", 
36980 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d          test_stm
36990 74 5f 72 65 61 64 6f 6e 6c 79 20 2c 30 20 7d 2c  t_readonly ,0 },
369a0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
369b0 5f 73 74 6d 74 5f 62 75 73 79 22 2c 20 20 20 20  _stmt_busy",    
369c0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74           test_st
369d0 6d 74 5f 62 75 73 79 20 20 20 20 20 2c 30 20 7d  mt_busy     ,0 }
369e0 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 73 5f 73  ,.     { "uses_s
369f0 74 6d 74 5f 6a 6f 75 72 6e 61 6c 22 2c 20 20 20  tmt_journal",   
36a00 20 20 20 20 20 20 20 20 20 20 75 73 65 73 5f 73            uses_s
36a10 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 2c 30 20 7d  tmt_journal ,0 }
36a20 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  ,..     { "sqlit
36a30 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
36a40 79 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f  y",        test_
36a50 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20  release_memory, 
36a60 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
36a70 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
36a80 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20  se_memory",     
36a90 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f  test_db_release_
36aa0 6d 65 6d 6f 72 79 2c 20 20 30 7d 2c 0a 20 20 20  memory,  0},.   
36ab0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f    { "sqlite3_db_
36ac0 63 61 63 68 65 66 6c 75 73 68 22 2c 20 20 20 20  cacheflush",    
36ad0 20 20 20 20 20 74 65 73 74 5f 64 62 5f 63 61 63       test_db_cac
36ae0 68 65 66 6c 75 73 68 2c 20 20 20 20 20 20 30 7d  heflush,      0}
36af0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
36b00 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 22 2c  3_system_errno",
36b10 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73            test_s
36b20 79 73 74 65 6d 5f 65 72 72 6e 6f 2c 20 20 20 20  ystem_errno,    
36b30 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
36b40 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61  qlite3_db_filena
36b50 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  me",           t
36b60 65 73 74 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 2c  est_db_filename,
36b70 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
36b80 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 72   { "sqlite3_db_r
36b90 65 61 64 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20  eadonly",       
36ba0 20 20 20 20 74 65 73 74 5f 64 62 5f 72 65 61 64      test_db_read
36bb0 6f 6e 6c 79 2c 20 20 20 20 20 20 20 20 30 7d 2c  only,        0},
36bc0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
36bd0 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
36be0 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73 6f  ",       test_so
36bf0 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 2c 20 20  ft_heap_limit,  
36c00 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
36c10 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
36c20 61 6e 75 70 22 2c 20 20 20 20 20 20 20 20 74 65  anup",        te
36c30 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  st_thread_cleanu
36c40 70 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  p,     0},.     
36c50 7b 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  { "sqlite3_pager
36c60 5f 72 65 66 63 6f 75 6e 74 73 22 2c 20 20 20 20  _refcounts",    
36c70 20 20 20 74 65 73 74 5f 70 61 67 65 72 5f 72 65     test_pager_re
36c80 66 63 6f 75 6e 74 73 2c 20 20 20 20 30 7d 2c 0a  fcounts,    0},.
36c90 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
36ca0 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22  _load_extension"
36cb0 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 6c 6f  ,        test_lo
36cc0 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20  ad_extension,   
36cd0 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
36ce0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61  lite3_enable_loa
36cf0 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 74 65  d_extension", te
36d00 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 2c 20  st_enable_load, 
36d10 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
36d20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  { "sqlite3_exten
36d30 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
36d40 22 2c 20 74 65 73 74 5f 65 78 74 65 6e 64 65 64  ", test_extended
36d50 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 2c 20 30  _result_codes, 0
36d60 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
36d70 65 33 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20  e3_limit",      
36d80 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
36d90 6c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20  limit,          
36da0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
36db0 7b 20 22 64 62 63 6f 6e 66 69 67 5f 6d 61 69 6e  { "dbconfig_main
36dc0 64 62 6e 61 6d 65 5f 69 63 65 63 75 62 65 22 2c  dbname_icecube",
36dd0 20 20 20 74 65 73 74 5f 64 62 63 6f 6e 66 69 67     test_dbconfig
36de0 5f 6d 61 69 6e 64 62 6e 61 6d 65 5f 69 63 65 63  _maindbname_icec
36df0 75 62 65 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22  ube },..     { "
36e00 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 22  save_prng_state"
36e10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36e20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c  save_prng_state,
36e30 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
36e40 22 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74  "restore_prng_st
36e50 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
36e60 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74   restore_prng_st
36e70 61 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ate, 0 },.     {
36e80 20 22 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61   "reset_prng_sta
36e90 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
36ea0 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61    reset_prng_sta
36eb0 74 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20  te,   0 },.     
36ec0 7b 20 22 64 61 74 61 62 61 73 65 5f 6e 65 76 65  { "database_neve
36ed0 72 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20 20  r_corrupt",     
36ee0 20 20 20 64 61 74 61 62 61 73 65 5f 6e 65 76 65     database_neve
36ef0 72 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20  r_corrupt, 0},. 
36f00 20 20 20 20 7b 20 22 64 61 74 61 62 61 73 65 5f      { "database_
36f10 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 22 2c  may_be_corrupt",
36f20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 5f         database_
36f30 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 2c 20  may_be_corrupt, 
36f40 30 7d 2c 0a 20 20 20 20 20 7b 20 22 6f 70 74 69  0},.     { "opti
36f50 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c  mization_control
36f60 22 2c 20 20 20 20 20 20 20 20 20 20 6f 70 74 69  ",          opti
36f70 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c  mization_control
36f80 2c 30 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f  ,0},.#if SQLITE_
36f90 4f 53 5f 57 49 4e 0a 20 20 20 20 20 7b 20 22 6c  OS_WIN.     { "l
36fa0 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c  ock_win32_file",
36fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
36fc0 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 2c 20  in32_file_lock, 
36fd0 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
36fe0 65 78 69 73 74 73 5f 77 69 6e 33 32 5f 70 61 74  exists_win32_pat
36ff0 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  h",             
37000 77 69 6e 33 32 5f 65 78 69 73 74 73 5f 70 61 74  win32_exists_pat
37010 68 2c 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  h,  0 },.     { 
37020 22 66 69 6e 64 5f 77 69 6e 33 32 5f 66 69 6c 65  "find_win32_file
37030 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
37040 20 77 69 6e 33 32 5f 66 69 6e 64 5f 66 69 6c 65   win32_find_file
37050 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ,    0 },.     {
37060 20 22 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66   "delete_win32_f
37070 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
37080 20 20 77 69 6e 33 32 5f 64 65 6c 65 74 65 5f 66    win32_delete_f
37090 69 6c 65 2c 20 20 30 20 7d 2c 0a 20 20 20 20 20  ile,  0 },.     
370a0 7b 20 22 6d 61 6b 65 5f 77 69 6e 33 32 5f 64 69  { "make_win32_di
370b0 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
370c0 20 20 20 77 69 6e 33 32 5f 6d 6b 64 69 72 2c 20     win32_mkdir, 
370d0 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20         0 },.    
370e0 20 7b 20 22 72 65 6d 6f 76 65 5f 77 69 6e 33 32   { "remove_win32
370f0 5f 64 69 72 22 2c 20 20 20 20 20 20 20 20 20 20  _dir",          
37100 20 20 20 20 77 69 6e 33 32 5f 72 6d 64 69 72 2c      win32_rmdir,
37110 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
37120 64 69 66 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f  dif.     { "tcl_
37130 6f 62 6a 70 72 6f 63 22 2c 20 20 20 20 20 20 20  objproc",       
37140 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e 41              runA
37150 73 4f 62 6a 50 72 6f 63 2c 20 20 20 20 20 20 20  sObjProc,       
37160 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71  0 },..     /* sq
37170 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29  lite3_column_*()
37180 20 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22   API */.     { "
37190 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
371a0 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
371b0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  test_column_coun
371c0 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  t  ,0 },.     { 
371d0 22 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f  "sqlite3_data_co
371e0 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  unt",           
371f0 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74   test_data_count
37200 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
37210 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
37220 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20  _type",         
37230 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79    test_column_ty
37240 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  pe   ,0 },.     
37250 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
37260 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  n_blob",        
37270 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62     test_column_b
37280 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  lob   ,0 },.    
37290 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
372a0 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20  mn_double",     
372b0 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
372c0 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20  double ,0 },.   
372d0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
372e0 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20  umn_int64",     
372f0 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
37300 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20  _int64  ,0 },.  
37310 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
37320 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 74 65  lumn_text",   te
37330 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28  st_stmt_utf8,  (
37340 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
37350 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c 0a 20 20 20  lumn_text },.   
37360 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
37370 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73  umn_name",   tes
37380 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76  t_stmt_utf8,  (v
37390 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
373a0 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a 20 20 20 20  umn_name },.    
373b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
373c0 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 74 65 73 74  mn_int",    test
373d0 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f  _stmt_int,   (vo
373e0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
373f0 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20 20 20 20 20  mn_int  },.     
37400 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
37410 6e 5f 62 79 74 65 73 22 2c 20 20 74 65 73 74 5f  n_bytes",  test_
37420 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69  stmt_int,   (voi
37430 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
37440 6e 5f 62 79 74 65 73 7d 2c 0a 23 69 66 6e 64 65  n_bytes},.#ifnde
37450 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
37460 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73  CLTYPE.     { "s
37470 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
37480 63 6c 74 79 70 65 22 2c 74 65 73 74 5f 73 74 6d  cltype",test_stm
37490 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
374a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
374b0 6c 74 79 70 65 7d 2c 0a 23 65 6e 64 69 66 0a 23  ltype},.#endif.#
374c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
374d0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
374e0 41 54 41 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63  ATA.{ "sqlite3_c
374f0 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
37500 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  ame",test_stmt_u
37510 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  tf8,(void*)sqlit
37520 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
37530 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c  se_name},.{ "sql
37540 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
37550 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d  e_name",test_stm
37560 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
37570 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
37580 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c  le_name},.{ "sql
37590 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
375a0 69 6e 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74  in_name",test_st
375b0 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73  mt_utf8,(void*)s
375c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
375d0 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64  igin_name},.#end
375e0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
375f0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
37600 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
37610 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 74  lumn_bytes16", t
37620 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 28 76  est_stmt_int, (v
37630 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
37640 75 6d 6e 5f 62 79 74 65 73 31 36 20 7d 2c 0a 20  umn_bytes16 },. 
37650 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
37660 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20  olumn_text16",  
37670 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
37680 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
37690 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a  column_text16},.
376a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
376b0 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20  column_name16", 
376c0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
376d0 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
376e0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c  _column_name16},
376f0 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 61 6c 69  .     { "add_ali
37700 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
37710 61 74 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69  ations", add_ali
37720 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
37730 61 74 69 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d  ations, 0      }
37740 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
37750 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
37760 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
37770 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36  olumn_decltype16
37780 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  ",test_stmt_utf1
37790 36 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  6,(void*)sqlite3
377a0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
377b0 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64  16},.#endif.#ifd
377c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
377d0 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
377e0 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .{"sqlite3_colum
377f0 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31  n_database_name1
37800 36 22 2c 0a 20 20 74 65 73 74 5f 73 74 6d 74 5f  6",.  test_stmt_
37810 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71  utf16, (void*)sq
37820 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74  lite3_column_dat
37830 61 62 61 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b  abase_name16},.{
37840 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
37850 74 61 62 6c 65 5f 6e 61 6d 65 31 36 22 2c 20 74  table_name16", t
37860 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
37870 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
37880 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65  olumn_table_name
37890 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63  16},.{"sqlite3_c
378a0 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
378b0 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f  e16", test_stmt_
378c0 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71  utf16, (void*)sq
378d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
378e0 67 69 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e  gin_name16},.#en
378f0 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  dif.#endif.     
37900 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
37910 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c  e_collation_v2",
37920 20 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c   test_create_col
37930 6c 61 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a  lation_v2, 0 },.
37940 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
37950 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 22 2c  global_recover",
37960 20 20 20 20 20 74 65 73 74 5f 67 6c 6f 62 61 6c       test_global
37970 5f 72 65 63 6f 76 65 72 2c 20 30 20 20 20 7d 2c  _recover, 0   },
37980 0a 20 20 20 20 20 7b 20 22 77 6f 72 6b 69 6e 67  .     { "working
37990 5f 36 34 62 69 74 5f 69 6e 74 22 2c 20 20 20 20  _64bit_int",    
379a0 20 20 20 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34        working_64
379b0 62 69 74 5f 69 6e 74 2c 20 20 20 30 20 20 20 7d  bit_int,   0   }
379c0 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e  ,.     { "vfs_un
379d0 6c 69 6e 6b 5f 74 65 73 74 22 2c 20 20 20 20 20  link_test",     
379e0 20 20 20 20 20 20 20 76 66 73 5f 75 6e 6c 69 6e         vfs_unlin
379f0 6b 5f 74 65 73 74 2c 20 20 20 20 20 30 20 20 20  k_test,     0   
37a00 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 69  },.     { "vfs_i
37a10 6e 69 74 66 61 69 6c 5f 74 65 73 74 22 2c 20 20  nitfail_test",  
37a20 20 20 20 20 20 20 20 20 76 66 73 5f 69 6e 69 74          vfs_init
37a30 66 61 69 6c 5f 74 65 73 74 2c 20 20 20 30 20 20  fail_test,   0  
37a40 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f   },.     { "vfs_
37a50 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c  unregister_all",
37a60 20 20 20 20 20 20 20 20 20 76 66 73 5f 75 6e 72           vfs_unr
37a70 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20  egister_all,  0 
37a80 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73    },.     { "vfs
37a90 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 22  _reregister_all"
37aa0 2c 20 20 20 20 20 20 20 20 20 76 66 73 5f 72 65  ,         vfs_re
37ab0 72 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30  register_all,  0
37ac0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
37ad0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 22  le_control_test"
37ae0 2c 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f  ,          file_
37af0 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 2c 20 20 20  control_test,   
37b00 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
37b10 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74  ile_control_last
37b20 65 72 72 6e 6f 5f 74 65 73 74 22 2c 20 66 69 6c  errno_test", fil
37b30 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72  e_control_laster
37b40 72 6e 6f 5f 74 65 73 74 2c 20 20 30 20 20 20 7d  rno_test,  0   }
37b50 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
37b60 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79  ontrol_lockproxy
37b70 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e  _test", file_con
37b80 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74  trol_lockproxy_t
37b90 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 23 69 66  est,  0   },.#if
37ba0 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20  def __APPLE__.  
37bb0 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
37bc0 6f 6c 5f 74 72 75 6e 63 61 74 65 5f 74 65 73 74  ol_truncate_test
37bd0 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ", file_control_
37be0 74 72 75 6e 63 61 74 65 5f 74 65 73 74 2c 20 20  truncate_test,  
37bf0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
37c00 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c  ile_control_repl
37c10 61 63 65 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f  ace_test", file_
37c20 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c 61 63 65 5f  control_replace_
37c30 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 23 65  test,  0   },.#e
37c40 6e 64 69 66 20 0a 20 20 20 20 20 7b 20 22 66 69  ndif .     { "fi
37c50 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b  le_control_chunk
37c60 73 69 7a 65 5f 74 65 73 74 22 2c 20 66 69 6c 65  size_test", file
37c70 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69  _control_chunksi
37c80 7a 65 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c  ze_test,  0   },
37c90 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
37ca0 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
37cb0 65 73 74 22 2c 20 20 66 69 6c 65 5f 63 6f 6e 74  est",  file_cont
37cc0 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73  rol_sizehint_tes
37cd0 74 2c 20 20 20 30 20 20 20 7d 2c 0a 23 69 66 20  t,   0   },.#if 
37ce0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20  SQLITE_OS_WIN.  
37cf0 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
37d00 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72  ol_win32_av_retr
37d10 79 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  y", file_control
37d20 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 2c  _win32_av_retry,
37d30 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
37d40 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69  "file_control_wi
37d50 6e 33 32 5f 67 65 74 5f 68 61 6e 64 6c 65 22 2c  n32_get_handle",
37d60 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
37d70 6e 33 32 5f 67 65 74 5f 68 61 6e 64 6c 65 2c 20  n32_get_handle, 
37d80 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69  0  },.     { "fi
37d90 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
37da0 5f 73 65 74 5f 68 61 6e 64 6c 65 22 2c 20 66 69  _set_handle", fi
37db0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
37dc0 5f 73 65 74 5f 68 61 6e 64 6c 65 2c 20 30 20 20  _set_handle, 0  
37dd0 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
37de0 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70   "file_control_p
37df0 65 72 73 69 73 74 5f 77 61 6c 22 2c 20 20 20 20  ersist_wal",    
37e00 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72  file_control_per
37e10 73 69 73 74 5f 77 61 6c 2c 20 20 20 20 20 30 20  sist_wal,     0 
37e20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
37e30 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73  e_control_powers
37e40 61 66 65 5f 6f 76 65 72 77 72 69 74 65 22 2c 66  afe_overwrite",f
37e50 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65  ile_control_powe
37e60 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65 2c  rsafe_overwrite,
37e70 30 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65  0},.     { "file
37e80 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65  _control_vfsname
37e90 22 2c 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63  ",        file_c
37ea0 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 2c 20  ontrol_vfsname, 
37eb0 20 20 20 20 20 20 20 20 30 20 20 20 7d 2c 0a 20          0   },. 
37ec0 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
37ed0 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65  rol_tempfilename
37ee0 22 2c 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  ",   file_contro
37ef0 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 2c 20  l_tempfilename, 
37f00 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
37f10 20 22 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69   "sqlite3_vfs_li
37f20 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 76  st",           v
37f30 66 73 5f 6c 69 73 74 2c 20 20 20 20 20 30 20 20  fs_list,     0  
37f40 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
37f50 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
37f60 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72  ion_v2", test_cr
37f70 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
37f80 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 70  , 0 },.     { "p
37f90 61 74 68 5f 69 73 5f 6c 6f 63 61 6c 22 2c 20 20  ath_is_local",  
37fa0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
37fb0 5f 69 73 5f 6c 6f 63 61 6c 2c 20 20 30 20 20 20  _is_local,  0   
37fc0 7d 2c 0a 20 20 20 20 20 7b 20 22 70 61 74 68 5f  },.     { "path_
37fd0 69 73 5f 64 6f 73 22 2c 20 20 20 20 20 20 20 20  is_dos",        
37fe0 20 20 20 20 20 20 20 20 70 61 74 68 5f 69 73 5f          path_is_
37ff0 64 6f 73 2c 20 20 30 20 20 20 7d 2c 0a 0a 20 20  dos,  0   },..  
38000 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20     /* Functions 
38010 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66  from os.h */.#if
38020 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
38030 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22 61  _UTF16.     { "a
38040 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  dd_test_collate"
38050 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f  ,        test_co
38060 6c 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20 20  llate, 0        
38070 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61      },.     { "a
38080 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  dd_test_collate_
38090 6e 65 65 64 65 64 22 2c 20 74 65 73 74 5f 63 6f  needed", test_co
380a0 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20 30 20  llate_needed, 0 
380b0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61      },.     { "a
380c0 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  dd_test_function
380d0 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 66 75  ",       test_fu
380e0 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20 20 20 20  nction, 0       
380f0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61      },.     { "a
38100 64 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e  dd_test_utf16bin
38110 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 74 65  _collate",    te
38120 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c  st_utf16bin_coll
38130 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 7d 2c  ate, 0        },
38140 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
38150 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72 72  sqlite3_test_err
38160 73 74 72 22 2c 20 20 20 20 20 74 65 73 74 5f 65  str",     test_e
38170 72 72 73 74 72 2c 20 30 20 20 20 20 20 20 20 20  rrstr, 0        
38180 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
38190 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70  tcl_variable_typ
381a0 65 22 2c 20 20 20 20 20 20 20 74 63 6c 5f 76 61  e",       tcl_va
381b0 72 69 61 62 6c 65 5f 74 79 70 65 2c 20 30 20 20  riable_type, 0  
381c0 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20       },.#ifndef 
381d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
381e0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 7b 20  ED_CACHE.     { 
381f0 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f  "sqlite3_enable_
38200 73 68 61 72 65 64 5f 63 61 63 68 65 22 2c 20 74  shared_cache", t
38210 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  est_enable_share
38220 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20  d, 0  },.     { 
38230 22 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64 5f  "sqlite3_shared_
38240 63 61 63 68 65 5f 72 65 70 6f 72 74 22 2c 20 73  cache_report", s
38250