/ Hex Artifact Content
Login

Artifact 07f56e5495a2abc3ed1cec74836dedd5f829eb00:


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 2a 0a 2a  te library..**.*
0220: 2a 20 24 49 64 3a 20 74 65 73 74 31 2e 63 2c 76  * $Id: test1.c,v
0230: 20 31 2e 33 32 33 20 32 30 30 38 2f 30 39 2f 30   1.323 2008/09/0
0240: 32 20 30 30 3a 35 32 3a 35 32 20 64 72 68 20 45  2 00:52:52 drh E
0250: 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  xp $.*/.#include
0260: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0270: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
0280: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
0290: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
02a0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  ring.h>../*.** T
02b0: 68 69 73 20 69 73 20 61 20 63 6f 70 79 20 6f 66  his is a copy of
02c0: 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
02d0: 6f 66 20 74 68 65 20 53 71 6c 69 74 65 44 62 20  of the SqliteDb 
02e0: 73 74 72 75 63 74 75 72 65 20 69 6e 20 0a 2a 2a  structure in .**
02f0: 20 74 63 6c 73 71 6c 69 74 65 2e 63 2e 20 20 57   tclsqlite.c.  W
0300: 65 20 6e 65 65 64 20 69 74 20 68 65 72 65 20 73  e need it here s
0310: 6f 20 74 68 61 74 20 74 68 65 20 67 65 74 5f 73  o that the get_s
0320: 71 6c 69 74 65 5f 70 6f 69 6e 74 65 72 20 72 6f  qlite_pointer ro
0330: 75 74 69 6e 65 0a 2a 2a 20 63 61 6e 20 65 78 74  utine.** can ext
0340: 72 61 63 74 20 74 68 65 20 73 71 6c 69 74 65 33  ract the sqlite3
0350: 2a 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 61  * pointer from a
0360: 6e 20 65 78 69 73 74 69 6e 67 20 54 63 6c 20 53  n existing Tcl S
0370: 51 4c 69 74 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  QLite.** connect
0380: 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ion..*/.struct S
0390: 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69  qliteDb {.  sqli
03a0: 74 65 33 20 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 0a  te3 *db;.};../*.
03b0: 2a 2a 20 43 6f 6e 76 65 72 74 20 74 65 78 74 20  ** Convert text 
03c0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
03d0: 20 22 25 70 22 20 63 6f 6e 76 65 72 73 69 6f 6e   "%p" conversion
03e0: 20 66 6f 72 6d 61 74 20 62 61 63 6b 20 69 6e 74   format back int
03f0: 6f 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 2e 0a  o.** a pointer..
0400: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
0410: 73 74 48 65 78 54 6f 49 6e 74 28 69 6e 74 20 68  stHexToInt(int h
0420: 29 7b 0a 20 20 69 66 28 20 68 3e 3d 27 30 27 20  ){.  if( h>='0' 
0430: 26 26 20 68 3c 3d 27 39 27 20 29 7b 0a 20 20 20  && h<='9' ){.   
0440: 20 72 65 74 75 72 6e 20 68 20 2d 20 27 30 27 3b   return h - '0';
0450: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3e 3d  .  }else if( h>=
0460: 27 61 27 20 26 26 20 68 3c 3d 27 66 27 20 29 7b  'a' && h<='f' ){
0470: 0a 20 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20  .    return h - 
0480: 27 61 27 20 2b 20 31 30 3b 0a 20 20 7d 65 6c 73  'a' + 10;.  }els
0490: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 68  e{.    assert( h
04a0: 3e 3d 27 41 27 20 26 26 20 68 3c 3d 27 46 27 20  >='A' && h<='F' 
04b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 20  );.    return h 
04c0: 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 7d 0a  - 'A' + 10;.  }.
04d0: 7d 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 54  }.void *sqlite3T
04e0: 65 73 74 54 65 78 74 54 6f 50 74 72 28 63 6f 6e  estTextToPtr(con
04f0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 76  st char *z){.  v
0500: 6f 69 64 20 2a 70 3b 0a 20 20 75 36 34 20 76 3b  oid *p;.  u64 v;
0510: 0a 20 20 75 33 32 20 76 32 3b 0a 20 20 69 66 28  .  u32 v2;.  if(
0520: 20 7a 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 5b   z[0]=='0' && z[
0530: 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 7a  1]=='x' ){.    z
0540: 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 76 20 3d   += 2;.  }.  v =
0550: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20   0;.  while( *z 
0560: 29 7b 0a 20 20 20 20 76 20 3d 20 28 76 3c 3c 34  ){.    v = (v<<4
0570: 29 20 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74  ) + testHexToInt
0580: 28 2a 7a 29 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  (*z);.    z++;. 
0590: 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28   }.  if( sizeof(
05a0: 70 29 3d 3d 73 69 7a 65 6f 66 28 76 29 20 29 7b  p)==sizeof(v) ){
05b0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2c 20  .    memcpy(&p, 
05c0: 26 76 2c 20 73 69 7a 65 6f 66 28 70 29 29 3b 0a  &v, sizeof(p));.
05d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
05e0: 65 72 74 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d  ert( sizeof(p)==
05f0: 73 69 7a 65 6f 66 28 76 32 29 20 29 3b 0a 20 20  sizeof(v2) );.  
0600: 20 20 76 32 20 3d 20 28 75 33 32 29 76 3b 0a 20    v2 = (u32)v;. 
0610: 20 20 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76     memcpy(&p, &v
0620: 32 2c 20 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20  2, sizeof(p));. 
0630: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
0640: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63  .../*.** A TCL c
0650: 6f 6d 6d 61 6e 64 20 74 68 61 74 20 72 65 74 75  ommand that retu
0660: 72 6e 73 20 74 68 65 20 61 64 64 72 65 73 73 20  rns the address 
0670: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 2a 20 70  of the sqlite* p
0680: 6f 69 6e 74 65 72 0a 2a 2a 20 66 6f 72 20 61 6e  ointer.** for an
0690: 20 73 71 6c 69 74 65 20 63 6f 6e 6e 65 63 74 69   sqlite connecti
06a0: 6f 6e 20 69 6e 73 74 61 6e 63 65 2e 20 20 42 61  on instance.  Ba
06b0: 64 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  d things happen 
06c0: 69 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20  if the.** input 
06d0: 69 73 20 6e 6f 74 20 61 6e 20 73 71 6c 69 74 65  is not an sqlite
06e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
06f0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 5f 73  static int get_s
0700: 71 6c 69 74 65 5f 70 6f 69 6e 74 65 72 28 0a 20  qlite_pointer(. 
0710: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
0720: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
0730: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
0740: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
0750: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
0760: 0a 20 20 73 74 72 75 63 74 20 53 71 6c 69 74 65  .  struct Sqlite
0770: 44 62 20 2a 70 3b 0a 20 20 54 63 6c 5f 43 6d 64  Db *p;.  Tcl_Cmd
0780: 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
0790: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
07a0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
07b0: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
07c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
07d0: 20 6f 62 6a 76 2c 20 22 53 51 4c 49 54 45 2d 43   objv, "SQLITE-C
07e0: 4f 4e 4e 45 43 54 49 4f 4e 22 29 3b 0a 20 20 20  ONNECTION");.   
07f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
0800: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 54 63  R;.  }.  if( !Tc
0810: 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f  l_GetCommandInfo
0820: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
0830: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
0840: 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20   &cmdInfo) ){.  
0850: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
0860: 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d  lt(interp, "comm
0870: 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22  and not found: "
0880: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  ,.           Tcl
0890: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
08a0: 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  1]), (char*)0);.
08b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
08c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  RROR;.  }.  p = 
08d0: 28 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62  (struct SqliteDb
08e0: 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69  *)cmdInfo.objCli
08f0: 65 6e 74 44 61 74 61 3b 0a 20 20 73 70 72 69 6e  entData;.  sprin
0900: 74 66 28 7a 42 75 66 2c 20 22 25 70 22 2c 20 70  tf(zBuf, "%p", p
0910: 2d 3e 64 62 29 3b 0a 20 20 69 66 28 20 73 74 72  ->db);.  if( str
0920: 6e 63 6d 70 28 7a 42 75 66 2c 22 30 78 22 2c 32  ncmp(zBuf,"0x",2
0930: 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  ) ){.    sprintf
0940: 28 7a 42 75 66 2c 20 22 30 78 25 70 22 2c 20 70  (zBuf, "0x%p", p
0950: 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  ->db);.  }.  Tcl
0960: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
0970: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
0980: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
0990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
09a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
09b0: 20 73 71 6c 69 74 65 33 20 6f 62 6a 65 63 74 2e   sqlite3 object.
09c0: 0a 2a 2f 0a 69 6e 74 20 67 65 74 44 62 50 6f 69  .*/.int getDbPoi
09d0: 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20  nter(Tcl_Interp 
09e0: 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63  *interp, const c
09f0: 68 61 72 20 2a 7a 41 2c 20 73 71 6c 69 74 65 33  har *zA, sqlite3
0a00: 20 2a 2a 70 70 44 62 29 7b 0a 20 20 73 74 72 75   **ppDb){.  stru
0a10: 63 74 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a  ct SqliteDb *p;.
0a20: 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d    Tcl_CmdInfo cm
0a30: 64 49 6e 66 6f 3b 0a 20 20 69 66 28 20 54 63 6c  dInfo;.  if( Tcl
0a40: 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28  _GetCommandInfo(
0a50: 69 6e 74 65 72 70 2c 20 7a 41 2c 20 26 63 6d 64  interp, zA, &cmd
0a60: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 70 20 3d  Info) ){.    p =
0a70: 20 28 73 74 72 75 63 74 20 53 71 6c 69 74 65 44   (struct SqliteD
0a80: 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c  b*)cmdInfo.objCl
0a90: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 2a 70  ientData;.    *p
0aa0: 70 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 7d  pDb = p->db;.  }
0ab0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 44 62 20  else{.    *ppDb 
0ac0: 3d 20 28 73 71 6c 69 74 65 33 2a 29 73 71 6c 69  = (sqlite3*)sqli
0ad0: 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
0ae0: 28 7a 41 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (zA);.  }.  retu
0af0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 63  rn TCL_OK;.}...c
0b00: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
0b10: 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28  e3TestErrorName(
0b20: 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74  int rc){.  const
0b30: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
0b40: 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 26  ;.  switch( rc &
0b50: 20 30 78 66 66 20 29 7b 0a 20 20 20 20 63 61 73   0xff ){.    cas
0b60: 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20  e SQLITE_OK:    
0b70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
0b80: 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20  LITE_OK";       
0b90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0ba0: 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a  se SQLITE_ERROR:
0bb0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
0bc0: 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20  QLITE_ERROR";   
0bd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0be0: 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a  ase SQLITE_PERM:
0bf0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0c00: 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20  SQLITE_PERM";   
0c10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0c20: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
0c30: 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  T:      zName = 
0c40: 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20  "SQLITE_ABORT"; 
0c50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0c60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
0c70: 59 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  Y:       zName =
0c80: 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20   "SQLITE_BUSY"; 
0c90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0ca0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
0cb0: 43 4b 45 44 3a 20 20 20 20 20 7a 4e 61 6d 65 20  CKED:     zName 
0cc0: 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  = "SQLITE_LOCKED
0cd0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
0ce0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
0cf0: 4f 4d 45 4d 3a 20 20 20 20 20 20 7a 4e 61 6d 65  OMEM:      zName
0d00: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   = "SQLITE_NOMEM
0d10: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
0d20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0d30: 52 45 41 44 4f 4e 4c 59 3a 20 20 20 7a 4e 61 6d  READONLY:   zNam
0d40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
0d50: 4f 4e 4c 59 22 3b 20 20 20 20 62 72 65 61 6b 3b  ONLY";    break;
0d60: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0d70: 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 7a 4e 61  _INTERRUPT:  zNa
0d80: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
0d90: 45 52 52 55 50 54 22 3b 20 20 20 62 72 65 61 6b  ERRUPT";   break
0da0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0db0: 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 7a 4e  E_IOERR:      zN
0dc0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
0dd0: 45 52 52 22 3b 20 20 20 20 20 20 20 62 72 65 61  ERR";       brea
0de0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0df0: 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 7a  TE_CORRUPT:    z
0e00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
0e10: 4f 52 52 55 50 54 22 3b 20 20 20 20 20 62 72 65  ORRUPT";     bre
0e20: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0e30: 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20  ITE_FULL:       
0e40: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0e50: 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72  FULL";        br
0e60: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0e70: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20  LITE_CANTOPEN:  
0e80: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0e90: 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 62  _CANTOPEN";    b
0ea0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0eb0: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20  QLITE_PROTOCOL: 
0ec0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0ed0: 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20  E_PROTOCOL";    
0ee0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0ef0: 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20  SQLITE_EMPTY:   
0f00: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0f10: 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20  TE_EMPTY";      
0f20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0f30: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20   SQLITE_SCHEMA: 
0f40: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0f50: 49 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20  ITE_SCHEMA";    
0f60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0f70: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
0f80: 49 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  INT: zName = "SQ
0f90: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22  LITE_CONSTRAINT"
0fa0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
0fb0: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  se SQLITE_MISMAT
0fc0: 43 48 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  CH:   zName = "S
0fd0: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b  QLITE_MISMATCH";
0fe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0ff0: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  ase SQLITE_MISUS
1000: 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  E:     zName = "
1010: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20  SQLITE_MISUSE"; 
1020: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1030: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  case SQLITE_NOLF
1040: 53 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  S:      zName = 
1050: 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20  "SQLITE_NOLFS"; 
1060: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1070: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54   case SQLITE_AUT
1080: 48 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  H:       zName =
1090: 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20   "SQLITE_AUTH"; 
10a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f    case SQLITE_FO
10c0: 52 4d 41 54 3a 20 20 20 20 20 7a 4e 61 6d 65 20  RMAT:     zName 
10d0: 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  = "SQLITE_FORMAT
10e0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
10f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
1100: 41 4e 47 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65  ANGE:      zName
1110: 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45   = "SQLITE_RANGE
1120: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
1130: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1140: 52 4f 57 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ROW:        zNam
1150: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57 22  e = "SQLITE_ROW"
1160: 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;         break;
1170: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1180: 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 7a 4e 61  _DONE:       zNa
1190: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e  me = "SQLITE_DON
11a0: 45 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  E";        break
11b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
11c0: 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 7a 4e  E_NOTADB:     zN
11d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
11e0: 54 41 44 42 22 3b 20 20 20 20 20 20 62 72 65 61  TADB";      brea
11f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1200: 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20 7a  TE_TOOBIG:     z
1210: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54  Name = "SQLITE_T
1220: 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 62 72 65  OOBIG";      bre
1230: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
1260: 55 6e 6b 6e 6f 77 6e 22 3b 20 20 20 20 20 62 72  Unknown";     br
1270: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
1280: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 64 65 66 69  n zName;.}.#defi
1290: 6e 65 20 74 31 45 72 72 6f 72 4e 61 6d 65 20 73  ne t1ErrorName s
12a0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
12b0: 61 6d 65 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ame../*.** Conve
12c0: 72 74 20 61 6e 20 73 71 6c 69 74 65 33 5f 73 74  rt an sqlite3_st
12d0: 6d 74 2a 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69  mt* into an sqli
12e0: 74 65 33 2a 2e 20 20 54 68 69 73 20 64 65 70 65  te3*.  This depe
12f0: 6e 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 66 61  nds on the.** fa
1300: 63 74 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ct that the sqli
1310: 74 65 33 2a 20 69 73 20 74 68 65 20 66 69 72 73  te3* is the firs
1320: 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 56  t field in the V
1330: 64 62 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  dbe structure..*
1340: 2f 0a 23 64 65 66 69 6e 65 20 53 74 6d 74 54 6f  /.#define StmtTo
1350: 44 62 28 58 29 20 20 20 73 71 6c 69 74 65 33 5f  Db(X)   sqlite3_
1360: 64 62 5f 68 61 6e 64 6c 65 28 58 29 0a 0a 2f 2a  db_handle(X)../*
1370: 0a 2a 2a 20 43 68 65 63 6b 20 61 20 72 65 74 75  .** Check a retu
1380: 72 6e 20 76 61 6c 75 65 20 74 6f 20 6d 61 6b 65  rn value to make
1390: 20 73 75 72 65 20 69 74 20 61 67 72 65 65 73 20   sure it agrees 
13a0: 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 73  with the results
13b0: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  .** from sqlite3
13c0: 5f 65 72 72 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  _errcode..*/.int
13d0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
13e0: 6f 64 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ode(Tcl_Interp *
13f0: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 20  interp, sqlite3 
1400: 2a 64 62 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  *db, int rc){.  
1410: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d  if( rc!=SQLITE_M
1420: 49 53 55 53 45 20 26 26 20 72 63 21 3d 53 51 4c  ISUSE && rc!=SQL
1430: 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
1440: 33 5f 65 72 72 63 6f 64 65 28 64 62 29 21 3d 72  3_errcode(db)!=r
1450: 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  c ){.    char zB
1460: 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 69 6e 74  uf[200];.    int
1470: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   r2 = sqlite3_er
1480: 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 73  rcode(db);.    s
1490: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 65 72  printf(zBuf, "er
14a0: 72 6f 72 20 63 6f 64 65 20 25 73 20 28 25 64 29  ror code %s (%d)
14b0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
14c0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20  sqlite3_errcode 
14d0: 25 73 20 28 25 64 29 22 2c 0a 20 20 20 20 20 20  %s (%d)",.      
14e0: 20 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29   t1ErrorName(rc)
14f0: 2c 20 72 63 2c 20 74 31 45 72 72 6f 72 4e 61 6d  , rc, t1ErrorNam
1500: 65 28 72 32 29 2c 20 72 32 29 3b 0a 20 20 20 20  e(r2), r2);.    
1510: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
1520: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
1530: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1540: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1550: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1560: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1570: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
1580: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
1590: 6c 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63  lite3_stmt objec
15a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
15b0: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
15c0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
15d0: 6e 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20  nterp, .  const 
15e0: 63 68 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20  char *zArg,  .  
15f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
1600: 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74  pStmt.){.  *ppSt
1610: 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74  mt = (sqlite3_st
1620: 6d 74 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54  mt*)sqlite3TestT
1630: 65 78 74 54 6f 50 74 72 28 7a 41 72 67 29 3b 0a  extToPtr(zArg);.
1640: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1660: 74 65 20 61 20 74 65 78 74 20 72 65 70 72 65 73  te a text repres
1670: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 70 6f  entation of a po
1680: 69 6e 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  inter that can b
1690: 65 20 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20  e understood.** 
16a0: 62 79 20 74 68 65 20 67 65 74 44 62 50 6f 69 6e  by the getDbPoin
16b0: 74 65 72 20 61 6e 64 20 67 65 74 56 6d 50 6f 69  ter and getVmPoi
16c0: 6e 74 65 72 20 72 6f 75 74 69 6e 65 73 20 61 62  nter routines ab
16d0: 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ove..**.** The p
16e0: 72 6f 62 6c 65 6d 20 69 73 2c 20 6f 6e 20 73 6f  roblem is, on so
16f0: 6d 65 20 6d 61 63 68 69 6e 65 73 20 28 53 6f 6c  me machines (Sol
1700: 61 72 69 73 29 20 69 66 20 79 6f 75 20 64 6f 20  aris) if you do 
1710: 61 20 70 72 69 6e 74 66 20 77 69 74 68 0a 2a 2a  a printf with.**
1720: 20 22 25 70 22 20 79 6f 75 20 63 61 6e 6e 6f 74   "%p" you cannot
1730: 20 74 75 72 6e 20 61 72 6f 75 6e 64 20 61 6e 64   turn around and
1740: 20 64 6f 20 61 20 73 63 61 6e 66 20 77 69 74 68   do a scanf with
1750: 20 74 68 65 20 73 61 6d 65 20 22 25 70 22 20 61   the same "%p" a
1760: 6e 64 0a 2a 2a 20 67 65 74 20 79 6f 75 72 20 70  nd.** get your p
1770: 6f 69 6e 74 65 72 20 62 61 63 6b 2e 20 20 59 6f  ointer back.  Yo
1780: 75 20 68 61 76 65 20 74 6f 20 70 72 65 70 65 6e  u have to prepen
1790: 64 20 61 20 22 30 78 22 20 62 65 66 6f 72 65 20  d a "0x" before 
17a0: 69 74 20 77 69 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e  it will.** work.
17b0: 20 20 4f 72 20 61 74 20 6c 65 61 73 74 20 74 68    Or at least th
17c0: 61 74 20 69 73 20 77 68 61 74 20 69 73 20 72 65  at is what is re
17d0: 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 28 64 72  ported to me (dr
17e0: 68 29 2e 20 20 42 75 74 20 74 68 69 73 0a 2a 2a  h).  But this.**
17f0: 20 62 65 68 61 76 69 6f 72 20 76 61 72 69 65 73   behavior varies
1800: 20 66 72 6f 6d 20 6d 61 63 68 69 6e 65 20 74 6f   from machine to
1810: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 73   machine.  The s
1820: 6f 6c 75 74 69 6f 6e 20 75 73 65 64 20 68 65 72  olution used her
1830: 20 69 73 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74   is.** to test t
1840: 68 65 20 73 74 72 69 6e 67 20 72 69 67 68 74 20  he string right 
1850: 61 66 74 65 72 20 69 74 20 69 73 20 67 65 6e 65  after it is gene
1860: 72 61 74 65 64 20 74 6f 20 73 65 65 20 69 66 20  rated to see if 
1870: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 75 6e 64  it can be.** und
1880: 65 72 73 74 6f 6f 64 20 62 79 20 73 63 61 6e 66  erstood by scanf
1890: 2c 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 74 72  , and if not, tr
18a0: 79 20 70 72 65 70 65 6e 64 69 6e 67 20 61 6e 20  y prepending an 
18b0: 22 30 78 22 20 74 6f 20 73 65 65 20 69 66 0a 2a  "0x" to see if.*
18c0: 2a 20 74 68 61 74 20 68 65 6c 70 73 2e 20 20 49  * that helps.  I
18d0: 66 20 6e 6f 74 68 69 6e 67 20 77 6f 72 6b 73 2c  f nothing works,
18e0: 20 61 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69   a fatal error i
18f0: 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  s generated..*/.
1900: 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 4d  int sqlite3TestM
1910: 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63  akePointerStr(Tc
1920: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1930: 2c 20 63 68 61 72 20 2a 7a 50 74 72 2c 20 76 6f  , char *zPtr, vo
1940: 69 64 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  id *p){.  sqlite
1950: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
1960: 7a 50 74 72 2c 20 22 25 70 22 2c 20 70 29 3b 0a  zPtr, "%p", p);.
1970: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 61  .}../*.** The ca
1990: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66  llback routine f
19a0: 6f 72 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  or sqlite3_exec_
19b0: 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 73 74 61  printf()..*/.sta
19c0: 74 69 63 20 69 6e 74 20 65 78 65 63 5f 70 72 69  tic int exec_pri
19d0: 6e 74 66 5f 63 62 28 76 6f 69 64 20 2a 70 41 72  ntf_cb(void *pAr
19e0: 67 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61  g, int argc, cha
19f0: 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a  r **argv, char *
1a00: 2a 6e 61 6d 65 29 7b 0a 20 20 54 63 6c 5f 44 53  *name){.  Tcl_DS
1a10: 74 72 69 6e 67 20 2a 73 74 72 20 3d 20 28 54 63  tring *str = (Tc
1a20: 6c 5f 44 53 74 72 69 6e 67 2a 29 70 41 72 67 3b  l_DString*)pArg;
1a30: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
1a40: 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67   Tcl_DStringLeng
1a50: 74 68 28 73 74 72 29 3d 3d 30 20 29 7b 0a 20 20  th(str)==0 ){.  
1a60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
1a70: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  c; i++){.      T
1a80: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
1a90: 45 6c 65 6d 65 6e 74 28 73 74 72 2c 20 6e 61 6d  Element(str, nam
1aa0: 65 5b 69 5d 20 3f 20 6e 61 6d 65 5b 69 5d 20 3a  e[i] ? name[i] :
1ab0: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a   "NULL");.    }.
1ac0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1ad0: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1ae0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
1af0: 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c 20 61  ndElement(str, a
1b00: 72 67 76 5b 69 5d 20 3f 20 61 72 67 76 5b 69 5d  rgv[i] ? argv[i]
1b10: 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 7d 0a   : "NULL");.  }.
1b20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1b30: 2a 0a 2a 2a 20 54 68 65 20 49 2f 4f 20 74 72 61  *.** The I/O tra
1b40: 63 69 6e 67 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  cing callback..*
1b50: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
1b60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
1b70: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1b80: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
1b90: 43 45 29 0a 73 74 61 74 69 63 20 46 49 4c 45 20  CE).static FILE 
1ba0: 2a 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20  *iotrace_file = 
1bb0: 30 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  0;.static void i
1bc0: 6f 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b  o_trace_callback
1bd0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
1be0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
1bf0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
1c00: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
1c10: 29 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 69 6f  );.  vfprintf(io
1c20: 74 72 61 63 65 5f 66 69 6c 65 2c 20 7a 46 6f 72  trace_file, zFor
1c30: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
1c40: 6e 64 28 61 70 29 3b 0a 20 20 66 66 6c 75 73 68  nd(ap);.  fflush
1c50: 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 29 3b 0a  (iotrace_file);.
1c60: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1c70: 55 73 61 67 65 3a 20 20 69 6f 5f 74 72 61 63 65  Usage:  io_trace
1c80: 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20   FILENAME.**.** 
1c90: 54 75 72 6e 20 49 2f 4f 20 74 72 61 63 69 6e 67  Turn I/O tracing
1ca0: 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 66 20   on or off.  If 
1cb0: 46 49 4c 45 4e 41 4d 45 20 69 73 20 6e 6f 74 20  FILENAME is not 
1cc0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
1cd0: 0a 2a 2a 20 49 2f 4f 20 74 72 61 63 69 6e 67 20  .** I/O tracing 
1ce0: 62 65 67 69 6e 73 20 67 6f 69 6e 67 20 69 6e 74  begins going int
1cf0: 6f 20 46 49 4c 45 4e 41 4d 45 2e 20 49 66 20 46  o FILENAME. If F
1d00: 49 4c 45 4e 41 4d 45 20 69 73 20 61 6e 20 65 6d  ILENAME is an em
1d10: 70 74 79 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 49  pty.** string, I
1d20: 2f 4f 20 74 72 61 63 69 6e 67 20 69 73 20 74 75  /O tracing is tu
1d30: 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  rned off..*/.sta
1d40: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 69 6f 5f  tic int test_io_
1d50: 74 72 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 4e  trace(.  void *N
1d60: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
1d70: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
1d80: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
1d90: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
1da0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
1db0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
1de0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
1df0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
1e00: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
1e10: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
1e20: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1e30: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
1e40: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
1e50: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
1e60: 29 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ).  if( argc!=2 
1e70: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1e80: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1e90: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1ea0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1eb0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  gv[0],.         
1ec0: 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20   " FILENAME\"", 
1ed0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1ee0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1ef0: 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69 6c 65  if( iotrace_file
1f00: 20 29 7b 0a 20 20 20 20 69 66 28 20 69 6f 74 72   ){.    if( iotr
1f10: 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f 75 74  ace_file!=stdout
1f20: 20 26 26 20 69 6f 74 72 61 63 65 5f 66 69 6c 65   && iotrace_file
1f30: 21 3d 73 74 64 65 72 72 20 29 7b 0a 20 20 20 20  !=stderr ){.    
1f40: 20 20 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65    fclose(iotrace
1f50: 5f 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _file);.    }.  
1f60: 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d    iotrace_file =
1f70: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
1f80: 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a  oTrace = 0;.  }.
1f90: 20 20 69 66 28 20 61 72 67 76 5b 31 5d 5b 30 5d    if( argv[1][0]
1fa0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
1fb0: 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74 64 6f  mp(argv[1],"stdo
1fc0: 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ut")==0 ){.     
1fd0: 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20   iotrace_file = 
1fe0: 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73  stdout;.    }els
1ff0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
2000: 76 5b 31 5d 2c 22 73 74 64 65 72 72 22 29 3d 3d  v[1],"stderr")==
2010: 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  0 ){.      iotra
2020: 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 65 72 72  ce_file = stderr
2030: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2040: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
2050: 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c  = fopen(argv[1],
2060: 20 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20   "w");.    }.   
2070: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
2080: 3d 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c 6c 62  = io_trace_callb
2090: 61 63 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ack;.  }.#endif.
20a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
20b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
20c0: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
20d0: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
20e0: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
20f0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
2100: 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  te3_exec_printf(
2110: 29 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  ) interface usin
2120: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
2130: 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20  ase.** DB.  The 
2140: 53 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e  SQL is the strin
2150: 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66  g FORMAT.  The f
2160: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f  ormat string sho
2170: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f  uld contain.** o
2180: 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54  ne %s or %q.  ST
2190: 52 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75  RING is the valu
21a0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
21b0: 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61  %s or %q..*/.sta
21c0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
21d0: 63 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64  c_printf(.  void
21e0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
21f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2200: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2210: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2220: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2230: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
2240: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
2250: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2260: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
2270: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
2280: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
2290: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
22a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
22b0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
22c0: 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  str;.  int rc;. 
22d0: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
22e0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
22f0: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
2300: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
2310: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2320: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2330: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2340: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
2350: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
2360: 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22  B FORMAT STRING"
2370: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
2380: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2390: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
23a0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
23b0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
23c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
23d0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
23e0: 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  str);.  zSql = s
23f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
2400: 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b 33 5d 29  rgv[2], argv[3])
2410: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2420: 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
2430: 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20  exec_printf_cb, 
2440: 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20  &str, &zErr);.  
2450: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2460: 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  l);.  sprintf(zB
2470: 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20  uf, "%d", rc);. 
2480: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
2490: 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29  nt(interp, zBuf)
24a0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
24b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63  ement(interp, rc
24c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63  ==SQLITE_OK ? Tc
24d0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
24e0: 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20  str) : zErr);.  
24f0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
2500: 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72  &str);.  if( zEr
2510: 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
2520: 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  (zErr);.  if( sq
2530: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
2540: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
2550: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2560: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
2570: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2580: 73 61 67 65 3a 20 20 64 62 5f 65 6e 74 65 72 20  sage:  db_enter 
2590: 44 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 62  DB.**         db
25a0: 5f 6c 65 61 76 65 20 44 42 0a 2a 2a 0a 2a 2a 20  _leave DB.**.** 
25b0: 45 6e 74 65 72 20 6f 72 20 6c 65 61 76 65 20 74  Enter or leave t
25c0: 68 65 20 6d 75 74 65 78 20 6f 6e 20 61 20 64 61  he mutex on a da
25d0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
25e0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
25f0: 20 64 62 5f 65 6e 74 65 72 28 0a 20 20 76 6f 69   db_enter(.  voi
2600: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
2610: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2620: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2630: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2640: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2650: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
2660: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
2670: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2680: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
2690: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
26a0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
26b0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
26c0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
26d0: 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  b;.  if( argc!=2
26e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
26f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2700: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2710: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2720: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2730: 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
2740: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2750: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
2760: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2770: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
2780: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2790: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
27a0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
27b0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  x);.  return TCL
27c0: 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
27d0: 74 20 64 62 5f 6c 65 61 76 65 28 0a 20 20 76 6f  t db_leave(.  vo
27e0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
27f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2800: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2810: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2820: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2830: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2840: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2850: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2860: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2870: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2880: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2890: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
28a0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
28b0: 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
28c0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
28d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
28e0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
28f0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
2900: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
2910: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
2920: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2930: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2940: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2950: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
2960: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2970: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  R;.  sqlite3_mut
2980: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
2990: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ex);.  return TC
29a0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
29b0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
29c0: 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a  xec  DB  SQL.**.
29d0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
29e0: 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72  lite3_exec inter
29f0: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
2a00: 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 0a  pen database DB.
2a10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
2a20: 73 74 5f 65 78 65 63 28 0a 20 20 76 6f 69 64 20  st_exec(.  void 
2a30: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
2a40: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2a50: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2a60: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2a70: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2a80: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
2a90: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2aa0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2ab0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
2ac0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
2ad0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
2ae0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
2af0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
2b00: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
2b10: 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  tr;.  int rc;.  
2b20: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
2b30: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2b40: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72  int i, j;.  char
2b50: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
2b60: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
2b70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2b80: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2b90: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2ba0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2bb0: 0a 20 20 20 20 20 20 20 22 20 44 42 20 53 51 4c  .       " DB SQL
2bc0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2bd0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2be0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2bf0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
2c00: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
2c10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2c20: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
2c30: 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  &str);.  zSql = 
2c40: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2c50: 22 25 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  "%s", argv[2]);.
2c60: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53 71    for(i=j=0; zSq
2c70: 6c 5b 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28 20  l[i];){.    if( 
2c80: 7a 53 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a  zSql[i]=='%' ){.
2c90: 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
2ca0: 3d 20 28 74 65 73 74 48 65 78 54 6f 49 6e 74 28  = (testHexToInt(
2cb0: 7a 53 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b  zSql[i+1])<<4) +
2cc0: 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53   testHexToInt(zS
2cd0: 71 6c 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20  ql[i+2]);.      
2ce0: 69 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73  i += 3;.    }els
2cf0: 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  e{.      zSql[j+
2d00: 2b 5d 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a  +] = zSql[i++];.
2d10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c      }.  }.  zSql
2d20: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  [j] = 0;.  rc = 
2d30: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
2d40: 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e   zSql, exec_prin
2d50: 74 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45  tf_cb, &str, &zE
2d60: 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  rr);.  sqlite3_f
2d70: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72  ree(zSql);.  spr
2d80: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
2d90: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
2da0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2db0: 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
2dc0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2dd0: 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  erp, rc==SQLITE_
2de0: 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67  OK ? Tcl_DString
2df0: 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45  Value(&str) : zE
2e00: 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  rr);.  Tcl_DStri
2e10: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
2e20: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
2e30: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
2e40: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
2e50: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
2e60: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
2e70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
2e80: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2e90: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2ea0: 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 20 20 44  lite3_exec_nr  D
2eb0: 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76  B  SQL.**.** Inv
2ec0: 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  oke the sqlite3_
2ed0: 65 78 65 63 20 69 6e 74 65 72 66 61 63 65 20 75  exec interface u
2ee0: 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64 61  sing the open da
2ef0: 74 61 62 61 73 65 20 44 42 2e 20 20 44 69 73 63  tabase DB.  Disc
2f00: 61 72 64 0a 2a 2a 20 61 6c 6c 20 72 65 73 75 6c  ard.** all resul
2f10: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts.*/.static int
2f20: 20 74 65 73 74 5f 65 78 65 63 5f 6e 72 28 0a 20   test_exec_nr(. 
2f30: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
2f40: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2f50: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2f60: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2f70: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2f80: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2f90: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
2fa0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2fb0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2fc0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
2fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
2fe0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
2ff0: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
3000: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
3010: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
3020: 30 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  0;.  if( argc!=3
3030: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
3040: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3050: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
3060: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
3070: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
3080: 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20  " DB SQL", 0);. 
3090: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
30a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
30b0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
30c0: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
30d0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
30e0: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
30f0: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61 72  ite3_exec(db, ar
3100: 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 26 7a 45  gv[2], 0, 0, &zE
3110: 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rr);.  if( sqlit
3120: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
3130: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
3140: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3150: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
3160: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
3170: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
3180: 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53 45 50 41  ntf_z_test  SEPA
3190: 52 41 54 4f 52 20 20 41 52 47 30 20 20 41 52 47  RATOR  ARG0  ARG
31a0: 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  1 ....**.** Test
31b0: 20 74 68 65 20 25 7a 20 66 6f 72 6d 61 74 20 6f   the %z format o
31c0: 66 20 73 71 6c 69 74 65 4d 50 72 69 6e 74 66 28  f sqliteMPrintf(
31d0: 29 2e 20 20 55 73 65 20 6d 75 6c 74 69 70 6c 65  ).  Use multiple
31e0: 20 6d 70 72 69 6e 74 66 28 29 20 63 61 6c 6c 73   mprintf() calls
31f0: 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63 61 74 65 6e   to .** concaten
3200: 61 74 65 20 61 72 67 30 20 74 68 72 6f 75 67 68  ate arg0 through
3210: 20 61 72 67 6e 20 75 73 69 6e 67 20 73 65 70 61   argn using sepa
3220: 72 61 74 6f 72 20 61 73 20 74 68 65 20 73 65 70  rator as the sep
3230: 61 72 61 74 6f 72 2e 0a 2a 2a 20 52 65 74 75 72  arator..** Retur
3240: 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f  n the result..*/
3250: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
3260: 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20 76 6f  _mprintf_z(.  vo
3270: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
3280: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3290: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
32a0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
32b0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
32c0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
32d0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
32e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
32f0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3300: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3310: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3320: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3330: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65  /.){.  char *zRe
3340: 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sult = 0;.  int 
3350: 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69  i;..  for(i=2; i
3360: 3c 61 72 67 63 20 26 26 20 28 69 3d 3d 32 20 7c  <argc && (i==2 |
3370: 7c 20 7a 52 65 73 75 6c 74 29 3b 20 69 2b 2b 29  | zResult); i++)
3380: 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20  {.    zResult = 
3390: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 30  sqlite3MPrintf(0
33a0: 2c 20 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73  , "%z%s%s", zRes
33b0: 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72  ult, argv[1], ar
33c0: 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63  gv[i]);.  }.  Tc
33d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
33e0: 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20  nterp, zResult, 
33f0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
3400: 65 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72  ee(zResult);.  r
3410: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3420: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3430: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e  qlite3_mprintf_n
3440: 5f 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a 2a  _test  STRING.**
3450: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e 20  .** Test the %n 
3460: 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65  format of sqlite
3470: 4d 50 72 69 6e 74 66 28 29 2e 20 20 52 65 74 75  MPrintf().  Retu
3480: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
3490: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73 74   the.** input st
34a0: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
34b0: 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66  int test_mprintf
34c0: 5f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  _n(.  void *NotU
34d0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
34e0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
34f0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
3500: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
3510: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3520: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3540: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3550: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
3560: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
3570: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
3580: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
3590: 68 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e 74  har *zStr;.  int
35a0: 20 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20 3d   n = 0;.  zStr =
35b0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
35c0: 30 2c 20 22 25 73 25 6e 22 2c 20 61 72 67 76 5b  0, "%s%n", argv[
35d0: 31 5d 2c 20 26 6e 29 3b 0a 20 20 73 71 6c 69 74  1], &n);.  sqlit
35e0: 65 33 5f 66 72 65 65 28 7a 53 74 72 29 3b 0a 20  e3_free(zStr);. 
35f0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
3600: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
3610: 77 49 6e 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 72  wIntObj(n));.  r
3620: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3630: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3640: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
3650: 69 6e 74 20 20 53 49 5a 45 20 46 4f 52 4d 41 54  int  SIZE FORMAT
3660: 20 20 49 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73 74    INT.**.** Test
3670: 20 74 68 65 20 6f 66 20 73 71 6c 69 74 65 33 5f   the of sqlite3_
3680: 73 6e 70 72 69 6e 74 66 28 29 20 72 6f 75 74 69  snprintf() routi
3690: 6e 65 2e 20 20 53 49 5a 45 20 69 73 20 74 68 65  ne.  SIZE is the
36a0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
36b0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
36c0: 20 62 79 74 65 73 2e 20 20 54 68 65 20 6d 61 78   bytes.  The max
36d0: 69 6d 75 6d 20 73 69 7a 65 20 69 73 20 31 30 30  imum size is 100
36e0: 2e 20 20 46 4f 52 4d 41 54 20 69 73 20 74 68 65  .  FORMAT is the
36f0: 0a 2a 2a 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  .** format strin
3700: 67 2e 20 20 49 4e 54 20 69 73 20 61 20 73 69 6e  g.  INT is a sin
3710: 67 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  gle integer argu
3720: 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 4d 41  ment.  The FORMA
3730: 54 0a 2a 2a 20 73 74 72 69 6e 67 20 6d 75 73 74  T.** string must
3740: 20 72 65 71 75 69 72 65 20 6e 6f 20 6d 6f 72 65   require no more
3750: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 20 69   than this one i
3760: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e  nteger argument.
3770: 20 20 49 66 0a 2a 2a 20 59 6f 75 20 70 61 73 73    If.** You pass
3780: 20 69 6e 20 61 20 66 6f 72 6d 61 74 20 73 74 72   in a format str
3790: 69 6e 67 20 74 68 61 74 20 72 65 71 75 69 72 65  ing that require
37a0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
37b0: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61 64  argument,.** bad
37c0: 20 74 68 69 6e 67 73 20 77 69 6c 6c 20 68 61 70   things will hap
37d0: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pen..*/.static i
37e0: 6e 74 20 74 65 73 74 5f 73 6e 70 72 69 6e 74 66  nt test_snprintf
37f0: 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  _int(.  void *No
3800: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
3810: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
3820: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
3830: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
3840: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
3850: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3870: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
3880: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
3890: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
38a0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
38b0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
38c0: 20 63 68 61 72 20 7a 53 74 72 5b 31 30 30 5d 3b   char zStr[100];
38d0: 0a 20 20 69 6e 74 20 6e 20 3d 20 61 74 6f 69 28  .  int n = atoi(
38e0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 63 6f 6e 73  argv[1]);.  cons
38f0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 20  t char *zFormat 
3900: 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 69 6e 74  = argv[2];.  int
3910: 20 61 31 20 3d 20 61 74 6f 69 28 61 72 67 76 5b   a1 = atoi(argv[
3920: 33 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 73 69 7a  3]);.  if( n>siz
3930: 65 6f 66 28 7a 53 74 72 29 20 29 20 6e 20 3d 20  eof(zStr) ) n = 
3940: 73 69 7a 65 6f 66 28 7a 53 74 72 29 3b 0a 20 20  sizeof(zStr);.  
3950: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
3960: 28 73 69 7a 65 6f 66 28 7a 53 74 72 29 2c 20 7a  (sizeof(zStr), z
3970: 53 74 72 2c 20 22 61 62 63 64 65 66 67 68 69 6a  Str, "abcdefghij
3980: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
3990: 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ");.  sqlite3_sn
39a0: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 72 2c 20  printf(n, zStr, 
39b0: 7a 46 6f 72 6d 61 74 2c 20 61 31 29 3b 0a 20 20  zFormat, a1);.  
39c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
39d0: 28 69 6e 74 65 72 70 2c 20 7a 53 74 72 2c 20 30  (interp, zStr, 0
39e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
39f0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
3a00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54  QLITE_OMIT_GET_T
3a10: 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ABLE../*.** Usag
3a20: 65 3a 20 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  e:  sqlite3_get_
3a30: 74 61 62 6c 65 5f 70 72 69 6e 74 66 20 20 44 42  table_printf  DB
3a40: 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47    FORMAT  STRING
3a50: 20 20 3f 2d 2d 6e 6f 2d 63 6f 75 6e 74 73 3f 0a    ?--no-counts?.
3a60: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  **.** Invoke the
3a70: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62   sqlite3_get_tab
3a80: 6c 65 5f 70 72 69 6e 74 66 28 29 20 69 6e 74 65  le_printf() inte
3a90: 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20  rface using the 
3aa0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a  open database.**
3ab0: 20 44 42 2e 20 20 54 68 65 20 53 51 4c 20 69 73   DB.  The SQL is
3ac0: 20 74 68 65 20 73 74 72 69 6e 67 20 46 4f 52 4d   the string FORM
3ad0: 41 54 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20  AT.  The format 
3ae0: 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 63 6f  string should co
3af0: 6e 74 61 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20  ntain.** one %s 
3b00: 6f 72 20 25 71 2e 20 20 53 54 52 49 4e 47 20 69  or %q.  STRING i
3b10: 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 73 65  s the value inse
3b20: 72 74 65 64 20 69 6e 74 6f 20 25 73 20 6f 72 20  rted into %s or 
3b30: 25 71 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  %q..*/.static in
3b40: 74 20 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65  t test_get_table
3b50: 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20  _printf(.  void 
3b60: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
3b70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
3b80: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
3b90: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
3ba0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
3bb0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
3bc0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
3bd0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
3be0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
3bf0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
3c00: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
3c10: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
3c20: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
3c30: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
3c40: 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  tr;.  int rc;.  
3c50: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
3c60: 20 20 69 6e 74 20 6e 52 6f 77 2c 20 6e 43 6f 6c    int nRow, nCol
3c70: 3b 0a 20 20 63 68 61 72 20 2a 2a 61 52 65 73 75  ;.  char **aResu
3c80: 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  lt;.  int i;.  c
3c90: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
3ca0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
3cb0: 74 20 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31 3b  t resCount = -1;
3cc0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20 29  .  if( argc==5 )
3cd0: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
3ce0: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
3cf0: 76 5b 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74 29  v[4], &resCount)
3d00: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
3d10: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  ROR;.  }.  if( a
3d20: 72 67 63 21 3d 34 20 26 26 20 61 72 67 63 21 3d  rgc!=4 && argc!=
3d30: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
3d40: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3d50: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
3d60: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
3d70: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
3d80: 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52   " DB FORMAT STR
3d90: 49 4e 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30 29  ING ?COUNT?", 0)
3da0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3db0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3dc0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
3dd0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
3de0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
3df0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44  L_ERROR;.  Tcl_D
3e00: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
3e10: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
3e20: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
3e30: 32 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69  2],argv[3]);.  i
3e40: 66 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20  f( argc==5 ){.  
3e50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
3e60: 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71  et_table(db, zSq
3e70: 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 30 2c 20  l, &aResult, 0, 
3e80: 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65 6c  0, &zErr);.  }el
3e90: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
3ea0: 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64  ite3_get_table(d
3eb0: 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c  b, zSql, &aResul
3ec0: 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c 2c  t, &nRow, &nCol,
3ed0: 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 72 65 73   &zErr);.    res
3ee0: 43 6f 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31 29  Count = (nRow+1)
3ef0: 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c  *nCol;.  }.  sql
3f00: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
3f10: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
3f20: 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63   "%d", rc);.  Tc
3f30: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
3f40: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
3f50: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3f60: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 61 72  OK ){.    if( ar
3f70: 67 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 73  gc==4 ){.      s
3f80: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64  printf(zBuf, "%d
3f90: 22 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  ", nRow);.      
3fa0: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
3fb0: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b  t(interp, zBuf);
3fc0: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
3fd0: 42 75 66 2c 20 22 25 64 22 2c 20 6e 43 6f 6c 29  Buf, "%d", nCol)
3fe0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  ;.      Tcl_Appe
3ff0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4000: 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  , zBuf);.    }. 
4010: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 65     for(i=0; i<re
4020: 73 43 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  sCount; i++){.  
4030: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c      Tcl_AppendEl
4040: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 61 52  ement(interp, aR
4050: 65 73 75 6c 74 5b 69 5d 20 3f 20 61 52 65 73 75  esult[i] ? aResu
4060: 6c 74 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b  lt[i] : "NULL");
4070: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
4080: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c      Tcl_AppendEl
4090: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 45  ement(interp, zE
40a0: 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  rr);.  }.  sqlit
40b0: 65 33 5f 66 72 65 65 5f 74 61 62 6c 65 28 61 52  e3_free_table(aR
40c0: 65 73 75 6c 74 29 3b 0a 20 20 69 66 28 20 7a 45  esult);.  if( zE
40d0: 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  rr ) sqlite3_fre
40e0: 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73  e(zErr);.  if( s
40f0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
4100: 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
4110: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4120: 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
4130: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  CL_OK;.}..#endif
4140: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4150: 47 45 54 5f 54 41 42 4c 45 20 2a 2f 0a 0a 0a 2f  GET_TABLE */.../
4160: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4170: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
4180: 5f 72 6f 77 69 64 20 44 42 0a 2a 2a 0a 2a 2a 20  _rowid DB.**.** 
4190: 52 65 74 75 72 6e 73 20 74 68 65 20 69 6e 74 65  Returns the inte
41a0: 67 65 72 20 52 4f 57 49 44 20 6f 66 20 74 68 65  ger ROWID of the
41b0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73   most recent ins
41c0: 65 72 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ert..*/.static i
41d0: 6e 74 20 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77  nt test_last_row
41e0: 69 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  id(.  void *NotU
41f0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4200: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4210: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4220: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4230: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4240: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4260: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4270: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
4280: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4290: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
42a0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
42b0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68  qlite3 *db;.  ch
42c0: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20  ar zBuf[30];..  
42d0: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
42e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
42f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
4300: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
4310: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
4320: 5d 2c 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a  ], " DB\"", 0);.
4330: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4340: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4350: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
4360: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
4370: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
4380: 45 52 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66  ERROR;.  sprintf
4390: 28 7a 42 75 66 2c 20 22 25 6c 6c 64 22 2c 20 73  (zBuf, "%lld", s
43a0: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
43b0: 72 74 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a 20  rt_rowid(db));. 
43c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
43d0: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
43e0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
43f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
4400: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
4410: 5f 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a  _key DB KEY.**.*
4420: 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20  * Set the codec 
4430: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
4440: 6e 74 20 74 65 73 74 5f 6b 65 79 28 0a 20 20 76  nt test_key(.  v
4450: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
4460: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4470: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
4480: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
4490: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
44a0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
44b0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
44c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
44d0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
44e0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
44f0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
4500: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
4510: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
4520: 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
4530: 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e  r *zKey;.  int n
4540: 4b 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21  Key;.  if( argc!
4550: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
4560: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4570: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
4580: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
4590: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
45a0: 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20   " FILENAME\"", 
45b0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
45c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
45d0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
45e0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
45f0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
4600: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65  TCL_ERROR;.  zKe
4610: 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e  y = argv[2];.  n
4620: 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65  Key = strlen(zKe
4630: 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  y);.#ifdef SQLIT
4640: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71  E_HAS_CODEC.  sq
4650: 6c 69 74 65 33 5f 6b 65 79 28 64 62 2c 20 7a 4b  lite3_key(db, zK
4660: 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69  ey, nKey);.#endi
4670: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
4680: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
4690: 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65  e:  sqlite3_reke
46a0: 79 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 43  y DB KEY.**.** C
46b0: 68 61 6e 67 65 20 74 68 65 20 63 6f 64 65 63 20  hange the codec 
46c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
46d0: 6e 74 20 74 65 73 74 5f 72 65 6b 65 79 28 0a 20  nt test_rekey(. 
46e0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
46f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4700: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4710: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4720: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4730: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4740: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4750: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4760: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4770: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
4780: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
4790: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
47a0: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
47b0: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
47c0: 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74  har *zKey;.  int
47d0: 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61 72 67   nKey;.  if( arg
47e0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
47f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4800: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
4810: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
4820: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
4830: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
4840: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
4850: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4860: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
4870: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
4880: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
4890: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
48a0: 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20  Key = argv[2];. 
48b0: 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a   nKey = strlen(z
48c0: 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Key);.#ifdef SQL
48d0: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
48e0: 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 64 62  sqlite3_rekey(db
48f0: 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23  , zKey, nKey);.#
4900: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
4910: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
4920: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
4930: 63 6c 6f 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43  close DB.**.** C
4940: 6c 6f 73 65 73 20 74 68 65 20 64 61 74 61 62 61  loses the databa
4950: 73 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c  se opened by sql
4960: 69 74 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74  ite3_open..*/.st
4970: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
4980: 74 65 73 74 5f 63 6c 6f 73 65 28 0a 20 20 76 6f  test_close(.  vo
4990: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
49a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
49b0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
49c0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
49d0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
49e0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
49f0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
4a00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4a10: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
4a20: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
4a30: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
4a40: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
4a50: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
4a60: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
4a70: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
4a80: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4a90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
4aa0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
4ab0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
4ac0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45  ],.       " FILE
4ad0: 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  NAME\"", 0);.   
4ae0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4af0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
4b00: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
4b10: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
4b20: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
4b30: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
4b40: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
4b50: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
4b60: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
4b70: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
4b80: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
4b90: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
4ba0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
4bb0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f  tion of the x_co
4bc0: 61 6c 65 73 63 65 28 29 20 66 75 6e 63 74 69 6f  alesce() functio
4bd0: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  n..** Return the
4be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
4bf0: 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
4c00: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4c10: 64 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28  d t1_ifnullFunc(
4c20: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
4c30: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
4c40: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
4c50: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
4c60: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
4c70: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
4c80: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  ++){.    if( SQL
4c90: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
4ca0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
4cb0: 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 69  v[i]) ){.      i
4cc0: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  nt n = sqlite3_v
4cd0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
4ce0: 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i]);.      sqlit
4cf0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
4d00: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73  ontext, (char*)s
4d10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
4d20: 74 28 61 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20  t(argv[i]),.    
4d30: 20 20 20 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f        n, SQLITE_
4d40: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
4d50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4d60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73   }.}../*.** Thes
4d70: 65 20 61 72 65 20 74 65 73 74 20 66 75 6e 63 74  e are test funct
4d80: 69 6f 6e 73 2e 20 20 20 20 68 65 78 38 28 29 20  ions.    hex8() 
4d90: 69 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61  interprets its a
4da0: 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54  rgument as.** UT
4db0: 46 38 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  F8 and returns a
4dc0: 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20   hex encoding.  
4dd0: 68 65 78 31 36 6c 65 28 29 20 69 6e 74 65 72 70  hex16le() interp
4de0: 72 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e  rets its argumen
4df0: 74 0a 2a 2a 20 61 73 20 55 54 46 31 36 6c 65 20  t.** as UTF16le 
4e00: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65  and returns a he
4e10: 78 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  x encoding..*/.s
4e20: 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 38 46  tatic void hex8F
4e30: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
4e40: 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63  ext *p, int argc
4e50: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
4e60: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
4e70: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4e80: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
4e90: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
4ea0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
4eb0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
4ec0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
4ed0: 7a 65 6f 66 28 7a 42 75 66 29 2f 32 20 2d 20 32  zeof(zBuf)/2 - 2
4ee0: 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   && z[i]; i++){.
4ef0: 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75      sprintf(&zBu
4f00: 66 5b 69 2a 32 5d 2c 20 22 25 30 32 78 22 2c 20  f[i*2], "%02x", 
4f10: 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a  z[i]&0xff);.  }.
4f20: 20 20 7a 42 75 66 5b 69 2a 32 5d 20 3d 20 30 3b    zBuf[i*2] = 0;
4f30: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
4f40: 74 5f 74 65 78 74 28 70 2c 20 28 63 68 61 72 2a  t_text(p, (char*
4f50: 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54  )zBuf, -1, SQLIT
4f60: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
4f70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4f80: 4d 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63  MIT_UTF16.static
4f90: 20 76 6f 69 64 20 68 65 78 31 36 46 75 6e 63 28   void hex16Func(
4fa0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
4fb0: 2a 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  *p, int argc, sq
4fc0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
4fd0: 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  gv){.  const uns
4fe0: 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20  igned short int 
4ff0: 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *z;.  int i;.  c
5000: 68 61 72 20 7a 42 75 66 5b 34 30 30 5d 3b 0a 20  har zBuf[400];. 
5010: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
5020: 75 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30  ue_text16(argv[0
5030: 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
5040: 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 34 20  <sizeof(zBuf)/4 
5050: 2d 20 34 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b  - 4 && z[i]; i++
5060: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26  ){.    sprintf(&
5070: 7a 42 75 66 5b 69 2a 34 5d 2c 20 22 25 30 34 78  zBuf[i*4], "%04x
5080: 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20  ", z[i]&0xff);. 
5090: 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d   }.  zBuf[i*4] =
50a0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
50b0: 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68  sult_text(p, (ch
50c0: 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51  ar*)zBuf, -1, SQ
50d0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
50e0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
50f0: 20 41 20 73 74 72 75 63 74 75 72 65 20 69 6e 74   A structure int
5100: 6f 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d  o which to accum
5110: 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73  ulate text..*/.s
5120: 74 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69  truct dstr {.  i
5130: 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53  nt nAlloc;  /* S
5140: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a  pace allocated *
5150: 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20  /.  int nUsed;  
5160: 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a   /* Space used *
5170: 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
5180: 20 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f   /* The space */
5190: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .};../*.** Appen
51a0: 64 20 74 65 78 74 20 74 6f 20 61 20 64 73 74 72  d text to a dstr
51b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
51c0: 64 73 74 72 41 70 70 65 6e 64 28 73 74 72 75 63  dstrAppend(struc
51d0: 74 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74  t dstr *p, const
51e0: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69   char *z, int di
51f0: 76 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  vider){.  int n 
5200: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69  = strlen(z);.  i
5210: 66 28 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20  f( p->nUsed + n 
5220: 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20  + 2 > p->nAlloc 
5230: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  ){.    char *zNe
5240: 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63  w;.    p->nAlloc
5250: 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b   = p->nAlloc*2 +
5260: 20 6e 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e   n + 200;.    zN
5270: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
5280: 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41  lloc(p->z, p->nA
5290: 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a  lloc);.    if( z
52a0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
52b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
52c0: 7a 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  z);.      memset
52d0: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
52e0: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
52f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a  ;.    }.    p->z
5300: 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69   = zNew;.  }.  i
5310: 66 28 20 64 69 76 69 64 65 72 20 26 26 20 70 2d  f( divider && p-
5320: 3e 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20  >nUsed>0 ){.    
5330: 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  p->z[p->nUsed++]
5340: 20 3d 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a   = divider;.  }.
5350: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70    memcpy(&p->z[p
5360: 2d 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31  ->nUsed], z, n+1
5370: 29 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d  );.  p->nUsed +=
5380: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   n;.}../*.** Inv
5390: 6f 6b 65 64 20 66 6f 72 20 65 61 63 68 20 63 61  oked for each ca
53a0: 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69  llback from sqli
53b0: 74 65 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73  te3ExecFunc.*/.s
53c0: 74 61 74 69 63 20 69 6e 74 20 65 78 65 63 46 75  tatic int execFu
53d0: 6e 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  ncCallback(void 
53e0: 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63  *pData, int argc
53f0: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63  , char **argv, c
5400: 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a  har **NotUsed){.
5410: 20 20 73 74 72 75 63 74 20 64 73 74 72 20 2a 70    struct dstr *p
5420: 20 3d 20 28 73 74 72 75 63 74 20 64 73 74 72 2a   = (struct dstr*
5430: 29 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b  )pData;.  int i;
5440: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
5450: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  gc; i++){.    if
5460: 28 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a  ( argv[i]==0 ){.
5470: 20 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64        dstrAppend
5480: 28 70 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29  (p, "NULL", ' ')
5490: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
54a0: 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c     dstrAppend(p,
54b0: 20 61 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a   argv[i], ' ');.
54c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
54d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
54e0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
54f0: 20 74 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78   the x_sqlite_ex
5500: 65 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ec() function.  
5510: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61  This function ta
5520: 6b 65 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  kes.** a single 
5530: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74  argument and att
5540: 65 6d 70 74 73 20 74 6f 20 65 78 65 63 75 74 65  empts to execute
5550: 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61   that argument a
5560: 73 20 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54  s SQL code..** T
5570: 68 69 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61  his is illegal a
5580: 6e 64 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68  nd should set th
5590: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  e SQLITE_MISUSE 
55a0: 66 6c 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61  flag on the data
55b0: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34  base..**.** 2004
55c0: 2d 4a 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76  -Jan-07:  We hav
55d0: 65 20 63 68 61 6e 67 65 64 20 74 68 69 73 20 74  e changed this t
55e0: 6f 20 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20  o make it legal 
55f0: 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  to call sqlite3_
5600: 65 78 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77  exec().** from w
5610: 69 74 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e  ithin a function
5620: 20 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20   call.  .** .** 
5630: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d  This routine sim
5640: 75 6c 61 74 65 73 20 74 68 65 20 65 66 66 65 63  ulates the effec
5650: 74 20 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20  t of having two 
5660: 74 68 72 65 61 64 73 20 61 74 74 65 6d 70 74 20  threads attempt 
5670: 74 6f 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61  to.** use the sa
5680: 6d 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  me database at t
5690: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f  he same time..*/
56a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
56b0: 69 74 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20  ite3ExecFunc(.  
56c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
56d0: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
56e0: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
56f0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
5700: 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72  ){.  struct dstr
5710: 20 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c   x;.  memset(&x,
5720: 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a   0, sizeof(x));.
5730: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
5740: 65 78 65 63 28 28 73 71 6c 69 74 65 33 2a 29 73  exec((sqlite3*)s
5750: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
5760: 28 63 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20  (context),.     
5770: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
5780: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5790: 30 5d 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46  0]),.      execF
57a0: 75 6e 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c  uncCallback, &x,
57b0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72   0);.  sqlite3_r
57c0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
57d0: 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64  xt, x.z, x.nUsed
57e0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
57f0: 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  NT);.  sqlite3_f
5800: 72 65 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  ree(x.z);.}../*.
5810: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
5820: 6e 20 6f 66 20 74 6b 74 32 32 31 33 66 75 6e 63  n of tkt2213func
5830: 28 29 2c 20 61 20 73 63 61 6c 61 72 20 66 75 6e  (), a scalar fun
5840: 63 74 69 6f 6e 20 74 68 61 74 20 74 61 6b 65 73  ction that takes
5850: 20 65 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20   exactly.** one 
5860: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 68 61 73  argument. It has
5870: 20 74 77 6f 20 69 6e 74 65 72 65 73 74 69 6e 67   two interesting
5880: 20 66 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a   features:.**.**
5890: 20 2a 20 49 74 20 63 61 6c 6c 73 20 73 71 6c 69   * It calls sqli
58a0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29  te3_value_text()
58b0: 20 33 20 74 69 6d 65 73 20 6f 6e 20 74 68 65 20   3 times on the 
58c0: 61 72 67 75 6d 65 6e 74 20 73 71 6c 69 74 65 33  argument sqlite3
58d0: 5f 76 61 6c 75 65 2a 2e 0a 2a 2a 20 20 20 49 66  _value*..**   If
58e0: 20 74 68 65 20 74 68 72 65 65 20 70 6f 69 6e 74   the three point
58f0: 65 72 73 20 72 65 74 75 72 6e 65 64 20 61 72 65  ers returned are
5900: 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 6e   not the same an
5910: 20 53 51 4c 20 65 72 72 6f 72 20 69 73 20 72 61   SQL error is ra
5920: 69 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74  ised..**.** * Ot
5930: 68 65 72 77 69 73 65 20 69 74 20 72 65 74 75 72  herwise it retur
5940: 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ns a copy of the
5950: 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
5960: 74 69 6f 6e 20 6f 66 20 69 74 73 20 0a 2a 2a 20  tion of its .** 
5970: 20 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 75    argument in su
5980: 63 68 20 61 20 77 61 79 20 61 73 20 74 68 65 20  ch a way as the 
5990: 56 44 42 45 20 72 65 70 72 65 73 65 6e 74 61 74  VDBE representat
59a0: 69 6f 6e 20 69 73 20 61 20 4d 65 6d 2a 20 63 65  ion is a Mem* ce
59b0: 6c 6c 20 0a 2a 2a 20 20 20 77 69 74 68 20 74 68  ll .**   with th
59c0: 65 20 4d 45 4d 5f 54 65 72 6d 20 66 6c 61 67 20  e MEM_Term flag 
59d0: 63 6c 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 69  clear. .**.** Ti
59e0: 63 6b 65 74 20 23 32 32 31 33 20 63 61 6e 20 74  cket #2213 can t
59f0: 68 65 72 65 66 6f 72 65 20 62 65 20 74 65 73 74  herefore be test
5a00: 65 64 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67  ed by evaluating
5a10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
5a20: 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  * SQL expression
5a30: 3a 0a 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32 32 31  :.**.**   tkt221
5a40: 33 66 75 6e 63 28 74 6b 74 32 32 31 33 66 75 6e  3func(tkt2213fun
5a50: 63 28 27 61 20 73 74 72 69 6e 67 27 29 29 3b 0a  c('a string'));.
5a60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
5a70: 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e 28 0a  kt2213Function(.
5a80: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5a90: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
5aa0: 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c  nt argc,  .  sql
5ab0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5ac0: 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 54 65 78 74  v.){.  int nText
5ad0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
5ae0: 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 31 3b  r const *zText1;
5af0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5b00: 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 32 3b 0a   const *zText2;.
5b10: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5b20: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 33 3b 0a 0a  const *zText3;..
5b30: 20 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65    nText = sqlite
5b40: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
5b50: 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 31  gv[0]);.  zText1
5b60: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5b70: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
5b80: 20 20 7a 54 65 78 74 32 20 3d 20 73 71 6c 69 74    zText2 = sqlit
5b90: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5ba0: 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 33  gv[0]);.  zText3
5bb0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5bc0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
5bd0: 0a 20 20 69 66 28 20 7a 54 65 78 74 31 21 3d 7a  .  if( zText1!=z
5be0: 54 65 78 74 32 20 7c 7c 20 7a 54 65 78 74 32 21  Text2 || zText2!
5bf0: 3d 7a 54 65 78 74 33 20 29 7b 0a 20 20 20 20 73  =zText3 ){.    s
5c00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5c10: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 74 6b  ror(context, "tk
5c20: 74 32 32 31 33 20 69 73 20 6e 6f 74 20 66 69 78  t2213 is not fix
5c30: 65 64 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73  ed", -1);.  }els
5c40: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  e{.    char *zCo
5c50: 70 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  py = (char *)sql
5c60: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 65 78  ite3_malloc(nTex
5c70: 74 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  t);.    memcpy(z
5c80: 43 6f 70 79 2c 20 7a 54 65 78 74 31 2c 20 6e 54  Copy, zText1, nT
5c90: 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ext);.    sqlite
5ca0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
5cb0: 6e 74 65 78 74 2c 20 7a 43 6f 70 79 2c 20 6e 54  ntext, zCopy, nT
5cc0: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  ext, sqlite3_fre
5cd0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
5ce0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   The following S
5cf0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65  QL function take
5d00: 73 20 34 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  s 4 arguments.  
5d10: 54 68 65 20 32 6e 64 20 61 6e 64 0a 2a 2a 20 34  The 2nd and.** 4
5d20: 74 68 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  th argument must
5d30: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   be one of these
5d40: 20 73 74 72 69 6e 67 73 3a 20 20 27 74 65 78 74   strings:  'text
5d50: 27 2c 20 27 74 65 78 74 31 36 27 2c 0a 2a 2a 20  ', 'text16',.** 
5d60: 6f 72 20 27 62 6c 6f 62 27 20 63 6f 72 72 65 73  or 'blob' corres
5d70: 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 20 66  ponding to API f
5d80: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 20  unctions.**.**  
5d90: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
5da0: 65 5f 74 65 78 74 28 29 0a 2a 2a 20 20 20 20 20  e_text().**     
5db0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5dc0: 65 78 74 31 36 28 29 0a 2a 2a 20 20 20 20 20 20  ext16().**      
5dd0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
5de0: 6f 62 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ob().**.** The t
5df0: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
5e00: 20 61 20 73 74 72 69 6e 67 2c 20 65 69 74 68 65   a string, eithe
5e10: 72 20 27 62 79 74 65 73 27 20 6f 72 20 27 62 79  r 'bytes' or 'by
5e20: 74 65 73 31 36 27 20 6f 72 20 27 6e 6f 6f 70 27  tes16' or 'noop'
5e30: 2c 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  ,.** correspondi
5e40: 6e 67 20 74 6f 20 41 50 49 73 3a 0a 2a 2a 0a 2a  ng to APIs:.**.*
5e50: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  *      sqlite3_v
5e60: 61 6c 75 65 5f 62 79 74 65 73 28 29 0a 2a 2a 20  alue_bytes().** 
5e70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
5e80: 75 65 5f 62 79 74 65 73 31 36 28 29 0a 2a 2a 20  ue_bytes16().** 
5e90: 20 20 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20       noop.**.** 
5ea0: 54 68 65 20 41 50 49 73 20 64 65 73 69 67 6e 61  The APIs designa
5eb0: 74 65 64 20 62 79 20 74 68 65 20 32 6e 64 20 74  ted by the 2nd t
5ec0: 68 72 6f 75 67 68 20 34 74 68 20 61 72 67 75 6d  hrough 4th argum
5ed0: 65 6e 74 73 20 61 72 65 20 61 70 70 6c 69 65 64  ents are applied
5ee0: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
5ef0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 6f 72 64   argument in ord
5f00: 65 72 2e 20 20 49 66 20 74 68 65 20 70 6f 69 6e  er.  If the poin
5f10: 74 65 72 73 20 72 65 74 75 72 6e 65 64 20 62 79  ters returned by
5f20: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61   the.** second a
5f30: 6e 64 20 66 6f 75 72 74 68 20 61 72 65 20 64 69  nd fourth are di
5f40: 66 66 65 72 65 6e 74 2c 20 74 68 69 73 20 72 6f  fferent, this ro
5f50: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
5f60: 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20    Otherwise,.** 
5f70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
5f80: 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  urns 0..**.** Th
5f90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
5fa0: 73 65 64 20 74 6f 20 74 65 73 74 20 74 6f 20 73  sed to test to s
5fb0: 65 65 20 77 68 65 6e 20 72 65 74 75 72 6e 65 64  ee when returned
5fc0: 20 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d 0a 2a   pointers from.*
5fd0: 2a 20 74 68 65 20 5f 74 65 78 74 28 29 2c 20 5f  * the _text(), _
5fe0: 74 65 78 74 31 36 28 29 20 61 6e 64 20 5f 62 6c  text16() and _bl
5ff0: 6f 62 28 29 20 41 50 49 73 20 62 65 63 6f 6d 65  ob() APIs become
6000: 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
6010: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
6020: 43 68 6e 67 46 75 6e 63 74 69 6f 6e 28 0a 20 20  ChngFunction(.  
6030: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6040: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
6050: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
6060: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
6070: 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ){.  const void 
6080: 2a 70 31 2c 20 2a 70 32 3b 0a 20 20 63 6f 6e 73  *p1, *p2;.  cons
6090: 74 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20  t char *zCmd;.  
60a0: 69 66 28 20 61 72 67 63 21 3d 34 20 29 20 72 65  if( argc!=4 ) re
60b0: 74 75 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d 20 28  turn;.  zCmd = (
60c0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
60d0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
60e0: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[1]);.  if( z
60f0: 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cmd==0 ) return;
6100: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  .  if( strcmp(zC
6110: 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b  md,"text")==0 ){
6120: 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74  .    p1 = (const
6130: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6140: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
6150: 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
6160: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
6170: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6180: 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29  (zCmd, "text16")
6190: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20  ==0 ){.    p1 = 
61a0: 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c  (const void*)sql
61b0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
61c0: 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64  6(argv[0]);.#end
61d0: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  if.  }else if( s
61e0: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f  trcmp(zCmd, "blo
61f0: 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31  b")==0 ){.    p1
6200: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
6210: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
6220: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d  ob(argv[0]);.  }
6230: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6240: 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28  ;.  }.  zCmd = (
6250: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
6260: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6270: 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[2]);.  if( z
6280: 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cmd==0 ) return;
6290: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  .  if( strcmp(zC
62a0: 6d 64 2c 22 62 79 74 65 73 22 29 3d 3d 30 20 29  md,"bytes")==0 )
62b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
62c0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
62d0: 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
62e0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
62f0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6300: 28 7a 43 6d 64 2c 20 22 62 79 74 65 73 31 36 22  (zCmd, "bytes16"
6310: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
6320: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31  te3_value_bytes1
6330: 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64  6(argv[0]);.#end
6340: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  if.  }else if( s
6350: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f 6f  trcmp(zCmd, "noo
6360: 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  p")==0 ){.    /*
6370: 20 64 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   do nothing */. 
6380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
6390: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d  rn;.  }.  zCmd =
63a0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
63b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
63c0: 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28  (argv[3]);.  if(
63d0: 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72   zCmd==0 ) retur
63e0: 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  n;.  if( strcmp(
63f0: 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20  zCmd,"text")==0 
6400: 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e  ){.    p2 = (con
6410: 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  st void*)sqlite3
6420: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
6430: 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  [0]);.#ifndef SQ
6440: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
6450: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
6460: 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36  mp(zCmd, "text16
6470: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20  ")==0 ){.    p2 
6480: 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73  = (const void*)s
6490: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
64a0: 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65  t16(argv[0]);.#e
64b0: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28  ndif.  }else if(
64c0: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62   strcmp(zCmd, "b
64d0: 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lob")==0 ){.    
64e0: 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p2 = (const void
64f0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6500: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
6510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
6520: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
6530: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
6540: 74 65 78 74 2c 20 70 31 21 3d 70 32 29 3b 0a 7d  text, p1!=p2);.}
6550: 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
6560: 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 72 65   sqlite_test_cre
6570: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 0a  ate_function DB.
6580: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73  **.** Call the s
6590: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
65a0: 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68  nction API on th
65b0: 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65  e given database
65c0: 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20   in order.** to 
65d0: 63 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f  create a functio
65e0: 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f 61 6c 65  n named "x_coale
65f0: 73 63 65 22 2e 20 20 54 68 69 73 20 66 75 6e 63  sce".  This func
6600: 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61  tion does the sa
6610: 6d 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74  me thing.** as t
6620: 68 65 20 22 63 6f 61 6c 65 73 63 65 22 20 66 75  he "coalesce" fu
6630: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75  nction.  This fu
6640: 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 72 65 67 69  nction also regi
6650: 73 74 65 72 73 20 61 6e 20 53 51 4c 20 66 75 6e  sters an SQL fun
6660: 63 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64 20 22  ction.** named "
6670: 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 20 74  x_sqlite_exec" t
6680: 68 61 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69  hat invokes sqli
6690: 74 65 33 5f 65 78 65 63 28 29 2e 20 20 49 6e 76  te3_exec().  Inv
66a0: 6f 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 65 78  oking sqlite3_ex
66b0: 65 63 28 29 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ec().** in this 
66c0: 77 61 79 20 69 73 20 69 6c 6c 65 67 61 6c 20 72  way is illegal r
66d0: 65 63 75 72 73 69 6f 6e 20 61 6e 64 20 73 68 6f  ecursion and sho
66e0: 75 6c 64 20 72 61 69 73 65 20 61 6e 20 53 51 4c  uld raise an SQL
66f0: 49 54 45 5f 4d 49 53 55 53 45 20 65 72 72 6f 72  ITE_MISUSE error
6700: 2e 0a 2a 2a 20 54 68 65 20 65 66 66 65 63 74 20  ..** The effect 
6710: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 72  is similar to tr
6720: 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20  ying to use the 
6730: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
6740: 6e 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a  nnection from.**
6750: 20 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 20   two threads at 
6760: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a  the same time..*
6770: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
6780: 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72  l motivation for
6790: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
67a0: 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  s to be able to 
67b0: 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69  call the.** sqli
67c0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
67d0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 68 69  ion function whi
67e0: 6c 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e  le a query is in
67f0: 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64   progress in ord
6800: 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68  er.** to test th
6810: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  e SQLITE_MISUSE 
6820: 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e  detection logic.
6830: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
6840: 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  est_create_funct
6850: 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ion(.  void *Not
6860: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
6870: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
6880: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
6890: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
68a0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
68b0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
68d0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
68e0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
68f0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
6900: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
6910: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
6920: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
6930: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 61 72  3 *db;..  if( ar
6940: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
6950: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
6960: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
6970: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
6980: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
6990: 20 20 20 20 22 20 44 42 5c 22 22 2c 20 30 29 3b      " DB\"", 0);
69a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
69b0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
69c0: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
69d0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
69e0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
69f0: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
6a00: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6a10: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f  nction(db, "x_co
6a20: 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20 53 51 4c  alesce", -1, SQL
6a30: 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20  ITE_ANY, 0, .   
6a40: 20 20 20 20 20 74 31 5f 69 66 6e 75 6c 6c 46 75       t1_ifnullFu
6a50: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  nc, 0, 0);.  if(
6a60: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6a70: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
6a80: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
6a90: 6f 6e 28 64 62 2c 20 22 68 65 78 38 22 2c 20 31  on(db, "hex8", 1
6aa0: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
6ab0: 20 0a 20 20 20 20 20 20 20 20 20 20 68 65 78 38   .          hex8
6ac0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
6ad0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6ae0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28  OMIT_UTF16.  if(
6af0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6b00: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
6b10: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
6b20: 6f 6e 28 64 62 2c 20 22 68 65 78 31 36 22 2c 20  on(db, "hex16", 
6b30: 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30  1, SQLITE_ANY, 0
6b40: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 68 65 78  , .          hex
6b50: 31 36 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  16Func, 0, 0);. 
6b60: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
6b70: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6b80: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6b90: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
6ba0: 6e 28 64 62 2c 20 22 74 6b 74 32 32 31 33 66 75  n(db, "tkt2213fu
6bb0: 6e 63 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41  nc", 1, SQLITE_A
6bc0: 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  NY, 0, .        
6bd0: 20 20 74 6b 74 32 32 31 33 46 75 6e 63 74 69 6f    tkt2213Functio
6be0: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  n, 0, 0);.  }.  
6bf0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6c00: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
6c10: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6c20: 63 74 69 6f 6e 28 64 62 2c 20 22 70 6f 69 6e 74  ction(db, "point
6c30: 65 72 5f 63 68 61 6e 67 65 22 2c 20 34 2c 20 53  er_change", 4, S
6c40: 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20  QLITE_ANY, 0, . 
6c50: 20 20 20 20 20 20 20 20 20 70 74 72 43 68 6e 67           ptrChng
6c60: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
6c70: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
6c80: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
6c90: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 71 6c    /* Use the sql
6ca0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6cb0: 74 69 6f 6e 31 36 28 29 20 41 50 49 20 68 65 72  tion16() API her
6cc0: 65 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20 66 75  e. Mainly for fu
6cd0: 6e 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20 20 2a  n, but also .  *
6ce0: 2a 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  * because it is 
6cf0: 6e 6f 74 20 74 65 73 74 65 64 20 61 6e 79 77 68  not tested anywh
6d00: 65 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 69  ere else. */.  i
6d10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6d20: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f   ){.    const vo
6d30: 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20  id *zUtf16;.    
6d40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
6d50: 56 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Val;.    sqlite3
6d60: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
6d70: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61  >mutex);.    pVa
6d80: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
6d90: 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  New(db);.    sql
6da0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
6db0: 70 56 61 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c  pVal, -1, "x_sql
6dc0: 69 74 65 5f 65 78 65 63 22 2c 20 53 51 4c 49 54  ite_exec", SQLIT
6dd0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
6de0: 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66  TATIC);.    zUtf
6df0: 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  16 = sqlite3Valu
6e00: 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
6e10: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
6e20: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
6e30: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
6e40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
6e50: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
6e60: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6e70: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
6e80: 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36  ion16(db, zUtf16
6e90: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
6ea0: 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46     1, SQLITE_UTF
6eb0: 31 36 2c 20 64 62 2c 20 73 71 6c 69 74 65 33 45  16, db, sqlite3E
6ec0: 78 65 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  xecFunc, 0, 0);.
6ed0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6ee0: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
6ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
6f00: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
6f10: 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
6f20: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ..  if( sqlite3T
6f30: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
6f40: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
6f50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6f60: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
6f70: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
6f80: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
6f90: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
6fa0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
6fb0: 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d  utines to implem
6fc0: 65 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e 74 28  ent the x_count(
6fd0: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
6fe0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f  tion..**.** x_co
6ff0: 75 6e 74 28 29 20 63 6f 75 6e 74 73 20 74 68 65  unt() counts the
7000: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 6e   number of non-n
7010: 75 6c 6c 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ull arguments.  
7020: 42 75 74 20 74 68 65 72 65 20 61 72 65 0a 2a 2a  But there are.**
7030: 20 73 6f 6d 65 20 74 77 69 73 74 73 20 66 6f 72   some twists for
7040: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
7050: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
7060: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 5f 63 6f  argument to x_co
7070: 75 6e 74 28 29 20 69 73 20 34 30 20 74 68 65 6e  unt() is 40 then
7080: 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69   a UTF-8 error i
7090: 73 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 6f 6e  s reported.** on
70a0: 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
70b0: 6f 6e 2e 20 20 49 66 20 78 5f 63 6f 75 6e 74 28  on.  If x_count(
70c0: 34 31 29 20 69 73 20 73 65 65 6e 2c 20 74 68 65  41) is seen, the
70d0: 6e 20 61 20 55 54 46 2d 31 36 20 65 72 72 6f 72  n a UTF-16 error
70e0: 0a 2a 2a 20 69 73 20 72 65 70 6f 72 74 65 64 20  .** is reported 
70f0: 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  on the step func
7100: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 74 6f  tion.  If the to
7110: 74 61 6c 20 63 6f 75 6e 74 20 69 73 20 34 32 2c  tal count is 42,
7120: 20 74 68 65 6e 0a 2a 2a 20 61 20 55 54 46 2d 38   then.** a UTF-8
7130: 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74   error is report
7140: 65 64 20 6f 6e 20 74 68 65 20 66 69 6e 61 6c 69  ed on the finali
7150: 7a 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ze function..*/.
7160: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 74  typedef struct t
7170: 31 43 6f 75 6e 74 43 74 78 20 74 31 43 6f 75 6e  1CountCtx t1Coun
7180: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 74 31 43  tCtx;.struct t1C
7190: 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e 74 20  ountCtx {.  int 
71a0: 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69  n;.};.static voi
71b0: 64 20 74 31 43 6f 75 6e 74 53 74 65 70 28 0a 20  d t1CountStep(. 
71c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
71d0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
71e0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
71f0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
7200: 0a 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70  .  t1CountCtx *p
7210: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
7220: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
7230: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
7240: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61  f(*p));.  if( (a
7250: 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45  rgc==0 || SQLITE
7260: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
7270: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
7280: 5d 29 20 29 20 26 26 20 70 20 29 7b 0a 20 20 20  ]) ) && p ){.   
7290: 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69   p->n++;.  }.  i
72a0: 66 28 20 61 72 67 63 3e 30 20 29 7b 0a 20 20 20  f( argc>0 ){.   
72b0: 20 69 6e 74 20 76 20 3d 20 73 71 6c 69 74 65 33   int v = sqlite3
72c0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
72d0: 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  0]);.    if( v==
72e0: 34 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  40 ){.      sqli
72f0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7300: 28 63 6f 6e 74 65 78 74 2c 20 22 76 61 6c 75 65  (context, "value
7310: 20 6f 66 20 34 30 20 68 61 6e 64 65 64 20 74 6f   of 40 handed to
7320: 20 78 5f 63 6f 75 6e 74 22 2c 20 2d 31 29 3b 0a   x_count", -1);.
7330: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7340: 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 7d 65  MIT_UTF16.    }e
7350: 6c 73 65 20 69 66 28 20 76 3d 3d 34 31 20 29 7b  lse if( v==41 ){
7360: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
7370: 72 20 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 5d  r zUtf16ErrMsg[]
7380: 20 3d 20 7b 20 30 2c 20 30 78 36 31 2c 20 30 2c   = { 0, 0x61, 0,
7390: 20 30 78 36 32 2c 20 30 2c 20 30 78 36 33 2c 20   0x62, 0, 0x63, 
73a0: 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20  0, 0, 0};.      
73b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
73c0: 72 72 6f 72 31 36 28 63 6f 6e 74 65 78 74 2c 20  rror16(context, 
73d0: 26 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 31 2d  &zUtf16ErrMsg[1-
73e0: 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e  SQLITE_BIGENDIAN
73f0: 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20  ], -1);.#endif. 
7400: 20 20 20 7d 0a 20 20 7d 0a 7d 20 20 20 0a 73 74     }.  }.}   .st
7410: 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e  atic void t1Coun
7420: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
7430: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7440: 78 74 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74  xt){.  t1CountCt
7450: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
7460: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7470: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
7480: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
7490: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
74a0: 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20 20 20 20 20  ->n==42 ){.     
74b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
74c0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
74d0: 78 5f 63 6f 75 6e 74 20 74 6f 74 61 6c 73 20 74  x_count totals t
74e0: 6f 20 34 32 22 2c 20 2d 31 29 3b 0a 20 20 20 20  o 42", -1);.    
74f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
7500: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
7510: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
7520: 6e 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  n : 0);.    }.  
7530: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
7540: 20 6c 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70   legacyCountStep
7550: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
7560: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
7570: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
7580: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
7590: 0a 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a  .){.  /* no-op *
75a0: 2f 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  /.}.static void 
75b0: 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c  legacyCountFinal
75c0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
75d0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
75e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
75f0: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
7600: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
7610: 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 29 3b 0a  ount(context));.
7620: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
7630: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7640: 61 67 67 72 65 67 61 74 65 20 44 42 0a 2a 2a 0a  aggregate DB.**.
7650: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69  ** Call the sqli
7660: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
7670: 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65 20 67  ion API on the g
7680: 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 69 6e  iven database in
7690: 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65   order.** to cre
76a0: 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e  ate a function n
76b0: 61 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22 2e 20  amed "x_count". 
76c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
76d0: 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20  s similar.** to 
76e0: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f 75  the built-in cou
76f0: 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20 77  nt() function, w
7700: 69 74 68 20 61 20 66 65 77 20 73 70 65 63 69 61  ith a few specia
7710: 6c 20 71 75 69 72 6b 73 0a 2a 2a 20 66 6f 72 20  l quirks.** for 
7720: 74 65 73 74 69 6e 67 20 74 68 65 20 73 71 6c 69  testing the sqli
7730: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7740: 28 29 20 41 50 49 73 2e 0a 2a 2a 0a 2a 2a 20 54  () APIs..**.** T
7750: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69  he original moti
7760: 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  vation for this 
7770: 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62  routine was to b
7780: 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e able to call t
7790: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72  he.** sqlite3_cr
77a0: 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 66  eate_aggregate f
77b0: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20  unction while a 
77c0: 71 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67  query is in prog
77d0: 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  ress in order.**
77e0: 20 74 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c   to test the SQL
77f0: 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63  ITE_MISUSE detec
7800: 74 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 53 65 65  tion logic.  See
7810: 20 6d 69 73 75 73 65 2e 74 65 73 74 2e 0a 2a 2a   misuse.test..**
7820: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7830: 20 77 61 73 20 6c 61 74 65 72 20 65 78 74 65 6e   was later exten
7840: 64 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  ded to test the 
7850: 75 73 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 72  use of sqlite3_r
7860: 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 0a 2a 2a  esult_error().**
7870: 20 77 69 74 68 69 6e 20 61 67 67 72 65 67 61 74   within aggregat
7880: 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a  e functions..**.
7890: 2a 2a 20 4c 61 74 65 72 3a 20 49 74 20 69 73 20  ** Later: It is 
78a0: 6e 6f 77 20 61 6c 73 6f 20 65 78 74 65 6e 64 65  now also extende
78b0: 64 20 74 6f 20 72 65 67 69 73 74 65 72 20 74 68  d to register th
78c0: 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
78d0: 74 69 6f 6e 0a 2a 2a 20 22 6c 65 67 61 63 79 5f  tion.** "legacy_
78e0: 63 6f 75 6e 74 28 29 22 20 77 69 74 68 20 74 68  count()" with th
78f0: 65 20 73 75 70 70 6c 69 65 64 20 64 61 74 61 62  e supplied datab
7900: 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  ase handle. This
7910: 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 74   is used.** to t
7920: 65 73 74 20 74 68 65 20 64 65 70 72 65 63 61 74  est the deprecat
7930: 65 64 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65  ed sqlite3_aggre
7940: 67 61 74 65 5f 63 6f 75 6e 74 28 29 20 41 50 49  gate_count() API
7950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7960: 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72  test_create_aggr
7970: 65 67 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e  egate(.  void *N
7980: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
7990: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
79a0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
79b0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
79c0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
79d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
79f0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
7a00: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
7a10: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
7a20: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
7a30: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
7a40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
7a50: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
7a60: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
7a70: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7a80: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
7a90: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
7aa0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
7ab0: 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c       " FILENAME\
7ac0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
7ad0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7ae0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
7af0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
7b00: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
7b10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7b20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7b30: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7b40: 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30 2c 20  , "x_count", 0, 
7b50: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
7b60: 30 2c 0a 20 20 20 20 20 20 74 31 43 6f 75 6e 74  0,.      t1Count
7b70: 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61  Step,t1CountFina
7b80: 6c 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  lize);.  if( rc=
7b90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7ba0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
7bb0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
7bc0: 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 31 2c  b, "x_count", 1,
7bd0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
7be0: 20 30 2c 0a 20 20 20 20 20 20 20 20 74 31 43 6f   0,.        t1Co
7bf0: 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74 46  untStep,t1CountF
7c00: 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  inalize);.  }.  
7c10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7c20: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
7c30: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7c40: 63 74 69 6f 6e 28 64 62 2c 20 22 6c 65 67 61 63  ction(db, "legac
7c50: 79 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c  y_count", 0, SQL
7c60: 49 54 45 5f 41 4e 59 2c 20 30 2c 20 30 2c 0a 20  ITE_ANY, 0, 0,. 
7c70: 20 20 20 20 20 20 20 6c 65 67 61 63 79 43 6f 75         legacyCou
7c80: 6e 74 53 74 65 70 2c 20 6c 65 67 61 63 79 43 6f  ntStep, legacyCo
7c90: 75 6e 74 46 69 6e 61 6c 69 7a 65 0a 20 20 20 20  untFinalize.    
7ca0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  );.  }.  if( sql
7cb0: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
7cc0: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
7cd0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
7ce0: 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  OR;.  Tcl_SetRes
7cf0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
7d00: 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
7d10: 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
7d20: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
7d30: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 70 72 69 6e  .** Usage:  prin
7d40: 74 66 20 54 45 58 54 0a 2a 2a 0a 2a 2a 20 53 65  tf TEXT.**.** Se
7d50: 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 70 72 69  nd output to pri
7d60: 6e 74 66 2e 20 20 55 73 65 20 74 68 69 73 20 72  ntf.  Use this r
7d70: 61 74 68 65 72 20 74 68 61 6e 20 70 75 74 73 20  ather than puts 
7d80: 74 6f 20 6d 65 72 67 65 20 74 68 65 20 6f 75 74  to merge the out
7d90: 70 75 74 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  put.** in the co
7da0: 72 72 65 63 74 20 73 65 71 75 65 6e 63 65 20 77  rrect sequence w
7db0: 69 74 68 20 64 65 62 75 67 67 69 6e 67 20 70 72  ith debugging pr
7dc0: 69 6e 74 66 73 20 69 6e 73 65 72 74 65 64 20 69  intfs inserted i
7dd0: 6e 74 6f 20 43 20 63 6f 64 65 2e 0a 2a 2a 20 50  nto C code..** P
7de0: 75 74 73 20 75 73 65 73 20 61 20 73 65 70 61 72  uts uses a separ
7df0: 61 74 65 20 62 75 66 66 65 72 20 61 6e 64 20 64  ate buffer and d
7e00: 65 62 75 67 67 69 6e 67 20 73 74 61 74 65 6d 65  ebugging stateme
7e10: 6e 74 73 20 77 69 6c 6c 20 62 65 20 6f 75 74 20  nts will be out 
7e20: 6f 66 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 69  of.** sequence i
7e30: 66 20 69 74 20 69 73 20 75 73 65 64 2e 0a 2a 2f  f it is used..*/
7e40: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
7e50: 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20  _printf(.  void 
7e60: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
7e70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
7e80: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
7e90: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
7ea0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
7eb0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
7ec0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
7ed0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
7ee0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
7ef0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
7f00: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
7f10: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
7f20: 7b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  {.  if( argc!=2 
7f30: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
7f40: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7f50: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
7f60: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
7f70: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
7f80: 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20  TEXT\"", 0);.   
7f90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7fa0: 52 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28  R;.  }.  printf(
7fb0: 22 25 73 5c 6e 22 2c 20 61 72 67 76 5b 31 5d 29  "%s\n", argv[1])
7fc0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
7fd0: 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  K;.}..../*.** Us
7fe0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
7ff0: 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41 54  rintf_int FORMAT
8000: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
8010: 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43   INTEGER.**.** C
8020: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
8030: 20 74 68 72 65 65 20 69 6e 74 65 67 65 72 20 61   three integer a
8040: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
8050: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
8060: 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f  printf_int(.  vo
8070: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
8080: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8090: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
80a0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
80b0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
80c0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
80d0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
80e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
80f0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8100: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8110: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8120: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8130: 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c  /.){.  int a[3],
8140: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
8150: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
8160: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8170: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
8180: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
8190: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
81a0: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
81b0: 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c  MAT INT INT INT\
81c0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
81d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
81e0: 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35  }.  for(i=2; i<5
81f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8200: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
8210: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69  p, argv[i], &a[i
8220: 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  -2]) ) return TC
8230: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
8240: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
8250: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
8260: 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20  , a[1], a[2]);. 
8270: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8280: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
8290: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
82a0: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
82b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
82c0: 20 7a 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73   zNum represents
82d0: 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74   an integer that
82e0: 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 36 34 2d   will fit in 64-
82f0: 62 69 74 73 2c 20 74 68 65 6e 20 73 65 74 0a 2a  bits, then set.*
8300: 2a 20 2a 70 56 61 6c 75 65 20 74 6f 20 74 68 61  * *pValue to tha
8310: 74 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65  t integer and re
8320: 74 75 72 6e 20 74 72 75 65 2e 20 20 4f 74 68 65  turn true.  Othe
8330: 72 77 69 73 65 20 72 65 74 75 72 6e 20 66 61 6c  rwise return fal
8340: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
8350: 74 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 36  t sqlite3GetInt6
8360: 34 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  4(const char *zN
8370: 75 6d 2c 20 69 36 34 20 2a 70 56 61 6c 75 65 29  um, i64 *pValue)
8380: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  {.  if( sqlite3F
8390: 69 74 73 49 6e 36 34 42 69 74 73 28 7a 4e 75 6d  itsIn64Bits(zNum
83a0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  , 0) ){.    sqli
83b0: 74 65 33 41 74 6f 69 36 34 28 7a 4e 75 6d 2c 20  te3Atoi64(zNum, 
83c0: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 72 65 74  pValue);.    ret
83d0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
83e0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
83f0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
8400: 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 46 4f  mprintf_int64 FO
8410: 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54  RMAT INTEGER INT
8420: 45 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a  EGER INTEGER.**.
8430: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
8440: 77 69 74 68 20 74 68 72 65 65 20 36 34 2d 62 69  with three 64-bi
8450: 74 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  t integer argume
8460: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nts.*/.static in
8470: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
8480: 66 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20  f_int64(.  void 
8490: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
84a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
84b0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
84c0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
84d0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
84e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
84f0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
8500: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
8510: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
8520: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
8530: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
8540: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
8550: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
8560: 69 74 65 5f 69 6e 74 36 34 20 61 5b 33 5d 3b 0a  ite_int64 a[3];.
8570: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
8580: 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
8590: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
85a0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
85b0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
85c0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
85d0: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
85e0: 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20  INT INT INT\"", 
85f0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
8600: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
8610: 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b  for(i=2; i<5; i+
8620: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  +){.    if( !sql
8630: 69 74 65 33 47 65 74 49 6e 74 36 34 28 61 72 67  ite3GetInt64(arg
8640: 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29  v[i], &a[i-2]) )
8650: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
8660: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8670: 20 22 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f   "argument is no
8680: 74 20 61 20 76 61 6c 69 64 20 36 34 2d 62 69 74  t a valid 64-bit
8690: 20 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20   integer", 0);. 
86a0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
86b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
86c0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
86d0: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
86e0: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d  a[0], a[1], a[2]
86f0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
8700: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
8710: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
8720: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
8730: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
8740: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
8750: 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 46 4f  3_mprintf_str FO
8760: 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54  RMAT INTEGER INT
8770: 45 47 45 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a  EGER STRING.**.*
8780: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
8790: 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20  ith two integer 
87a0: 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e  arguments and on
87b0: 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e  e string argumen
87c0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t.*/.static int 
87d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
87e0: 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  str(.  void *Not
87f0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
8800: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
8810: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
8820: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
8830: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
8840: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
8850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8860: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
8870: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
8880: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
8890: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
88a0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
88b0: 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63  int a[3], i;.  c
88c0: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
88d0: 67 63 3c 34 20 7c 7c 20 61 72 67 63 3e 35 20 29  gc<4 || argc>5 )
88e0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
88f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8900: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
8910: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
8920: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
8930: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f 53  ORMAT INT INT ?S
8940: 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20  TRING?\"", 0);. 
8950: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8960: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
8970: 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20  =2; i<4; i++){. 
8980: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
8990: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
89a0: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65  ], &a[i-2]) ) re
89b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
89c0: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
89d0: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
89e0: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61  ], a[0], a[1], a
89f0: 72 67 63 3e 34 20 3f 20 61 72 67 76 5b 34 5d 20  rgc>4 ? argv[4] 
8a00: 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41  : NULL);.  Tcl_A
8a10: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8a20: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
8a30: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
8a40: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
8a50: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
8a60: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8a70: 5f 73 74 72 20 49 4e 54 45 47 45 52 20 46 4f 52  _str INTEGER FOR
8a80: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
8a90: 47 45 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  GER STRING.**.**
8aa0: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
8ab0: 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61  th two integer a
8ac0: 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65  rguments and one
8ad0: 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74   string argument
8ae0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8af0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
8b00: 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  str(.  void *Not
8b10: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
8b20: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
8b30: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
8b40: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
8b50: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
8b60: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8b80: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
8b90: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
8ba0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
8bb0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
8bc0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
8bd0: 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 69  int a[3], i;.  i
8be0: 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt n;.  char *z;
8bf0: 0a 20 20 69 66 28 20 61 72 67 63 3c 35 20 7c 7c  .  if( argc<5 ||
8c00: 20 61 72 67 63 3e 36 20 29 7b 0a 20 20 20 20 54   argc>6 ){.    T
8c10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8c20: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
8c30: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
8c40: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
8c50: 20 20 20 20 20 20 22 20 49 4e 54 20 46 4f 52 4d        " INT FORM
8c60: 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49  AT INT INT ?STRI
8c70: 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  NG?\"", 0);.    
8c80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8c90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
8ca0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
8cb0: 72 67 76 5b 31 5d 2c 20 26 6e 29 20 29 20 72 65  rgv[1], &n) ) re
8cc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8cd0: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
8ce0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8cf0: 74 28 69 6e 74 65 72 70 2c 20 22 4e 20 6d 75 73  t(interp, "N mus
8d00: 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t be non-negativ
8d10: 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
8d20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8d30: 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c 35  }.  for(i=3; i<5
8d40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8d50: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
8d60: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69  p, argv[i], &a[i
8d70: 2d 33 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  -3]) ) return TC
8d80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
8d90: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
8da0: 63 28 20 6e 2b 31 20 29 3b 0a 20 20 73 71 6c 69  c( n+1 );.  sqli
8db0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20  te3_snprintf(n, 
8dc0: 7a 2c 20 61 72 67 76 5b 32 5d 2c 20 61 5b 30 5d  z, argv[2], a[0]
8dd0: 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f  , a[1], argc>4 ?
8de0: 20 61 72 67 76 5b 35 5d 20 3a 20 4e 55 4c 4c 29   argv[5] : NULL)
8df0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
8e00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
8e10: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
8e20: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
8e30: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
8e40: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
8e50: 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20  _mprintf_double 
8e60: 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49  FORMAT INTEGER I
8e70: 4e 54 45 47 45 52 20 44 4f 55 42 4c 45 0a 2a 2a  NTEGER DOUBLE.**
8e80: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
8e90: 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65   with two intege
8ea0: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20  r arguments and 
8eb0: 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  one double argum
8ec0: 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ent.*/.static in
8ed0: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
8ee0: 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64  f_double(.  void
8ef0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
8f00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8f10: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
8f20: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
8f30: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
8f40: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
8f50: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
8f60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
8f70: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
8f80: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
8f90: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
8fa0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
8fb0: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
8fc0: 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20  ;.  double r;.  
8fd0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
8fe0: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
8ff0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9000: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
9010: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
9020: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
9030: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e       " FORMAT IN
9040: 54 20 49 4e 54 20 44 4f 55 42 4c 45 5c 22 22 2c  T INT DOUBLE\"",
9050: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
9060: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9070: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
9080: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
9090: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
90a0: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
90b0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
90c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
90d0: 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e  Tcl_GetDouble(in
90e0: 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20 26  terp, argv[4], &
90f0: 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  r) ) return TCL_
9100: 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c  ERROR;.  z = sql
9110: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
9120: 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[1], a[0], a[1]
9130: 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  , r);.  Tcl_Appe
9140: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9150: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
9160: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
9170: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
9180: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
9190: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
91a0: 6c 65 64 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c  led FORMAT DOUBL
91b0: 45 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43  E DOUBLE.**.** C
91c0: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
91d0: 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65   a single double
91e0: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
91f0: 69 73 20 74 68 65 20 70 72 6f 64 75 63 74 20 6f  is the product o
9200: 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67  f the.** two arg
9210: 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61 62 6f  uments given abo
9220: 76 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ve.  This is use
9230: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 6f 76  d to generate ov
9240: 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72  erflow and under
9250: 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20  flow.** doubles 
9260: 74 6f 20 74 65 73 74 20 74 68 61 74 20 74 68 65  to test that the
9270: 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  y are converted 
9280: 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61  properly..*/.sta
9290: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
92a0: 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a  mprintf_scaled(.
92b0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
92c0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
92d0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
92e0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
92f0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9300: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9310: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9320: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9330: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
9340: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
9350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
9360: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
9370: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  nt */.){.  int i
9380: 3b 0a 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b  ;.  double r[2];
9390: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
93a0: 28 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20  ( argc!=4 ){.   
93b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
93c0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
93d0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
93e0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
93f0: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
9400: 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22   DOUBLE DOUBLE\"
9410: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9420: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9430: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b  .  for(i=2; i<4;
9440: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
9450: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74  cl_GetDouble(int
9460: 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72  erp, argv[i], &r
9470: 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20  [i-2]) ) return 
9480: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9490: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
94a0: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b  intf(argv[1], r[
94b0: 30 5d 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f  0]*r[1]);.  Tcl_
94c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
94d0: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
94e0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
94f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9500: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
9510: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9520: 5f 73 74 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20  _stronly FORMAT 
9530: 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c  STRING.**.** Cal
9540: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61  l mprintf with a
9550: 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61   single double a
9560: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
9570: 20 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20   the product of 
9580: 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d  the.** two argum
9590: 65 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65  ents given above
95a0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
95b0: 74 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72  to generate over
95c0: 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c  flow and underfl
95d0: 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f  ow.** doubles to
95e0: 20 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20   test that they 
95f0: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72  are converted pr
9600: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  operly..*/.stati
9610: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
9620: 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20  rintf_stronly(. 
9630: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
9640: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9650: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
9660: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
9670: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
9680: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
9690: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
96a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
96b0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
96c0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
96d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
96e0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
96f0: 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  t */.){.  char *
9700: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  z;.  if( argc!=3
9710: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
9720: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9730: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
9740: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
9750: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
9760: 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c 22   FORMAT STRING\"
9770: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9780: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9790: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
97a0: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
97b0: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  argv[2]);.  Tcl_
97c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
97d0: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
97e0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
97f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9800: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
9810: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9820: 5f 68 65 78 64 6f 75 62 6c 65 20 46 4f 52 4d 41  _hexdouble FORMA
9830: 54 20 48 45 58 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  T HEX.**.** Call
9840: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20   mprintf with a 
9850: 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72  single double ar
9860: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
9870: 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65  derived from the
9880: 0a 2a 2a 20 68 65 78 61 64 65 63 69 6d 61 6c 20  .** hexadecimal 
9890: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 6e 20 49  encoding of an I
98a0: 45 45 45 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73  EEE double..*/.s
98b0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
98c0: 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75  3_mprintf_hexdou
98d0: 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ble(.  void *Not
98e0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
98f0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
9900: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
9910: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
9920: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
9930: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
9940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9950: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
9960: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
9970: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
9980: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
9990: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
99a0: 63 68 61 72 20 2a 7a 3b 0a 20 20 64 6f 75 62 6c  char *z;.  doubl
99b0: 65 20 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  e r;.  unsigned 
99c0: 69 6e 74 20 78 31 2c 20 78 32 3b 0a 20 20 73 71  int x1, x2;.  sq
99d0: 6c 69 74 65 5f 75 69 6e 74 36 34 20 64 3b 0a 20  lite_uint64 d;. 
99e0: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
99f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9a00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
9a10: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
9a20: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
9a30: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
9a40: 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20 30  MAT STRING\"", 0
9a50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
9a60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
9a70: 66 28 20 73 73 63 61 6e 66 28 61 72 67 76 5b 32  f( sscanf(argv[2
9a80: 5d 2c 20 22 25 30 38 78 25 30 38 78 22 2c 20 26  ], "%08x%08x", &
9a90: 78 32 2c 20 26 78 31 29 21 3d 32 20 29 7b 0a 20  x2, &x1)!=2 ){. 
9aa0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9ab0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 32 6e 64  ult(interp, "2nd
9ac0: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
9ad0: 20 62 65 20 31 36 2d 63 68 61 72 61 63 74 65 72   be 16-character
9ae0: 73 20 6f 66 20 68 65 78 22 2c 20 30 29 3b 0a 20  s of hex", 0);. 
9af0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9b00: 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 20 3d 20 78  ROR;.  }.  d = x
9b10: 32 3b 0a 20 20 64 20 3d 20 28 64 3c 3c 33 32 29  2;.  d = (d<<32)
9b20: 20 2b 20 78 31 3b 0a 20 20 6d 65 6d 63 70 79 28   + x1;.  memcpy(
9b30: 26 72 2c 20 26 64 2c 20 73 69 7a 65 6f 66 28 72  &r, &d, sizeof(r
9b40: 29 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  ));.  z = sqlite
9b50: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
9b60: 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70  ], r);.  Tcl_App
9b70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9b80: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
9b90: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
9ba0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9bb0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
9bc0: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72  ite3_enable_shar
9bd0: 65 64 5f 63 61 63 68 65 20 3f 42 4f 4f 4c 45 41  ed_cache ?BOOLEA
9be0: 4e 3f 0a 2a 2a 0a 2a 2f 0a 23 69 66 20 21 64 65  N?.**.*/.#if !de
9bf0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9c00: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a  T_SHARED_CACHE).
9c10: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
9c20: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 28 0a 20  enable_shared(. 
9c30: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
9c40: 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
9c50: 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
9c60: 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
9c70: 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
9c80: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
9c90: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
9ca0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
9cb0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
9cc0: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
9cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9ce0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9cf0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
9d00: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
9d10: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
9d20: 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
9d30: 63 3b 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b  c;.  int enable;
9d40: 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a  .  int ret = 0;.
9d50: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
9d60: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 45  ite3SharedCacheE
9d70: 6e 61 62 6c 65 64 3b 0a 0a 20 20 69 66 28 20 6f  nabled;..  if( o
9d80: 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
9d90: 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
9da0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
9db0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f 4f  , 1, objv, "?BOO
9dc0: 4c 45 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74  LEAN?");.    ret
9dd0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9de0: 20 7d 0a 20 20 72 65 74 20 3d 20 47 4c 4f 42 41   }.  ret = GLOBA
9df0: 4c 28 69 6e 74 2c 20 73 71 6c 69 74 65 33 53 68  L(int, sqlite3Sh
9e00: 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64  aredCacheEnabled
9e10: 29 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  );..  if( objc==
9e20: 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  2 ){.    if( Tcl
9e30: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
9e40: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
9e50: 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b 0a  1], &enable) ){.
9e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9e70: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9e80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
9e90: 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
9ea0: 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20 20  he(enable);.    
9eb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9ec0: 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  K ){.      Tcl_S
9ed0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
9ee0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
9ef0: 45 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f  ErrStr(rc), TCL_
9f00: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 72  STATIC);.      r
9f10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9f20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63 6c  .    }.  }.  Tcl
9f30: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
9f40: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
9f50: 6c 65 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a 20  leanObj(ret));. 
9f60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9f70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a  }.#endif..../*.*
9f80: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
9f90: 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
9fa0: 5f 63 6f 64 65 73 20 20 20 44 42 20 20 20 20 42  _codes   DB    B
9fb0: 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61  OOLEAN.**.*/.sta
9fc0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 74  tic int test_ext
9fd0: 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
9fe0: 65 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  es(.  ClientData
9ff0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
a000: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
a010: 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
a020: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
a030: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
a040: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
a050: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
a060: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
a070: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
a080: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
a090: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
a0a0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
a0b0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
a0c0: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
a0d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
a0e0: 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71  int enable;.  sq
a0f0: 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
a100: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
a110: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
a120: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
a130: 76 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29  v, "DB BOOLEAN")
a140: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
a150: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
a160: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
a170: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
a180: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
a190: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
a1a0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
a1b0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
a1c0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
a1d0: 5b 32 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 20  [2], &enable) ) 
a1e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a1f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65  ;.  sqlite3_exte
a200: 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
a210: 73 28 64 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20  s(db, enable);. 
a220: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
a230: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
a240: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
a250: 6f 6e 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a  on_number.**.*/.
a260: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
a270: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
a280: 72 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  r(.  ClientData 
a290: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
a2a0: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
a2b0: 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
a2c0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
a2d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
a2e0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
a2f0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
a300: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
a310: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
a320: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a330: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
a340: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
a350: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
a360: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
a370: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  uments */.){.  T
a380: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
a390: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
a3a0: 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69  ntObj(sqlite3_li
a3b0: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
a3c0: 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
a3d0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
a3e0: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 74 61  sage: sqlite3_ta
a3f0: 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
a400: 61 74 61 20 44 42 20 64 62 6e 61 6d 65 20 74 62  ata DB dbname tb
a410: 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a  lname colname.**
a420: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
a430: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
a440: 4d 45 54 41 44 41 54 41 0a 73 74 61 74 69 63 20  METADATA.static 
a450: 69 6e 74 20 74 65 73 74 5f 74 61 62 6c 65 5f 63  int test_table_c
a460: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
a470: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
a480: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
a490: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
a4a0: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
a4b0: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
a4c0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
a4d0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
a4e0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
a4f0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
a500: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
a510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a520: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a530: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
a540: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
a550: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
a560: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
a570: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
a580: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f   char *zDb;.  co
a590: 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a  nst char *zTbl;.
a5a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
a5b0: 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ol;.  int rc;.  
a5c0: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a  Tcl_Obj *pRet;..
a5d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
a5e0: 61 74 61 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74  atatype;.  const
a5f0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b   char *zCollseq;
a600: 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a  .  int notnull;.
a610: 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
a620: 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 72  ;.  int autoincr
a630: 65 6d 65 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62  ement;..  if( ob
a640: 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
a650: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
a660: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
a670: 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d  DB dbname tblnam
a680: 65 20 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20 20  e colname");.   
a690: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a6a0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
a6b0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
a6c0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
a6d0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
a6e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a6f0: 52 3b 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47  R;.  zDb = Tcl_G
a700: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
a710: 29 3b 0a 20 20 7a 54 62 6c 20 3d 20 54 63 6c 5f  );.  zTbl = Tcl_
a720: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
a730: 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 54 63 6c  ]);.  zCol = Tcl
a740: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
a750: 34 5d 29 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c  4]);..  if( strl
a760: 65 6e 28 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62  en(zDb)==0 ) zDb
a770: 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71   = 0;..  rc = sq
a780: 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
a790: 6d 6e 5f 6d 65 74 61 64 61 74 61 28 64 62 2c 20  mn_metadata(db, 
a7a0: 7a 44 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c  zDb, zTbl, zCol,
a7b0: 20 0a 20 20 20 20 20 20 26 7a 44 61 74 61 74 79   .      &zDataty
a7c0: 70 65 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26  pe, &zCollseq, &
a7d0: 6e 6f 74 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72  notnull, &primar
a7e0: 79 6b 65 79 2c 20 26 61 75 74 6f 69 6e 63 72 65  ykey, &autoincre
a7f0: 6d 65 6e 74 29 3b 0a 0a 20 20 69 66 28 20 72 63  ment);..  if( rc
a800: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a810: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a820: 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
a830: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
a840: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a850: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
a860: 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f   pRet = Tcl_NewO
a870: 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  bj();.  Tcl_List
a880: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
a890: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
a8a0: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61  wStringObj(zData
a8b0: 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63  type, -1));.  Tc
a8c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
a8d0: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
a8e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
a8f0: 28 7a 43 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b  (zCollseq, -1));
a900: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
a910: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
a920: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
a930: 62 6a 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20  bj(notnull));.  
a940: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
a950: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
a960: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
a970: 70 72 69 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20  primarykey));.  
a980: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
a990: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
a9a0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
a9b0: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b  autoincrement));
a9c0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
a9d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
a9e0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  );..  return TCL
a9f0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
aa00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
aa10: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 0a 2f 2a 0a  IT_INCRBLOB../*.
aa20: 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  ** sqlite3_blob_
aa30: 72 65 61 64 20 20 43 48 41 4e 4e 45 4c 20 4f 46  read  CHANNEL OF
aa40: 46 53 45 54 20 4e 0a 2a 2a 0a 2a 2a 20 20 20 54  FSET N.**.**   T
aa50: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
aa60: 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  sed to test the 
aa70: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
aa80: 64 28 29 20 69 6e 20 77 61 79 73 20 74 68 61 74  d() in ways that
aa90: 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20 63 68  .**   the Tcl ch
aaa0: 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63 65 20  annel interface 
aab0: 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20 66 69  does not. The fi
aac0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  rst argument sho
aad0: 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68 65 20  uld.**   be the 
aae0: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 20  name of a valid 
aaf0: 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65 64 20  channel created 
ab00: 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62  by the [incrblob
ab10: 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66  ] method.**   of
ab20: 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   a database hand
ab30: 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
ab40: 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f  n calls sqlite3_
ab50: 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20 20  blob_read().**  
ab60: 20 74 6f 20 72 65 61 64 20 4e 20 62 79 74 65 73   to read N bytes
ab70: 20 66 72 6f 6d 20 6f 66 66 73 65 74 20 4f 46 46   from offset OFF
ab80: 53 45 54 20 66 72 6f 6d 20 74 68 65 20 75 6e 64  SET from the und
ab90: 65 72 6c 79 69 6e 67 20 53 51 4c 69 74 65 0a 2a  erlying SQLite.*
aba0: 2a 20 20 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e  *   blob handle.
abb0: 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63  .**.**   On succ
abc0: 65 73 73 2c 20 61 20 62 79 74 65 2d 61 72 72 61  ess, a byte-arra
abd0: 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  y object contain
abe0: 69 6e 67 20 74 68 65 20 72 65 61 64 20 64 61 74  ing the read dat
abf0: 61 20 69 73 20 0a 2a 2a 20 20 20 72 65 74 75 72  a is .**   retur
ac00: 6e 65 64 2e 20 4f 6e 20 66 61 69 6c 75 72 65 2c  ned. On failure,
ac10: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
ac20: 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 20 74   result is set t
ac30: 6f 20 74 68 65 0a 2a 2a 20 20 20 74 65 78 74 20  o the.**   text 
ac40: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
ac50: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 65  f the returned e
ac60: 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
ac70: 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 0a  "SQLITE_NOMEM").
ac80: 2a 2a 20 20 20 61 6e 64 20 61 20 54 63 6c 20 65  **   and a Tcl e
ac90: 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68 72 6f  xception is thro
aca0: 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  wn..*/.static in
acb0: 74 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64  t test_blob_read
acc0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
acd0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
ace0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
acf0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
ad00: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
ad10: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
ad20: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
ad30: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
ad40: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
ad50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
ad60: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
ad70: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ad80: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
ad90: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
ada0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
adb0: 6e 65 6c 3b 0a 20 20 43 6c 69 65 6e 74 44 61 74  nel;.  ClientDat
adc0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  a instanceData;.
add0: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
ade0: 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e 6f 74  pBlob;.  int not
adf0: 55 73 65 64 3b 0a 20 20 69 6e 74 20 6e 42 79 74  Used;.  int nByt
ae00: 65 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74  e;.  int iOffset
ae10: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
ae20: 72 20 2a 7a 42 75 66 3b 0a 20 20 69 6e 74 20 72  r *zBuf;.  int r
ae30: 63 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  c;.  .  if( objc
ae40: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
ae50: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
ae60: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48  rp, 1, objv, "CH
ae70: 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 4e 22 29  ANNEL OFFSET N")
ae80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
ae90: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 63  _ERROR;.  }..  c
aea0: 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74  hannel = Tcl_Get
aeb0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
aec0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
aed0: 6a 76 5b 31 5d 29 2c 20 26 6e 6f 74 55 73 65 64  jv[1]), &notUsed
aee0: 29 3b 0a 20 20 69 66 28 20 21 63 68 61 6e 6e 65  );.  if( !channe
aef0: 6c 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d  l.   || TCL_OK!=
af00: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
af10: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
af20: 5d 2c 20 26 69 4f 66 66 73 65 74 29 0a 20 20 20  ], &iOffset).   
af30: 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  || TCL_OK!=Tcl_G
af40: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
af50: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
af60: 42 79 74 65 29 0a 20 20 20 7c 7c 20 6e 42 79 74  Byte).   || nByt
af70: 65 3c 30 20 7c 7c 20 69 4f 66 66 73 65 74 3c 30  e<0 || iOffset<0
af80: 0a 20 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  .  ){ .    retur
af90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
afa0: 0a 0a 20 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ..  instanceData
afb0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
afc0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
afd0: 61 6e 6e 65 6c 29 3b 0a 20 20 70 42 6c 6f 62 20  annel);.  pBlob 
afe0: 3d 20 2a 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f  = *((sqlite3_blo
aff0: 62 20 2a 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  b **)instanceDat
b000: 61 29 3b 0a 0a 20 20 7a 42 75 66 20 3d 20 28 75  a);..  zBuf = (u
b010: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
b020: 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  cl_Alloc(nByte);
b030: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
b040: 62 6c 6f 62 5f 72 65 61 64 28 70 42 6c 6f 62 2c  blob_read(pBlob,
b050: 20 7a 42 75 66 2c 20 6e 42 79 74 65 2c 20 69 4f   zBuf, nByte, iO
b060: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
b070: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b080: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
b090: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
b0a0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
b0b0: 7a 42 75 66 2c 20 6e 42 79 74 65 29 29 3b 0a 20  zBuf, nByte));. 
b0c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
b0d0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
b0e0: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
b0f0: 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72  3TestErrorName(r
b100: 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  c), TCL_VOLATILE
b110: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65  );.  }.  Tcl_Fre
b120: 65 28 28 63 68 61 72 20 2a 29 7a 42 75 66 29 3b  e((char *)zBuf);
b130: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
b140: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f  SQLITE_OK ? TCL_
b150: 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b  OK : TCL_ERROR);
b160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65  .}../*.** sqlite
b170: 33 5f 62 6c 6f 62 5f 77 72 69 74 65 20 43 48 41  3_blob_write CHA
b180: 4e 4e 45 4c 20 4f 46 46 53 45 54 20 44 41 54 41  NNEL OFFSET DATA
b190: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 63 6f  .**.**   This co
b1a0: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
b1b0: 20 74 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   test the sqlite
b1c0: 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29 20 69  3_blob_write() i
b1d0: 6e 20 77 61 79 73 20 74 68 61 74 0a 2a 2a 20 20  n ways that.**  
b1e0: 20 74 68 65 20 54 63 6c 20 63 68 61 6e 6e 65 6c   the Tcl channel
b1f0: 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20   interface does 
b200: 6e 6f 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  not. The first a
b210: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 0a 2a  rgument should.*
b220: 2a 20 20 20 62 65 20 74 68 65 20 6e 61 6d 65 20  *   be the name 
b230: 6f 66 20 61 20 76 61 6c 69 64 20 63 68 61 6e 6e  of a valid chann
b240: 65 6c 20 63 72 65 61 74 65 64 20 62 79 20 74 68  el created by th
b250: 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d 65 74  e [incrblob] met
b260: 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61 20 64 61  hod.**   of a da
b270: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54  tabase handle. T
b280: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
b290: 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  ls sqlite3_blob_
b2a0: 77 72 69 74 65 28 29 0a 2a 2a 20 20 20 74 6f 20  write().**   to 
b2b0: 77 72 69 74 65 20 74 68 65 20 44 41 54 41 20 62  write the DATA b
b2c0: 79 74 65 2d 61 72 72 61 79 20 74 6f 20 74 68 65  yte-array to the
b2d0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 53 51 4c 69   underlying SQLi
b2e0: 74 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a  te blob handle..
b2f0: 2a 2a 20 20 20 61 74 20 6f 66 66 73 65 74 20 4f  **   at offset O
b300: 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f  FFSET..**.**   O
b310: 6e 20 73 75 63 63 65 73 73 2c 20 61 6e 20 65 6d  n success, an em
b320: 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 72 65  pty string is re
b330: 74 75 72 6e 65 64 2e 20 4f 6e 20 66 61 69 6c 75  turned. On failu
b340: 72 65 2c 20 74 68 65 20 69 6e 74 65 72 70 72 65  re, the interpre
b350: 74 65 72 0a 2a 2a 20 20 20 72 65 73 75 6c 74 20  ter.**   result 
b360: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 74 65  is set to the te
b370: 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
b380: 6e 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  n of the returne
b390: 64 20 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a  d error code .**
b3a0: 20 20 20 28 69 2e 65 2e 20 22 53 51 4c 49 54 45     (i.e. "SQLITE
b3b0: 5f 4e 4f 4d 45 4d 22 29 20 61 6e 64 20 61 20 54  _NOMEM") and a T
b3c0: 63 6c 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  cl exception is 
b3d0: 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69  thrown..*/.stati
b3e0: 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f  c int test_blob_
b3f0: 77 72 69 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  write(.  ClientD
b400: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
b410: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
b420: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
b430: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
b440: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
b450: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
b460: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
b470: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
b480: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b490: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
b4a0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
b4b0: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
b4c0: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
b4d0: 29 7b 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  ){.  Tcl_Channel
b4e0: 20 63 68 61 6e 6e 65 6c 3b 0a 20 20 43 6c 69 65   channel;.  Clie
b4f0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
b500: 61 74 61 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  ata;.  sqlite3_b
b510: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  lob *pBlob;.  in
b520: 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 69 6e 74  t notUsed;.  int
b530: 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
b540: 72 63 3b 0a 0a 20 20 75 6e 73 69 67 6e 65 64 20  rc;..  unsigned 
b550: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 69 6e  char *zBuf;.  in
b560: 74 20 6e 42 75 66 3b 0a 20 20 0a 20 20 69 66 28  t nBuf;.  .  if(
b570: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
b580: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
b590: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
b5a0: 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  , "CHANNEL OFFSE
b5b0: 54 20 44 41 54 41 22 29 3b 0a 20 20 20 20 72 65  T DATA");.    re
b5c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b5d0: 20 20 7d 0a 0a 20 20 63 68 61 6e 6e 65 6c 20 3d    }..  channel =
b5e0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
b5f0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
b600: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
b610: 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  &notUsed);.  if(
b620: 20 21 63 68 61 6e 6e 65 6c 0a 20 20 20 7c 7c 20   !channel.   || 
b630: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
b640: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
b650: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 4f 66 66  , objv[2], &iOff
b660: 73 65 74 29 0a 20 20 20 7c 7c 20 69 4f 66 66 73  set).   || iOffs
b670: 65 74 3c 30 0a 20 20 29 7b 20 0a 20 20 20 20 72  et<0.  ){ .    r
b680: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b690: 0a 20 20 7d 0a 0a 20 20 69 6e 73 74 61 6e 63 65  .  }..  instance
b6a0: 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 43 68  Data = Tcl_GetCh
b6b0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
b6c0: 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 70 42  a(channel);.  pB
b6d0: 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69 74 65 33  lob = *((sqlite3
b6e0: 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74 61 6e 63  _blob **)instanc
b6f0: 65 44 61 74 61 29 3b 0a 0a 20 20 7a 42 75 66 20  eData);..  zBuf 
b700: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
b710: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ayFromObj(objv[3
b720: 5d 2c 20 26 6e 42 75 66 29 3b 0a 20 20 72 63 20  ], &nBuf);.  rc 
b730: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77  = sqlite3_blob_w
b740: 72 69 74 65 28 70 42 6c 6f 62 2c 20 7a 42 75 66  rite(pBlob, zBuf
b750: 2c 20 6e 42 75 66 2c 20 69 4f 66 66 73 65 74 29  , nBuf, iOffset)
b760: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b770: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
b780: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
b790: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
b7a0: 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28  e3TestErrorName(
b7b0: 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  rc), TCL_VOLATIL
b7c0: 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  E);.  }..  retur
b7d0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
b7e0: 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f   ? TCL_OK : TCL_
b7f0: 45 52 52 4f 52 29 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR);.}.#endif
b800: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
b810: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
b820: 6c 6c 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48 41  llation_v2 DB-HA
b830: 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52  NDLE NAME CMP-PR
b840: 4f 43 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a  OC DEL-PROC.**.*
b850: 2a 20 20 20 54 68 69 73 20 54 63 6c 20 70 72 6f  *   This Tcl pro
b860: 63 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  c is used for te
b870: 73 74 69 6e 67 20 74 68 65 20 65 78 70 65 72 69  sting the experi
b880: 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c 69  mental.**   sqli
b890: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
b8a0: 74 69 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72 66  tion_v2() interf
b8b0: 61 63 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54  ace..*/.struct T
b8c0: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b 0a  estCollationX {.
b8d0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
b8e0: 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
b8f0: 2a 70 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  *pCmp;.  Tcl_Obj
b900: 20 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65 64   *pDel;.};.typed
b910: 65 66 20 73 74 72 75 63 74 20 54 65 73 74 43 6f  ef struct TestCo
b920: 6c 6c 61 74 69 6f 6e 58 20 54 65 73 74 43 6f 6c  llationX TestCol
b930: 6c 61 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63 20  lationX;.static 
b940: 76 6f 69 64 20 74 65 73 74 43 72 65 61 74 65 43  void testCreateC
b950: 6f 6c 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69 64  ollationDel(void
b960: 20 2a 70 43 74 78 29 7b 0a 20 20 54 65 73 74 43   *pCtx){.  TestC
b970: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28  ollationX *p = (
b980: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
b990: 29 70 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72 63  )pCtx;..  int rc
b9a0: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
b9b0: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70  (p->interp, p->p
b9c0: 44 65 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Del, TCL_EVAL_DI
b9d0: 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c  RECT|TCL_EVAL_GL
b9e0: 4f 42 41 4c 29 3b 0a 20 20 69 66 28 20 72 63 21  OBAL);.  if( rc!
b9f0: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  =TCL_OK ){.    T
ba00: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
ba10: 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  or(p->interp);. 
ba20: 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65   }..  Tcl_DecrRe
ba30: 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b  fCount(p->pCmp);
ba40: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
ba50: 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20 20  unt(p->pDel);.  
ba60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f  sqlite3_free((vo
ba70: 69 64 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74 69  id *)p);.}.stati
ba80: 63 20 69 6e 74 20 74 65 73 74 43 72 65 61 74 65  c int testCreate
ba90: 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20 20  CollationCmp(.  
baa0: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e  void *pCtx,.  in
bab0: 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73 74  t nLeft,.  const
bac0: 20 76 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20 20   void *zLeft,.  
bad0: 69 6e 74 20 6e 52 69 67 68 74 2c 0a 20 20 63 6f  int nRight,.  co
bae0: 6e 73 74 20 76 6f 69 64 20 2a 7a 52 69 67 68 74  nst void *zRight
baf0: 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74  .){.  TestCollat
bb00: 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43  ionX *p = (TestC
bb10: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78  ollationX *)pCtx
bb20: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63  ;.  Tcl_Obj *pSc
bb30: 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69  ript = Tcl_Dupli
bb40: 63 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70 29  cateObj(p->pCmp)
bb50: 3b 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20 30  ;.  int iRes = 0
bb60: 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  ;..  Tcl_IncrRef
bb70: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
bb80: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
bb90: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53  endElement(0, pS
bba0: 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74  cript, Tcl_NewSt
bbb0: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
bbc0: 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b 0a  zLeft, nLeft));.
bbd0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
bbe0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53  endElement(0, pS
bbf0: 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74  cript, Tcl_NewSt
bc00: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
bc10: 7a 52 69 67 68 74 2c 6e 52 69 67 68 74 29 29 3b  zRight,nRight));
bc20: 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ..  if( TCL_OK!=
bc30: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
bc40: 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  >interp, pScript
bc50: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
bc60: 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  T|TCL_EVAL_GLOBA
bc70: 4c 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21  L).   || TCL_OK!
bc80: 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
bc90: 62 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54 63  bj(p->interp, Tc
bca0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70  l_GetObjResult(p
bcb0: 2d 3e 69 6e 74 65 72 70 29 2c 20 26 69 52 65 73  ->interp), &iRes
bcc0: 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42  ).  ){.    Tcl_B
bcd0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70  ackgroundError(p
bce0: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20  ->interp);.  }. 
bcf0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
bd00: 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20 72  t(pScript);..  r
bd10: 65 74 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73 74  eturn iRes;.}.st
bd20: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72  atic int test_cr
bd30: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
bd40: 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  2(.  ClientData 
bd50: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
bd60: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
bd70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
bd80: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
bd90: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
bda0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
bdb0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
bdc0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
bdd0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
bde0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
bdf0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
be00: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
be10: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
be20: 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20   TestCollationX 
be30: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *p;.  sqlite3 *d
be40: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
be50: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
be60: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
be70: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
be80: 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20  bjv, "DB-HANDLE 
be90: 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45  NAME CMP-PROC DE
bea0: 4c 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65  L-PROC");.    re
beb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bec0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
bed0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
bee0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
bef0: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
bf00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bf10: 0a 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c  .  p = (TestColl
bf20: 61 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33  ationX *)sqlite3
bf30: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54  _malloc(sizeof(T
bf40: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b  estCollationX));
bf50: 0a 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a  .  p->pCmp = obj
bf60: 76 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20  v[3];.  p->pDel 
bf70: 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e  = objv[4];.  p->
bf80: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
bf90: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
bfa0: 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20  unt(p->pCmp);.  
bfb0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
bfc0: 28 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63  (p->pDel);..  rc
bfd0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
bfe0: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64  e_collation_v2(d
bff0: 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  b, Tcl_GetString
c000: 28 6f 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a  (objv[2]), 16, .
c010: 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c        (void *)p,
c020: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
c030: 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65  tionCmp, testCre
c040: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a  ateCollationDel.
c050: 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53    );.  if( rc!=S
c060: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a  QLITE_MISUSE ){.
c070: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
c080: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71  sult(interp, "sq
c090: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
c0a0: 6c 61 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64  late_v2() failed
c0b0: 20 74 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20   to detect ".   
c0c0: 20 20 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65     "an invalid e
c0d0: 6e 63 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a  ncoding", (char*
c0e0: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
c0f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
c100: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
c110: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
c120: 32 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72  2(db, Tcl_GetStr
c130: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51  ing(objv[2]), SQ
c140: 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
c150: 20 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73    (void *)p, tes
c160: 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e  tCreateCollation
c170: 43 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43  Cmp, testCreateC
c180: 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b  ollationDel.  );
c190: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
c1a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
c1b0: 3a 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  : sqlite3_load_e
c1c0: 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44  xtension DB-HAND
c1d0: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 0a 2a  LE FILE ?PROC?.*
c1e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
c1f0: 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  t_load_extension
c200: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
c210: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
c220: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
c230: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
c240: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
c250: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
c260: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
c270: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
c280: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c290: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
c2a0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
c2b0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c2c0: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
c2d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
c2e0: 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
c2f0: 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
c300: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
c310: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 68 61  char *zDb;.  cha
c320: 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72  r *zFile;.  char
c330: 20 2a 7a 50 72 6f 63 20 3d 20 30 3b 0a 20 20 63   *zProc = 0;.  c
c340: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a  har *zErr = 0;..
c350: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26    if( objc!=4 &&
c360: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
c370: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
c380: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
c390: 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c  , "DB-HANDLE FIL
c3a0: 45 20 3f 50 52 4f 43 3f 22 29 3b 0a 20 20 20 20  E ?PROC?");.    
c3b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c3c0: 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63  ;.  }.  zDb = Tc
c3d0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c3e0: 5b 31 5d 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20  [1]);.  zFile = 
c3f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
c400: 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 6f 62  jv[2]);.  if( ob
c410: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 50 72  jc==4 ){.    zPr
c420: 6f 63 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  oc = Tcl_GetStri
c430: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d  ng(objv[3]);.  }
c440: 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74  ..  /* Extract t
c450: 68 65 20 43 20 64 61 74 61 62 61 73 65 20 68 61  he C database ha
c460: 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 54 63  ndle from the Tc
c470: 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a  l command name *
c480: 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74  /.  if( !Tcl_Get
c490: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
c4a0: 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66  rp, zDb, &cmdInf
c4b0: 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  o) ){.    Tcl_Ap
c4c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
c4d0: 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20  p, "command not 
c4e0: 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28  found: ", zDb, (
c4f0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
c500: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c510: 20 20 7d 0a 20 20 64 62 20 3d 20 28 28 73 74 72    }.  db = ((str
c520: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
c530: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
c540: 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65  ata)->db;.  asse
c550: 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 61  rt(db);..  /* Ca
c560: 6c 6c 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ll the underlyin
c570: 67 20 43 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  g C function. If
c580: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c590: 2c 20 73 65 74 20 72 63 20 74 6f 20 0a 20 20 2a  , set rc to .  *
c5a0: 2a 20 54 43 4c 5f 45 52 52 4f 52 20 61 6e 64 20  * TCL_ERROR and 
c5b0: 6c 6f 61 64 20 61 6e 79 20 65 72 72 6f 72 20 73  load any error s
c5c0: 74 72 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 69  tring into the i
c5d0: 6e 74 65 72 70 72 65 74 65 72 2e 20 49 66 20 6e  nterpreter. If n
c5e0: 6f 20 0a 20 20 2a 2a 20 65 72 72 6f 72 20 6f 63  o .  ** error oc
c5f0: 63 75 72 73 2c 20 73 65 74 20 72 63 20 74 6f 20  curs, set rc to 
c600: 54 43 4c 5f 4f 4b 2e 0a 20 20 2a 2f 0a 23 69 66  TCL_OK..  */.#if
c610: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c620: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
c630: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
c640: 4f 52 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c  OR;.  zErr = sql
c650: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 68  ite3_mprintf("th
c660: 69 73 20 62 75 69 6c 64 20 6f 6d 69 74 73 20 73  is build omits s
c670: 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
c680: 6e 73 69 6f 6e 28 29 22 29 3b 0a 23 65 6c 73 65  nsion()");.#else
c690: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
c6a0: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64  load_extension(d
c6b0: 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c  b, zFile, zProc,
c6c0: 20 26 7a 45 72 72 29 3b 0a 23 65 6e 64 69 66 0a   &zErr);.#endif.
c6d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c6e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
c6f0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
c700: 20 7a 45 72 72 20 3f 20 7a 45 72 72 20 3a 20 22   zErr ? zErr : "
c710: 22 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ", TCL_VOLATILE)
c720: 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45  ;.    rc = TCL_E
c730: 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
c740: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
c750: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
c760: 65 65 28 7a 45 72 72 29 3b 0a 0a 20 20 72 65 74  ee(zErr);..  ret
c770: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c780: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
c790: 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
c7a0: 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20  nsion DB-HANDLE 
c7b0: 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61 74 69 63 20  ONOFF.*/.static 
c7c0: 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  int test_enable_
c7d0: 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  load(.  ClientDa
c7e0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
c7f0: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
c800: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c810: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
c820: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
c830: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
c840: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
c850: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
c860: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c870: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
c880: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
c890: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
c8a0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
c8b0: 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  {.  Tcl_CmdInfo 
c8c0: 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  cmdInfo;.  sqlit
c8d0: 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a  e3 *db;.  char *
c8e0: 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66  zDb;.  int onoff
c8f0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
c900: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
c910: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
c920: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41   1, objv, "DB-HA
c930: 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a 20 20  NDLE ONOFF");.  
c940: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c950: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20  OR;.  }.  zDb = 
c960: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
c970: 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20 45 78  jv[1]);..  /* Ex
c980: 74 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61  tract the C data
c990: 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  base handle from
c9a0: 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   the Tcl command
c9b0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21   name */.  if( !
c9c0: 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
c9d0: 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20  fo(interp, zDb, 
c9e0: 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20  &cmdInfo) ){.   
c9f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ca00: 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61  t(interp, "comma
ca10: 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c  nd not found: ",
ca20: 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b   zDb, (char*)0);
ca30: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ca40: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20  ERROR;.  }.  db 
ca50: 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74  = ((struct Sqlit
ca60: 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a  eDb*)cmdInfo.obj
ca70: 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b  ClientData)->db;
ca80: 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a  .  assert(db);..
ca90: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6f 6e 6f    /* Get the ono
caa0: 66 66 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  ff parameter */.
cab0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
cac0: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
cad0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e  rp, objv[2], &on
cae0: 6f 66 66 29 20 29 7b 0a 20 20 20 20 72 65 74 75  off) ){.    retu
caf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cb00: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
cb10: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
cb20: 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70 65 6e  SION.  Tcl_Appen
cb30: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
cb40: 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d 69 74  "this build omit
cb50: 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  s sqlite3_load_e
cb60: 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 20 20  xtension()");.  
cb70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cb80: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
cb90: 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
cba0: 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e 6f 66  tension(db, onof
cbb0: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  f);.  return TCL
cbc0: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  _OK;.#endif.}../
cbd0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
cbe0: 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20  ite_abort.**.** 
cbf0: 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 72 6f  Shutdown the pro
cc00: 63 65 73 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  cess immediately
cc10: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  .  This is not a
cc20: 20 63 6c 65 61 6e 20 73 68 75 74 64 6f 77 6e 2e   clean shutdown.
cc30: 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
cc40: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
cc50: 20 74 68 65 20 72 65 63 6f 76 65 72 61 62 69 6c   the recoverabil
cc60: 69 74 79 20 6f 66 20 61 20 64 61 74 61 62 61 73  ity of a databas
cc70: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76 65 6e  e in.** the even
cc80: 74 20 6f 66 20 61 20 70 72 6f 67 72 61 6d 20 63  t of a program c
cc90: 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rash..*/.static 
cca0: 69 6e 74 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  int sqlite_abort
ccb0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
ccc0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
ccd0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
cce0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
ccf0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
cd00: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
cd10: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
cd20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
cd30: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
cd40: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cd60: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
cd70: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  ment */.){.  ass
cd80: 65 72 74 28 20 69 6e 74 65 72 70 3d 3d 30 20 29  ert( interp==0 )
cd90: 3b 20 20 20 2f 2a 20 54 68 69 73 20 77 69 6c 6c  ;   /* This will
cda0: 20 61 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f 0a   always fail */.
cdb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
cdc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
cdd0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
cde0: 69 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e 65  is a user-define
cdf0: 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77  d SQL function w
ce00: 68 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a 20  hose purpose.** 
ce10: 69 73 20 74 6f 20 74 65 73 74 20 74 68 65 20 73  is to test the s
ce20: 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74  qlite_set_result
ce30: 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69  () API..*/.stati
ce40: 63 20 76 6f 69 64 20 74 65 73 74 46 75 6e 63 28  c void testFunc(
ce50: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
ce60: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
ce70: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
ce80: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68 69  e **argv){.  whi
ce90: 6c 65 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20  le( argc>=2 ){. 
cea0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ceb0: 41 72 67 30 20 3d 20 28 63 68 61 72 2a 29 73 71  Arg0 = (char*)sq
cec0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
ced0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
cee0: 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20 20  f( zArg0 ){.    
cef0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
cf00: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20 22  StrICmp(zArg0, "
cf10: 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20  int") ){.       
cf20: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
cf30: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
cf40: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
cf50: 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20  rgv[1]));.      
cf60: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
cf70: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
cf80: 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20  int64")==0 ){.  
cf90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
cfa0: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
cfb0: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
cfc0: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29  e_int64(argv[1])
cfd0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
cfe0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
cff0: 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67 22  p(zArg0,"string"
d000: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
d010: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
d020: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68  ext(context, (ch
d030: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
d040: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 2c  e_text(argv[1]),
d050: 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20   -1,.           
d060: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d070: 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  T);.      }else 
d080: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
d090: 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c 65  mp(zArg0,"double
d0a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
d0b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
d0c0: 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20  double(context, 
d0d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
d0e0: 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b 0a  uble(argv[1]));.
d0f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d100: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
d110: 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20  Arg0,"null")==0 
d120: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d130: 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63  e3_result_null(c
d140: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
d150: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
d160: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 76  StrICmp(zArg0,"v
d170: 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  alue")==0 ){.   
d180: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
d190: 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78  ult_value(contex
d1a0: 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65 33 5f  t, argv[sqlite3_
d1b0: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31  value_int(argv[1
d1c0: 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ])]);.      }els
d1d0: 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  e{.        goto 
d1e0: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20  error_out;.     
d1f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
d200: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
d210: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 72  ut;.    }.    ar
d220: 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72 67  gc -= 2;.    arg
d230: 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65  v += 2;.  }.  re
d240: 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74  turn;..error_out
d250: 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  :.  sqlite3_resu
d260: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
d270: 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  ,"first argument
d280: 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
d290: 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e 74 20  f: ".      "int 
d2a0: 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64 6f 75  int64 string dou
d2b0: 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22 2c  ble null value",
d2c0: 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   -1);.}../*.** U
d2d0: 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 5f 72  sage:   sqlite_r
d2e0: 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e  egister_test_fun
d2f0: 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45 0a  ction  DB  NAME.
d300: 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74  **.** Register t
d310: 68 65 20 74 65 73 74 20 53 51 4c 20 66 75 6e 63  he test SQL func
d320: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
d330: 62 61 73 65 20 44 42 20 75 6e 64 65 72 20 74 68  base DB under th
d340: 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f 0a  e name NAME..*/.
d350: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
d360: 72 65 67 69 73 74 65 72 5f 66 75 6e 63 28 0a 20  register_func(. 
d370: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
d380: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d390: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
d3a0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
d3b0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
d3c0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
d3d0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
d3e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d3f0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d400: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
d410: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
d420: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
d430: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
d440: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
d450: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
d460: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
d470: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d480: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
d490: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
d4a0: 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20  v[0], .       " 
d4b0: 44 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45  DB FUNCTION-NAME
d4c0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
d4d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
d4e0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
d4f0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
d500: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
d510: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d520: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
d530: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
d540: 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51   argv[2], -1, SQ
d550: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20  LITE_UTF8, 0, . 
d560: 20 20 20 20 20 74 65 73 74 46 75 6e 63 2c 20 30       testFunc, 0
d570: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
d580: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
d590: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d5a0: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
d5b0: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
d5c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d5d0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
d5e0: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
d5f0: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
d600: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d610: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
d620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
d630: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
d640: 7a 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  ze  STMT .**.** 
d650: 46 69 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65  Finalize a state
d660: 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  ment handle..*/.
d670: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
d680: 66 69 6e 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64  finalize(.  void
d690: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
d6a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
d6b0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
d6c0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
d6d0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
d6e0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
d6f0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  t;.  int rc;.  s
d700: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a  qlite3 *db = 0;.
d710: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
d720: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
d730: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d740: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
d750: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
d760: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
d770: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
d780: 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22  ], 0), " <STMT>"
d790: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
d7a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d7b0: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
d7c0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
d7d0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
d7e0: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
d7f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d800: 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  ;..  if( pStmt )
d810: 7b 0a 20 20 20 20 64 62 20 3d 20 53 74 6d 74 54  {.    db = StmtT
d820: 6f 44 62 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  oDb(pStmt);.  }.
d830: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
d840: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
d850: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
d860: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
d870: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
d880: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
d890: 69 66 28 20 64 62 20 26 26 20 73 71 6c 69 74 65  if( db && sqlite
d8a0: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
d8b0: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
d8c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d8d0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
d8e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
d8f0: 3a 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f  :  sqlite3_next_
d900: 73 74 6d 74 20 20 44 42 20 20 53 54 4d 54 0a 2a  stmt  DB  STMT.*
d910: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
d920: 6e 65 78 74 20 73 74 61 74 6d 65 6e 74 20 69 6e  next statment in
d930: 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20   sequence after 
d940: 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  STMT..*/.static 
d950: 69 6e 74 20 74 65 73 74 5f 6e 65 78 74 5f 73 74  int test_next_st
d960: 6d 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  mt(.  void * cli
d970: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
d980: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
d990: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
d9a0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
d9b0: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
d9c0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 73  stmt *pStmt;.  s
d9d0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a  qlite3 *db = 0;.
d9e0: 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
d9f0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
da00: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
da10: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
da20: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
da30: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
da40: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
da50: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
da60: 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 53 54 4d  0], 0), " DB STM
da70: 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
da80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
da90: 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  }..  if( getDbPo
daa0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
dab0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
dac0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
dad0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
dae0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
daf0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
db00: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
db10: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
db20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
db30: 20 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    pStmt = sqlite
db40: 33 5f 6e 65 78 74 5f 73 74 6d 74 28 64 62 2c 20  3_next_stmt(db, 
db50: 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53  pStmt);.  if( pS
db60: 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
db70: 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
db80: 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
db90: 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
dba0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
dbb0: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
dbc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
dbd0: 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
dbe0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
dbf0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
dc00: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 20 53  sqlite3_reset  S
dc10: 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74  TMT .**.** Reset
dc20: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e   a statement han
dc30: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
dc40: 6e 74 20 74 65 73 74 5f 72 65 73 65 74 28 0a 20  nt test_reset(. 
dc50: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
dc60: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
dc70: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
dc80: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
dc90: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
dca0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
dcb0: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
dcc0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
dcd0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
dce0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
dcf0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
dd00: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
dd10: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
dd20: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
dd30: 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
dd40: 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  >", 0);.    retu
dd50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dd60: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
dd70: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
dd80: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
dd90: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
dda0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
ddb0: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
ddc0: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
ddd0: 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 26 26  ;.  if( pStmt &&
dde0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
ddf0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
de00: 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
de10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
de20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
de30: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
de40: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
de50: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
de60: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 2f 2a 0a 20  CL_STATIC);./*. 
de70: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
de80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
de90: 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65 74 75 72 6e  .  }.*/.  return
dea0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
deb0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
dec0: 33 5f 65 78 70 69 72 65 64 20 53 54 4d 54 20 0a  3_expired STMT .
ded0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  **.** Return TRU
dee0: 45 20 69 66 20 61 20 72 65 63 6f 6d 70 69 6c 61  E if a recompila
def0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
df00: 65 6d 65 6e 74 20 69 73 20 72 65 63 6f 6d 6d 65  ement is recomme
df10: 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nded..*/.static 
df20: 69 6e 74 20 74 65 73 74 5f 65 78 70 69 72 65 64  int test_expired
df30: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
df40: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
df50: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
df60: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
df70: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
df80: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
df90: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 66 28  mt *pStmt;.  if(
dfa0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
dfb0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
dfc0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
dfd0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
dfe0: 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
dff0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
e000: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
e010: 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a   " <STMT>", 0);.
e020: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e030: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
e040: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
e050: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
e060: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
e070: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
e080: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
e090: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
e0a0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
e0b0: 6c 65 61 6e 4f 62 6a 28 73 71 6c 69 74 65 33 5f  leanObj(sqlite3_
e0c0: 65 78 70 69 72 65 64 28 70 53 74 6d 74 29 29 29  expired(pStmt)))
e0d0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
e0e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
e0f0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 74 72 61 6e  e:  sqlite3_tran
e100: 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 20 46 52  sfer_bindings FR
e110: 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a  OMSTMT TOSTMT.**
e120: 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 61 6c 6c  .** Transfer all
e130: 20 62 69 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46   bindings from F
e140: 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20 74 6f 20  ROMSTMT over to 
e150: 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63  TOSTMT.*/.static
e160: 20 69 6e 74 20 74 65 73 74 5f 74 72 61 6e 73 66   int test_transf
e170: 65 72 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20  er_bind(.  void 
e180: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
e190: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
e1a0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
e1b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
e1c0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
e1d0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
e1e0: 31 2c 20 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66  1, *pStmt2;.  if
e1f0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
e200: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e210: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
e220: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
e230: 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
e240: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
e250: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
e260: 2c 20 22 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f  , " FROM-STMT TO
e270: 2d 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20  -STMT", 0);.    
e280: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e290: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
e2a0: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
e2b0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
e2c0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
e2d0: 74 31 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t1)) return TCL_
e2e0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74  ERROR;.  if( get
e2f0: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
e300: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
e310: 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74  g(objv[2]), &pSt
e320: 6d 74 32 29 29 20 72 65 74 75 72 6e 20 54 43 4c  mt2)) return TCL
e330: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
e340: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
e350: 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77  p, .     Tcl_New
e360: 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74  IntObj(sqlite3_t
e370: 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73  ransfer_bindings
e380: 28 70 53 74 6d 74 31 2c 70 53 74 6d 74 32 29 29  (pStmt1,pStmt2))
e390: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
e3a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
e3b0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 68 61  ge:  sqlite3_cha
e3c0: 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  nges DB.**.** Re
e3d0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
e3e0: 6f 66 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  of changes made 
e3f0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
e400: 62 79 20 74 68 65 20 6c 61 73 74 20 53 51 4c 0a  by the last SQL.
e410: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f  ** execution..*/
e420: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
e430: 5f 63 68 61 6e 67 65 73 28 0a 20 20 76 6f 69 64  _changes(.  void
e440: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
e450: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e460: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
e470: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
e480: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
e490: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
e4a0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
e4b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e4c0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
e4d0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
e4e0: 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 54 63  e \"",.       Tc
e4f0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e500: 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
e510: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e520: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
e530: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
e540: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
e550: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
e560: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
e570: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
e580: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
e590: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
e5a0: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
e5b0: 64 62 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  db)));.  return 
e5c0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
e5d0: 20 54 68 69 73 20 69 73 20 74 68 65 20 22 73 74   This is the "st
e5e0: 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22  atic_bind_value"
e5f0: 20 74 68 61 74 20 76 61 72 69 61 62 6c 65 73 20   that variables 
e600: 61 72 65 20 62 6f 75 6e 64 20 74 6f 20 77 68 65  are bound to whe
e610: 6e 0a 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f 70  n.** the FLAG op
e620: 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 5f  tion of sqlite3_
e630: 62 69 6e 64 20 69 73 20 22 73 74 61 74 69 63 22  bind is "static"
e640: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
e650: 2a 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  *sqlite_static_b
e660: 69 6e 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 73  ind_value = 0;.s
e670: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
e680: 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79  _static_bind_nby
e690: 74 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55  te = 0;../*.** U
e6a0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 62  sage:  sqlite3_b
e6b0: 69 6e 64 20 20 56 4d 20 20 49 44 58 20 20 56 41  ind  VM  IDX  VA
e6c0: 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a  LUE  FLAGS.**.**
e6d0: 20 53 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   Sets the value 
e6e0: 6f 66 20 74 68 65 20 49 44 58 2d 74 68 20 6f 63  of the IDX-th oc
e6f0: 63 75 72 61 6e 63 65 20 6f 66 20 22 3f 22 20 69  curance of "?" i
e700: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
e710: 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56  QL.** string.  V
e720: 41 4c 55 45 20 69 73 20 74 68 65 20 6e 65 77 20  ALUE is the new 
e730: 76 61 6c 75 65 2e 20 20 49 66 20 46 4c 41 47 53  value.  If FLAGS
e740: 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41  =="null" then VA
e750: 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  LUE is.** ignore
e760: 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
e770: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
e780: 20 49 66 20 46 4c 41 47 53 3d 3d 22 73 74 61 74   If FLAGS=="stat
e790: 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ic" then.** the 
e7a0: 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
e7b0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
e7c0: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 6e  tatic variable n
e7d0: 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  amed.** "sqlite_
e7e0: 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
e7f0: 65 22 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  e".  If FLAGS=="
e800: 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20 61 20 63  normal" then a c
e810: 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41  opy.** of the VA
e820: 4c 55 45 20 69 73 20 6d 61 64 65 2e 20 20 49 66  LUE is made.  If
e830: 20 46 4c 41 47 53 3d 3d 22 62 6c 6f 62 31 30 22   FLAGS=="blob10"
e840: 20 74 68 65 6e 20 61 20 56 41 4c 55 45 20 69 73   then a VALUE is
e850: 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 20 61   ignored.** an a
e860: 20 31 30 2d 62 79 74 65 20 62 6c 6f 62 20 22 61   10-byte blob "a
e870: 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22  bc\000xyz\000pq"
e880: 20 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   is inserted..*/
e890: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
e8a0: 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 4e  _bind(.  void *N
e8b0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
e8c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
e8d0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
e8e0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
e8f0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
e900: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e920: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
e930: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
e940: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
e950: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
e960: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
e970: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
e980: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
e990: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66  .  int idx;.  if
e9a0: 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  ( argc!=5 ){.   
e9b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e9c0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
e9d0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
e9e0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
e9f0: 20 0a 20 20 20 20 20 20 20 22 20 56 4d 20 49 44   .       " VM ID
ea00: 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c 73 74  X VALUE (null|st
ea10: 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c  atic|normal)\"",
ea20: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
ea30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
ea40: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
ea50: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
ea60: 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20 29 20 72  [1], &pStmt) ) r
ea70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ea80: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
ea90: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
eaa0: 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
eab0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
eac0: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
ead0: 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a  ],"null")==0 ){.
eae0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
eaf0: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
eb00: 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65 20  , idx);.  }else 
eb10: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
eb20: 34 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d 30 20  4],"static")==0 
eb30: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
eb40: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
eb50: 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65  tmt, idx, sqlite
eb60: 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
eb70: 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 65  ue, -1, 0);.  }e
eb80: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
eb90: 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 2d 6e  rgv[4],"static-n
eba0: 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  bytes")==0 ){.  
ebb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
ebc0: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
ebd0: 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74  idx, sqlite_stat
ebe0: 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 0a 20  ic_bind_value,. 
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec10: 20 20 20 20 20 20 73 71 6c 69 74 65 5f 73 74 61        sqlite_sta
ec20: 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20  tic_bind_nbyte, 
ec30: 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
ec40: 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
ec50: 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20  normal")==0 ){. 
ec60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
ec70: 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
ec80: 20 69 64 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d   idx, argv[3], -
ec90: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
eca0: 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ENT);.  }else if
ecb0: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
ecc0: 2c 22 62 6c 6f 62 31 30 22 29 3d 3d 30 20 29 7b  ,"blob10")==0 ){
ecd0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ece0: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
ecf0: 74 2c 20 69 64 78 2c 20 22 61 62 63 5c 30 30 30  t, idx, "abc\000
ed00: 78 79 7a 5c 30 30 30 70 71 22 2c 20 31 30 2c 20  xyz\000pq", 10, 
ed10: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
ed20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
ed30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ed40: 74 65 72 70 2c 20 22 34 74 68 20 61 72 67 75 6d  terp, "4th argum
ed50: 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  ent should be ".
ed60: 20 20 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c          "\"null\
ed70: 22 20 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20  " or \"static\" 
ed80: 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20  or \"normal\"", 
ed90: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
eda0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
edb0: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
edc0: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
edd0: 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
ede0: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
edf0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
ee00: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
ee10: 66 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e  f[50];.    sprin
ee20: 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22  tf(zBuf, "(%d) "
ee30: 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
ee40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ee50: 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
ee60: 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
ee70: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ee80: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
ee90: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
eea0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
eeb0: 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55  IT_UTF16./*.** U
eec0: 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
eed0: 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20  ollate <db ptr> 
eee0: 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
eef0: 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a   <utf16be>.**.**
ef00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
ef10: 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
ef20: 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63  hat SQLite selec
ef30: 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  ts the correct c
ef40: 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75  ollation.** sequ
ef50: 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68  ence callback wh
ef60: 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73  en multiple vers
ef70: 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72  ions (for differ
ef80: 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ent text encodin
ef90: 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c  gs).** are avail
efa0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  able..**.** Call
efb0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
efc0: 20 72 65 67 69 73 74 65 72 73 20 74 68 65 20 63   registers the c
efd0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
efe0: 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  e "test_collate"
eff0: 0a 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61 73  .** with databas
f000: 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54  e handle <db>. T
f010: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
f020: 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73  nt must be a lis
f030: 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f  t of three.** bo
f040: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66  olean values. If
f050: 20 74 68 65 20 66 69 72 73 74 20 69 73 20 74 72   the first is tr
f060: 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69  ue, then a versi
f070: 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61  on of test_colla
f080: 74 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65  te is.** registe
f090: 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
f0a0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  f the second is 
f0b0: 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20  true, a version 
f0c0: 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  is registered fo
f0d0: 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69  r.** UTF-16le, i
f0e0: 66 20 74 68 65 20 74 68 69 72 64 20 69 73 20 74  f the third is t
f0f0: 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20  rue, a UTF-16be 
f100: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
f110: 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75  able..** Previou
f120: 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65  s versions of te
f130: 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64  st_collate are d
f140: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
f150: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
f160: 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74  ence test_collat
f170: 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  e is implemented
f180: 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a   by calling the.
f190: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  ** following TCL
f1a0: 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
f1b0: 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c   "test_collate <
f1c0: 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e  enc> <lhs> <rhs>
f1d0: 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73  ".**.** The <lhs
f1e0: 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20  > and <rhs> are 
f1f0: 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62  the two values b
f200: 65 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65  eing compared, e
f210: 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e  ncoded in UTF-8.
f220: 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61  .** The <enc> pa
f230: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
f240: 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63  ncoding of the c
f250: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
f260: 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65  n that.** SQLite
f270: 20 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c   selected to cal
f280: 6c 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74 20  l. The TCL test 
f290: 73 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74  script implement
f2a0: 73 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63  s the.** "test_c
f2b0: 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a  ollate" proc..**
f2c0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
f2d0: 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72  is will only wor
f2e0: 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 70  k with one intep
f2f0: 72 65 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c  reter at a time,
f300: 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72   as the.** inter
f310: 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65  p pointer to use
f320: 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67   when evaluating
f330: 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   the TCL script 
f340: 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
f350: 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
f360: 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  rp..*/.static Tc
f370: 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43  l_Interp* pTestC
f380: 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74  ollateInterp;.st
f390: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
f3a0: 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f  llate_func(.  vo
f3b0: 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  id *pCtx, .  int
f3c0: 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nA, const void 
f3d0: 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63  *zA,.  int nB, c
f3e0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
f3f0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
f400: 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49   = pTestCollateI
f410: 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63  nterp;.  int enc
f420: 69 6e 20 3d 20 28 69 6e 74 29 70 43 74 78 3b 0a  in = (int)pCtx;.
f430: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74    int res;.  int
f440: 20 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76   n;..  sqlite3_v
f450: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63  alue *pVal;.  Tc
f460: 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58  l_Obj *pX;..  pX
f470: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
f480: 4f 62 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74  Obj("test_collat
f490: 65 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  e", -1);.  Tcl_I
f4a0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ncrRefCount(pX);
f4b0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 6e 63 69  ..  switch( enci
f4c0: 6e 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  n ){.    case SQ
f4d0: 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20  LITE_UTF8:.     
f4e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f4f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54  ndElement(i,pX,T
f500: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f510: 22 55 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20  "UTF-8",-1));.  
f520: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
f530: 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ase SQLITE_UTF16
f540: 4c 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  LE:.      Tcl_Li
f550: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f560: 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53  nt(i,pX,Tcl_NewS
f570: 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36  tringObj("UTF-16
f580: 4c 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20  LE",-1));.      
f590: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
f5a0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3a 0a  SQLITE_UTF16BE:.
f5b0: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
f5c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f5d0: 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ,pX,Tcl_NewStrin
f5e0: 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c  gObj("UTF-16BE",
f5f0: 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  -1));.      brea
f600: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
f610: 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
f620: 0a 20 20 7d 0a 0a 20 20 70 56 61 6c 20 3d 20 73  .  }..  pVal = s
f630: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
f640: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
f650: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 41  eSetStr(pVal, nA
f660: 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c  , zA, encin, SQL
f670: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 6e  ITE_STATIC);.  n
f680: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
f690: 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20  _bytes(pVal);.  
f6a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f6b0: 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20  dElement(i,pX,. 
f6c0: 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
f6d0: 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
f6e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
f6f0: 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 73 71 6c  pVal),n));.  sql
f700: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
f710: 70 56 61 6c 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e  pVal, nB, zB, en
f720: 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  cin, SQLITE_STAT
f730: 49 43 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  IC);.  n = sqlit
f740: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
f750: 56 61 6c 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Val);.  Tcl_List
f760: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f770: 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 54 63 6c  (i,pX,.      Tcl
f780: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
f790: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
f7a0: 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29  ue_text(pVal),n)
f7b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
f7c0: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
f7d0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 2c  Tcl_EvalObjEx(i,
f7e0: 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44   pX, 0);.  Tcl_D
f7f0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ecrRefCount(pX);
f800: 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  .  Tcl_GetIntFro
f810: 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47 65 74 4f  mObj(i, Tcl_GetO
f820: 62 6a 52 65 73 75 6c 74 28 69 29 2c 20 26 72 65  bjResult(i), &re
f830: 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  s);.  return res
f840: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ;.}.static int t
f850: 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76  est_collate(.  v
f860: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
f870: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
f880: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
f890: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
f8a0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
f8b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
f8c0: 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71 6c 69 74  int val;.  sqlit
f8d0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
f8e0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
f8f0: 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20   objc!=5 ) goto 
f900: 62 61 64 5f 61 72 67 73 3b 0a 20 20 70 54 65 73  bad_args;.  pTes
f910: 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 20 3d  tCollateInterp =
f920: 20 69 6e 74 65 72 70 3b 0a 20 20 69 66 28 20 67   interp;.  if( g
f930: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
f940: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
f950: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
f960: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
f970: 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f  ROR;..  if( TCL_
f980: 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
f990: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
f9a0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29  , objv[2], &val)
f9b0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
f9c0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
f9d0: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
f9e0: 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63  tion(db, "test_c
f9f0: 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
fa00: 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 20  UTF8, .         
fa10: 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f   (void *)SQLITE_
fa20: 55 54 46 38 2c 20 76 61 6c 3f 74 65 73 74 5f 63  UTF8, val?test_c
fa30: 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
fa40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
fa50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
fa60: 20 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20   void *zUtf16;. 
fa70: 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
fa80: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
fa90: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
faa0: 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[3], &val) ) re
fab0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fac0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fad0: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
fae0: 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c  n(db, "test_coll
faf0: 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ate", SQLITE_UTF
fb00: 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20  16LE, .         
fb10: 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54     (void *)SQLIT
fb20: 45 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74  E_UTF16LE, val?t
fb30: 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
fb40: 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 54 43 4c  :0);.    if( TCL
fb50: 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
fb60: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
fb70: 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c  p, objv[4], &val
fb80: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
fb90: 52 52 4f 52 3b 0a 0a 23 69 66 20 30 0a 20 20 20  RROR;..#if 0.   
fba0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 4d 61   if( sqlite3_iMa
fbb0: 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a 20 20  llocFail>0 ){.  
fbc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c      sqlite3_iMal
fbd0: 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d  locFail++;.    }
fbe0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
fbf0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
fc00: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
fc10: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
fc20: 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20  lueNew(db);.    
fc30: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
fc40: 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 74 65  tr(pVal, -1, "te
fc50: 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c  st_collate", SQL
fc60: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
fc70: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55  _STATIC);.    zU
fc80: 74 66 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61  tf16 = sqlite3Va
fc90: 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
fca0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
fcb0: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
fcc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
fcd0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
fce0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
fcf0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
fd00: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
fd10: 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74  lation16(db, zUt
fd20: 66 31 36 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  f16, SQLITE_UTF1
fd30: 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  6BE, .          
fd40: 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55  (void *)SQLITE_U
fd50: 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73 74  TF16BE, val?test
fd60: 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29  _collate_func:0)
fd70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
fd80: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
fd90: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
fda0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
fdb0: 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 69 66  mutex);.  }.  if
fdc0: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
fdd0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
fde0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
fdf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a 20 20 69 66  L_ERROR;.  .  if
fe00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fe10: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
fe20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
fe30: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72  sqlite3TestError
fe40: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
fe50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
fe60: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
fe70: 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72   TCL_OK;..bad_ar
fe80: 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  gs:.  Tcl_Append
fe90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
fea0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
feb0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
fec0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
fed0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
fee0: 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66   0), " <DB> <utf
fef0: 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74  8> <utf16le> <ut
ff00: 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72  f16be>", 0);.  r
ff10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ff20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
ff30: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65  he collation nee
ff40: 64 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ded callback is 
ff50: 69 6e 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64 20  invoked, record 
ff60: 74 68 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20  the name of .** 
ff70: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
ff80: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
ff90: 20 68 65 72 65 2e 20 20 54 68 65 20 72 65 63 6f   here.  The reco
ffa0: 72 64 65 64 20 6e 61 6d 65 20 69 73 20 6c 69 6e  rded name is lin
ffb0: 6b 65 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c 20  ked.** to a TCL 
ffc0: 76 61 72 69 61 62 6c 65 20 61 6e 64 20 75 73 65  variable and use
ffd0: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
ffe0: 68 61 74 20 74 68 65 20 72 65 71 75 65 73 74 65  hat the requeste
fff0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e  d collation.** n
10000 61 6d 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ame is correct..
10010 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  */.static char z
10020 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
10030 32 30 30 5d 3b 0a 73 74 61 74 69 63 20 63 68 61  200];.static cha
10040 72 20 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  r *pzNeededColla
10050 74 69 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43 6f  tion = zNeededCo
10060 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a  llation;.../*.**
10070 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   Called when a c
10080 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10090 65 20 69 73 20 6e 65 65 64 65 64 2e 20 20 52 65  e is needed.  Re
100a0 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 0a 2a  gistered using.*
100b0 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  * sqlite3_collat
100c0 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e 0a  ion_needed16()..
100d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
100e0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
100f0 65 64 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70  ed_cb(.  void *p
10100 43 74 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  Ctx, .  sqlite3 
10110 2a 64 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  *db,.  int eText
10120 52 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Rep,.  const voi
10130 64 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e  d *pName.){.  in
10140 74 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  t enc = ENC(db);
10150 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
10160 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20 28   *z;.  for(z = (
10170 63 68 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d 30  char*)pName, i=0
10180 3b 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b  ; *z || z[1]; z+
10190 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20 29  +){.    if( *z )
101a0 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f   zNeededCollatio
101b0 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d  n[i++] = *z;.  }
101c0 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74  .  zNeededCollat
101d0 69 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71  ion[i] = 0;.  sq
101e0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
101f0 6c 61 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62  lation(.      db
10200 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
10210 2c 20 45 4e 43 28 64 62 29 2c 20 28 76 6f 69 64  , ENC(db), (void
10220 20 2a 29 65 6e 63 2c 20 74 65 73 74 5f 63 6f 6c   *)enc, test_col
10230 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f  late_func);.}../
10240 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f  *.** Usage: add_
10250 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
10260 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63  ded DB.*/.static
10270 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74   int test_collat
10280 65 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69 64  e_needed(.  void
10290 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
102a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
102b0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
102c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
102d0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
102e0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
102f0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
10300 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=2 ) goto bad_a
10310 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62  rgs;.  if( getDb
10320 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
10330 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10340 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
10350 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10360 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10370 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
10380 31 36 28 64 62 2c 20 30 2c 20 74 65 73 74 5f 63  16(db, 0, test_c
10390 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62  ollate_needed_cb
103a0 29 3b 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c  );.  zNeededColl
103b0 61 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20  ation[0] = 0;.  
103c0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
103d0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
103e0 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
103f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
10400 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64  urn TCL_OK;..bad
10410 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72 6f  _args:.  Tcl_Wro
10420 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10430 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29  , 1, objv, "DB")
10440 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
10450 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  RROR;.}../*.** t
10460 63 6c 63 6d 64 3a 20 20 20 61 64 64 5f 61 6c 69  clcmd:   add_ali
10470 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
10480 61 74 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a 2a 2a  ations  DB.**.**
10490 20 41 64 64 20 74 77 6f 20 6e 65 77 20 63 6f 6c   Add two new col
104a0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
104b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
104c0 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20 75 74   DB.**.**     ut
104d0 66 31 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a 20 20  f16_aligned.**  
104e0 20 20 20 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e     utf16_unalign
104f0 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 63 6f  ed.**.** Both co
10500 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10510 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 73  s use the same s
10520 6f 72 74 20 6f 72 64 65 72 20 61 73 20 42 49 4e  ort order as BIN
10530 41 52 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  ARY..** The only
10540 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 74   difference is t
10550 68 61 74 20 74 68 65 20 75 74 66 31 36 5f 61 6c  hat the utf16_al
10560 69 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 0a  igned collating.
10570 2a 2a 20 73 65 71 75 65 6e 63 65 20 69 73 20 64  ** sequence is d
10580 65 63 6c 61 72 65 64 20 77 69 74 68 20 74 68 65  eclared with the
10590 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
105a0 49 47 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a 20 42  IGNED flag..** B
105b0 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  oth collating fu
105c0 6e 63 74 69 6f 6e 73 20 69 6e 63 72 65 6d 65 6e  nctions incremen
105d0 74 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20  t the unaligned 
105e0 75 74 66 31 36 20 63 6f 75 6e 74 65 72 0a 2a 2a  utf16 counter.**
105f0 20 77 68 65 6e 65 76 65 72 20 74 68 65 79 20 73   whenever they s
10600 65 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  ee a string that
10610 20 62 65 67 69 6e 73 20 6f 6e 20 61 6e 20 6f 64   begins on an od
10620 64 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  d byte boundary.
10630 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
10640 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
10650 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 73 74 61  counter = 0;.sta
10660 74 69 63 20 69 6e 74 20 61 6c 69 67 6e 6d 65 6e  tic int alignmen
10670 74 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69  tCollFunc(.  voi
10680 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
10690 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
106a0 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
106b0 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
106c0 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
106d0 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d  int rc, n;.  n =
106e0 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e   nKey1<nKey2 ? n
106f0 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20  Key1 : nKey2;.  
10700 69 66 28 20 6e 4b 65 79 31 3e 30 20 26 26 20 31  if( nKey1>0 && 1
10710 3d 3d 28 31 26 28 69 6e 74 29 70 4b 65 79 31 29  ==(1&(int)pKey1)
10720 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72   ) unaligned_str
10730 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  ing_counter++;. 
10740 20 69 66 28 20 6e 4b 65 79 32 3e 30 20 26 26 20   if( nKey2>0 && 
10750 31 3d 3d 28 31 26 28 69 6e 74 29 70 4b 65 79 32  1==(1&(int)pKey2
10760 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74  ) ) unaligned_st
10770 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ring_counter++;.
10780 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b    rc = memcmp(pK
10790 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a  ey1, pKey2, n);.
107a0 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
107b0 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20     rc = nKey1 - 
107c0 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
107d0 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
107e0 20 69 6e 74 20 61 64 64 5f 61 6c 69 67 6e 6d 65   int add_alignme
107f0 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f  nt_test_collatio
10800 6e 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ns(.  void * cli
10810 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
10820 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
10830 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
10840 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
10850 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
10860 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e  *db;.  if( objc>
10870 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =2 ){.    if( ge
10880 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
10890 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
108a0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
108b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
108c0 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  OR;.    sqlite3_
108d0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
108e0 28 64 62 2c 20 22 75 74 66 31 36 5f 75 6e 61 6c  (db, "utf16_unal
108f0 69 67 6e 65 64 22 2c 0a 20 20 20 20 20 20 20 20  igned",.        
10900 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a 20  SQLITE_UTF16, . 
10910 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d         0, alignm
10920 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20  entCollFunc);.  
10930 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
10940 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
10950 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c 0a  utf16_aligned",.
10960 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55          SQLITE_U
10970 54 46 31 36 20 7c 20 53 51 4c 49 54 45 5f 55 54  TF16 | SQLITE_UT
10980 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20 0a 20 20  F16_ALIGNED, .  
10990 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65        0, alignme
109a0 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 7d  ntCollFunc);.  }
109b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
109c0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
109d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
109e0 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20 2a 2f 0a  _OMIT_UTF16) */.
109f0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64  ./*.** Usage: ad
10a00 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  d_test_function 
10a10 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20  <db ptr> <utf8> 
10a20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
10a30 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  be>.**.** This f
10a40 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
10a50 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
10a60 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20  ite selects the 
10a70 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a 2a 20  correct user.** 
10a80 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63  function callbac
10a90 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  k when multiple 
10aa0 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69  versions (for di
10ab0 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63  fferent text enc
10ac0 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61  odings).** are a
10ad0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
10ae0 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
10af0 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 75  tine registers u
10b00 70 20 74 6f 20 74 68 72 65 65 20 76 65 72 73 69  p to three versi
10b10 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65 72 20  ons of the user 
10b20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74 65 73  function.** "tes
10b30 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69 74 68  t_function" with
10b40 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
10b50 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65 20 73   <db>.  If the s
10b60 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
10b70 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20  s.** true, then 
10b80 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73  a version of tes
10b90 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  t_function is re
10ba0 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
10bb0 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20 74 68  -8, if the.** th
10bc0 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20 76  ird is true, a v
10bd0 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74  ersion is regist
10be0 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31 36 6c  ered for UTF-16l
10bf0 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72 74 68  e, if the fourth
10c00 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61 20 55   is.** true, a U
10c10 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20  TF-16be version 
10c20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 50  is available.  P
10c30 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
10c40 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75 6e 63   of.** test_func
10c50 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74 65 64  tion are deleted
10c60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73 65 72  ..**.** The user
10c70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
10c80 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c  lemented by call
10c90 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
10ca0 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a  g TCL script:.**
10cb0 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75 6e 63  .**   "test_func
10cc0 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72 67 3e  tion <enc> <arg>
10cd0 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 3c 65  ".**.** Where <e
10ce0 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 54  nc> is one of UT
10cf0 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20 6f 72  F-8, UTF-16LE or
10d00 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20 3c 61   UTF16BE, and <a
10d10 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20 73 69  rg> is the.** si
10d20 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 70 61  ngle argument pa
10d30 73 73 65 64 20 74 6f 20 74 68 65 20 53 51 4c 20  ssed to the SQL 
10d40 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61  function. The va
10d50 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 0a  lue returned by.
10d60 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72 69 70  ** the TCL scrip
10d70 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  t is used as the
10d80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
10d90 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f   the SQL functio
10da0 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61 73 73  n. It.** is pass
10db0 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75 73 69  ed to SQLite usi
10dc0 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f 72 20  ng UTF-16BE for 
10dd0 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66 75 6e  a UTF-8 test_fun
10de0 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38 0a 2a  ction(), UTF-8.*
10df0 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36 4c 45  * for a UTF-16LE
10e00 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29   test_function()
10e10 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45 20 66  , and UTF-16LE f
10e20 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  or an implementa
10e30 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70 72 65  tion that.** pre
10e40 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e 0a 2a  fers UTF-16BE..*
10e50 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
10e60 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74 61 74  _OMIT_UTF16.stat
10e70 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
10e80 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20 20 73 71  ction_utf8(.  sq
10e90 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
10ea0 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
10eb0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
10ec0 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63  e **argv.){.  Tc
10ed0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10ee0 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
10ef0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
10f00 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70   *pVal;.  interp
10f10 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a   = (Tcl_Interp *
10f20 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
10f30 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d  ta(pCtx);.  pX =
10f40 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10f50 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  j("test_function
10f60 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
10f70 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
10f80 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10f90 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10fa0 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74  p, pX, Tcl_NewSt
10fb0 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c  ringObj("UTF-8",
10fc0 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
10fd0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10fe0 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20  t(interp, pX, . 
10ff0 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
11000 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
11010 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
11020 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a  argv[0]), -1));.
11030 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
11040 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a  interp, pX, 0);.
11050 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
11060 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69 74 65  nt(pX);.  sqlite
11070 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
11080 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  tx, Tcl_GetStrin
11090 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
110a0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
110b0 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c 20 3d  SIENT);.  pVal =
110c0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
110d0 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
110e0 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
110f0 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
11100 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
11110 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
11120 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
11130 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
11140 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70  esult_text16be(p
11150 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
11160 75 65 5f 74 65 78 74 31 36 62 65 28 70 56 61 6c  ue_text16be(pVal
11170 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
11180 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
11190 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
111a0 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74  ee(pVal);.}.stat
111b0 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
111c0 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28 0a 20  ction_utf16le(. 
111d0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
111e0 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
111f0 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
11200 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
11210 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
11220 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
11230 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
11240 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
11250 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
11260 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
11270 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
11280 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
11290 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
112a0 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
112b0 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
112c0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
112d0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
112e0 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
112f0 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
11300 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54  16LE", -1));.  T
11310 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11320 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11330 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e  pX, .      Tcl_N
11340 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
11350 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
11360 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20  _text(argv[0]), 
11370 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
11380 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58  ObjEx(interp, pX
11390 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
113a0 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
113b0 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
113c0 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c  lueNew(0);.  sql
113d0 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
113e0 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65  pVal, -1, Tcl_Ge
113f0 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
11400 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51  terp), .      SQ
11410 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
11420 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  E_STATIC);.  sql
11430 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
11440 28 70 43 74 78 2c 28 63 68 61 72 2a 29 73 71 6c  (pCtx,(char*)sql
11450 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
11460 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54 45 5f  pVal),-1,SQLITE_
11470 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
11480 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
11490 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Val);.}.static v
114a0 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  oid test_functio
114b0 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73 71 6c  n_utf16be(.  sql
114c0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
114d0 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
114e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
114f0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c   **argv.){.  Tcl
11500 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
11510 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a  .  Tcl_Obj *pX;.
11520 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
11530 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20  *pVal;.  interp 
11540 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  = (Tcl_Interp *)
11550 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
11560 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20  a(pCtx);.  pX = 
11570 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11580 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  ("test_function"
11590 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
115a0 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
115b0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
115c0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
115d0 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72  , pX, Tcl_NewStr
115e0 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45  ingObj("UTF-16BE
115f0 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
11600 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11610 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
11620 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
11630 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
11640 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
11650 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29  t(argv[0]), -1))
11660 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
11670 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29  x(interp, pX, 0)
11680 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
11690 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c  ount(pX);.  pVal
116a0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
116b0 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
116c0 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
116d0 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
116e0 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
116f0 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
11700 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
11710 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
11720 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 28 70  _result_text16(p
11730 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
11740 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c  ue_text16le(pVal
11750 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
11760 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
11770 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
11780 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
11790 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
117a0 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
117b0 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
117c0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
117d0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
117e0 31 36 6c 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16le(pCtx, sqlit
117f0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
11800 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
11810 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
11820 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ENT);.  sqlite3V
11830 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
11840 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11850 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
11860 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
11870 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69  _function(.  voi
11880 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
11890 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
118a0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
118b0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
118c0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
118d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
118e0 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
118f0 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b   *db;.  int val;
11900 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
11910 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b  ) goto bad_args;
11920 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
11930 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
11940 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
11950 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
11960 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
11970 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
11980 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
11990 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
119a0 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
119b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
119c0 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71  f( val ){.    sq
119d0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
119e0 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ction(db, "test_
119f0 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51  function", 1, SQ
11a00 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
11a10 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74      interp, test
11a20 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 2c 20  _function_utf8, 
11a30 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
11a40 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
11a50 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
11a60 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
11a70 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
11a80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
11a90 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  val ){.    sqlit
11aa0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
11ab0 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e  on(db, "test_fun
11ac0 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54  ction", 1, SQLIT
11ad0 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20  E_UTF16LE, .    
11ae0 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74      interp, test
11af0 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c  _function_utf16l
11b00 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  e, 0, 0);.  }.  
11b10 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
11b20 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
11b30 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
11b40 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
11b50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
11b60 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71  f( val ){.    sq
11b70 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11b80 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ction(db, "test_
11b90 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51  function", 1, SQ
11ba0 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20  LITE_UTF16BE, . 
11bb0 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74         interp, t
11bc0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
11bd0 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  16be, 0, 0);.  }
11be0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
11bf0 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  K;.bad_args:.  T
11c00 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11c10 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
11c20 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
11c30 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f   \"",.      Tcl_
11c40 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
11c50 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
11c60 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  <DB> <utf8> <utf
11c70 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22  16le> <utf16be>"
11c80 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
11c90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
11ca0 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
11cb0 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  L_ERROR;.}../*.*
11cc0 2a 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20  * Usage:        
11cd0 20 74 65 73 74 5f 65 72 72 73 74 72 20 3c 65 72   test_errstr <er
11ce0 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65  r code>.**.** Te
11cf0 73 74 20 74 68 61 74 20 74 68 65 20 65 6e 67 6c  st that the engl
11d00 69 73 68 20 6c 61 6e 67 75 61 67 65 20 73 74 72  ish language str
11d10 69 6e 67 20 65 71 75 69 76 61 6c 65 6e 74 73 20  ing equivalents 
11d20 66 6f 72 20 73 71 6c 69 74 65 20 65 72 72 6f 72  for sqlite error
11d30 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73 61   codes.** are sa
11d40 6e 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  ne. The paramete
11d50 72 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  r is an integer 
11d60 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
11d70 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
11d80 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  e..** The result
11d90 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 77   is a list of tw
11da0 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20  o elements, the 
11db0 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
11dc0 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
11dd0 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 74  error code and t
11de0 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he english langu
11df0 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e  age explanation.
11e00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
11e10 65 73 74 5f 65 72 72 73 74 72 28 0a 20 20 76 6f  est_errstr(.  vo
11e20 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
11e30 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11e40 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
11e50 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
11e60 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
11e70 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69  char *zCode;.  i
11e80 6e 74 20 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63  nt i;.  if( objc
11e90 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
11ea0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11eb0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65  rp, 1, objv, "<e
11ec0 72 72 6f 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20  rror code>");.  
11ed0 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c  }..  zCode = Tcl
11ee0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11ef0 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1]);.  for(i=0; 
11f00 69 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<200; i++){.   
11f10 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 74   if( 0==strcmp(t
11f20 31 45 72 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a  1ErrorName(i), z
11f30 43 6f 64 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Code) ) break;. 
11f40 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75   }.  Tcl_SetResu
11f50 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
11f60 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72   *)sqlite3ErrStr
11f70 28 69 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  (i), 0);.  retur
11f80 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
11f90 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72 65  ** Usage:    bre
11fa0 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68  akpoint.**.** Th
11fb0 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74  is routine exist
11fc0 73 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73  s for one purpos
11fd0 65 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20 61  e - to provide a
11fe0 20 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61 0a   place to put a.
11ff0 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 69  ** breakpoint wi
12000 74 68 20 47 44 42 20 74 68 61 74 20 63 61 6e 20  th GDB that can 
12010 62 65 20 74 72 69 67 67 65 72 65 64 20 75 73 69  be triggered usi
12020 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54 68  ng TCL code.  Th
12030 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69  e use.** for thi
12040 73 20 69 73 20 77 68 65 6e 20 61 20 70 61 72 74  s is when a part
12050 69 63 75 6c 61 72 20 74 65 73 74 20 66 61 69 6c  icular test fail
12060 73 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20 31  s on (say) the 1
12070 34 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e 2e  485th iteration.
12080 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20 74  .** In the TCL t
12090 65 73 74 20 73 63 72 69 70 74 2c 20 77 65 20 63  est script, we c
120a0 61 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b 65  an add code like
120b0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
120c0 20 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62   if {$i==1485} b
120d0 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20  reakpoint.**.** 
120e0 54 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69 78  Then run testfix
120f0 74 75 72 65 20 69 6e 20 74 68 65 20 64 65 62 75  ture in the debu
12100 67 67 65 72 20 61 6e 64 20 77 61 69 74 20 66 6f  gger and wait fo
12110 72 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e 74  r the breakpoint
12120 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68   to.** fire.  Th
12130 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 72  en additional br
12140 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62 65  eakpoints can be
12150 20 73 65 74 20 74 6f 20 74 72 61 63 65 20 64 6f   set to trace do
12160 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73  wn the bug..*/.s
12170 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
12180 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69  reakpoint(.  voi
12190 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
121a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
121b0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
121c0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
121d0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
121e0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
121f0 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
12200 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
12210 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
12220 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
12230 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
12240 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
12250 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  .){.  return TCL
12260 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
12270 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a  Do nothing */.}.
12280 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
12290 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
122a0 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49 44 58 20  oblob  STMT IDX 
122b0 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  N.**.** Test the
122c0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
122d0 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65  roblob interface
122e0 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
122f0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
12300 0a 2a 2a 20 49 44 58 20 69 73 20 74 68 65 20 69  .** IDX is the i
12310 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
12320 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
12330 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
12340 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
12350 69 6e 64 73 20 61 20 4e 2d 62 79 74 65 20 7a 65  inds a N-byte ze
12360 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 20 74  ro-filled BLOB t
12370 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a  o the wildcard..
12380 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
12390 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  st_bind_zeroblob
123a0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
123b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
123c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
123d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
123e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
123f0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
12400 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
12410 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20   idx;.  int n;. 
12420 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
12430 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
12440 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
12450 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
12460 20 22 53 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a   "STMT IDX N");.
12470 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12480 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
12490 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
124a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
124b0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
124c0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
124d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
124e0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
124f0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
12500 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
12510 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12520 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
12530 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
12540 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72 65  bjv[3], &n) ) re
12550 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12560 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
12570 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 70 53  bind_zeroblob(pS
12580 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20 20  tmt, idx, n);.  
12590 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
125a0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
125b0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
125c0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
125d0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
125e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
125f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12600 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
12610 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
12620 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
12630 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53  ite3_bind_int  S
12640 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a  TMT N VALUE.**.*
12650 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
12660 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65  e3_bind_int inte
12670 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
12680 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
12690 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
126a0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
126b0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
126c0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
126d0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
126e0 2a 20 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74  * binds a 32-bit
126f0 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74   integer VALUE t
12700 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e  o that wildcard.
12710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
12720 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20  est_bind_int(.  
12730 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
12740 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
12750 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
12760 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
12770 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
12780 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
12790 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
127a0 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20  ;.  int value;. 
127b0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
127c0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
127d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
127e0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
127f0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
12800 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
12810 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
12820 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
12830 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c  " STMT N VALUE",
12840 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
12850 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
12860 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
12870 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
12880 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12890 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
128a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
128b0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
128c0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
128d0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
128e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
128f0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
12900 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
12910 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
12920 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  lue) ) return TC
12930 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
12940 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
12950 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  t(pStmt, idx, va
12960 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
12970 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
12980 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
12990 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
129a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
129b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
129c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
129d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
129e0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
129f0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
12a00 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
12a10 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d 54 20 4e  nd_int64  STMT N
12a20 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73   VALUE.**.** Tes
12a30 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
12a40 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65 72 66 61  nd_int64 interfa
12a50 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
12a60 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
12a70 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
12a80 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
12a90 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
12aa0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
12ab0 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
12ac0 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e  inds a 64-bit in
12ad0 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
12ae0 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
12af0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
12b00 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76  _bind_int64(.  v
12b10 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
12b20 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
12b30 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
12b40 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
12b50 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
12b60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12b70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
12b80 0a 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20  .  i64 value;.  
12b90 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
12ba0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
12bb0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
12bc0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
12bd0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
12be0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
12bf0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
12c00 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
12c10 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20   STMT N VALUE", 
12c20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
12c30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
12c40 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
12c50 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
12c60 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
12c70 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
12c80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12c90 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
12ca0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
12cb0 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
12cc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12cd0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
12ce0 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
12cf0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
12d00 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e  &value) ) return
12d10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
12d20 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
12d30 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 64  _int64(pStmt, id
12d40 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28  x, value);.  if(
12d50 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
12d60 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
12d70 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
12d80 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12d90 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
12da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12db0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12dc0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
12dd0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
12de0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
12df0 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 20  e3_bind_double  
12e00 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a  STMT N VALUE.**.
12e10 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
12e20 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20  te3_bind_double 
12e30 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
12e40 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
12e50 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
12e60 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
12e70 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
12e80 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
12e90 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
12ea0 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34  nd.** binds a 64
12eb0 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
12ec0 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
12ed0 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
12ee0 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75  nt test_bind_dou
12ef0 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ble(.  void * cl
12f00 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
12f10 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
12f20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
12f30 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
12f40 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
12f50 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
12f60 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75 62 6c  int idx;.  doubl
12f70 65 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  e value;.  int r
12f80 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c;.  const char 
12f90 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  *zVal;.  int i;.
12fa0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
12fb0 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
12fc0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
12fd0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
12fe0 65 20 73 70 65 63 69 61 6c 20 66 6c 6f 61 74 69  e special floati
12ff0 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 2a  ng point value *
13000 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  /.    unsigned i
13010 6e 74 20 69 55 70 70 65 72 3b 20 20 20 2f 2a 20  nt iUpper;   /* 
13020 55 70 70 65 72 20 33 32 20 62 69 74 73 20 2a 2f  Upper 32 bits */
13030 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
13040 74 20 69 4c 6f 77 65 72 3b 20 20 20 2f 2a 20 4c  t iLower;   /* L
13050 6f 77 65 72 20 33 32 20 62 69 74 73 20 2a 2f 0a  ower 32 bits */.
13060 20 20 7d 20 61 53 70 65 63 69 61 6c 46 70 5b 5d    } aSpecialFp[]
13070 20 3d 20 7b 0a 20 20 20 20 7b 20 20 22 4e 61 4e   = {.    {  "NaN
13080 22 2c 20 20 20 20 20 20 30 78 37 66 66 66 66 66  ",      0x7fffff
13090 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d  ff, 0xffffffff }
130a0 2c 0a 20 20 20 20 7b 20 20 22 53 4e 61 4e 22 2c  ,.    {  "SNaN",
130b0 20 20 20 20 20 30 78 37 66 66 37 66 66 66 66 2c       0x7ff7ffff,
130c0 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20   0xffffffff },. 
130d0 20 20 20 7b 20 20 22 2d 4e 61 4e 22 2c 20 20 20     {  "-NaN",   
130e0 20 20 30 78 66 66 66 66 66 66 66 66 2c 20 30 78    0xffffffff, 0x
130f0 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20  ffffffff },.    
13100 7b 20 20 22 2d 53 4e 61 4e 22 2c 20 20 20 20 30  {  "-SNaN",    0
13110 78 66 66 66 37 66 66 66 66 2c 20 30 78 66 66 66  xfff7ffff, 0xfff
13120 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20  fffff },.    {  
13130 22 2b 49 6e 66 22 2c 20 20 20 20 20 30 78 37 66  "+Inf",     0x7f
13140 66 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  f00000, 0x000000
13150 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 49  00 },.    {  "-I
13160 6e 66 22 2c 20 20 20 20 20 30 78 66 66 66 30 30  nf",     0xfff00
13170 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20  000, 0x00000000 
13180 7d 2c 0a 20 20 20 20 7b 20 20 22 45 70 73 69 6c  },.    {  "Epsil
13190 6f 6e 22 2c 20 20 30 78 30 30 30 30 30 30 30 30  on",  0x00000000
131a0 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d 2c 0a  , 0x00000001 },.
131b0 20 20 20 20 7b 20 20 22 2d 45 70 73 69 6c 6f 6e      {  "-Epsilon
131c0 22 2c 20 30 78 38 30 30 30 30 30 30 30 2c 20 30  ", 0x80000000, 0
131d0 78 30 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20  x00000001 },.   
131e0 20 7b 20 20 22 4e 61 4e 30 22 2c 20 20 20 20 20   {  "NaN0",     
131f0 30 78 37 66 66 38 30 30 30 30 2c 20 30 78 30 30  0x7ff80000, 0x00
13200 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
13210 20 22 2d 4e 61 4e 30 22 2c 20 20 20 20 30 78 66   "-NaN0",    0xf
13220 66 66 38 30 30 30 30 2c 20 30 78 30 30 30 30 30  ff80000, 0x00000
13230 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69  000 },.  };..  i
13240 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
13250 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13260 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
13270 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
13280 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
13290 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
132a0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
132b0 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
132c0 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
132d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
132e0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
132f0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
13300 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
13310 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
13320 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13330 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
13340 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
13350 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
13360 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
13370 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e 74  ERROR;..  /* Int
13380 65 72 63 65 70 74 20 74 68 65 20 73 74 72 69 6e  ercept the strin
13390 67 20 22 4e 61 4e 22 20 61 6e 64 20 67 65 6e 65  g "NaN" and gene
133a0 72 61 74 65 20 61 20 4e 61 4e 20 76 61 6c 75 65  rate a NaN value
133b0 20 66 6f 72 20 69 74 2e 0a 20 20 2a 2a 20 41 6c   for it..  ** Al
133c0 6c 20 6f 74 68 65 72 20 73 74 72 69 6e 67 73 20  l other strings 
133d0 61 72 65 20 70 61 73 73 65 64 20 74 68 72 6f 75  are passed throu
133e0 67 68 20 74 6f 20 54 63 6c 5f 47 65 74 44 6f 75  gh to Tcl_GetDou
133f0 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 2e 0a 20 20  bleFromObj()..  
13400 2a 2a 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65  ** Tcl_GetDouble
13410 46 72 6f 6d 4f 62 6a 28 29 20 73 68 6f 75 6c 64  FromObj() should
13420 20 75 6e 64 65 72 73 74 61 6e 64 20 22 4e 61 4e   understand "NaN
13430 22 20 62 75 74 20 73 6f 6d 65 20 76 65 72 73 69  " but some versi
13440 6f 6e 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  ons.  ** contain
13450 20 61 20 62 75 67 2e 0a 20 20 2a 2f 0a 20 20 7a   a bug..  */.  z
13460 56 61 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Val = Tcl_GetStr
13470 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
13480 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
13490 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73 69  f(aSpecialFp)/si
134a0 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 5b  zeof(aSpecialFp[
134b0 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
134c0 66 28 20 73 74 72 63 6d 70 28 61 53 70 65 63 69  f( strcmp(aSpeci
134d0 61 6c 46 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  alFp[i].zName, z
134e0 56 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Val)==0 ){.     
134f0 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
13500 78 3b 0a 20 20 20 20 20 20 78 20 3d 20 61 53 70  x;.      x = aSp
13510 65 63 69 61 6c 46 70 5b 69 5d 2e 69 55 70 70 65  ecialFp[i].iUppe
13520 72 3b 0a 20 20 20 20 20 20 78 20 3c 3c 3d 20 33  r;.      x <<= 3
13530 32 3b 0a 20 20 20 20 20 20 78 20 7c 3d 20 61 53  2;.      x |= aS
13540 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69 4c 6f 77  pecialFp[i].iLow
13550 65 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  er;.      assert
13560 28 20 73 69 7a 65 6f 66 28 76 61 6c 75 65 29 3d  ( sizeof(value)=
13570 3d 38 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =8 );.      asse
13580 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
13590 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
135a0 28 26 76 61 6c 75 65 2c 20 26 78 2c 20 38 29 3b  (&value, &x, 8);
135b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
135c0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e    }.  }.  if( i>
135d0 3d 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c  =sizeof(aSpecial
135e0 46 70 29 2f 73 69 7a 65 6f 66 28 61 53 70 65 63  Fp)/sizeof(aSpec
135f0 69 61 6c 46 70 5b 30 5d 29 20 26 26 0a 20 20 20  ialFp[0]) &&.   
13600 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75        Tcl_GetDou
13610 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  bleFromObj(inter
13620 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
13630 75 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ue) ){.    retur
13640 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
13650 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
13660 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d  bind_double(pStm
13670 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a  t, idx, value);.
13680 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
13690 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
136a0 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
136b0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
136c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
136d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
136e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
136f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
13700 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
13710 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
13720 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
13730 20 20 53 54 4d 54 20 4e 0a 2a 2a 0a 2a 2a 20 54    STMT N.**.** T
13740 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
13750 62 69 6e 64 5f 6e 75 6c 6c 20 69 6e 74 65 72 66  bind_null interf
13760 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
13770 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
13780 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
13790 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
137a0 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
137b0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
137c0 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
137d0 62 69 6e 64 73 20 61 20 4e 55 4c 4c 20 74 6f 20  binds a NULL to 
137e0 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  the wildcard..*/
137f0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
13800 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a 20 20 76 6f  _bind_null(.  vo
13810 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
13820 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
13830 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
13840 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
13850 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
13860 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
13870 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
13880 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
13890 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
138a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
138b0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
138c0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
138d0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
138e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
138f0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
13900 20 22 20 53 54 4d 54 20 4e 22 2c 20 30 29 3b 0a   " STMT N", 0);.
13910 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13920 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
13930 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
13940 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
13950 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
13960 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
13970 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
13980 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
13990 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
139a0 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
139b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
139c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
139d0 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
139e0 69 64 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  idx);.  if( sqli
139f0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
13a00 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
13a10 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
13a20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13a30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13a40 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
13a50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
13a60 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
13a70 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
13a80 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
13a90 64 5f 74 65 78 74 20 20 53 54 4d 54 20 4e 20 53  d_text  STMT N S
13aa0 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a  TRING BYTES.**.*
13ab0 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
13ac0 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 69 6e 74  e3_bind_text int
13ad0 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
13ae0 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
13af0 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
13b00 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
13b10 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
13b20 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
13b30 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
13b40 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d 38  ** binds a UTF-8
13b50 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74   string STRING t
13b60 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20  o the wildcard. 
13b70 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 42   The string is B
13b80 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f  YTES bytes.** lo
13b90 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
13ba0 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74  t test_bind_text
13bb0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
13bc0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
13bd0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
13be0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
13bf0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
13c00 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
13c10 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
13c20 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65   idx;.  int byte
13c30 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65  s;.  char *value
13c40 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
13c50 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
13c60 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13c70 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
13c80 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
13c90 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
13ca0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
13cb0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
13cc0 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
13cd0 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20  E BYTES", 0);.  
13ce0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13cf0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
13d00 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
13d10 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
13d20 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
13d30 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
13d40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
13d50 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
13d60 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
13d70 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
13d80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76  n TCL_ERROR;.  v
13d90 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63  alue = (char*)Tc
13da0 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
13db0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
13dc0 62 79 74 65 73 29 3b 0a 20 20 69 66 28 20 54 63  bytes);.  if( Tc
13dd0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
13de0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
13df0 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
13e00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
13e10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
13e20 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
13e30 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65 73 2c  x, value, bytes,
13e40 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
13e50 54 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  T);.  if( sqlite
13e60 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
13e70 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
13e80 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
13e90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13ea0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13eb0 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
13ec0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13ed0 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  , sqlite3TestErr
13ee0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
13ef0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13f00 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
13f10 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
13f20 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
13f30 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
13f40 36 20 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54  6 ?-static? STMT
13f50 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a   N STRING BYTES.
13f60 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
13f70 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
13f80 31 36 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  16 interface.  S
13f90 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
13fa0 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
13fb0 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
13fc0 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
13fd0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
13fe0 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
13ff0 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
14000 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 53   UTF-16 string S
14010 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c  TRING to the wil
14020 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72 69  dcard.  The stri
14030 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74 65  ng is BYTES byte
14040 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74  s.** long..*/.st
14050 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
14060 6e 64 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69  nd_text16(.  voi
14070 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
14080 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
14090 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
140a0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
140b0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
140c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
140d0 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
140e0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
140f0 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62  int idx;.  int b
14100 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61  ytes;.  char *va
14110 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
14120 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 29    void (*xDel)()
14130 20 3d 20 28 6f 62 6a 63 3d 3d 36 3f 53 51 4c 49   = (objc==6?SQLI
14140 54 45 5f 53 54 41 54 49 43 3a 53 51 4c 49 54 45  TE_STATIC:SQLITE
14150 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 54  _TRANSIENT);.  T
14160 63 6c 5f 4f 62 6a 20 2a 6f 53 74 6d 74 20 20 20  cl_Obj *oStmt   
14170 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 34 5d 3b   = objv[objc-4];
14180 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 4e 20 20  .  Tcl_Obj *oN  
14190 20 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63       = objv[objc
141a0 2d 33 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  -3];.  Tcl_Obj *
141b0 6f 53 74 72 69 6e 67 20 20 3d 20 6f 62 6a 76 5b  oString  = objv[
141c0 6f 62 6a 63 2d 32 5d 3b 0a 20 20 54 63 6c 5f 4f  objc-2];.  Tcl_O
141d0 62 6a 20 2a 6f 42 79 74 65 73 20 20 20 3d 20 6f  bj *oBytes   = o
141e0 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20  bjv[objc-1];..  
141f0 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
14200 62 6a 63 21 3d 36 29 7b 0a 20 20 20 20 54 63 6c  bjc!=6){.    Tcl
14210 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
14220 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
14230 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
14240 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
14250 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
14260 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
14270 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54  STMT N VALUE BYT
14280 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ES", 0);.    ret
14290 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
142a0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
142b0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
142c0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
142d0 53 74 6d 74 29 2c 20 26 70 53 74 6d 74 29 20 29  Stmt), &pStmt) )
142e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
142f0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
14300 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
14310 70 2c 20 6f 4e 2c 20 26 69 64 78 29 20 29 20 72  p, oN, &idx) ) r
14320 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14330 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72  .  value = (char
14340 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  *)Tcl_GetByteArr
14350 61 79 46 72 6f 6d 4f 62 6a 28 6f 53 74 72 69 6e  ayFromObj(oStrin
14360 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 54 63 6c  g, 0);.  if( Tcl
14370 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
14380 6e 74 65 72 70 2c 20 6f 42 79 74 65 73 2c 20 26  nterp, oBytes, &
14390 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
143a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
143b0 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
143c0 74 65 78 74 31 36 28 70 53 74 6d 74 2c 20 69 64  text16(pStmt, id
143d0 78 2c 20 28 76 6f 69 64 20 2a 29 76 61 6c 75 65  x, (void *)value
143e0 2c 20 62 79 74 65 73 2c 20 78 44 65 6c 29 3b 0a  , bytes, xDel);.
143f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
14400 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
14410 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
14420 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
14430 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
14440 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14450 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
14460 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
14470 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61  lite3TestErrorNa
14480 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
14490 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
144a0 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  ;.  }..#endif /*
144b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
144c0 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
144d0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
144e0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
144f0 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74 61  _bind_blob ?-sta
14500 74 69 63 3f 20 53 54 4d 54 20 4e 20 44 41 54 41  tic? STMT N DATA
14510 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73   BYTES.**.** Tes
14520 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
14530 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63  nd_blob interfac
14540 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
14550 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
14560 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
14570 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
14580 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
14590 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
145a0 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
145b0 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f 20 74 68  nds a BLOB to th
145c0 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  e wildcard.  The
145d0 20 42 4c 4f 42 20 69 73 20 42 59 54 45 53 20 62   BLOB is BYTES b
145e0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
145f0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
14600 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76 6f  _bind_blob(.  vo
14610 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
14620 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
14630 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
14640 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
14650 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
14660 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
14670 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
14680 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
14690 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e  har *value;.  in
146a0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
146b0 64 65 73 74 72 75 63 74 6f 72 5f 74 79 70 65 20  destructor_type 
146c0 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51  xDestructor = SQ
146d0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 3b 0a  LITE_TRANSIENT;.
146e0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
146f0 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20 20  & objc!=6 ){.   
14700 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
14710 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
14720 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
14730 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
14740 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
14750 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
14760 2c 20 22 20 53 54 4d 54 20 4e 20 44 41 54 41 20  , " STMT N DATA 
14770 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20  BYTES", 0);.    
14780 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14790 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a  ;.  }..  if( obj
147a0 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78 44 65 73  c==6 ){.    xDes
147b0 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45  tructor = SQLITE
147c0 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 6f 62 6a  _STATIC;.    obj
147d0 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  v++;.  }..  if( 
147e0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
147f0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
14800 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
14810 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
14820 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
14830 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
14840 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
14850 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
14860 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14870 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 53  value = Tcl_GetS
14880 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
14890 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
148a0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
148b0 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29  objv[4], &bytes)
148c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
148d0 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
148e0 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
148f0 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
14900 2c 20 62 79 74 65 73 2c 20 78 44 65 73 74 72 75  , bytes, xDestru
14910 63 74 6f 72 29 3b 0a 20 20 69 66 28 20 73 71 6c  ctor);.  if( sql
14920 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
14930 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
14940 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
14950 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14960 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14970 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
14980 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14990 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
149a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
149b0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
149c0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
149d0 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52  nt  STMT.**.** R
149e0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
149f0 20 6f 66 20 77 69 6c 64 63 61 72 64 73 20 69 6e   of wildcards in
14a00 20 74 68 65 20 67 69 76 65 6e 20 73 74 61 74 65   the given state
14a10 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
14a20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  int test_bind_pa
14a30 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a 20  rameter_count(. 
14a40 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
14a50 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
14a60 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
14a70 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
14a80 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
14a90 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
14aa0 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
14ab0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
14ac0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
14ad0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
14ae0 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
14af0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14b00 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
14b10 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
14b20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
14b30 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
14b40 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
14b50 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
14b60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
14b70 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
14b80 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
14b90 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ter_count(pStmt)
14ba0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
14bb0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
14bc0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
14bd0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
14be0 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a  me  STMT  N.**.*
14bf0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
14c00 65 20 6f 66 20 74 68 65 20 4e 74 68 20 77 69 6c  e of the Nth wil
14c10 64 63 61 72 64 2e 20 20 54 68 65 20 66 69 72 73  dcard.  The firs
14c20 74 20 77 69 6c 64 63 61 72 64 20 69 73 20 31 2e  t wildcard is 1.
14c30 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20 73 74 72  .** An empty str
14c40 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 20  ing is returned 
14c50 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72  if N is out of r
14c60 61 6e 67 65 20 6f 72 20 69 66 20 74 68 65 20 77  ange or if the w
14c70 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e 61  ildcard.** is na
14c80 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  meless..*/.stati
14c90 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
14ca0 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 0a  parameter_name(.
14cb0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
14cc0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
14cd0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
14ce0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
14cf0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
14d00 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
14d10 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
14d20 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
14d30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
14d40 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
14d50 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
14d60 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
14d70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
14d80 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
14d90 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
14da0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
14db0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
14dc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14dd0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
14de0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
14df0 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20 72  objv[2], &i) ) r
14e00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14e10 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
14e20 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20  ult(interp, .   
14e30 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
14e40 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  bj(sqlite3_bind_
14e50 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
14e60 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29 3b  Stmt,i),-1).  );
14e70 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
14e80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
14e90 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
14ea0 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
14eb0 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a    STMT  NAME.**.
14ec0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
14ed0 64 65 78 20 6f 66 20 74 68 65 20 77 69 6c 64 63  dex of the wildc
14ee0 61 72 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ard called NAME.
14ef0 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
14f00 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75 63  ere is.** no suc
14f10 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  h wildcard..*/.s
14f20 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
14f30 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
14f40 64 65 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  dex(.  void * cl
14f50 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
14f60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
14f70 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
14f80 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
14f90 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
14fa0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
14fb0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
14fc0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
14fd0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
14fe0 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45  objv, "STMT NAME
14ff0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
15000 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
15010 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
15020 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
15030 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
15040 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
15050 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15060 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
15070 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  t(interp, .     
15080 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20  Tcl_NewIntObj(. 
15090 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
150a0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
150b0 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74  ex(pStmt,Tcl_Get
150c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29  String(objv[2]))
150d0 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a 20 20 72  .     ).  );.  r
150e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
150f0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
15100 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69  sqlite3_clear_bi
15110 6e 64 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a  ndings STMT.**.*
15120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
15130 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  t_clear_bindings
15140 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
15150 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
15160 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
15170 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
15180 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
15190 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
151a0 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
151b0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
151c0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
151d0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
151e0 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
151f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15200 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
15210 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
15220 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
15230 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
15240 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
15250 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
15260 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
15270 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
15280 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69  sqlite3_clear_bi
15290 6e 64 69 6e 67 73 28 70 53 74 6d 74 29 29 29 3b  ndings(pStmt)));
152a0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
152b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
152c0 3a 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65  :   sqlite3_slee
152d0 70 20 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a  p MILLISECONDS.*
152e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
152f0 74 5f 73 6c 65 65 70 28 0a 20 20 76 6f 69 64 20  t_sleep(.  void 
15300 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
15310 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15320 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
15330 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
15340 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
15350 20 6d 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   ms;..  if( objc
15360 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
15370 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
15380 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4d 49  rp, 1, objv, "MI
15390 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20  LLISECONDS");.  
153a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
153b0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
153c0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
153d0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
153e0 20 26 6d 73 29 20 29 7b 0a 20 20 20 20 72 65 74   &ms) ){.    ret
153f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15400 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
15410 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
15420 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
15430 74 65 33 5f 73 6c 65 65 70 28 6d 73 29 29 29 3b  te3_sleep(ms)));
15440 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
15450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
15460 3a 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  : sqlite3_errcod
15470 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  e DB.**.** Retur
15480 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  n the string rep
15490 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
154a0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
154b0 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20  qlite3_* API.** 
154c0 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e  error code. e.g.
154d0 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e   "SQLITE_ERROR".
154e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
154f0 65 73 74 5f 65 72 72 63 6f 64 65 28 0a 20 20 76  est_errcode(.  v
15500 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15510 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15520 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15530 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15540 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15550 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
15560 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
15570 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28 20  Buf[30];..  if( 
15580 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
15590 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
155a0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
155b0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
155c0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
155d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
155e0 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
155f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
15600 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
15610 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
15620 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
15630 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
15640 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
15650 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
15660 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
15670 29 3b 0a 20 20 69 66 28 20 28 72 63 26 30 78 66  );.  if( (rc&0xf
15680 66 29 3d 3d 72 63 20 29 7b 0a 20 20 20 20 7a 42  f)==rc ){.    zB
15690 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c  uf[0] = 0;.  }el
156a0 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  se{.    sprintf(
156b0 7a 42 75 66 2c 22 2b 25 64 22 2c 20 72 63 3e 3e  zBuf,"+%d", rc>>
156c0 38 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70  8);.  }.  Tcl_Ap
156d0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
156e0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
156f0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 7a 42 75 66  orName(rc), zBuf
15700 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
15710 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
15720 55 73 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72  Usage:   test_er
15730 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  rmsg DB.**.** Re
15740 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 38 20  turns the UTF-8 
15750 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
15760 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
15770 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74  age string for t
15780 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
15790 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20  t sqlite3_* API 
157a0 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
157b0 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 28  int test_errmsg(
157c0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
157d0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
157e0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
157f0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
15800 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
15810 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
15820 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
15830 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  zErr;..  if( obj
15840 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
15850 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
15860 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
15870 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
15880 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
15890 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
158a0 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
158b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
158c0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
158d0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
158e0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
158f0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
15900 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15910 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71  OR;..  zErr = sq
15920 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
15930 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
15940 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
15950 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45  _NewStringObj(zE
15960 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74 75  rr, -1));.  retu
15970 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
15980 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65 73  .** Usage:   tes
15990 74 5f 65 72 72 6d 73 67 31 36 20 44 42 0a 2a 2a  t_errmsg16 DB.**
159a0 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20  .** Returns the 
159b0 55 54 46 2d 31 36 20 72 65 70 72 65 73 65 6e 74  UTF-16 represent
159c0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72  ation of the err
159d0 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e  or message strin
159e0 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73  g for the.** mos
159f0 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
15a00 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20 54 68 69  _* API call. Thi
15a10 73 20 69 73 20 61 20 62 79 74 65 20 61 72 72 61  s is a byte arra
15a20 79 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20  y object at the 
15a30 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c 20 61  TCL .** level, a
15a40 6e 64 20 69 74 20 69 6e 63 6c 75 64 65 73 20 74  nd it includes t
15a50 68 65 20 30 78 30 30 20 30 78 30 30 20 74 65 72  he 0x00 0x00 ter
15a60 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20 61 74  minator bytes at
15a70 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
15a80 2a 2a 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67  ** UTF-16 string
15a90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15aa0 74 65 73 74 5f 65 72 72 6d 73 67 31 36 28 0a 20  test_errmsg16(. 
15ab0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
15ac0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
15ad0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
15ae0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
15af0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
15b00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15b10 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
15b20 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
15b30 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20 20  t void *zErr;.  
15b40 69 6e 74 20 62 79 74 65 73 20 3d 20 30 3b 0a 0a  int bytes = 0;..
15b50 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
15b60 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
15b70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
15b80 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
15b90 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
15ba0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
15bb0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
15bc0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
15bd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
15be0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
15bf0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
15c00 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
15c10 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
15c20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
15c30 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65  zErr = sqlite3_e
15c40 72 72 6d 73 67 31 36 28 64 62 29 3b 0a 20 20 69  rrmsg16(db);.  i
15c50 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 62  f( zErr ){.    b
15c60 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 55 74  ytes = sqlite3Ut
15c70 66 31 36 42 79 74 65 4c 65 6e 28 7a 45 72 72 2c  f16ByteLen(zErr,
15c80 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f   -1);.  }.  Tcl_
15c90 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
15ca0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  erp, Tcl_NewByte
15cb0 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c 20 62  ArrayObj(zErr, b
15cc0 79 74 65 73 29 29 3b 0a 23 65 6e 64 69 66 20 2f  ytes));.#endif /
15cd0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
15ce0 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
15cf0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
15d00 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
15d10 70 72 65 70 61 72 65 20 44 42 20 73 71 6c 20 62  prepare DB sql b
15d20 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a  ytes tailvar.**.
15d30 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f  ** Compile up to
15d40 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f   <bytes> bytes o
15d50 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53  f the supplied S
15d60 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20  QL string <sql> 
15d70 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  using.** databas
15d80 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54  e handle <DB>. T
15d90 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61  he parameter <ta
15da0 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61  ilval> is the na
15db0 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a  me of a global.*
15dc0 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  * variable that 
15dd0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e  is set to the un
15de0 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  used portion of 
15df0 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20  <sql> (if any). 
15e00 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65  A.** STMT handle
15e10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
15e20 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
15e30 5f 70 72 65 70 61 72 65 28 0a 20 20 76 6f 69 64  _prepare(.  void
15e40 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
15e50 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15e60 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
15e70 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
15e80 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
15e90 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
15ea0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
15eb0 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f   int bytes;.  co
15ec0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20  nst char *zTail 
15ed0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
15ee0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
15ef0 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
15f00 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
15f10 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
15f20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
15f30 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
15f40 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
15f50 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
15f60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15f70 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
15f80 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c   bytes tailvar",
15f90 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
15fa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
15fb0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
15fc0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
15fd0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
15fe0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
15ff0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
16000 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
16010 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
16020 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
16030 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16040 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
16050 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16060 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
16070 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71  _prepare(db, zSq
16080 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74  l, bytes, &pStmt
16090 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28  , &zTail);.  if(
160a0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
160b0 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
160c0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
160d0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54  _ERROR;.  if( zT
160e0 61 69 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 62  ail ){.    if( b
160f0 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ytes>=0 ){.     
16100 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d   bytes = bytes -
16110 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20   (zTail-zSql);. 
16120 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
16130 6c 65 6e 28 7a 54 61 69 6c 29 3c 62 79 74 65 73  len(zTail)<bytes
16140 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20   ){.      bytes 
16150 3d 20 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b  = strlen(zTail);
16160 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f  .    }.    Tcl_O
16170 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
16180 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63  , objv[4], 0, Tc
16190 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
161a0 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29  Tail, bytes), 0)
161b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
161c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
161d0 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d   assert( pStmt==
161e0 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  0 );.    sprintf
161f0 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20  (zBuf, "(%d) ", 
16200 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  rc);.    Tcl_App
16210 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
16220 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f  , zBuf, sqlite3_
16230 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
16240 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16250 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
16260 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
16270 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
16280 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
16290 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
162a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
162b0 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
162c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
162d0 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
162e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
162f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
16300 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
16310 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65 73  _v2 DB sql bytes
16320 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43   tailvar.**.** C
16330 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
16340 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
16350 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
16360 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
16370 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
16380 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
16390 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
163a0 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
163b0 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
163c0 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
163d0 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
163e0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
163f0 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
16400 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
16410 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
16420 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
16430 70 61 72 65 5f 76 32 28 0a 20 20 76 6f 69 64 20  pare_v2(.  void 
16440 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
16450 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
16460 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
16470 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
16480 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
16490 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
164a0 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
164b0 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e  int bytes;.  con
164c0 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d  st char *zTail =
164d0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
164e0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
164f0 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
16500 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
16510 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
16520 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
16530 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
16540 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
16550 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
16560 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
16570 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
16580 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
16590 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
165a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
165b0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
165c0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
165d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
165e0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
165f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
16600 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
16610 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
16620 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
16630 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
16640 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
16650 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16660 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
16670 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
16680 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
16690 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20 61  mt, &zTail);.  a
166a0 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
166b0 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29  _OK || pStmt==0)
166c0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
166d0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
166e0 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
166f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16700 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20   if( zTail ){.  
16710 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29    if( bytes>=0 )
16720 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20  {.      bytes = 
16730 62 79 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d 7a  bytes - (zTail-z
16740 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
16750 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
16760 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
16770 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  0, Tcl_NewString
16780 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73  Obj(zTail, bytes
16790 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ), 0);.  }.  if(
167a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
167b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
167c0 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70  tmt==0 );.    sp
167d0 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64  rintf(zBuf, "(%d
167e0 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
167f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16800 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
16810 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
16820 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
16830 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16840 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
16850 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
16860 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
16870 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
16880 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
16890 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63  CL_ERROR;.    Tc
168a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
168b0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
168c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
168d0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
168e0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
168f0 65 70 61 72 65 5f 74 6b 74 33 31 33 34 20 44 42  epare_tkt3134 DB
16900 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
16910 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
16920 6d 65 6e 74 20 66 6f 72 20 61 20 7a 65 72 6f 2d  ment for a zero-
16930 62 79 74 65 20 73 74 72 69 6e 67 20 61 73 20 61  byte string as a
16940 20 74 65 73 74 0a 2a 2a 20 66 6f 72 20 74 69 63   test.** for tic
16950 6b 65 74 20 23 33 31 33 34 2e 20 20 54 68 65 20  ket #3134.  The 
16960 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65  string should be
16970 20 70 72 65 63 65 65 64 65 64 20 62 79 20 61 20   preceeded by a 
16980 7a 65 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73 74  zero byte..*/.st
16990 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
169a0 65 70 61 72 65 5f 74 6b 74 33 31 33 34 28 0a 20  epare_tkt3134(. 
169b0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
169c0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
169d0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
169e0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
169f0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
16a00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
16a10 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
16a20 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c 30  har zSql[] = "\0
16a30 30 30 53 45 4c 45 43 54 20 31 22 3b 0a 20 20 73  00SELECT 1";.  s
16a40 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
16a50 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  mt = 0;.  char z
16a60 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72  Buf[50];.  int r
16a70 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
16a80 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
16a90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
16aa0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
16ab0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
16ac0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
16ad0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
16ae0 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  " DB sql bytes t
16af0 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20  ailvar", 0);.   
16b00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16b10 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
16b20 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
16b30 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
16b40 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
16b50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16b60 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
16b70 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
16b80 20 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20 26 70   &zSql[1], 0, &p
16b90 53 74 6d 74 2c 20 30 29 3b 0a 20 20 61 73 73 65  Stmt, 0);.  asse
16ba0 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rt(rc==SQLITE_OK
16bb0 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20   || pStmt==0);. 
16bc0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
16bd0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
16be0 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
16bf0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
16c00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16c10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16c20 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
16c30 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25  printf(zBuf, "(%
16c40 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
16c50 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16c60 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
16c70 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
16c80 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
16c90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
16ca0 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
16cb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
16cc0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
16cd0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
16ce0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
16cf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
16d00 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16d10 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
16d20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
16d30 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
16d40 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
16d50 72 65 70 61 72 65 31 36 20 44 42 20 73 71 6c 20  repare16 DB sql 
16d60 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a  bytes tailvar.**
16d70 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74  .** Compile up t
16d80 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20  o <bytes> bytes 
16d90 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
16da0 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e  SQL string <sql>
16db0 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61   using.** databa
16dc0 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20  se handle <DB>. 
16dd0 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74  The parameter <t
16de0 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e  ailval> is the n
16df0 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a  ame of a global.
16e00 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  ** variable that
16e10 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75   is set to the u
16e20 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  nused portion of
16e30 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e   <sql> (if any).
16e40 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c   A.** STMT handl
16e50 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
16e60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
16e70 74 5f 70 72 65 70 61 72 65 31 36 28 0a 20 20 76  t_prepare16(.  v
16e80 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16e90 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16ea0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16eb0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16ec0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
16ed0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16ee0 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
16ef0 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
16f00 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f  void *zSql;.  co
16f10 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20  nst void *zTail 
16f20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  = 0;.  Tcl_Obj *
16f30 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  pTail = 0;.  sql
16f40 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
16f50 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
16f60 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63  f[50]; .  int rc
16f70 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20  ;.  int bytes;  
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16f90 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70 65   The integer spe
16fa0 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33 20  cified as arg 3 
16fb0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b  */.  int objlen;
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16fd0 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61 79  * The byte-array
16fe0 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32   length of arg 2
16ff0 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
17000 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
17010 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17020 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
17030 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
17040 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
17050 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
17060 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
17070 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20  tailvar", 0);.  
17080 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17090 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
170a0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
170b0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
170c0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
170d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
170e0 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = Tcl
170f0 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
17100 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f  mObj(objv[2], &o
17110 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63  bjlen);.  if( Tc
17120 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
17130 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
17140 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
17150 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
17160 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
17170 70 61 72 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c  pare16(db, zSql,
17180 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
17190 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28 20 73  &zTail);.  if( s
171a0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
171b0 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
171c0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
171d0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29  RROR;.  if( rc )
171e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
171f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
17200 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20  f( zTail ){.    
17210 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20  objlen = objlen 
17220 2d 20 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28  - ((u8 *)zTail-(
17230 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 7d 65  u8 *)zSql);.  }e
17240 6c 73 65 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20  lse{.    objlen 
17250 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 69 6c  = 0;.  }.  pTail
17260 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
17270 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61  rayObj((u8 *)zTa
17280 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 54  il, objlen);.  T
17290 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
172a0 70 54 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 4f 62  pTail);.  Tcl_Ob
172b0 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
172c0 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61   objv[4], 0, pTa
172d0 69 6c 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  il, 0);.  Tcl_De
172e0 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c  crRefCount(pTail
172f0 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20  );..  if( pStmt 
17300 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
17310 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
17320 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
17330 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
17340 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17350 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
17360 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
17370 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  f, 0);.#endif /*
17380 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
17390 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
173a0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
173b0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
173c0 72 65 70 61 72 65 31 36 5f 76 32 20 44 42 20 73  repare16_v2 DB s
173d0 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
173e0 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
173f0 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
17400 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
17410 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
17420 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
17430 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
17440 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
17450 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
17460 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
17470 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
17480 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
17490 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
174a0 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
174b0 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
174c0 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
174d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
174e0 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76  test_prepare16_v
174f0 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  2(.  void * clie
17500 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
17510 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
17520 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17530 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17540 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
17550 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
17560 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
17570 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c  const void *zSql
17580 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
17590 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c  zTail = 0;.  Tcl
175a0 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b  _Obj *pTail = 0;
175b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
175c0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
175d0 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20  ar zBuf[50]; .  
175e0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79  int rc;.  int by
175f0 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  tes;            
17600 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
17610 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20  er specified as 
17620 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f  arg 3 */.  int o
17630 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  bjlen;          
17640 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
17650 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66  -array length of
17660 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28   arg 2 */..  if(
17670 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
17680 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17690 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
176a0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
176b0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
176c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
176d0 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
176e0 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
176f0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
17700 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
17710 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
17720 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
17730 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
17740 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
17750 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
17760 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
17770 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
17780 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20  2], &objlen);.  
17790 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
177a0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
177b0 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
177c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
177d0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
177e0 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28  e3_prepare16_v2(
177f0 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c  db, zSql, bytes,
17800 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29   &pStmt, &zTail)
17810 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
17820 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
17830 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
17840 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17850 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
17860 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17870 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61 69  .  }..  if( zTai
17880 6c 20 29 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20  l ){.    objlen 
17890 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20  = objlen - ((u8 
178a0 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53  *)zTail-(u8 *)zS
178b0 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ql);.  }else{.  
178c0 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20    objlen = 0;.  
178d0 7d 0a 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f  }.  pTail = Tcl_
178e0 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
178f0 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a  (u8 *)zTail, obj
17900 6c 65 6e 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  len);.  Tcl_Incr
17910 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
17920 0a 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72  .  Tcl_ObjSetVar
17930 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
17940 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b  ], 0, pTail, 0);
17950 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
17960 75 6e 74 28 70 54 61 69 6c 29 3b 0a 0a 20 20 69  unt(pTail);..  i
17970 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
17980 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
17990 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
179a0 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
179b0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
179c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
179d0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
179e0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
179f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
17a00 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
17a10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
17a20 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
17a30 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69 6c  sqlite3_open fil
17a40 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c  ename ?options-l
17a50 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist?.*/.static i
17a60 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20 20  nt test_open(.  
17a70 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
17a80 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
17a90 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
17aa0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
17ab0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
17ac0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
17ad0 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  ilename;.  sqlit
17ae0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
17af0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
17b00 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
17b10 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 26 26  =3 && objc!=2 &&
17b20 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
17b30 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17b40 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
17b50 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
17b60 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
17b70 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
17b80 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d  v[0]), " filenam
17b90 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c  e options-list",
17ba0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
17bb0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
17bc0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6f 62    zFilename = ob
17bd0 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65 74 53 74  jc>1 ? Tcl_GetSt
17be0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 20 3a 20  ring(objv[1]) : 
17bf0 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
17c00 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  3_open(zFilename
17c10 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28  , &db);.  .  if(
17c20 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
17c30 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
17c40 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72  p, zBuf, db) ) r
17c50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17c60 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
17c70 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
17c80 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
17c90 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
17ca0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f  Usage: sqlite3_o
17cb0 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f  pen16 filename o
17cc0 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63  ptions.*/.static
17cd0 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 31 36   int test_open16
17ce0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
17cf0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
17d00 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
17d10 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
17d20 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
17d30 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
17d40 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
17d50 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c  const void *zFil
17d60 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  ename;.  sqlite3
17d70 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
17d80 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
17d90 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
17da0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
17db0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
17dc0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
17dd0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
17de0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
17df0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
17e00 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
17e10 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  s-list", 0);.   
17e20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17e30 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e  R;.  }..  zFilen
17e40 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ame = Tcl_GetByt
17e50 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
17e60 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 72 63 20  jv[1], 0);.  rc 
17e70 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  = sqlite3_open16
17e80 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29  (zFilename, &db)
17e90 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74  ;.  .  if( sqlit
17ea0 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
17eb0 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
17ec0 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e 20  f, db) ) return 
17ed0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
17ee0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
17ef0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
17f00 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
17f10 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
17f20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
17f30 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
17f40 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
17f50 31 36 20 3c 55 54 46 2d 31 36 20 73 74 72 69 6e  16 <UTF-16 strin
17f60 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  g>.**.** Return 
17f70 31 20 69 66 20 74 68 65 20 73 75 70 70 6c 69 65  1 if the supplie
17f80 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
17f90 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
17fa0 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a  tement, or zero.
17fb0 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
17fc0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
17fd0 5f 63 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20 76  _complete16(.  v
17fe0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17ff0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18000 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18010 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18020 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
18030 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
18040 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45  TE_OMIT_COMPLETE
18050 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
18060 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29  LITE_OMIT_UTF16)
18070 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a  .  char *zBuf;..
18080 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
18090 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
180a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
180b0 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20   objv, "<utf-16 
180c0 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72 65 74 75  sql>");.    retu
180d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
180e0 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 28 63 68 61  }..  zBuf = (cha
180f0 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72  r*)Tcl_GetByteAr
18100 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
18110 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65  1], 0);.  Tcl_Se
18120 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
18130 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
18140 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74  (sqlite3_complet
18150 65 31 36 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e  e16(zBuf)));.#en
18160 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
18170 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26 26 20 53  IT_COMPLETE && S
18180 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
18190 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
181a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
181b0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 74 65  age: sqlite3_ste
181c0 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76  p STMT.**.** Adv
181d0 61 6e 63 65 20 74 68 65 20 73 74 61 74 65 6d 65  ance the stateme
181e0 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  nt to the next r
181f0 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
18200 74 20 74 65 73 74 5f 73 74 65 70 28 0a 20 20 76  t test_step(.  v
18210 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18220 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18230 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18240 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18250 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18260 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
18270 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
18280 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
18290 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
182a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
182b0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
182c0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
182d0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
182e0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
182f0 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
18300 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18310 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
18320 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
18330 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
18340 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
18350 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18360 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
18370 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
18380 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63 21 3d  ;..  /* if( rc!=
18390 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72  SQLITE_DONE && r
183a0 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20  c!=SQLITE_ROW ) 
183b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
183c0 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65  ; */.  Tcl_SetRe
183d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
183e0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
183f0 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
18400 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
18410 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
18420 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20  e3_column_count 
18430 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75  STMT .**.** Retu
18440 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18450 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
18460 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61  d by the sql sta
18470 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a  tement STMT..*/.
18480 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
18490 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20  column_count(.  
184a0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
184b0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
184c0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
184d0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
184e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
184f0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
18500 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
18510 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
18520 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18530 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
18540 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
18550 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
18560 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
18570 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
18580 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
18590 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
185a0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
185b0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
185c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
185d0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
185e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
185f0 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  OR;..  Tcl_SetOb
18600 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
18610 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
18620 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
18630 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72  nt(pStmt)));.  r
18640 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18650 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
18660 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
18670 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
18680 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
18690 79 70 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  ype of the data 
186a0 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
186b0 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
186c0 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t row..*/.static
186d0 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
186e0 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20  _type(.  void * 
186f0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18700 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18710 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18720 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18730 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18740 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
18750 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74    int col;.  int
18760 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   tp;..  if( objc
18770 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
18780 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18790 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
187a0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
187b0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
187c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
187d0 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
187e0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
187f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18800 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
18810 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
18820 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
18830 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
18840 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18850 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
18860 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
18870 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
18880 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18890 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c  ROR;..  tp = sql
188a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
188b0 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
188c0 73 77 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20  switch( tp ){.  
188d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
188e0 54 45 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63  TEGER: .      Tc
188f0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
18900 72 70 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54  rp, "INTEGER", T
18910 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
18920 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
18930 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a  se SQLITE_NULL:.
18940 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
18950 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c  ult(interp, "NUL
18960 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  L", TCL_STATIC);
18970 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
18980 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
18990 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f  LOAT:.      Tcl_
189a0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
189b0 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53  , "FLOAT", TCL_S
189c0 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
189d0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
189e0 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20  QLITE_TEXT:.    
189f0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
18a00 69 6e 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20  interp, "TEXT", 
18a10 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
18a20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
18a30 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
18a40 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
18a50 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c  sult(interp, "BL
18a60 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  OB", TCL_STATIC)
18a70 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
18a80 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
18a90 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
18aa0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
18ab0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
18ac0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
18ad0 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f  mn_int64 STMT co
18ae0 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lumn.**.** Retur
18af0 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f  n the data in co
18b00 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66  lumn 'column' of
18b10 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
18b20 20 63 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77   cast as an.** w
18b30 69 64 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74  ide (64-bit) int
18b40 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
18b50 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
18b60 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  int64(.  void * 
18b70 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18b80 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18b90 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18ba0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18bb0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18bc0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
18bd0 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34    int col;.  i64
18be0 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62   iVal;..  if( ob
18bf0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
18c00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18c10 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
18c20 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
18c30 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
18c40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
18c50 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
18c60 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
18c70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18c80 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
18c90 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
18ca0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18cb0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
18cc0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18cd0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
18ce0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
18cf0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
18d00 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
18d10 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d  ERROR;..  iVal =
18d20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
18d30 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c  int64(pStmt, col
18d40 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
18d50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
18d60 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
18d70 69 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  iVal));.  return
18d80 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
18d90 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
18da0 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d  _column_blob STM
18db0 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74  T column.*/.stat
18dc0 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
18dd0 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20  mn_blob(.  void 
18de0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18df0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18e00 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18e10 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18e20 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
18e30 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
18e40 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20  ;.  int col;..  
18e50 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74  int len;.  const
18e60 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20   void *pBlob;.. 
18e70 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
18e80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
18e90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
18ea0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
18eb0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
18ec0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
18ed0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
18ee0 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
18ef0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18f00 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
18f10 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
18f20 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
18f30 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
18f40 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
18f50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
18f60 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
18f70 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
18f80 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
18f90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
18fa0 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63   len = sqlite3_c
18fb0 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
18fc0 74 2c 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62  t, col);.  pBlob
18fd0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
18fe0 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f  n_blob(pStmt, co
18ff0 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
19000 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
19010 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
19020 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b  bj(pBlob, len));
19030 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
19040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
19050 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
19060 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c  _double STMT col
19070 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  umn.**.** Return
19080 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c   the data in col
19090 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20  umn 'column' of 
190a0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
190b0 63 61 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65  cast as a double
190c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
190d0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  test_column_doub
190e0 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  le(.  void * cli
190f0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
19100 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
19110 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
19120 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
19130 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
19140 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
19150 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65  nt col;.  double
19160 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62   rVal;..  if( ob
19170 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
19180 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19190 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
191a0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
191b0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
191c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
191d0 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
191e0 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
191f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19200 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
19210 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
19220 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19230 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
19240 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19250 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
19260 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
19270 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
19280 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
19290 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d  ERROR;..  rVal =
192a0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
192b0 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f  double(pStmt, co
192c0 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
192d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
192e0 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28  cl_NewDoubleObj(
192f0 72 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  rVal));.  return
19300 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
19310 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
19320 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54  _data_count STMT
19330 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74   .**.** Return t
19340 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
19350 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
19360 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65   the sql stateme
19370 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74  nt STMT..*/.stat
19380 69 63 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61  ic int test_data
19390 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a  _count(.  void *
193a0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
193b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
193c0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
193d0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
193e0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
193f0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
19400 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
19410 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
19420 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19430 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
19440 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
19450 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
19460 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
19470 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
19480 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
19490 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
194a0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
194b0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
194c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
194d0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
194e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
194f0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
19500 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
19510 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
19520 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74  data_count(pStmt
19530 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
19540 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
19550 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
19560 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63  lumn_text STMT c
19570 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
19580 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
19590 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20  n_decltype STMT 
195a0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
195b0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
195c0 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c  mn_name STMT col
195d0 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
195e0 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  t test_stmt_utf8
195f0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
19600 74 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a  tData,        /*
19610 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69   Pointer to SQLi
19620 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  te API function 
19630 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a  to be invoke */.
19640 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
19650 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
19660 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
19670 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
19680 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
19690 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
196a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78   const char *(*x
196b0 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
196c0 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e  mt*, int);.  con
196d0 73 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a  st char *zRet;..
196e0 20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74    xFunc = (const
196f0 20 63 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74   char *(*)(sqlit
19700 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63  e3_stmt*, int))c
19710 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28  lientData;.  if(
19720 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
19730 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19740 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
19750 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
19760 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
19770 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19780 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
19790 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
197a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
197b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
197c0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
197d0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
197e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
197f0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
19800 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
19810 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
19820 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
19830 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
19840 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74  CL_ERROR;.  zRet
19850 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20   = xFunc(pStmt, 
19860 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74  col);.  if( zRet
19870 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
19880 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
19890 68 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a  har *)zRet, 0);.
198a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
198b0 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
198c0 6e 74 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72  nt test_global_r
198d0 65 63 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a  ecover(.  void *
198e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
198f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19900 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
19910 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
19920 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
19930 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c  f SQLITE_OMIT_GL
19940 4f 42 41 4c 52 45 43 4f 56 45 52 0a 20 20 69 6e  OBALRECOVER.  in
19950 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63  t rc;.  if( objc
19960 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
19970 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
19980 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 1, objv, "")
19990 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
199a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
199b0 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61   = sqlite3_globa
199c0 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a 20 20 54  l_recover();.  T
199d0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
199e0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
199f0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
19a00 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e 64 69  L_STATIC);.#endi
19a10 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
19a20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
19a30 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
19a40 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
19a50 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
19a60 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
19a70 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
19a80 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
19a90 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
19aa0 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
19ab0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
19ac0 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a  est_stmt_utf16(.
19ad0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
19ae0 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ata,     /* Poin
19af0 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
19b00 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
19b10 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63   invoked */.  Tc
19b20 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19b30 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
19b40 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
19b50 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
19b60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
19b70 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  16.  sqlite3_stm
19b80 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
19b90 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  col;.  Tcl_Obj *
19ba0 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f  pRet;.  const vo
19bb0 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63  id *zName16;.  c
19bc0 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46 75  onst void *(*xFu
19bd0 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
19be0 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e  *, int);..  xFun
19bf0 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 20  c = (const void 
19c00 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  *(*)(sqlite3_stm
19c10 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44  t*, int))clientD
19c20 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ata;.  if( objc!
19c30 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
19c40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19c50 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
19c60 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
19c70 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
19c80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
19c90 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
19ca0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
19cb0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
19cc0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
19cd0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
19ce0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19cf0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
19d00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19d10 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
19d20 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
19d30 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
19d40 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19d50 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20 3d  OR;..  zName16 =
19d60 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
19d70 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 31  l);.  if( zName1
19d80 36 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  6 ){.    pRet = 
19d90 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
19da0 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 73 71 6c  Obj(zName16, sql
19db0 69 74 65 33 55 74 66 31 36 42 79 74 65 4c 65 6e  ite3Utf16ByteLen
19dc0 28 7a 4e 61 6d 65 31 36 2c 20 2d 31 29 2b 32 29  (zName16, -1)+2)
19dd0 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
19de0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
19df0 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Ret);.  }.#endif
19e00 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19e10 55 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74 75  UTF16 */..  retu
19e20 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
19e30 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
19e40 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54  e3_column_int ST
19e50 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
19e60 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
19e70 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54  olumn_bytes STMT
19e80 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
19e90 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
19ea0 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54  umn_bytes16 STMT
19eb0 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74   column.**.*/.st
19ec0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
19ed0 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  mt_int(.  void *
19ee0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20   clientData,    
19ef0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51  /* Pointer to SQ
19f00 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f  Lite API functio
19f10 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
19f20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
19f30 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
19f40 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
19f50 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
19f60 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19f70 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
19f80 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  ;.  int (*xFunc)
19f90 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
19fa0 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d  int);..  xFunc =
19fb0 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a   (const void *(*
19fc0 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
19fd0 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61   int))clientData
19fe0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ;.  if( objc!=3 
19ff0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1a000 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a010 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1a020 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1a030 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1a040 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1a050 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1a060 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1a070 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1a080 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1a090 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1a0a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1a0b0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1a0c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a0d0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1a0e0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1a0f0 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
1a100 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a110 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
1a120 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1a130 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63  _NewIntObj(xFunc
1a140 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a  (pStmt, col)));.
1a150 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1a160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1a170 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67    sqlite_set_mag
1a180 69 63 20 20 44 42 20 20 4d 41 47 49 43 2d 4e 55  ic  DB  MAGIC-NU
1a190 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74  MBER.**.** Set t
1a1a0 68 65 20 64 62 2d 3e 6d 61 67 69 63 20 76 61 6c  he db->magic val
1a1b0 75 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ue.  This is use
1a1c0 64 20 74 6f 20 74 65 73 74 20 65 72 72 6f 72 20  d to test error 
1a1d0 72 65 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0a  recovery logic..
1a1e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
1a1f0 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 28 0a  lite_set_magic(.
1a200 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1a210 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1a220 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1a230 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1a240 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
1a250 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1a260 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1a270 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a280 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1a290 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a2a0 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
1a2b0 20 20 20 20 20 22 20 44 42 20 4d 41 47 49 43 22       " DB MAGIC"
1a2c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1a2d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a2e0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1a2f0 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
1a300 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
1a310 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1a320 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32  f( strcmp(argv[2
1a330 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43  ], "SQLITE_MAGIC
1a340 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a 20 20  _OPEN")==0 ){.  
1a350 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
1a360 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b  LITE_MAGIC_OPEN;
1a370 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
1a380 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
1a390 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45  LITE_MAGIC_CLOSE
1a3a0 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  D")==0 ){.    db
1a3b0 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
1a3c0 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20  _MAGIC_CLOSED;. 
1a3d0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1a3e0 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49  p(argv[2], "SQLI
1a3f0 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 22 29 3d  TE_MAGIC_BUSY")=
1a400 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
1a410 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
1a420 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  IC_BUSY;.  }else
1a430 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
1a440 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
1a450 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20 29 7b  IC_ERROR")==0 ){
1a460 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
1a470 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
1a480 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ROR;.  }else if(
1a490 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
1a4a0 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 64 62  rp, argv[2], &db
1a4b0 2d 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20 20 20  ->magic) ){.    
1a4c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a4d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
1a4e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1a4f0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1a500 69 6e 74 65 72 72 75 70 74 20 20 44 42 20 0a 2a  interrupt  DB .*
1a510 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20 61 6e 20  *.** Trigger an 
1a520 69 6e 74 65 72 72 75 70 74 20 6f 6e 20 44 42 0a  interrupt on DB.
1a530 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1a540 73 74 5f 69 6e 74 65 72 72 75 70 74 28 0a 20 20  st_interrupt(.  
1a550 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1a560 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1a570 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1a580 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1a590 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
1a5a0 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
1a5b0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1a5c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1a5d0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1a5e0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1a5f0 20 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c   argv[0], " DB",
1a600 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a610 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1a620 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1a630 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1a640 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1a650 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
1a660 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
1a670 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  db);.  return TC
1a680 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  L_OK;.}..static 
1a690 75 38 20 2a 73 71 6c 69 74 65 33 5f 73 74 61 63  u8 *sqlite3_stac
1a6a0 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20 30 3b 0a  k_baseline = 0;.
1a6b0 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
1a6c0 73 74 61 63 6b 20 77 69 74 68 20 61 20 6b 6e 6f  stack with a kno
1a6d0 77 6e 20 62 69 74 70 61 74 74 65 72 6e 2e 0a 2a  wn bitpattern..*
1a6e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
1a6f0 65 70 53 74 61 63 6b 28 76 6f 69 64 29 7b 0a 20  epStack(void){. 
1a700 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 62 69   int i;.  u32 bi
1a710 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 20 20 66  gBuf[65536];.  f
1a720 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
1a730 28 62 69 67 42 75 66 29 3b 20 69 2b 2b 29 20 62  (bigBuf); i++) b
1a740 69 67 42 75 66 5b 69 5d 20 3d 20 30 78 64 65 61  igBuf[i] = 0xdea
1a750 64 62 65 65 66 3b 0a 20 20 73 71 6c 69 74 65 33  dbeef;.  sqlite3
1a760 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20  _stack_baseline 
1a770 3d 20 28 75 38 2a 29 26 62 69 67 42 75 66 5b 36  = (u8*)&bigBuf[6
1a780 35 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  5536];.}../*.** 
1a790 47 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  Get the current 
1a7a0 73 74 61 63 6b 20 64 65 70 74 68 2e 20 20 55 73  stack depth.  Us
1a7b0 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
1a7c0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36 34 20 73 71   only..*/.u64 sq
1a7d0 6c 69 74 65 33 53 74 61 63 6b 44 65 70 74 68 28  lite3StackDepth(
1a7e0 76 6f 69 64 29 7b 0a 20 20 75 38 20 78 3b 0a 20  void){.  u8 x;. 
1a7f0 20 72 65 74 75 72 6e 20 28 75 36 34 29 28 73 71   return (u64)(sq
1a800 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65  lite3_stack_base
1a810 6c 69 6e 65 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f  line - &x);.}../
1a820 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1a830 69 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 20  ite3_stack_used 
1a840 44 42 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79  DB SQL.**.** Try
1a850 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
1a860 61 6d 6f 75 6e 74 20 6f 66 20 73 74 61 63 6b 20  amount of stack 
1a870 73 70 61 63 65 20 75 73 65 64 20 62 79 20 61 20  space used by a 
1a880 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
1a890 65 78 65 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69  exec.*/.static i
1a8a0 6e 74 20 74 65 73 74 5f 73 74 61 63 6b 5f 75 73  nt test_stack_us
1a8b0 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ed(.  void * cli
1a8c0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1a8d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1a8e0 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
1a8f0 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71  r **argv.){.  sq
1a900 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
1a910 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d   i;.  if( argc!=
1a920 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1a930 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a940 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1a950 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1a960 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1a970 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b    " DB SQL", 0);
1a980 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a990 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1a9a0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1a9b0 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1a9c0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1a9d0 5f 45 52 52 4f 52 3b 0a 20 20 70 72 65 70 53 74  _ERROR;.  prepSt
1a9e0 61 63 6b 28 29 3b 0a 20 20 28 76 6f 69 64 29 73  ack();.  (void)s
1a9f0 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
1aa00 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 30  argv[2], 0, 0, 0
1aa10 29 3b 0a 20 20 66 6f 72 28 69 3d 36 35 35 33 35  );.  for(i=65535
1aa20 3b 20 69 3e 3d 30 20 26 26 20 28 28 75 33 32 2a  ; i>=0 && ((u32*
1aa30 29 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62  )sqlite3_stack_b
1aa40 61 73 65 6c 69 6e 65 29 5b 2d 69 5d 3d 3d 30 78  aseline)[-i]==0x
1aa50 64 65 61 64 62 65 65 66 3b 20 69 2d 2d 29 7b 7d  deadbeef; i--){}
1aa60 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1aa70 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1aa80 4e 65 77 49 6e 74 4f 62 6a 28 69 2a 34 29 29 3b  NewIntObj(i*4));
1aa90 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1aaa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1aab0 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f  : sqlite_delete_
1aac0 66 75 6e 63 74 69 6f 6e 20 44 42 20 66 75 6e 63  function DB func
1aad0 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  tion-name.**.** 
1aae0 44 65 6c 65 74 65 20 74 68 65 20 75 73 65 72 20  Delete the user 
1aaf0 66 75 6e 63 74 69 6f 6e 20 27 66 75 6e 63 74 69  function 'functi
1ab00 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61  on-name' from da
1ab10 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 44 42  tabase handle DB
1ab20 2e 20 49 74 0a 2a 2a 20 69 73 20 61 73 73 75 6d  . It.** is assum
1ab30 65 64 20 74 68 61 74 20 74 68 65 20 75 73 65 72  ed that the user
1ab40 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 72   function was cr
1ab50 65 61 74 65 64 20 61 73 20 55 54 46 38 2c 20 61  eated as UTF8, a
1ab60 6e 79 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  ny number of.** 
1ab70 61 72 67 75 6d 65 6e 74 73 20 28 74 68 65 20 77  arguments (the w
1ab80 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  ay the TCL inter
1ab90 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a  face does it)..*
1aba0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c  /.static int del
1abb0 65 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ete_function(.  
1abc0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1abd0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1abe0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1abf0 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1ac00 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gv.){.  int rc;.
1ac10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1ac20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
1ac30 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1ac40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1ac50 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1ac60 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1ac70 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
1ac80 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22  B function-name"
1ac90 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1aca0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1acb0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1acc0 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
1acd0 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
1ace0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
1acf0 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
1ad00 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
1ad10 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c  argv[2], -1, SQL
1ad20 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20  ITE_UTF8, 0, 0, 
1ad30 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74  0, 0);.  Tcl_Set
1ad40 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
1ad50 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
1ad60 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
1ad70 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
1ad80 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1ad90 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c  sage: sqlite_del
1ada0 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44 42  ete_collation DB
1adb0 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a   collation-name.
1adc0 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  **.** Delete the
1add0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1ade0 6e 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e  nce 'collation-n
1adf0 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61  ame' from databa
1ae00 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44 42  se handle .** DB
1ae10 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
1ae20 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69  that the collati
1ae30 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73 20  on sequence was 
1ae40 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38 20  created as UTF8 
1ae50 28 74 68 65 20 0a 2a 2a 20 77 61 79 20 74 68 65  (the .** way the
1ae60 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64   TCL interface d
1ae70 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74  oes it)..*/.stat
1ae80 69 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 63 6f  ic int delete_co
1ae90 6c 6c 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20  llation(.  void 
1aea0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1aeb0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1aec0 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
1aed0 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
1aee0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1aef0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1af00 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
1af10 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1af20 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1af30 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1af40 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
1af50 20 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e          " DB fun
1af60 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b  ction-name", 0);
1af70 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1af80 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1af90 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1afa0 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1afb0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1afc0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1afd0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
1afe0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76  llation(db, argv
1aff0 5b 32 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  [2], SQLITE_UTF8
1b000 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53  , 0, 0);.  Tcl_S
1b010 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1b020 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
1b030 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
1b040 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
1b050 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1b060 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1b070 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44  get_autocommit D
1b080 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
1b090 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62  rue if the datab
1b0a0 61 73 65 20 44 42 20 69 73 20 63 75 72 72 65 6e  ase DB is curren
1b0b0 74 6c 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d  tly in auto-comm
1b0c0 69 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75  it mode..** Retu
1b0d0 72 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  rn false if not.
1b0e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1b0f0 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 0a 20  et_autocommit(. 
1b100 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1b110 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1b120 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b130 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
1b140 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42  rgv.){.  char zB
1b150 75 66 5b 33 30 5d 3b 0a 20 20 73 71 6c 69 74 65  uf[30];.  sqlite
1b160 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1b170 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1b180 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1b190 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1b1a0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1b1b0 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1b1c0 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a       " DB", 0);.
1b1d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b1e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1b1f0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1b200 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1b210 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1b220 45 52 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66  ERROR;.  sprintf
1b230 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 73 71 6c  (zBuf, "%d", sql
1b240 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
1b250 6d 69 74 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f  mit(db));.  Tcl_
1b260 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1b270 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
1b280 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1b290 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1b2a0 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
1b2b0 65 6f 75 74 20 44 42 20 4d 53 0a 2a 2a 0a 2a 2a  eout DB MS.**.**
1b2c0 20 53 65 74 20 74 68 65 20 62 75 73 79 20 74 69   Set the busy ti
1b2d0 6d 65 6f 75 74 2e 20 20 54 68 69 73 20 69 73 20  meout.  This is 
1b2e0 6d 6f 72 65 20 65 61 73 69 6c 79 20 64 6f 6e 65  more easily done
1b2f0 20 75 73 69 6e 67 20 74 68 65 20 74 69 6d 65 6f   using the timeo
1b300 75 74 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ut.** method of 
1b310 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63  the TCL interfac
1b320 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20  e.  But we need 
1b330 61 20 77 61 79 20 74 6f 20 74 65 73 74 20 74 68  a way to test th
1b340 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20  e case.** where 
1b350 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1b360 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73 74 61  E_MISUSE..*/.sta
1b370 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 75 73  tic int test_bus
1b380 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76 6f 69  y_timeout(.  voi
1b390 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1b3a0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1b3b0 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1b3c0 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1b3d0 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d 73 3b  ){.  int rc, ms;
1b3e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1b3f0 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
1b400 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1b410 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1b420 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1b430 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1b440 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
1b450 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1b460 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b470 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1b480 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1b490 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1b4a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b4b0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1b4c0 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d  (interp, argv[2]
1b4d0 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20  , &ms) ) return 
1b4e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1b4f0 3d 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  = sqlite3_busy_t
1b500 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29 3b 0a  imeout(db, ms);.
1b510 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1b520 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
1b530 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28  e3TestErrorName(
1b540 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
1b550 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1b560 2a 2a 20 55 73 61 67 65 3a 20 20 74 63 6c 5f 76  ** Usage:  tcl_v
1b570 61 72 69 61 62 6c 65 5f 74 79 70 65 20 56 41 52  ariable_type VAR
1b580 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  IABLENAME.**.** 
1b590 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
1b5a0 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  of the internal 
1b5b0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66  representation f
1b5c0 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  or the.** value 
1b5d0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 76 61 72  of the given var
1b5e0 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
1b5f0 20 69 6e 74 20 74 63 6c 5f 76 61 72 69 61 62 6c   int tcl_variabl
1b600 65 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a  e_type(.  void *
1b610 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1b620 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1b630 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1b640 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1b650 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f  objv[].){.  Tcl_
1b660 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69 66 28  Obj *pVar;.  if(
1b670 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1b680 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1b690 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1b6a0 2c 20 22 56 41 52 49 41 42 4c 45 22 29 3b 0a 20  , "VARIABLE");. 
1b6b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b6c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20  ROR;.  }.  pVar 
1b6d0 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28  = Tcl_GetVar2Ex(
1b6e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1b6f0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1b700 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52  0, TCL_LEAVE_ERR
1b710 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20 70 56 61  _MSG);.  if( pVa
1b720 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  r==0 ) return TC
1b730 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70  L_ERROR;.  if( p
1b740 56 61 72 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a  Var->typePtr ){.
1b750 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
1b760 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1b770 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56  _NewStringObj(pV
1b780 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
1b790 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72  e, -1));.  }.  r
1b7a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b7b0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1b7c0 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
1b7d0 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20  emory ?N?.**.** 
1b7e0 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61  Attempt to relea
1b7f0 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  se memory curren
1b800 74 6c 79 20 68 65 6c 64 20 62 75 74 20 6e 6f 74  tly held but not
1b810 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
1b820 65 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67  ed..** The integ
1b830 65 72 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  er N is the numb
1b840 65 72 20 6f 66 20 62 79 74 65 73 20 77 65 20 61  er of bytes we a
1b850 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 65 6c  re trying to rel
1b860 65 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a 20 72  ease.  The .** r
1b870 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1b880 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
1b890 6f 72 79 20 61 63 74 75 61 6c 6c 79 20 72 65 6c  ory actually rel
1b8a0 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eased..*/.static
1b8b0 20 69 6e 74 20 74 65 73 74 5f 72 65 6c 65 61 73   int test_releas
1b8c0 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64  e_memory(.  void
1b8d0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1b8e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1b8f0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1b900 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1b910 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20  T objv[].){.#if 
1b920 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1b930 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
1b940 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66  AGEMENT) && !def
1b950 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1b960 5f 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74 20 4e  _DISKIO).  int N
1b970 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69  ;.  int amt;.  i
1b980 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62  f( objc!=1 && ob
1b990 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1b9a0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1b9b0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1b9c0 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ?N?");.    retur
1b9d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b9e0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
1b9f0 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
1ba00 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1ba10 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29  rp, objv[1], &N)
1ba20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1ba30 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
1ba40 20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20    N = -1;.  }.  
1ba50 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  amt = sqlite3_re
1ba60 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b  lease_memory(N);
1ba70 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1ba80 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1ba90 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b  NewIntObj(amt));
1baa0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1bab0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1bac0 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
1bad0 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
1bae0 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72  t ?N?.**.** Quer
1baf0 79 20 6f 72 20 73 65 74 20 74 68 65 20 73 6f 66  y or set the sof
1bb00 74 20 68 65 61 70 20 6c 69 6d 69 74 20 66 6f 72  t heap limit for
1bb10 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
1bb20 65 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c 69 6d  ead.  The.** lim
1bb30 69 74 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67  it is only chang
1bb40 65 64 20 69 66 20 74 68 65 20 4e 20 69 73 20 70  ed if the N is p
1bb50 72 65 73 65 6e 74 2e 20 20 54 68 65 20 70 72 65  resent.  The pre
1bb60 76 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a 20 69  vious limit.** i
1bb70 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1bb80 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1bb90 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a  oft_heap_limit(.
1bba0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1bbb0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1bbc0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1bbd0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1bbe0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1bbf0 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 73  {.  static int s
1bc00 6f 66 74 48 65 61 70 4c 69 6d 69 74 20 3d 20 30  oftHeapLimit = 0
1bc10 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69  ;.  int amt;.  i
1bc20 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62  f( objc!=1 && ob
1bc30 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1bc40 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1bc50 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1bc60 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ?N?");.    retur
1bc70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1bc80 0a 20 20 61 6d 74 20 3d 20 73 6f 66 74 48 65 61  .  amt = softHea
1bc90 70 4c 69 6d 69 74 3b 0a 20 20 69 66 28 20 6f 62  pLimit;.  if( ob
1bca0 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  jc==2 ){.    int
1bcb0 20 4e 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f   N;.    if( Tcl_
1bcc0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1bcd0 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
1bce0 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  N) ) return TCL_
1bcf0 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
1bd00 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
1bd10 69 74 28 4e 29 3b 0a 20 20 20 20 73 6f 66 74 48  it(N);.    softH
1bd20 65 61 70 4c 69 6d 69 74 20 3d 20 4e 3b 0a 20 20  eapLimit = N;.  
1bd30 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
1bd40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1bd50 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29 29  _NewIntObj(amt))
1bd60 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1bd70 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1bd80 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 74 68 72  e:   sqlite3_thr
1bd90 65 61 64 5f 63 6c 65 61 6e 75 70 0a 2a 2a 0a 2a  ead_cleanup.**.*
1bda0 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74  * Call the sqlit
1bdb0 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
1bdc0 70 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63  p API..*/.static
1bdd0 20 69 6e 74 20 74 65 73 74 5f 74 68 72 65 61 64   int test_thread
1bde0 5f 63 6c 65 61 6e 75 70 28 0a 20 20 76 6f 69 64  _cleanup(.  void
1bdf0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1be00 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1be10 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1be20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1be30 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1be40 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
1be50 61 6e 75 70 28 29 3b 0a 20 20 72 65 74 75 72 6e  anup();.  return
1be60 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
1be70 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
1be80 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  te3_pager_refcou
1be90 6e 74 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  nts  DB.**.** Re
1bea0 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e  turn a list of n
1beb0 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65  umbers which are
1bec0 20 74 68 65 20 50 61 67 65 72 52 65 66 63 6f 75   the PagerRefcou
1bed0 6e 74 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61  nt for all.** pa
1bee0 67 65 72 73 20 6f 6e 20 65 61 63 68 20 64 61 74  gers on each dat
1bef0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1bf00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bf10 74 65 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f  test_pager_refco
1bf20 75 6e 74 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  unts(.  void * c
1bf30 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1bf40 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1bf50 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1bf60 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1bf70 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1bf80 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  3 *db;.  int i;.
1bf90 20 20 69 6e 74 20 76 2c 20 2a 61 3b 0a 20 20 54    int v, *a;.  T
1bfa0 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
1bfb0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1bfc0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1bfd0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1bfe0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1bff0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
1c000 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1c010 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
1c020 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30  0], 0), " DB", 0
1c030 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c040 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1c050 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1c060 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1c070 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1c080 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1c090 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 52 65 73 75  L_ERROR;.  pResu
1c0a0 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  lt = Tcl_NewObj(
1c0b0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1c0c0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1c0d0 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
1c0e0 5d 2e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ].pBt==0 ){.    
1c0f0 20 20 76 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65    v = -1;.    }e
1c100 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1c110 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1c120 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
1c130 20 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   a = sqlite3Page
1c140 72 53 74 61 74 73 28 73 71 6c 69 74 65 33 42 74  rStats(sqlite3Bt
1c150 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62  reePager(db->aDb
1c160 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 20  [i].pBt));.     
1c170 20 76 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20   v = a[0];.     
1c180 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1c190 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1c1a0 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c  .    }.    Tcl_L
1c1b0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1c1c0 65 6e 74 28 30 2c 20 70 52 65 73 75 6c 74 2c 20  ent(0, pResult, 
1c1d0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29  Tcl_NewIntObj(v)
1c1e0 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  );.  }.  Tcl_Set
1c1f0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1c200 2c 20 70 52 65 73 75 6c 74 29 3b 0a 20 20 72 65  , pResult);.  re
1c210 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c220 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
1c230 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69   working_64bit_i
1c240 6e 74 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43  nt.**.** Some TC
1c250 4c 20 62 75 69 6c 64 73 20 28 65 78 3a 20 63 79  L builds (ex: cy
1c260 67 77 69 6e 29 20 64 6f 20 6e 6f 74 20 73 75 70  gwin) do not sup
1c270 70 6f 72 74 20 36 34 2d 62 69 74 20 69 6e 74 65  port 64-bit inte
1c280 67 65 72 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6c  gers.  This.** l
1c290 65 61 64 73 20 74 6f 20 61 20 6e 75 6d 62 65 72  eads to a number
1c2a0 20 6f 66 20 74 65 73 74 20 66 61 69 6c 75 72 65   of test failure
1c2b0 73 2e 20 20 54 68 65 20 70 72 65 73 65 6e 74 20  s.  The present 
1c2c0 63 6f 6d 6d 61 6e 64 20 63 68 65 63 6b 73 20 74  command checks t
1c2d0 68 65 0a 2a 2a 20 54 43 4c 20 62 75 69 6c 64 20  he.** TCL build 
1c2e0 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
1c2f0 72 20 6e 6f 74 20 69 74 20 73 75 70 70 6f 72 74  r not it support
1c300 73 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  s 64-bit integer
1c310 73 2e 20 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e  s.  It.** return
1c320 73 20 54 52 55 45 20 69 66 20 69 74 20 64 6f 65  s TRUE if it doe
1c330 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e  s and FALSE if n
1c340 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ot..**.** This c
1c350 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
1c360 6f 20 77 61 72 6e 20 75 73 65 72 73 20 74 68 61  o warn users tha
1c370 74 20 74 68 65 69 72 20 54 43 4c 20 62 75 69 6c  t their TCL buil
1c380 64 20 69 73 20 64 65 66 65 63 74 69 76 65 0a 2a  d is defective.*
1c390 2a 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 65  * and that the e
1c3a0 72 72 6f 72 73 20 74 68 65 79 20 61 72 65 20 73  rrors they are s
1c3b0 65 65 69 6e 67 20 69 6e 20 74 68 65 20 74 65 73  eeing in the tes
1c3c0 74 20 73 63 72 69 70 74 73 20 6d 69 67 68 74 20  t scripts might 
1c3d0 62 65 0a 2a 2a 20 61 20 72 65 73 75 6c 74 20 6f  be.** a result o
1c3e0 66 20 74 68 65 69 72 20 64 65 66 65 63 74 69 76  f their defectiv
1c3f0 65 20 54 43 4c 20 72 61 74 68 65 72 20 74 68 61  e TCL rather tha
1c400 6e 20 70 72 6f 62 6c 65 6d 73 20 69 6e 20 53 51  n problems in SQ
1c410 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Lite..*/.static 
1c420 69 6e 74 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69  int working_64bi
1c430 74 5f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44  t_int(.  ClientD
1c440 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
1c450 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
1c460 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
1c470 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
1c480 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c490 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
1c4a0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
1c4b0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
1c4c0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
1c4d0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
1c4e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c4f0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
1c500 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1c510 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
1c520 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
1c530 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 65 73  .  Tcl_Obj *pTes
1c540 74 4f 62 6a 3b 0a 20 20 69 6e 74 20 77 6f 72 6b  tObj;.  int work
1c550 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 70 54 65 73  ing = 0;..  pTes
1c560 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69  tObj = Tcl_NewWi
1c570 64 65 49 6e 74 4f 62 6a 28 31 30 30 30 30 30 30  deIntObj(1000000
1c580 2a 28 69 36 34 29 31 32 33 34 35 36 37 38 39 30  *(i64)1234567890
1c590 29 3b 0a 20 20 77 6f 72 6b 69 6e 67 20 3d 20 73  );.  working = s
1c5a0 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72  trcmp(Tcl_GetStr
1c5b0 69 6e 67 28 70 54 65 73 74 4f 62 6a 29 2c 20 22  ing(pTestObj), "
1c5c0 31 32 33 34 35 36 37 38 39 30 30 30 30 30 30 30  1234567890000000
1c5d0 22 29 3d 3d 30 3b 0a 20 20 54 63 6c 5f 44 65 63  ")==0;.  Tcl_Dec
1c5e0 72 52 65 66 43 6f 75 6e 74 28 70 54 65 73 74 4f  rRefCount(pTestO
1c5f0 62 6a 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  bj);.  Tcl_SetOb
1c600 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1c610 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
1c620 6a 28 77 6f 72 6b 69 6e 67 29 29 3b 0a 20 20 72  j(working));.  r
1c630 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1c640 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
1c650 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73    vfs_unlink_tes
1c660 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  t.**.** This TCL
1c670 20 63 6f 6d 6d 61 6e 64 20 75 6e 72 65 67 69 73   command unregis
1c680 74 65 72 73 20 74 68 65 20 70 72 69 6d 61 72 79  ters the primary
1c690 20 56 46 53 20 61 6e 64 20 74 68 65 6e 20 72 65   VFS and then re
1c6a0 67 69 73 74 65 72 73 0a 2a 2a 20 69 74 20 62 61  gisters.** it ba
1c6b0 63 6b 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20  ck again.  This 
1c6c0 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
1c6d0 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 72  the ability to r
1c6e0 65 67 69 73 74 65 72 20 61 0a 2a 2a 20 56 46 53  egister a.** VFS
1c6f0 20 77 68 65 6e 20 6e 6f 6e 65 20 61 72 65 20 70   when none are p
1c700 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74  reviously regist
1c710 65 72 65 64 2c 20 61 6e 64 20 74 68 65 20 61 62  ered, and the ab
1c720 69 6c 69 74 79 20 74 6f 20 0a 2a 2a 20 75 6e 72  ility to .** unr
1c730 65 67 69 73 74 65 72 20 74 68 65 20 6f 6e 6c 79  egister the only
1c740 20 61 76 61 69 6c 61 62 6c 65 20 56 46 53 2e 20   available VFS. 
1c750 20 54 69 63 6b 65 74 20 23 32 37 33 38 0a 2a 2f   Ticket #2738.*/
1c760 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f  .static int vfs_
1c770 75 6e 6c 69 6e 6b 5f 74 65 73 74 28 0a 20 20 43  unlink_test(.  C
1c780 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1c790 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
1c7a0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
1c7b0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
1c7c0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1c7d0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1c7e0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1c7f0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1c800 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1c810 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
1c820 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c830 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1c840 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
1c850 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
1c860 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
1c870 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1c880 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1c890 4d 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Main;.  sqlite3_
1c8a0 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a  vfs *apVfs[20];.
1c8b0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e    sqlite3_vfs on
1c8c0 65 2c 20 74 77 6f 3b 0a 0a 20 20 73 71 6c 69 74  e, two;..  sqlit
1c8d0 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
1c8e0 72 28 30 29 3b 20 20 20 2f 2a 20 55 6e 72 65 67  r(0);   /* Unreg
1c8f0 69 73 74 65 72 20 6f 66 20 4e 55 4c 4c 20 69 73  ister of NULL is
1c900 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f   harmless */.  o
1c910 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e  ne.zName = "__on
1c920 65 22 3b 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65 20  e";.  two.zName 
1c930 3d 20 22 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a  = "__two";..  /*
1c940 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   Calling sqlite3
1c950 5f 76 66 73 5f 72 65 67 69 73 74 65 72 20 77 69  _vfs_register wi
1c960 74 68 20 32 6e 64 20 61 72 67 75 6d 65 6e 74 20  th 2nd argument 
1c970 6f 66 20 30 20 64 6f 65 73 20 6e 6f 74 0a 20 20  of 0 does not.  
1c980 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 64 65  ** change the de
1c990 66 61 75 6c 74 20 56 46 53 0a 20 20 2a 2f 0a 20  fault VFS.  */. 
1c9a0 20 70 4d 61 69 6e 20 3d 20 73 71 6c 69 74 65 33   pMain = sqlite3
1c9b0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
1c9c0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
1c9d0 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20  ster(&one, 0);. 
1c9e0 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d   assert( pMain==
1c9f0 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69  0 || pMain==sqli
1ca00 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
1ca10 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  );.  sqlite3_vfs
1ca20 5f 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20  _register(&two, 
1ca30 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d  0);.  assert( pM
1ca40 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d  ain==0 || pMain=
1ca50 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
1ca60 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 57 65  d(0) );..  /* We
1ca70 20 63 61 6e 20 66 69 6e 64 20 61 20 56 46 53 20   can find a VFS 
1ca80 62 79 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  by its name */. 
1ca90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1caa0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
1cab0 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73  ")==&one );.  as
1cac0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
1cad0 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d  s_find("__two")=
1cae0 3d 26 74 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43  =&two );..  /* C
1caf0 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 5f 76 66  alling sqlite_vf
1cb00 73 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20  s_register with 
1cb10 6e 6f 6e 2d 7a 65 72 6f 20 73 65 63 6f 6e 64 20  non-zero second 
1cb20 70 61 72 61 6d 65 74 65 72 20 63 68 61 6e 67 65  parameter change
1cb30 73 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75  s the.  ** defau
1cb40 6c 74 20 56 46 53 2c 20 65 76 65 6e 20 69 66 20  lt VFS, even if 
1cb50 74 68 65 20 31 73 74 20 70 61 72 61 6d 65 74 65  the 1st paramete
1cb60 72 20 69 73 20 61 6e 20 65 78 69 73 74 69 67 20  r is an existig 
1cb70 56 46 53 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  VFS that is.  **
1cb80 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69   previously regi
1cb90 73 74 65 72 65 64 20 61 73 20 74 68 65 20 6e 6f  stered as the no
1cba0 6e 2d 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a  n-default..  */.
1cbb0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
1cbc0 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b  gister(&one, 1);
1cbd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1cbe0 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f  e3_vfs_find("__o
1cbf0 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20  ne")==&one );.  
1cc00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1cc10 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22  vfs_find("__two"
1cc20 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73  )==&two );.  ass
1cc30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
1cc40 5f 66 69 6e 64 28 30 29 3d 3d 26 6f 6e 65 20 29  _find(0)==&one )
1cc50 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
1cc60 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20 31  register(&two, 1
1cc70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1cc80 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
1cc90 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a  _one")==&one );.
1cca0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ccb0 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77  3_vfs_find("__tw
1ccc0 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61  o")==&two );.  a
1ccd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
1cce0 66 73 5f 66 69 6e 64 28 30 29 3d 3d 26 74 77 6f  fs_find(0)==&two
1ccf0 20 29 3b 0a 20 20 69 66 28 20 70 4d 61 69 6e 20   );.  if( pMain 
1cd00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
1cd10 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69  fs_register(pMai
1cd20 6e 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  n, 1);.    asser
1cd30 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
1cd40 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
1cd50 6e 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ne );.    assert
1cd60 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
1cd70 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
1cd80 6f 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  o );.    assert(
1cd90 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1cda0 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20  d(0)==pMain );. 
1cdb0 20 7d 0a 20 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e   }.  .  /* Unlin
1cdc0 6b 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  k the default VF
1cdd0 53 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c  S.  Repeat until
1cde0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
1cdf0 72 65 20 56 46 53 65 73 0a 20 20 2a 2a 20 72 65  re VFSes.  ** re
1ce00 67 69 73 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 20  gistered..  */. 
1ce10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
1ce20 6f 66 28 61 70 56 66 73 29 2f 73 69 7a 65 6f 66  of(apVfs)/sizeof
1ce30 28 61 70 56 66 73 5b 30 5d 29 3b 20 69 2b 2b 29  (apVfs[0]); i++)
1ce40 7b 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d  {.    apVfs[i] =
1ce50 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1ce60 64 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70  d(0);.    if( ap
1ce70 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  Vfs[i] ){.      
1ce80 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d  assert( apVfs[i]
1ce90 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
1cea0 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61  nd(apVfs[i]->zNa
1ceb0 6d 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  me) );.      sql
1cec0 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
1ced0 74 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20  ter(apVfs[i]);. 
1cee0 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
1cef0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1cf00 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65  (apVfs[i]->zName
1cf10 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ) );.    }.  }. 
1cf20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
1cf30 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
1cf40 29 3b 0a 20 20 0a 20 20 2f 2a 20 52 65 67 69 73  );.  .  /* Regis
1cf50 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53  ter the main VFS
1cf60 20 61 73 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20   as non-default 
1cf70 28 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 64 65  (will be made de
1cf80 66 61 75 6c 74 2c 20 73 69 6e 63 65 0a 20 20 2a  fault, since.  *
1cf90 2a 20 69 74 27 6c 6c 20 62 65 20 74 68 65 20 6f  * it'll be the o
1cfa0 6e 6c 79 20 6f 6e 65 20 69 6e 20 65 78 69 73 74  nly one in exist
1cfb0 65 6e 63 65 29 2e 0a 20 20 2a 2f 0a 20 20 73 71  ence)..  */.  sq
1cfc0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
1cfd0 65 72 28 70 4d 61 69 6e 2c 20 30 29 3b 0a 20 20  er(pMain, 0);.  
1cfe0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1cff0 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61  vfs_find(0)==pMa
1d000 69 6e 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e  in );.  .  /* Un
1d010 2d 72 65 67 69 73 74 65 72 20 74 68 65 20 6d 61  -register the ma
1d020 69 6e 20 56 46 53 20 61 67 61 69 6e 20 74 6f 20  in VFS again to 
1d030 72 65 73 74 6f 72 65 20 61 6e 20 65 6d 70 74 79  restore an empty
1d040 20 56 46 53 20 6c 69 73 74 20 2a 2f 0a 20 20 73   VFS list */.  s
1d050 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67  qlite3_vfs_unreg
1d060 69 73 74 65 72 28 70 4d 61 69 6e 29 3b 0a 20 20  ister(pMain);.  
1d070 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
1d080 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
1d090 3b 0a 0a 20 20 2f 2a 20 52 65 6c 69 6e 6b 20 61  ;..  /* Relink a
1d0a0 6c 6c 20 56 46 53 65 73 20 69 6e 20 72 65 76 65  ll VFSes in reve
1d0b0 72 73 65 20 6f 72 64 65 72 2e 20 2a 2f 20 20 0a  rse order. */  .
1d0c0 20 20 66 6f 72 28 69 3d 73 69 7a 65 6f 66 28 61    for(i=sizeof(a
1d0d0 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56  pVfs)/sizeof(apV
1d0e0 66 73 5b 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20  fs[0])-1; i>=0; 
1d0f0 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 70  i--){.    if( ap
1d100 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  Vfs[i] ){.      
1d110 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
1d120 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 31  ster(apVfs[i], 1
1d130 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d140 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74   apVfs[i]==sqlit
1d150 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
1d160 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d170 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65  apVfs[i]==sqlite
1d180 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73  3_vfs_find(apVfs
1d190 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20  [i]->zName) );. 
1d1a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
1d1b0 6e 72 65 67 69 73 74 65 72 20 6f 75 74 20 73 61  nregister out sa
1d1c0 6d 70 6c 65 20 56 46 53 65 73 2e 20 2a 2f 0a 20  mple VFSes. */. 
1d1d0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
1d1e0 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20  egister(&one);. 
1d1f0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
1d200 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a 0a  egister(&two);..
1d210 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 69    /* Unregisteri
1d220 6e 67 20 61 20 56 46 53 20 74 68 61 74 20 69 73  ng a VFS that is
1d230 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
1d240 65 67 69 73 74 65 72 65 64 20 69 73 20 68 61 72  egistered is har
1d250 6d 6c 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74  mless */.  sqlit
1d260 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
1d270 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74  r(&one);.  sqlit
1d280 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
1d290 72 28 26 74 77 6f 29 3b 0a 20 20 61 73 73 65 72  r(&two);.  asser
1d2a0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
1d2b0 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20  ind("__one")==0 
1d2c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1d2d0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
1d2e0 5f 74 77 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20 20  _two")==0 );..  
1d2f0 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 62 65 20  /* We should be 
1d300 6c 65 66 74 20 77 69 74 68 20 74 68 65 20 6f 72  left with the or
1d310 69 67 69 6e 61 6c 20 64 65 66 61 75 6c 74 20 56  iginal default V
1d320 46 53 20 62 61 63 6b 20 61 73 20 74 68 65 0a 20  FS back as the. 
1d330 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a   ** original */.
1d340 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d350 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70  3_vfs_find(0)==p
1d360 4d 61 69 6e 20 29 3b 0a 0a 20 20 72 65 74 75 72  Main );..  retur
1d370 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d380 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73  ** tclcmd:   vfs
1d390 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 0a 2a  _initfail_test.*
1d3a0 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
1d3b0 6d 6d 61 6e 64 20 61 74 74 65 6d 70 74 73 20 74  mmand attempts t
1d3c0 6f 20 76 66 73 5f 66 69 6e 64 20 61 6e 64 20 76  o vfs_find and v
1d3d0 66 73 5f 72 65 67 69 73 74 65 72 20 77 68 65 6e  fs_register when
1d3e0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
1d3f0 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 6e 74  initialize() int
1d400 65 72 66 61 63 65 20 69 73 20 66 61 69 6c 69 6e  erface is failin
1d410 67 2e 20 20 41 6c 6c 20 63 61 6c 6c 73 20 73 68  g.  All calls sh
1d420 6f 75 6c 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74  ould fail..*/.st
1d430 61 74 69 63 20 69 6e 74 20 76 66 73 5f 69 6e 69  atic int vfs_ini
1d440 74 66 61 69 6c 5f 74 65 73 74 28 0a 20 20 43 6c  tfail_test(.  Cl
1d450 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1d460 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
1d470 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
1d480 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
1d490 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1d4a0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1d4b0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1d4c0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1d4d0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1d4e0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
1d4f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1d500 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1d510 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
1d520 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
1d530 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
1d540 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
1d550 76 66 73 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a  vfs one;.  one.z
1d560 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a  Name = "__one";.
1d570 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
1d580 66 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74  fs_find(0) ) ret
1d590 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d5a0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
1d5b0 69 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a  ister(&one, 0);.
1d5c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66    if( sqlite3_vf
1d5d0 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75  s_find(0) ) retu
1d5e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d5f0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
1d600 73 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20  ster(&one, 1);. 
1d610 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73   if( sqlite3_vfs
1d620 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72  _find(0) ) retur
1d630 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
1d640 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1d650 0a 2f 2a 0a 2a 2a 20 53 61 76 65 64 20 56 46 53  ./*.** Saved VFS
1d660 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  es.*/.static sql
1d670 69 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73 5b  ite3_vfs *apVfs[
1d680 32 30 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  20];.static int 
1d690 6e 56 66 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  nVfs = 0;../*.**
1d6a0 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75   tclcmd:   vfs_u
1d6b0 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a  nregister_all.**
1d6c0 0a 2a 2a 20 55 6e 72 65 67 69 73 74 65 72 20 61  .** Unregister a
1d6d0 6c 6c 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61  ll VFSes..*/.sta
1d6e0 74 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 72 65  tic int vfs_unre
1d6f0 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c  gister_all(.  Cl
1d700 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1d710 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
1d720 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
1d730 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
1d740 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1d750 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1d760 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1d770 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1d780 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1d790 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
1d7a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1d7b0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1d7c0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
1d7d0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
1d7e0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
1d7f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
1d800 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
1d810 79 53 69 7a 65 28 61 70 56 66 73 29 3b 20 69 2b  ySize(apVfs); i+
1d820 2b 29 7b 0a 20 20 20 20 61 70 56 66 73 5b 69 5d  +){.    apVfs[i]
1d830 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
1d840 69 6e 64 28 30 29 3b 0a 20 20 20 20 69 66 28 20  ind(0);.    if( 
1d850 61 70 56 66 73 5b 69 5d 3d 3d 30 20 29 20 62 72  apVfs[i]==0 ) br
1d860 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eak;.    sqlite3
1d870 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
1d880 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apVfs[i]);.  }. 
1d890 20 6e 56 66 73 20 3d 20 69 3b 0a 20 20 72 65 74   nVfs = i;.  ret
1d8a0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
1d8b0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66  .** tclcmd:   vf
1d8c0 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_reregister_all
1d8d0 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 61  .**.** Restore a
1d8e0 6c 6c 20 56 46 53 65 73 20 74 68 61 74 20 77 65  ll VFSes that we
1d8f0 72 65 20 72 65 6d 6f 76 65 64 20 75 73 69 6e 67  re removed using
1d900 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f   vfs_unregister_
1d910 61 6c 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  all.*/.static in
1d920 74 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72  t vfs_reregister
1d930 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61  _all(.  ClientDa
1d940 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
1d950 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
1d960 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
1d970 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
1d980 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1d990 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
1d9a0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
1d9b0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
1d9c0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
1d9d0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
1d9e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1d9f0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
1da00 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1da10 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
1da20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1da30 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1da40 3d 30 3b 20 69 3c 6e 56 66 73 3b 20 69 2b 2b 29  =0; i<nVfs; i++)
1da50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
1da60 73 5f 72 65 67 69 73 74 65 72 28 61 70 56 66 73  s_register(apVfs
1da70 5b 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a  [i], i==0);.  }.
1da80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1da90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  .}.../*.** tclcm
1daa0 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
1dab0 6c 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20  l_test DB.**.** 
1dac0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
1dad0 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
1dae0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
1daf0 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
1db00 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
1db10 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
1db20 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e same..*/.stati
1db30 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
1db40 6f 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  ol_test(.  Clien
1db50 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
1db60 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
1db70 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
1db80 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
1db90 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1dba0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1dbb0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1dbc0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1dbd0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1dbe0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
1dbf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1dc00 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1dc10 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1dc20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
1dc30 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
1dc40 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20  ){.  int iArg = 
1dc50 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
1dc60 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1dc70 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1dc80 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1dc90 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1dca0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1dcb0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
1dcc0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
1dcd0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
1dce0 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
1dcf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1dd00 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1dd10 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1dd20 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1dd30 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1dd40 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1dd50 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1dd60 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
1dd70 64 62 2c 20 30 2c 20 30 2c 20 26 69 41 72 67 29  db, 0, 0, &iArg)
1dd80 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
1dd90 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
1dda0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
1ddb0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
1ddc0 22 6e 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20  "notadatabase", 
1ddd0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
1dde0 4b 53 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a  KSTATE, &iArg);.
1ddf0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1de00 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
1de10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
1de20 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d  e_control(db, "m
1de30 61 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29  ain", -1, &iArg)
1de40 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
1de50 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
1de60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
1de70 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
1de80 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69 41 72  "temp", -1, &iAr
1de90 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  g);.  assert( rc
1dea0 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  ==SQLITE_ERROR )
1deb0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1dec0 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
1ded0 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f  lcmd:   sqlite3_
1dee0 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20  vfs_list.**.**  
1def0 20 52 65 74 75 72 6e 20 61 20 74 63 6c 20 6c 69   Return a tcl li
1df00 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
1df10 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 72  e names of all r
1df20 65 67 69 73 74 65 72 65 64 20 76 66 73 27 73 2e  egistered vfs's.
1df30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1df40 66 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69 65 6e  fs_list(.  Clien
1df50 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
1df60 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
1df70 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
1df80 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
1df90 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1dfa0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1dfb0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1dfc0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1dfd0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1dfe0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
1dff0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e000 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1e010 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1e020 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
1e030 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
1e040 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1e050 20 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f 4f 62   *pVfs;.  Tcl_Ob
1e060 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  j *pRet = Tcl_Ne
1e070 77 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20 6f 62  wObj();.  if( ob
1e080 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
1e090 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1e0a0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1e0b0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1e0c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1e0d0 66 6f 72 28 70 56 66 73 3d 73 71 6c 69 74 65 33  for(pVfs=sqlite3
1e0e0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 20 70 56  _vfs_find(0); pV
1e0f0 66 73 3b 20 70 56 66 73 3d 70 56 66 73 2d 3e 70  fs; pVfs=pVfs->p
1e100 4e 65 78 74 29 7b 0a 20 20 20 20 54 63 6c 5f 4c  Next){.    Tcl_L
1e110 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1e120 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
1e130 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1e140 62 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20  bj(pVfs->zName, 
1e150 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  -1));.  }.  Tcl_
1e160 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1e170 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 72 65  erp, pRet);.  re
1e180 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
1e190 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
1e1a0 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20    sqlite3_limit 
1e1b0 44 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a  DB ID VALUE.**.*
1e1c0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
1e1d0 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
1e1e0 74 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65 72 66  te3_limit interf
1e1f0 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
1e200 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
1e210 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d  ation of the sam
1e220 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e230 20 74 65 73 74 5f 6c 69 6d 69 74 28 0a 20 20 43   test_limit(.  C
1e240 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1e250 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
1e260 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
1e270 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
1e280 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1e290 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1e2a0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1e2b0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1e2c0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1e2d0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
1e2e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e2f0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1e300 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
1e310 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
1e320 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
1e330 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
1e340 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
1e350 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1e360 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
1e370 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69  r *zName;.     i
1e380 6e 74 20 69 64 3b 0a 20 20 7d 20 61 49 64 5b 5d  nt id;.  } aId[]
1e390 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49   = {.    { "SQLI
1e3a0 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 22  TE_LIMIT_LENGTH"
1e3b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ,              S
1e3c0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
1e3d0 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
1e3e0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
1e3f0 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
1e400 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  TH",          SQ
1e410 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
1e420 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20  ENGTH           
1e430 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
1e440 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 22 2c 20  _LIMIT_COLUMN", 
1e450 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1e460 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1e480 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
1e490 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
1e4a0 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ",          SQLI
1e4b0 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
1e4c0 50 54 48 20 20 20 20 20 20 20 20 20 20 20 7d 2c  PTH           },
1e4d0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
1e4e0 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
1e4f0 4c 45 43 54 22 2c 20 20 20 20 20 53 51 4c 49 54  LECT",     SQLIT
1e500 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
1e510 5f 53 45 4c 45 43 54 20 20 20 20 20 20 7d 2c 0a  _SELECT      },.
1e520 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
1e530 4d 49 54 5f 56 44 42 45 5f 4f 50 22 2c 20 20 20  MIT_VDBE_OP",   
1e540 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1e550 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20  _LIMIT_VDBE_OP  
1e560 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1e570 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
1e580 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 22  IT_FUNCTION_ARG"
1e590 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
1e5a0 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
1e5b0 52 47 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  RG         },.  
1e5c0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
1e5d0 54 5f 41 54 54 41 43 48 45 44 22 2c 20 20 20 20  T_ATTACHED",    
1e5e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
1e5f0 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20 20  IMIT_ATTACHED   
1e600 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1e610 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
1e620 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
1e630 4e 47 54 48 22 2c 20 53 51 4c 49 54 45 5f 4c 49  NGTH", SQLITE_LI
1e640 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
1e650 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a 20 20 20 20  _LENGTH  },.    
1e660 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
1e670 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 22  VARIABLE_NUMBER"
1e680 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d  ,     SQLITE_LIM
1e690 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
1e6a0 45 52 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 0a  ER      },.    .
1e6b0 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20 72 61      /* Out of ra
1e6c0 6e 67 65 20 74 65 73 74 20 63 61 73 65 73 20 2a  nge test cases *
1e6d0 2f 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  /.    { "SQLITE_
1e6e0 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22 2c  LIMIT_TOOSMALL",
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
1e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1e720 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
1e730 49 4d 49 54 5f 54 4f 4f 42 49 47 22 2c 20 20 20  IMIT_TOOBIG",   
1e740 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1e750 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
1e760 5f 4e 55 4d 42 45 52 2b 31 20 20 20 20 7d 2c 0a  _NUMBER+1    },.
1e770 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64    };.  int i, id
1e780 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 63  ;.  int val;.  c
1e790 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a  onst char *zId;.
1e7a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
1e7b0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1e7c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1e7d0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1e7e0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
1e7f0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1e800 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
1e810 5d 2c 20 30 29 2c 20 22 20 44 42 20 49 44 20 56  ], 0), " DB ID V
1e820 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  ALUE", 0);.    r
1e830 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e840 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1e850 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1e860 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1e870 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
1e880 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e890 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f 47 65 74  .  zId = Tcl_Get
1e8a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
1e8b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
1e8c0 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f 66  zeof(aId)/sizeof
1e8d0 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  (aId[0]); i++){.
1e8e0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
1e8f0 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d 65  Id, aId[i].zName
1e900 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 64  )==0 ){.      id
1e910 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b 0a 20 20   = aId[i].id;.  
1e920 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e930 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69  .  }.  if( i>=si
1e940 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f 66  zeof(aId)/sizeof
1e950 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20 20 20 20  (aId[0]) ){.    
1e960 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1e970 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77  (interp, "unknow
1e980 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a 20 22 2c  n limit type: ",
1e990 20 7a 49 64 2c 20 28 63 68 61 72 2a 29 30 29 3b   zId, (char*)0);
1e9a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e9b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1e9c0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1e9d0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1e9e0 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  3], &val) ) retu
1e9f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ea00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 69 6d  rc = sqlite3_lim
1ea10 69 74 28 64 62 2c 20 69 64 2c 20 76 61 6c 29 3b  it(db, id, val);
1ea20 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1ea30 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1ea40 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a  NewIntObj(rc));.
1ea50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ea60 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63    .}../*.** tclc
1ea70 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e 67 5f 73  md:  save_prng_s
1ea80 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65 20  tate.**.** Save 
1ea90 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
1eaa0 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e   pseudo-random n
1eab0 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  umber generator.
1eac0 0a 2a 2a 20 41 74 20 74 68 65 20 73 61 6d 65 20  .** At the same 
1ead0 74 69 6d 65 2c 20 76 65 72 69 66 79 20 74 68 61  time, verify tha
1eae0 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  t sqlite3_test_c
1eaf0 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 65 76 65  ontrol works eve
1eb00 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64  n when.** called
1eb10 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d   with an out-of-
1eb20 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e 0a 2a 2f  range opcode..*/
1eb30 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
1eb40 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43  _prng_state(.  C
1eb50 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1eb60 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
1eb70 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
1eb80 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
1eb90 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1eba0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1ebb0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1ebc0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1ebd0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1ebe0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
1ebf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ec00 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1ec10 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
1ec20 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
1ec30 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
1ec40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1ec50 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
1ec60 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b 0a 20 20  ontrol(9999);.  
1ec70 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b  assert( rc==0 );
1ec80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1ec90 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 2d 31 29  test_control(-1)
1eca0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
1ecb0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74  0 );.  sqlite3_t
1ecc0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1ecd0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
1ece0 5f 53 41 56 45 29 3b 0a 20 20 72 65 74 75 72 6e  _SAVE);.  return
1ecf0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
1ed00 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 74 6f 72   tclcmd:  restor
1ed10 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a  e_prng_state.*/.
1ed20 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 74 6f  static int resto
1ed30 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20  re_prng_state(. 
1ed40 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
1ed50 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
1ed60 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
1ed70 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
1ed80 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
1ed90 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1eda0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1edb0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1edc0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1edd0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
1ede0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1edf0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1ee00 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
1ee10 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
1ee20 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
1ee30 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
1ee40 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ee50 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ee60 50 52 4e 47 5f 52 45 53 54 4f 52 45 29 3b 0a 20  PRNG_RESTORE);. 
1ee70 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1ee80 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  }./*.** tclcmd: 
1ee90 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74   reset_prng_stat
1eea0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1eeb0 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65  reset_prng_state
1eec0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
1eed0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
1eee0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
1eef0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
1ef00 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
1ef10 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
1ef20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
1ef30 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
1ef40 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
1ef50 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ef70 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
1ef80 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
1ef90 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
1efa0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
1efb0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
1efc0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1efd0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1efe0 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 29 3b 0a  RL_PRNG_RESET);.
1eff0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1f000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
1f010 3a 20 20 70 63 61 63 68 65 5f 73 74 61 74 73 0a  :  pcache_stats.
1f020 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1f030 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73 28  st_pcache_stats(
1f040 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
1f050 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
1f060 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
1f070 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
1f080 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
1f090 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
1f0a0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
1f0b0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
1f0c0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
1f0d0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f0f0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
1f100 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
1f110 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
1f120 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
1f130 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
1f140 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20 6e 4d 61   nMin;.  int nMa
1f150 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e  x;.  int nCurren
1f160 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63 79 63 6c  t;.  int nRecycl
1f170 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  able;.  Tcl_Obj 
1f180 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c 69 74 65  *pRet;..  sqlite
1f190 33 50 63 61 63 68 65 53 74 61 74 73 28 26 6e 43  3PcacheStats(&nC
1f1a0 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78 2c 20 26  urrent, &nMax, &
1f1b0 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63 6c 61 62  nMin, &nRecyclab
1f1c0 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20 3d 20 54  le);..  pRet = T
1f1d0 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54  cl_NewObj();.  T
1f1e0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1f1f0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1f200 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
1f210 69 6e 67 4f 62 6a 28 22 63 75 72 72 65 6e 74 22  ingObj("current"
1f220 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
1f230 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1f240 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
1f250 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
1f260 43 75 72 72 65 6e 74 29 29 3b 0a 20 20 54 63 6c  Current));.  Tcl
1f270 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1f280 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
1f290 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
1f2a0 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d 31 29 29  gObj("max", -1))
1f2b0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
1f2c0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1f2d0 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
1f2e0 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78 29 29 3b  ewIntObj(nMax));
1f2f0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
1f300 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1f310 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
1f320 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 22  wStringObj("min"
1f330 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
1f340 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1f350 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
1f360 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
1f370 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Min));.  Tcl_Lis
1f380 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1f390 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
1f3a0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1f3b0 28 22 72 65 63 79 63 6c 61 62 6c 65 22 2c 20 2d  ("recyclable", -
1f3c0 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
1f3d0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1f3e0 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
1f3f0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 52 65 63  l_NewIntObj(nRec
1f400 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20 20 54 63  yclable));..  Tc
1f410 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1f420 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20  nterp, pRet);.. 
1f430 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1f440 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  }.../*.** Regist
1f450 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68  er commands with
1f460 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   the TCL interpr
1f470 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c  eter..*/.int Sql
1f480 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
1f490 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f4a0 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ){.  extern int 
1f4b0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
1f4c0 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
1f4d0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  nt sqlite3_inter
1f4e0 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  rupt_count;.  ex
1f4f0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
1f500 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
1f510 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
1f520 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e  qlite3_sort_coun
1f530 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
1f540 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
1f550 74 69 6d 65 3b 0a 20 20 65 78 74 65 72 6e 20 69  time;.  extern i
1f560 6e 74 20 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62  nt sqlite3_max_b
1f570 6c 6f 62 73 69 7a 65 3b 0a 20 20 65 78 74 65 72  lobsize;.  exter
1f580 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  n int sqlite3Btr
1f590 65 65 53 68 61 72 65 64 43 61 63 68 65 52 65 70  eeSharedCacheRep
1f5a0 6f 72 74 28 76 6f 69 64 2a 2c 0a 20 20 20 20 20  ort(void*,.     
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5d0 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 2a       Tcl_Interp*
1f5e0 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f 4e  ,int,Tcl_Obj*CON
1f5f0 53 54 2a 29 3b 0a 20 20 73 74 61 74 69 63 20 73  ST*);.  static s
1f600 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
1f610 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54  r *zName;.     T
1f620 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f  cl_CmdProc *xPro
1f630 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20  c;.  } aCmd[] = 
1f640 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f 65 6e 74  {.     { "db_ent
1f650 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  er",            
1f660 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
1f670 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65 72  mdProc*)db_enter
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1f690 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f 6c 65 61  ,.     { "db_lea
1f6a0 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ve",            
1f6b0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
1f6c0 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76 65  mdProc*)db_leave
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1f6e0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1f6f0 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20  3_mprintf_int", 
1f700 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
1f710 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
1f720 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d  mprintf_int    }
1f730 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1f740 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 22  3_mprintf_int64"
1f750 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ,         (Tcl_C
1f760 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
1f770 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d  mprintf_int64  }
1f780 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1f790 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20  3_mprintf_str", 
1f7a0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
1f7b0 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
1f7c0 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d  mprintf_str    }
1f7d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1f7e0 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 22 2c  3_snprintf_str",
1f7f0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
1f800 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
1f810 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 20 20 7d  snprintf_str   }
1f820 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1f830 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c  3_mprintf_stronl
1f840 79 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43  y",       (Tcl_C
1f850 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
1f860 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d  mprintf_stronly}
1f870 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1f880 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65  3_mprintf_double
1f890 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
1f8a0 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
1f8b0 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d  mprintf_double }
1f8c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1f8d0 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64  3_mprintf_scaled
1f8e0 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
1f8f0 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
1f900 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d  mprintf_scaled }
1f910 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1f920 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75  3_mprintf_hexdou
1f930 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d 64  ble",   (Tcl_Cmd
1f940 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
1f950 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 7d  rintf_hexdouble}
1f960 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1f970 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74  3_mprintf_z_test
1f980 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
1f990 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72  mdProc*)test_mpr
1f9a0 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c  intf_z        },
1f9b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1f9c0 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 22  _mprintf_n_test"
1f9d0 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
1f9e0 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69  dProc*)test_mpri
1f9f0 6e 74 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c 0a  ntf_n        },.
1fa00 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1fa10 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20  snprintf_int",  
1fa20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1fa30 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72 69  Proc*)test_snpri
1fa40 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a 20  ntf_int     },. 
1fa50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c      { "sqlite3_l
1fa60 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
1fa70 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ",     (Tcl_CmdP
1fa80 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72  roc*)test_last_r
1fa90 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20 20  owid       },.  
1faa0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
1fab0 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20  ec_printf",     
1fac0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
1fad0 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70 72  oc*)test_exec_pr
1fae0 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20 20  intf      },.   
1faf0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
1fb00 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
1fb10 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
1fb20 63 2a 29 74 65 73 74 5f 65 78 65 63 20 20 20 20  c*)test_exec    
1fb30 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1fb40 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63   { "sqlite3_exec
1fb50 5f 6e 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  _nr",           
1fb60 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1fb70 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e 72 20 20  *)test_exec_nr  
1fb80 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64          },.#ifnd
1fb90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47  ef SQLITE_OMIT_G
1fba0 45 54 5f 54 41 42 4c 45 0a 20 20 20 20 20 7b 20  ET_TABLE.     { 
1fbb0 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62  "sqlite3_get_tab
1fbc0 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20  le_printf",     
1fbd0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
1fbe0 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  est_get_table_pr
1fbf0 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  intf },.#endif. 
1fc00 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
1fc10 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20  lose",          
1fc20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1fc30 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74  roc*)sqlite_test
1fc40 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20  _close     },.  
1fc50 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72     { "sqlite3_cr
1fc60 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  eate_function", 
1fc70 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
1fc80 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f  oc*)test_create_
1fc90 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20  function  },.   
1fca0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
1fcb0 61 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20  ate_aggregate", 
1fcc0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
1fcd0 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61  c*)test_create_a
1fce0 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20  ggregate },.    
1fcf0 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73   { "sqlite_regis
1fd00 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  ter_test_functio
1fd10 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  n", (Tcl_CmdProc
1fd20 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  *)test_register_
1fd30 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20  func    },.     
1fd40 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22  { "sqlite_abort"
1fd50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fd60 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
1fd70 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20  )sqlite_abort   
1fd80 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
1fd90 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20   "sqlite_bind", 
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdb0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1fdc0 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20  test_bind       
1fdd0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
1fde0 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20  "breakpoint",   
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
1fe10 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20  est_breakpoint  
1fe20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
1fe30 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20 20  sqlite3_key",   
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
1fe60 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20  st_key          
1fe70 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1fe80 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20 20  qlite3_rekey",  
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1fea0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
1feb0 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20 20  t_rekey         
1fec0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1fed0 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c  lite_set_magic",
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
1fef0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
1ff00 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20 20  te_set_magic    
1ff10 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1ff20 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22 2c  ite3_interrupt",
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
1ff40 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
1ff50 69 6e 74 65 72 72 75 70 74 20 20 20 20 20 20 20  interrupt       
1ff60 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1ff70 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69  te_delete_functi
1ff80 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  on",        (Tcl
1ff90 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65  _CmdProc*)delete
1ffa0 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20 20  _function       
1ffb0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1ffc0 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69  e_delete_collati
1ffd0 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  on",       (Tcl_
1ffe0 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f  CmdProc*)delete_
1fff0 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d  collation      }
20000 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
20010 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
20020 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
20030 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f  mdProc*)get_auto
20040 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d 2c  commit        },
20050 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
20060 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20 20 20  _stack_used",   
20070 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
20080 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74 61 63  dProc*)test_stac
20090 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d 2c 0a  k_used       },.
200a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
200b0 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20  busy_timeout",  
200c0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
200d0 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79 5f  Proc*)test_busy_
200e0 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20  timeout     },. 
200f0 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c 20      { "printf", 
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20110 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
20120 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74 66  roc*)test_printf
20130 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
20140 20 20 20 7b 20 22 73 71 6c 69 74 65 33 49 6f 54     { "sqlite3IoT
20150 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20  race",          
20160 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
20170 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 20  *)test_io_trace 
20180 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a          },.  };.
20190 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
201a0 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  {.     char *zNa
201b0 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a  me;.     Tcl_Obj
201c0 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a  CmdProc *xProc;.
201d0 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e       void *clien
201e0 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43  tData;.  } aObjC
201f0 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  md[] = {.     { 
20200 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74  "sqlite3_connect
20210 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20 20 20  ion_pointer",   
20220 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e   get_sqlite_poin
20230 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ter, 0 },.     {
20240 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69   "sqlite3_bind_i
20250 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
20260 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c    test_bind_int,
20270 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20        0 },.     
20280 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
20290 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20  zeroblob",      
202a0 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72     test_bind_zer
202b0 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20  oblob, 0 },.    
202c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
202d0 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
202e0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
202f0 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20  t64,    0 },.   
20300 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
20310 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  d_double",      
20320 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64       test_bind_d
20330 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20  ouble,   0 },.  
20340 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
20350 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20  nd_null",       
20360 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
20370 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20  null     ,0 },. 
20380 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
20390 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20  ind_text",      
203a0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
203b0 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a  _text     ,0 },.
203c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
203d0 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20  bind_text16",   
203e0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
203f0 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c  d_text16   ,0 },
20400 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
20410 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20  _bind_blob",    
20420 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
20430 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d  nd_blob     ,0 }
20440 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
20450 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
20460 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62  _count",  test_b
20470 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
20480 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  unt, 0},.     { 
20490 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  "sqlite3_bind_pa
204a0 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20  rameter_name",  
204b0 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
204c0 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a  eter_name,  0},.
204d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
204e0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
204f0 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62 69 6e  ndex",  test_bin
20500 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
20510 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  x, 0},.     { "s
20520 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e  qlite3_clear_bin
20530 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20 20 74  dings",        t
20540 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  est_clear_bindin
20550 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  gs, 0},.     { "
20560 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c 20  sqlite3_sleep", 
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20580 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20 20 20  test_sleep,     
20590 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
205a0 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  "sqlite3_errcode
205b0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
205c0 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20   test_errcode   
205d0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
205e0 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   "sqlite3_errmsg
205f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
20600 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20 20    test_errmsg   
20610 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
20620 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  { "sqlite3_errms
20630 67 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  g16",           
20640 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36     test_errmsg16
20650 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
20660 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e   { "sqlite3_open
20670 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
20680 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20 20      test_open   
20690 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
206a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
206b0 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  n16",           
206c0 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31 36       test_open16
206d0 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
206e0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
206f0 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20 20 20  mplete16",      
20700 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d 70 6c        test_compl
20710 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a 0a  ete16    ,0 },..
20720 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20730 70 72 65 70 61 72 65 22 2c 20 20 20 20 20 20 20  prepare",       
20740 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65          test_pre
20750 70 61 72 65 20 20 20 20 20 20 20 2c 30 20 7d 2c  pare       ,0 },
20760 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
20770 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20 20 20  _prepare16",    
20780 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
20790 65 70 61 72 65 31 36 20 20 20 20 20 2c 30 20 7d  epare16     ,0 }
207a0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
207b0 33 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20 20  3_prepare_v2",  
207c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
207d0 72 65 70 61 72 65 5f 76 32 20 20 20 20 2c 30 20  repare_v2    ,0 
207e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
207f0 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31  e3_prepare_tkt31
20800 33 34 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  34",       test_
20810 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 2c  prepare_tkt3134,
20820 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
20830 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76  ite3_prepare16_v
20840 32 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  2",          tes
20850 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 20  t_prepare16_v2  
20860 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
20870 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22 2c  lite3_finalize",
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
20890 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20 20  st_finalize     
208a0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
208b0 71 6c 69 74 65 33 5f 72 65 73 65 74 22 2c 20 20  qlite3_reset",  
208c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
208d0 65 73 74 5f 72 65 73 65 74 20 20 20 20 20 20 20  est_reset       
208e0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
208f0 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 22  sqlite3_expired"
20900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20910 74 65 73 74 5f 65 78 70 69 72 65 64 20 20 20 20  test_expired    
20920 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
20930 22 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65  "sqlite3_transfe
20940 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20  r_bindings",    
20950 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f 62   test_transfer_b
20960 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  ind ,0 },.     {
20970 20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65   "sqlite3_change
20980 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  s",             
20990 20 20 74 65 73 74 5f 63 68 61 6e 67 65 73 20 20    test_changes  
209a0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
209b0 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 65 70 22  { "sqlite3_step"
209c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
209d0 20 20 20 74 65 73 74 5f 73 74 65 70 20 20 20 20     test_step    
209e0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
209f0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6e 65 78 74   { "sqlite3_next
20a00 5f 73 74 6d 74 22 2c 20 20 20 20 20 20 20 20 20  _stmt",         
20a10 20 20 20 20 74 65 73 74 5f 6e 65 78 74 5f 73 74      test_next_st
20a20 6d 74 20 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20  mt     ,0 },..  
20a30 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65     { "sqlite3_re
20a40 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20  lease_memory",  
20a50 20 20 20 20 20 20 74 65 73 74 5f 72 65 6c 65 61        test_relea
20a60 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 20 20 20 30  se_memory,     0
20a70 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
20a80 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
20a90 69 74 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  it",       test_
20aa0 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 2c  soft_heap_limit,
20ab0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
20ac0 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
20ad0 6c 65 61 6e 75 70 22 2c 20 20 20 20 20 20 20 20  leanup",        
20ae0 74 65 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61  test_thread_clea
20af0 6e 75 70 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20  nup,     0},.   
20b00 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 61 67    { "sqlite3_pag
20b10 65 72 5f 72 65 66 63 6f 75 6e 74 73 22 2c 20 20  er_refcounts",  
20b20 20 20 20 20 20 74 65 73 74 5f 70 61 67 65 72 5f       test_pager_
20b30 72 65 66 63 6f 75 6e 74 73 2c 20 20 20 20 30 7d  refcounts,    0}
20b40 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  ,..     { "sqlit
20b50 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
20b60 6e 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f  n",        test_
20b70 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20  load_extension, 
20b80 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
20b90 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
20ba0 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20  oad_extension", 
20bb0 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  test_enable_load
20bc0 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
20bd0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74    { "sqlite3_ext
20be0 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
20bf0 65 73 22 2c 20 74 65 73 74 5f 65 78 74 65 6e 64  es", test_extend
20c00 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 2c  ed_result_codes,
20c10 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
20c20 69 74 65 33 5f 6c 69 6d 69 74 22 2c 20 20 20 20  ite3_limit",    
20c30 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
20c40 74 5f 6c 69 6d 69 74 2c 20 20 20 20 20 20 20 20  t_limit,        
20c50 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 0a 20 20           0},..  
20c60 20 20 20 7b 20 22 73 61 76 65 5f 70 72 6e 67 5f     { "save_prng_
20c70 73 74 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  state",         
20c80 20 20 20 20 20 20 73 61 76 65 5f 70 72 6e 67 5f        save_prng_
20c90 73 74 61 74 65 2c 20 20 20 20 30 20 7d 2c 0a 20  state,    0 },. 
20ca0 20 20 20 20 7b 20 22 72 65 73 74 6f 72 65 5f 70      { "restore_p
20cb0 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20  rng_state",     
20cc0 20 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f 70         restore_p
20cd0 72 6e 67 5f 73 74 61 74 65 2c 20 30 20 7d 2c 0a  rng_state, 0 },.
20ce0 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f 70 72       { "reset_pr
20cf0 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20  ng_state",      
20d00 20 20 20 20 20 20 20 20 72 65 73 65 74 5f 70 72          reset_pr
20d10 6e 67 5f 73 74 61 74 65 2c 20 20 20 30 20 7d 2c  ng_state,   0 },
20d20 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ..     /* sqlite
20d30 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49  3_column_*() API
20d40 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   */.     { "sqli
20d50 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
20d60 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ",          test
20d70 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c  _column_count  ,
20d80 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
20d90 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22  ite3_data_count"
20da0 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
20db0 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20 20 20  t_data_count    
20dc0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
20dd0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
20de0 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  e",           te
20df0 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20  st_column_type  
20e00 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
20e10 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
20e20 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  ob",           t
20e30 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20  est_column_blob 
20e40 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
20e50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
20e60 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20  ouble",         
20e70 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  test_column_doub
20e80 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  le ,0 },.     { 
20e90 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
20ea0 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  int64",         
20eb0 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   test_column_int
20ec0 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  64  ,0 },.     {
20ed0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
20ee0 5f 74 65 78 74 22 2c 20 20 20 74 65 73 74 5f 73  _text",   test_s
20ef0 74 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64  tmt_utf8,  (void
20f00 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
20f10 5f 74 65 78 74 20 7d 2c 0a 20 20 20 20 20 7b 20  _text },.     { 
20f20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
20f30 6e 61 6d 65 22 2c 20 20 20 74 65 73 74 5f 73 74  name",   test_st
20f40 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a  mt_utf8,  (void*
20f50 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
20f60 6e 61 6d 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22  name },.     { "
20f70 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
20f80 6e 74 22 2c 20 20 20 20 74 65 73 74 5f 73 74 6d  nt",    test_stm
20f90 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29  t_int,   (void*)
20fa0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
20fb0 6e 74 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  nt  },.     { "s
20fc0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
20fd0 74 65 73 22 2c 20 20 74 65 73 74 5f 73 74 6d 74  tes",  test_stmt
20fe0 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73  _int,   (void*)s
20ff0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
21000 74 65 73 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51  tes},.#ifndef SQ
21010 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
21020 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  PE.     { "sqlit
21030 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
21040 70 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  pe",test_stmt_ut
21050 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  f8,(void*)sqlite
21060 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
21070 65 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  e},.#endif.#ifde
21080 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
21090 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
210a0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
210b0 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 22  n_database_name"
210c0 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c  ,test_stmt_utf8,
210d0 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
210e0 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
210f0 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33  ame},.{ "sqlite3
21100 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
21110 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  me",test_stmt_ut
21120 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  f8,(void*)sqlite
21130 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e  3_column_table_n
21140 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33  ame},.{ "sqlite3
21150 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
21160 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  ame",test_stmt_u
21170 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  tf8,(void*)sqlit
21180 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
21190 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a  _name},.#endif..
211a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
211b0 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b  MIT_UTF16.     {
211c0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
211d0 5f 62 79 74 65 73 31 36 22 2c 20 74 65 73 74 5f  _bytes16", test_
211e0 73 74 6d 74 5f 69 6e 74 2c 20 28 76 6f 69 64 2a  stmt_int, (void*
211f0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
21200 62 79 74 65 73 31 36 20 7d 2c 0a 20 20 20 20 20  bytes16 },.     
21210 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
21220 6e 5f 74 65 78 74 31 36 22 2c 20 20 74 65 73 74  n_text16",  test
21230 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f  _stmt_utf16, (vo
21240 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
21250 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a 20 20 20 20  mn_text16},.    
21260 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
21270 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20 74 65 73  mn_name16",  tes
21280 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76  t_stmt_utf16, (v
21290 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
212a0 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 20 20 20  umn_name16},.   
212b0 20 20 7b 20 22 61 64 64 5f 61 6c 69 67 6e 6d 65    { "add_alignme
212c0 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f  nt_test_collatio
212d0 6e 73 22 2c 20 61 64 64 5f 61 6c 69 67 6e 6d 65  ns", add_alignme
212e0 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f  nt_test_collatio
212f0 6e 73 2c 20 30 20 20 20 20 20 20 7d 2c 0a 23 69  ns, 0      },.#i
21300 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21310 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20  T_DECLTYPE.     
21320 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
21330 6e 5f 64 65 63 6c 74 79 70 65 31 36 22 2c 74 65  n_decltype16",te
21340 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 28 76  st_stmt_utf16,(v
21350 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
21360 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c  umn_decltype16},
21370 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
21380 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
21390 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 22 73  UMN_METADATA.{"s
213a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
213b0 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 22 2c 0a  tabase_name16",.
213c0 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31    test_stmt_utf1
213d0 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  6, sqlite3_colum
213e0 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31  n_database_name1
213f0 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f  6},.{"sqlite3_co
21400 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31  lumn_table_name1
21410 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  6", test_stmt_ut
21420 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69  f16, (void*)sqli
21430 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
21440 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69  _name16},.{"sqli
21450 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69  te3_column_origi
21460 6e 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f  n_name16", test_
21470 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
21480 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
21490 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 7d  n_origin_name16}
214a0 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  ,.#endif.#endif.
214b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
214c0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
214d0 5f 76 32 22 2c 20 74 65 73 74 5f 63 72 65 61 74  _v2", test_creat
214e0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 2c 20  e_collation_v2, 
214f0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
21500 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
21510 76 65 72 22 2c 20 20 20 20 20 74 65 73 74 5f 67  ver",     test_g
21520 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 2c 20 30  lobal_recover, 0
21530 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 77 6f     },.     { "wo
21540 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 22  rking_64bit_int"
21550 2c 20 20 20 20 20 20 20 20 20 20 77 6f 72 6b 69  ,          worki
21560 6e 67 5f 36 34 62 69 74 5f 69 6e 74 2c 20 20 20  ng_64bit_int,   
21570 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76  0   },.     { "v
21580 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 22 2c  fs_unlink_test",
21590 20 20 20 20 20 20 20 20 20 20 20 20 76 66 73 5f              vfs_
215a0 75 6e 6c 69 6e 6b 5f 74 65 73 74 2c 20 20 20 20  unlink_test,    
215b0 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
215c0 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73  vfs_initfail_tes
215d0 74 22 2c 20 20 20 20 20 20 20 20 20 20 76 66 73  t",          vfs
215e0 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 2c 20  _initfail_test, 
215f0 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
21600 22 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f  "vfs_unregister_
21610 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76 66  all",         vf
21620 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
21630 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  0   },.     {
21640 20 22 76 66 73 5f 72 65 72 65 67 69 73 74 65 72   "vfs_reregister
21650 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76  _all",         v
21660 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c  fs_reregister_al
21670 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  l,  0   },.     
21680 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
21690 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20  test",          
216a0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73  file_control_tes
216b0 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  t,   0   },.    
216c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 76 66 73 5f   { "sqlite3_vfs_
216d0 6c 69 73 74 22 2c 20 20 20 20 20 20 20 20 20 20  list",          
216e0 20 76 66 73 5f 6c 69 73 74 2c 20 20 20 20 20 30   vfs_list,     0
216f0 20 20 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 46     },..     /* F
21700 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 73  unctions from os
21710 2e 68 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .h */.#ifndef SQ
21720 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
21730 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74       { "add_test
21740 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20  _collate",      
21750 20 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 2c 20    test_collate, 
21760 30 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  0            },.
21770 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74       { "add_test
21780 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 22  _collate_needed"
21790 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  , test_collate_n
217a0 65 65 64 65 64 2c 20 30 20 20 20 20 20 7d 2c 0a  eeded, 0     },.
217b0 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74       { "add_test
217c0 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20  _function",     
217d0 20 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 2c    test_function,
217e0 20 30 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a   0           },.
217f0 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
21800 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72 72 73  qlite3_test_errs
21810 74 72 22 2c 20 20 20 20 20 74 65 73 74 5f 65 72  tr",     test_er
21820 72 73 74 72 2c 20 30 20 20 20 20 20 20 20 20 20  rstr, 0         
21830 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74      },.     { "t
21840 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
21850 22 2c 20 20 20 20 20 20 20 74 63 6c 5f 76 61 72  ",       tcl_var
21860 69 61 62 6c 65 5f 74 79 70 65 2c 20 30 20 20 20  iable_type, 0   
21870 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53      },.#ifndef S
21880 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
21890 44 5f 43 41 43 48 45 0a 20 20 20 20 20 7b 20 22  D_CACHE.     { "
218a0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
218b0 68 61 72 65 64 5f 63 61 63 68 65 22 2c 20 74 65  hared_cache", te
218c0 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  st_enable_shared
218d0 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  , 0  },.     { "
218e0 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64 5f 63  sqlite3_shared_c
218f0 61 63 68 65 5f 72 65 70 6f 72 74 22 2c 20 73 71  ache_report", sq
21900 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 65 64  lite3BtreeShared
21910 43 61 63 68 65 52 65 70 6f 72 74 2c 20 30 7d 2c  CacheReport, 0},
21920 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
21930 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
21940 6f 6e 5f 6e 75 6d 62 65 72 22 2c 20 74 65 73 74  on_number", test
21950 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
21960 65 72 2c 20 30 20 20 7d 2c 0a 23 69 66 64 65 66  er, 0  },.#ifdef
21970 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
21980 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
21990 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74      { "sqlite3_t
219a0 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
219b0 64 61 74 61 22 2c 20 74 65 73 74 5f 74 61 62 6c  data", test_tabl
219c0 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
219d0 61 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a  a, 0  },.#endif.
219e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
219f0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
21a00 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f    { "sqlite3_blo
21a10 62 5f 72 65 61 64 22 2c 20 20 74 65 73 74 5f 62  b_read",  test_b
21a20 6c 6f 62 5f 72 65 61 64 2c 20 30 20 20 7d 2c 0a  lob_read, 0  },.
21a30 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
21a40 62 6c 6f 62 5f 77 72 69 74 65 22 2c 20 74 65 73  blob_write", tes
21a50 74 5f 62 6c 6f 62 5f 77 72 69 74 65 2c 20 30 20  t_blob_write, 0 
21a60 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
21a70 7b 20 22 70 63 61 63 68 65 5f 73 74 61 74 73 22  { "pcache_stats"
21a80 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70 63 61  ,       test_pca
21a90 63 68 65 5f 73 74 61 74 73 2c 20 30 20 20 7d 2c  che_stats, 0  },
21aa0 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69  .  };.  static i
21ab0 6e 74 20 62 69 74 6d 61 73 6b 5f 73 69 7a 65 20  nt bitmask_size 
21ac0 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  = sizeof(Bitmask
21ad0 29 2a 38 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  )*8;.  int i;.  
21ae0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
21af0 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 73  e3_sync_count, s
21b00 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
21b10 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
21b20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
21b30 74 65 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  temp_count;.  ex
21b40 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
21b50 5f 6c 69 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20 65  _like_count;.  e
21b60 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
21b70 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b  3_xferopt_count;
21b80 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
21b90 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
21ba0 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  db_count;.  exte
21bb0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
21bc0 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
21bd0 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
21be0 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
21bf0 72 69 74 65 6a 5f 63 6f 75 6e 74 3b 0a 23 69 66  ritej_count;.#if
21c00 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
21c10 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
21c20 45 5f 54 45 53 54 29 20 26 26 20 53 51 4c 49 54  E_TEST) && SQLIT
21c30 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 65  E_THREADSAFE.  e
21c40 78 74 65 72 6e 20 69 6e 74 20 74 68 72 65 61 64  xtern int thread
21c50 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
21c60 65 72 73 4c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66  ersLocks;.#endif
21c70 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
21c80 49 4e 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  IN.  extern int 
21c90 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b  sqlite3_os_type;
21ca0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
21cb0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 65 78  QLITE_DEBUG.  ex
21cc0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
21cd0 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20 65 78  WhereTrace;.  ex
21ce0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
21cf0 4f 53 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72  OSTrace;.  exter
21d00 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  n int sqlite3Vdb
21d10 65 41 64 64 6f 70 54 72 61 63 65 3b 0a 23 65 6e  eAddopTrace;.#en
21d20 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
21d30 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20  E_TEST.  extern 
21d40 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  int sqlite3_enab
21d50 6c 65 5f 69 6e 5f 6f 70 74 3b 0a 20 20 65 78 74  le_in_opt;.  ext
21d60 65 72 6e 20 63 68 61 72 20 73 71 6c 69 74 65 33  ern char sqlite3
21d70 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 3b 0a 20  _query_plan[];. 
21d80 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 71 75   static char *qu
21d90 65 72 79 5f 70 6c 61 6e 20 3d 20 73 71 6c 69 74  ery_plan = sqlit
21da0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 3b 0a 23  e3_query_plan;.#
21db0 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30  endif..  for(i=0
21dc0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29  ; i<sizeof(aCmd)
21dd0 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29  /sizeof(aCmd[0])
21de0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
21df0 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
21e00 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e  terp, aCmd[i].zN
21e10 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72  ame, aCmd[i].xPr
21e20 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  oc, 0, 0);.  }. 
21e30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
21e40 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65  of(aObjCmd)/size
21e50 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20  of(aObjCmd[0]); 
21e60 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72  i++){.    Tcl_Cr
21e70 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
21e80 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69  nterp, aObjCmd[i
21e90 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ].zName, .      
21ea0 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72    aObjCmd[i].xPr
21eb0 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63  oc, aObjCmd[i].c
21ec0 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20  lientData, 0);. 
21ed0 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72   }.  Tcl_LinkVar
21ee0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
21ef0 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20  _search_count", 
21f00 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
21f10 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
21f20 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
21f30 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
21f40 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
21f50 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a  e_sort_count", .
21f60 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
21f70 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74  lite3_sort_count
21f80 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
21f90 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
21fa0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
21fb0 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a  max_blobsize", .
21fc0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
21fd0 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
21fe0 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ze, TCL_LINK_INT
21ff0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
22000 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
22010 5f 6c 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20  _like_count", . 
22020 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
22030 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c  ite3_like_count,
22040 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
22050 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
22060 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e  terp, "sqlite_in
22070 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20  terrupt_count", 
22080 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
22090 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
220a0 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
220b0 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
220c0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
220d0 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  lite_open_file_c
220e0 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63  ount", .      (c
220f0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70  har*)&sqlite3_op
22100 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54  en_file_count, T
22110 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
22120 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
22130 72 70 2c 20 22 73 71 6c 69 74 65 5f 63 75 72 72  rp, "sqlite_curr
22140 65 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20  ent_time", .    
22150 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
22160 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20  3_current_time, 
22170 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
22180 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
22190 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 78 66  erp, "sqlite3_xf
221a0 65 72 6f 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20  eropt_count",.  
221b0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
221c0 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
221d0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
221e0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
221f0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
22200 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
22210 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
22220 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65  r*)&sqlite3_page
22230 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20  r_readdb_count, 
22240 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
22250 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
22260 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
22270 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
22280 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
22290 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  )&sqlite3_pager_
222a0 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54  writedb_count, T
222b0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
222c0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
222d0 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67  rp, "sqlite3_pag
222e0 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22  er_writej_count"
222f0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
22300 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
22310 69 74 65 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  itej_count, TCL_
22320 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64  LINK_INT);.#ifnd
22330 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
22340 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  TF16.  Tcl_LinkV
22350 61 72 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 6c  ar(interp, "unal
22360 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75  igned_string_cou
22370 6e 74 65 72 22 2c 0a 20 20 20 20 20 20 28 63 68  nter",.      (ch
22380 61 72 2a 29 26 75 6e 61 6c 69 67 6e 65 64 5f 73  ar*)&unaligned_s
22390 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2c 20 54  tring_counter, T
223a0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
223b0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
223c0 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e  OS_UNIX && defin
223d0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
223e0 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
223f0 53 41 46 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  SAFE.  Tcl_LinkV
22400 61 72 28 69 6e 74 65 72 70 2c 20 22 74 68 72 65  ar(interp, "thre
22410 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
22420 74 68 65 72 73 4c 6f 63 6b 73 22 2c 0a 20 20 20  thersLocks",.   
22430 20 20 20 28 63 68 61 72 2a 29 26 74 68 72 65 61     (char*)&threa
22440 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
22450 68 65 72 73 4c 6f 63 6b 73 2c 20 54 43 4c 5f 4c  hersLocks, TCL_L
22460 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
22470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22480 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c  OMIT_UTF16.  Tcl
22490 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
224a0 20 22 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65   "sqlite_last_ne
224b0 65 64 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c  eded_collation",
224c0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70  .      (char*)&p
224d0 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
224e0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
224f0 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f  G|TCL_LINK_READ_
22500 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ONLY);.#endif.#i
22510 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
22520 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
22530 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73  terp, "sqlite_os
22540 5f 74 79 70 65 22 2c 0a 20 20 20 20 20 20 28 63  _type",.      (c
22550 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73  har*)&sqlite3_os
22560 5f 74 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  _type, TCL_LINK_
22570 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  INT);.#endif.#if
22580 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
22590 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
225a0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 71 75  terp, "sqlite_qu
225b0 65 72 79 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20  ery_plan",.     
225c0 20 28 63 68 61 72 2a 29 26 71 75 65 72 79 5f 70   (char*)&query_p
225d0 6c 61 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54  lan, TCL_LINK_ST
225e0 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45  RING|TCL_LINK_RE
225f0 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  AD_ONLY);.#endif
22600 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
22610 45 42 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  EBUG.  Tcl_LinkV
22620 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
22630 74 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 22 2c  te_addop_trace",
22640 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
22650 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
22660 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
22670 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
22680 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
22690 74 65 5f 77 68 65 72 65 5f 74 72 61 63 65 22 2c  te_where_trace",
226a0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
226b0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
226c0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
226d0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
226e0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
226f0 73 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20  s_trace",.      
22700 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 4f  (char*)&sqlite3O
22710 53 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b  STrace, TCL_LINK
22720 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69  _INT);.#endif.#i
22730 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22740 54 5f 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f 4c  T_DISKIO.  Tcl_L
22750 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
22760 73 71 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70 5f  sqlite_opentemp_
22770 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
22780 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70  har*)&sqlite3_op
22790 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54 43  entemp_count, TC
227a0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e  L_LINK_INT);.#en
227b0 64 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  dif.  Tcl_LinkVa
227c0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
227d0 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61  e_static_bind_va
227e0 6c 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  lue",.      (cha
227f0 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69  r*)&sqlite_stati
22800 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43  c_bind_value, TC
22810 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a  L_LINK_STRING);.
22820 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
22830 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74  terp, "sqlite_st
22840 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 22  atic_bind_nbyte"
22850 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
22860 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
22870 6e 64 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c 49  nd_nbyte, TCL_LI
22880 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
22890 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
228a0 73 71 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72 65  sqlite_temp_dire
228b0 63 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63  ctory",.      (c
228c0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 74 65  har*)&sqlite3_te
228d0 6d 70 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43  mp_directory, TC
228e0 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a  L_LINK_STRING);.
228f0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
22900 74 65 72 70 2c 20 22 62 69 74 6d 61 73 6b 5f 73  terp, "bitmask_s
22910 69 7a 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ize",.      (cha
22920 72 2a 29 26 62 69 74 6d 61 73 6b 5f 73 69 7a 65  r*)&bitmask_size
22930 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54  , TCL_LINK_INT|T
22940 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c  CL_LINK_READ_ONL
22950 59 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  Y);.  Tcl_LinkVa
22960 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
22970 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20  e_sync_count",. 
22980 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
22990 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c  ite3_sync_count,
229a0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
229b0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
229c0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 75  terp, "sqlite_fu
229d0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20  llsync_count",. 
229e0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
229f0 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
22a00 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
22a10 54 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  T);.#ifdef SQLIT
22a20 45 5f 54 45 53 54 0a 20 20 54 63 6c 5f 4c 69 6e  E_TEST.  Tcl_Lin
22a30 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
22a40 6c 69 74 65 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f  lite_enable_in_o
22a50 70 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  pt",.      (char
22a60 2a 29 26 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  *)&sqlite3_enabl
22a70 65 5f 69 6e 5f 6f 70 74 2c 20 54 43 4c 5f 4c 49  e_in_opt, TCL_LI
22a80 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a  NK_INT);.#endif.
22a90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
22aa0 0a 7d 0a                                         .}.