/ Hex Artifact Content
Login

Artifact bca7922b1eb9e8ca6042651a6974f0e2ad022df7:


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 30 20 32 30 30 38 2f 30 38 2f 32   1.320 2008/08/2
0240: 37 20 31 35 3a 32 31 3a 33 34 20 64 72 68 20 45  7 15:21:34 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 20 20 20 20 20 42 4f  ed_cache      BO
9be0: 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 23 69 66 20  OLEAN.**.*/.#if 
9bf0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9c00: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
9c10: 45 29 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  E).static int te
9c20: 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  st_enable_shared
9c30: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
9c40: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
9c50: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
9c60: 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
9c70: 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
9c80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
9c90: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
9ca0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
9cb0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
9cc0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ce0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
9cf0: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
9d00: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
9d10: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
9d20: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
9d30: 74 20 72 63 3b 0a 20 20 69 6e 74 20 65 6e 61 62  t rc;.  int enab
9d40: 6c 65 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20  le;.  int ret = 
9d50: 30 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  0;.  extern int 
9d60: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
9d70: 68 65 45 6e 61 62 6c 65 64 3b 0a 0a 20 20 69 66  heEnabled;..  if
9d80: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
9d90: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
9da0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
9db0: 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20  v, "BOOLEAN");. 
9dc0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9dd0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
9de0: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
9df0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
9e00: 76 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29  v[1], &enable) )
9e10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
9e20: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
9e30: 74 20 3d 20 73 71 6c 69 74 65 33 53 68 61 72 65  t = sqlite3Share
9e40: 64 43 61 63 68 65 45 6e 61 62 6c 65 64 3b 0a 20  dCacheEnabled;. 
9e50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 6e   rc = sqlite3_en
9e60: 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
9e70: 65 28 65 6e 61 62 6c 65 29 3b 0a 20 20 69 66 28  e(enable);.  if(
9e80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9e90: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
9ea0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
9eb0: 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74  r *)sqlite3ErrSt
9ec0: 72 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  r(rc), TCL_STATI
9ed0: 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
9ee0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
9ef0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
9f00: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
9f10: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29 29  BooleanObj(ret))
9f20: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
9f30: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  K;.}.#endif..../
9f40: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
9f50: 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
9f60: 75 6c 74 5f 63 6f 64 65 73 20 20 20 44 42 20 20  ult_codes   DB  
9f70: 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a    BOOLEAN.**.*/.
9f80: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
9f90: 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
9fa0: 63 6f 64 65 73 28 0a 20 20 43 6c 69 65 6e 74 44  codes(.  ClientD
9fb0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
9fc0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
9fd0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
9fe0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
9ff0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a000: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
a010: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
a020: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
a030: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
a040: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
a050: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a060: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
a070: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
a080: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
a090: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
a0a0: 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20  .  int enable;. 
a0b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
a0c0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
a0d0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
a0e0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
a0f0: 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45 41  objv, "DB BOOLEA
a100: 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
a110: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
a120: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
a130: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
a140: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
a150: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
a160: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
a170: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
a180: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
a190: 62 6a 76 5b 32 5d 2c 20 26 65 6e 61 62 6c 65 29  bjv[2], &enable)
a1a0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
a1b0: 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65  ROR;.  sqlite3_e
a1c0: 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
a1d0: 6f 64 65 73 28 64 62 2c 20 65 6e 61 62 6c 65 29  odes(db, enable)
a1e0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
a1f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
a200: 65 3a 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  e: sqlite3_libve
a210: 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 0a 2a 2a 0a  rsion_number.**.
a220: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
a230: 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  st_libversion_nu
a240: 6d 62 65 72 28 0a 20 20 43 6c 69 65 6e 74 44 61  mber(.  ClientDa
a250: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
a260: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
a270: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
a280: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
a290: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
a2a0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
a2b0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
a2c0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
a2d0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
a2e0: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
a2f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
a300: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
a310: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
a320: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
a330: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
a340: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
a350: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
a360: 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
a370: 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
a380: 65 72 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  er()));.  return
a390: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
a3a0: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
a3b0: 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
a3c0: 74 61 64 61 74 61 20 44 42 20 64 62 6e 61 6d 65  tadata DB dbname
a3d0: 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65   tblname colname
a3e0: 0a 2a 2a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .**.*/.#ifdef SQ
a3f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
a400: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 73 74 61 74  MN_METADATA.stat
a410: 69 63 20 69 6e 74 20 74 65 73 74 5f 74 61 62 6c  ic int test_tabl
a420: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
a430: 61 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  a(.  ClientData 
a440: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
a450: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
a460: 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
a470: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
a480: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
a490: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
a4a0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
a4b0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
a4c0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
a4d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a4e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
a4f0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
a500: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
a510: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
a520: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
a530: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
a540: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
a550: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
a560: 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
a570: 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *zCol;.  int rc;
a580: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
a590: 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ;..  const char 
a5a0: 2a 7a 44 61 74 61 74 79 70 65 3b 0a 20 20 63 6f  *zDatatype;.  co
a5b0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 73  nst char *zColls
a5c0: 65 71 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c  eq;.  int notnul
a5d0: 6c 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79  l;.  int primary
a5e0: 6b 65 79 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69  key;.  int autoi
a5f0: 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20 20 69 66 28  ncrement;..  if(
a600: 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
a610: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
a620: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
a630: 2c 20 22 44 42 20 64 62 6e 61 6d 65 20 74 62 6c  , "DB dbname tbl
a640: 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65 22 29 3b 0a  name colname");.
a650: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a660: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
a670: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
a680: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
a690: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
a6a0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
a6b0: 52 52 4f 52 3b 0a 20 20 7a 44 62 20 3d 20 54 63  RROR;.  zDb = Tc
a6c0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
a6d0: 5b 32 5d 29 3b 0a 20 20 7a 54 62 6c 20 3d 20 54  [2]);.  zTbl = T
a6e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
a6f0: 76 5b 33 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20  v[3]);.  zCol = 
a700: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
a710: 6a 76 5b 34 5d 29 3b 0a 0a 20 20 69 66 28 20 73  jv[4]);..  if( s
a720: 74 72 6c 65 6e 28 7a 44 62 29 3d 3d 30 20 29 20  trlen(zDb)==0 ) 
a730: 7a 44 62 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d  zDb = 0;..  rc =
a740: 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
a750: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 64  olumn_metadata(d
a760: 62 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 7a 43  b, zDb, zTbl, zC
a770: 6f 6c 2c 20 0a 20 20 20 20 20 20 26 7a 44 61 74  ol, .      &zDat
a780: 61 74 79 70 65 2c 20 26 7a 43 6f 6c 6c 73 65 71  atype, &zCollseq
a790: 2c 20 26 6e 6f 74 6e 75 6c 6c 2c 20 26 70 72 69  , &notnull, &pri
a7a0: 6d 61 72 79 6b 65 79 2c 20 26 61 75 74 6f 69 6e  marykey, &autoin
a7b0: 63 72 65 6d 65 6e 74 29 3b 0a 0a 20 20 69 66 28  crement);..  if(
a7c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a7d0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
a7e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
a7f0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
a800: 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
a810: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
a820: 0a 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e  ..  pRet = Tcl_N
a830: 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c  ewObj();.  Tcl_L
a840: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
a850: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
a860: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44  _NewStringObj(zD
a870: 61 74 61 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20  atatype, -1));. 
a880: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
a890: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
a8a0: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
a8b0: 4f 62 6a 28 7a 43 6f 6c 6c 73 65 71 2c 20 2d 31  Obj(zCollseq, -1
a8c0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
a8d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
a8e0: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
a8f0: 6e 74 4f 62 6a 28 6e 6f 74 6e 75 6c 6c 29 29 3b  ntObj(notnull));
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 70 72 69 6d 61 72 79 6b 65 79 29 29 3b  bj(primarykey));
a940: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
a950: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
a960: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
a970: 62 6a 28 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  bj(autoincrement
a980: 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ));.  Tcl_SetObj
a990: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
a9a0: 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Ret);..  return 
a9b0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
a9c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a9d0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 0a  _OMIT_INCRBLOB..
a9e0: 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c  /*.** sqlite3_bl
a9f0: 6f 62 5f 72 65 61 64 20 20 43 48 41 4e 4e 45 4c  ob_read  CHANNEL
aa00: 20 4f 46 46 53 45 54 20 4e 0a 2a 2a 0a 2a 2a 20   OFFSET N.**.** 
aa10: 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69    This command i
aa20: 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
aa30: 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  he sqlite3_blob_
aa40: 72 65 61 64 28 29 20 69 6e 20 77 61 79 73 20 74  read() in ways t
aa50: 68 61 74 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c  hat.**   the Tcl
aa60: 20 63 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61   channel interfa
aa70: 63 65 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65  ce does not. The
aa80: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
aa90: 73 68 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74  should.**   be t
aaa0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c  he name of a val
aab0: 69 64 20 63 68 61 6e 6e 65 6c 20 63 72 65 61 74  id channel creat
aac0: 65 64 20 62 79 20 74 68 65 20 5b 69 6e 63 72 62  ed by the [incrb
aad0: 6c 6f 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20  lob] method.**  
aae0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 68   of a database h
aaf0: 61 6e 64 6c 65 2e 20 54 68 69 73 20 66 75 6e 63  andle. This func
ab00: 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74  tion calls sqlit
ab10: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a  e3_blob_read().*
ab20: 2a 20 20 20 74 6f 20 72 65 61 64 20 4e 20 62 79  *   to read N by
ab30: 74 65 73 20 66 72 6f 6d 20 6f 66 66 73 65 74 20  tes from offset 
ab40: 4f 46 46 53 45 54 20 66 72 6f 6d 20 74 68 65 20  OFFSET from the 
ab50: 75 6e 64 65 72 6c 79 69 6e 67 20 53 51 4c 69 74  underlying SQLit
ab60: 65 0a 2a 2a 20 20 20 62 6c 6f 62 20 68 61 6e 64  e.**   blob hand
ab70: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20 73  le..**.**   On s
ab80: 75 63 63 65 73 73 2c 20 61 20 62 79 74 65 2d 61  uccess, a byte-a
ab90: 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74  rray object cont
aba0: 61 69 6e 69 6e 67 20 74 68 65 20 72 65 61 64 20  aining the read 
abb0: 64 61 74 61 20 69 73 20 0a 2a 2a 20 20 20 72 65  data is .**   re
abc0: 74 75 72 6e 65 64 2e 20 4f 6e 20 66 61 69 6c 75  turned. On failu
abd0: 72 65 2c 20 74 68 65 20 69 6e 74 65 72 70 72 65  re, the interpre
abe0: 74 65 72 20 72 65 73 75 6c 74 20 69 73 20 73 65  ter result is se
abf0: 74 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 74 65  t to the.**   te
ac00: 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
ac10: 6e 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  n of the returne
ac20: 64 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  d error code (i.
ac30: 65 2e 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  e. "SQLITE_NOMEM
ac40: 22 29 0a 2a 2a 20 20 20 61 6e 64 20 61 20 54 63  ").**   and a Tc
ac50: 6c 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 74  l exception is t
ac60: 68 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  hrown..*/.static
ac70: 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f 72   int test_blob_r
ac80: 65 61 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ead(.  ClientDat
ac90: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
aca0: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
acb0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
acc0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
acd0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
ace0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
acf0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
ad00: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
ad10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ad20: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
ad30: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
ad40: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
ad50: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
ad60: 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63  .  Tcl_Channel c
ad70: 68 61 6e 6e 65 6c 3b 0a 20 20 43 6c 69 65 6e 74  hannel;.  Client
ad80: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
ad90: 61 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  a;.  sqlite3_blo
ada0: 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20  b *pBlob;.  int 
adb0: 6e 6f 74 55 73 65 64 3b 0a 20 20 69 6e 74 20 6e  notUsed;.  int n
adc0: 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 4f 66 66  Byte;.  int iOff
add0: 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  set;.  unsigned 
ade0: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 69 6e  char *zBuf;.  in
adf0: 74 20 72 63 3b 0a 20 20 0a 20 20 69 66 28 20 6f  t rc;.  .  if( o
ae00: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
ae10: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
ae20: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
ae30: 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20  "CHANNEL OFFSET 
ae40: 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
ae50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
ae60: 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f    channel = Tcl_
ae70: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
ae80: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
ae90: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 6e 6f 74 55  (objv[1]), &notU
aea0: 73 65 64 29 3b 0a 20 20 69 66 28 20 21 63 68 61  sed);.  if( !cha
aeb0: 6e 6e 65 6c 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f  nnel.   || TCL_O
aec0: 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  K!=Tcl_GetIntFro
aed0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
aee0: 76 5b 32 5d 2c 20 26 69 4f 66 66 73 65 74 29 0a  v[2], &iOffset).
aef0: 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63     || TCL_OK!=Tc
af00: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
af10: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
af20: 20 26 6e 42 79 74 65 29 0a 20 20 20 7c 7c 20 6e   &nByte).   || n
af30: 42 79 74 65 3c 30 20 7c 7c 20 69 4f 66 66 73 65  Byte<0 || iOffse
af40: 74 3c 30 0a 20 20 29 7b 20 0a 20 20 20 20 72 65  t<0.  ){ .    re
af50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
af60: 20 20 7d 0a 0a 20 20 69 6e 73 74 61 6e 63 65 44    }..  instanceD
af70: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  ata = Tcl_GetCha
af80: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
af90: 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 70 42 6c  (channel);.  pBl
afa0: 6f 62 20 3d 20 2a 28 28 73 71 6c 69 74 65 33 5f  ob = *((sqlite3_
afb0: 62 6c 6f 62 20 2a 2a 29 69 6e 73 74 61 6e 63 65  blob **)instance
afc0: 44 61 74 61 29 3b 0a 0a 20 20 7a 42 75 66 20 3d  Data);..  zBuf =
afd0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
afe0: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74  *)Tcl_Alloc(nByt
aff0: 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
b000: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 42 6c  e3_blob_read(pBl
b010: 6f 62 2c 20 7a 42 75 66 2c 20 6e 42 79 74 65 2c  ob, zBuf, nByte,
b020: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69 66 28   iOffset);.  if(
b030: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b040: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
b050: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
b060: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
b070: 62 6a 28 7a 42 75 66 2c 20 6e 42 79 74 65 29 29  bj(zBuf, nByte))
b080: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
b090: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
b0a0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
b0b0: 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d  ite3TestErrorNam
b0c0: 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  e(rc), TCL_VOLAT
b0d0: 49 4c 45 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  ILE);.  }.  Tcl_
b0e0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 7a 42 75  Free((char *)zBu
b0f0: 66 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72  f);..  return (r
b100: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54  c==SQLITE_OK ? T
b110: 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f  CL_OK : TCL_ERRO
b120: 52 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  R);.}../*.** sql
b130: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 20  ite3_blob_write 
b140: 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 44  CHANNEL OFFSET D
b150: 41 54 41 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ATA.**.**   This
b160: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
b170: 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c   to test the sql
b180: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28  ite3_blob_write(
b190: 29 20 69 6e 20 77 61 79 73 20 74 68 61 74 0a 2a  ) in ways that.*
b1a0: 2a 20 20 20 74 68 65 20 54 63 6c 20 63 68 61 6e  *   the Tcl chan
b1b0: 6e 65 6c 20 69 6e 74 65 72 66 61 63 65 20 64 6f  nel interface do
b1c0: 65 73 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73  es not. The firs
b1d0: 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  t argument shoul
b1e0: 64 0a 2a 2a 20 20 20 62 65 20 74 68 65 20 6e 61  d.**   be the na
b1f0: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 20 63 68  me of a valid ch
b200: 61 6e 6e 65 6c 20 63 72 65 61 74 65 64 20 62 79  annel created by
b210: 20 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20   the [incrblob] 
b220: 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61  method.**   of a
b230: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
b240: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
b250: 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c  calls sqlite3_bl
b260: 6f 62 5f 77 72 69 74 65 28 29 0a 2a 2a 20 20 20  ob_write().**   
b270: 74 6f 20 77 72 69 74 65 20 74 68 65 20 44 41 54  to write the DAT
b280: 41 20 62 79 74 65 2d 61 72 72 61 79 20 74 6f 20  A byte-array to 
b290: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 53  the underlying S
b2a0: 51 4c 69 74 65 20 62 6c 6f 62 20 68 61 6e 64 6c  QLite blob handl
b2b0: 65 2e 0a 2a 2a 20 20 20 61 74 20 6f 66 66 73 65  e..**   at offse
b2c0: 74 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  t OFFSET..**.** 
b2d0: 20 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 6e    On success, an
b2e0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73   empty string is
b2f0: 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e 20 66 61   returned. On fa
b300: 69 6c 75 72 65 2c 20 74 68 65 20 69 6e 74 65 72  ilure, the inter
b310: 70 72 65 74 65 72 0a 2a 2a 20 20 20 72 65 73 75  preter.**   resu
b320: 6c 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  lt is set to the
b330: 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
b340: 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 74 75  tion of the retu
b350: 72 6e 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20  rned error code 
b360: 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 22 53 51 4c  .**   (i.e. "SQL
b370: 49 54 45 5f 4e 4f 4d 45 4d 22 29 20 61 6e 64 20  ITE_NOMEM") and 
b380: 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 20  a Tcl exception 
b390: 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73 74  is thrown..*/.st
b3a0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c  atic int test_bl
b3b0: 6f 62 5f 77 72 69 74 65 28 0a 20 20 43 6c 69 65  ob_write(.  Clie
b3c0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
b3d0: 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a  a, /* Not used *
b3e0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
b3f0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
b400: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
b410: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
b420: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
b430: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
b440: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b450: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
b460: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
b470: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
b480: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
b490: 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 68 61 6e  */.){.  Tcl_Chan
b4a0: 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20 43  nel channel;.  C
b4b0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
b4c0: 63 65 44 61 74 61 3b 0a 20 20 73 71 6c 69 74 65  ceData;.  sqlite
b4d0: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20  3_blob *pBlob;. 
b4e0: 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20   int notUsed;.  
b4f0: 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69  int iOffset;.  i
b500: 6e 74 20 72 63 3b 0a 0a 20 20 75 6e 73 69 67 6e  nt rc;..  unsign
b510: 65 64 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20  ed char *zBuf;. 
b520: 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20 0a 20 20   int nBuf;.  .  
b530: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
b540: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
b550: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
b560: 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46  bjv, "CHANNEL OF
b570: 46 53 45 54 20 44 41 54 41 22 29 3b 0a 20 20 20  FSET DATA");.   
b580: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b590: 52 3b 0a 20 20 7d 0a 0a 20 20 63 68 61 6e 6e 65  R;.  }..  channe
b5a0: 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  l = Tcl_GetChann
b5b0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
b5c0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
b5d0: 29 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  ), &notUsed);.  
b5e0: 69 66 28 20 21 63 68 61 6e 6e 65 6c 0a 20 20 20  if( !channel.   
b5f0: 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  || TCL_OK!=Tcl_G
b600: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
b610: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
b620: 4f 66 66 73 65 74 29 0a 20 20 20 7c 7c 20 69 4f  Offset).   || iO
b630: 66 66 73 65 74 3c 30 0a 20 20 29 7b 20 0a 20 20  ffset<0.  ){ .  
b640: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b650: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 73 74 61  OR;.  }..  insta
b660: 6e 63 65 44 61 74 61 20 3d 20 54 63 6c 5f 47 65  nceData = Tcl_Ge
b670: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
b680: 44 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20  Data(channel);. 
b690: 20 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69   pBlob = *((sqli
b6a0: 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74  te3_blob **)inst
b6b0: 61 6e 63 65 44 61 74 61 29 3b 0a 0a 20 20 7a 42  anceData);..  zB
b6c0: 75 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  uf = Tcl_GetByte
b6d0: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
b6e0: 76 5b 33 5d 2c 20 26 6e 42 75 66 29 3b 0a 20 20  v[3], &nBuf);.  
b6f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
b700: 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 7a  b_write(pBlob, z
b710: 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 73  Buf, nBuf, iOffs
b720: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  et);.  if( rc!=S
b730: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b740: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
b750: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
b760: 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61  lite3TestErrorNa
b770: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41  me(rc), TCL_VOLA
b780: 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  TILE);.  }..  re
b790: 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
b7a0: 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54  _OK ? TCL_OK : T
b7b0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 23 65 6e  CL_ERROR);.}.#en
b7c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
b7d0: 3a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  : sqlite3_create
b7e0: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20 44 42  _collation_v2 DB
b7f0: 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50  -HANDLE NAME CMP
b800: 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f 43 0a 2a  -PROC DEL-PROC.*
b810: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 54 63 6c 20  *.**   This Tcl 
b820: 70 72 6f 63 20 69 73 20 75 73 65 64 20 66 6f 72  proc is used for
b830: 20 74 65 73 74 69 6e 67 20 74 68 65 20 65 78 70   testing the exp
b840: 65 72 69 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 73  erimental.**   s
b850: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
b860: 6c 6c 61 74 69 6f 6e 5f 76 32 28 29 20 69 6e 74  llation_v2() int
b870: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 72 75 63  erface..*/.struc
b880: 74 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58  t TestCollationX
b890: 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
b8a0: 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f  *interp;.  Tcl_O
b8b0: 62 6a 20 2a 70 43 6d 70 3b 0a 20 20 54 63 6c 5f  bj *pCmp;.  Tcl_
b8c0: 4f 62 6a 20 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79  Obj *pDel;.};.ty
b8d0: 70 65 64 65 66 20 73 74 72 75 63 74 20 54 65 73  pedef struct Tes
b8e0: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 54 65 73 74  tCollationX Test
b8f0: 43 6f 6c 6c 61 74 69 6f 6e 58 3b 0a 73 74 61 74  CollationX;.stat
b900: 69 63 20 76 6f 69 64 20 74 65 73 74 43 72 65 61  ic void testCrea
b910: 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 28 76  teCollationDel(v
b920: 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20 54 65  oid *pCtx){.  Te
b930: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20  stCollationX *p 
b940: 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  = (TestCollation
b950: 58 20 2a 29 70 43 74 78 3b 0a 0a 20 20 69 6e 74  X *)pCtx;..  int
b960: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
b970: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
b980: 2d 3e 70 44 65 6c 2c 20 54 43 4c 5f 45 56 41 4c  ->pDel, TCL_EVAL
b990: 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c  _DIRECT|TCL_EVAL
b9a0: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 69 66 28 20  _GLOBAL);.  if( 
b9b0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc!=TCL_OK ){.  
b9c0: 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64    Tcl_Background
b9d0: 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29  Error(p->interp)
b9e0: 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63  ;.  }..  Tcl_Dec
b9f0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d  rRefCount(p->pCm
ba00: 70 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  p);.  Tcl_DecrRe
ba10: 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b  fCount(p->pDel);
ba20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
ba30: 28 76 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a 73 74  (void *)p);.}.st
ba40: 61 74 69 63 20 69 6e 74 20 74 65 73 74 43 72 65  atic int testCre
ba50: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28  ateCollationCmp(
ba60: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20  .  void *pCtx,. 
ba70: 20 69 6e 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f   int nLeft,.  co
ba80: 6e 73 74 20 76 6f 69 64 20 2a 7a 4c 65 66 74 2c  nst void *zLeft,
ba90: 0a 20 20 69 6e 74 20 6e 52 69 67 68 74 2c 0a 20  .  int nRight,. 
baa0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 52 69   const void *zRi
bab0: 67 68 74 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c  ght.){.  TestCol
bac0: 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65  lationX *p = (Te
bad0: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70  stCollationX *)p
bae0: 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Ctx;.  Tcl_Obj *
baf0: 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75  pScript = Tcl_Du
bb00: 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 43  plicateObj(p->pC
bb10: 6d 70 29 3b 0a 20 20 69 6e 74 20 69 52 65 73 20  mp);.  int iRes 
bb20: 3d 20 30 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 72  = 0;..  Tcl_Incr
bb30: 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
bb40: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
bb50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
bb60: 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65   pScript, Tcl_Ne
bb70: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
bb80: 20 2a 29 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 29   *)zLeft, nLeft)
bb90: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
bba0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
bbb0: 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65   pScript, Tcl_Ne
bbc0: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
bbd0: 20 2a 29 7a 52 69 67 68 74 2c 6e 52 69 67 68 74   *)zRight,nRight
bbe0: 29 29 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f  ));..  if( TCL_O
bbf0: 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  K!=Tcl_EvalObjEx
bc00: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72  (p->interp, pScr
bc10: 69 70 74 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  ipt, TCL_EVAL_DI
bc20: 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c  RECT|TCL_EVAL_GL
bc30: 4f 42 41 4c 29 0a 20 20 20 7c 7c 20 54 43 4c 5f  OBAL).   || TCL_
bc40: 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
bc50: 6f 6d 4f 62 6a 28 70 2d 3e 69 6e 74 65 72 70 2c  omObj(p->interp,
bc60: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
bc70: 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 26 69  t(p->interp), &i
bc80: 52 65 73 29 0a 20 20 29 7b 0a 20 20 20 20 54 63  Res).  ){.    Tc
bc90: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
bca0: 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  r(p->interp);.  
bcb0: 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  }.  Tcl_DecrRefC
bcc0: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 0a  ount(pScript);..
bcd0: 20 20 72 65 74 75 72 6e 20 69 52 65 73 3b 0a 7d    return iRes;.}
bce0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
bcf0: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
bd00: 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61  n_v2(.  ClientDa
bd10: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
bd20: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
bd30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
bd40: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
bd50: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
bd60: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
bd70: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
bd80: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
bd90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bda0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
bdb0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
bdc0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
bdd0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
bde0: 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  {.  TestCollatio
bdf0: 6e 58 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  nX *p;.  sqlite3
be00: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
be10: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
be20: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
be30: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
be40: 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44  , objv, "DB-HAND
be50: 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43  LE NAME CMP-PROC
be60: 20 44 45 4c 2d 50 52 4f 43 22 29 3b 0a 20 20 20   DEL-PROC");.   
be70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
be80: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
be90: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
bea0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
beb0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
bec0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
bed0: 52 3b 0a 0a 20 20 70 20 3d 20 28 54 65 73 74 43  R;..  p = (TestC
bee0: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 73 71 6c 69  ollationX *)sqli
bef0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
bf00: 66 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58  f(TestCollationX
bf10: 29 29 3b 0a 20 20 70 2d 3e 70 43 6d 70 20 3d 20  ));.  p->pCmp = 
bf20: 6f 62 6a 76 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44  objv[3];.  p->pD
bf30: 65 6c 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20  el = objv[4];.  
bf40: 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  p->interp = inte
bf50: 72 70 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  rp;.  Tcl_IncrRe
bf60: 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b  fCount(p->pCmp);
bf70: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
bf80: 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20  unt(p->pDel);.. 
bf90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
bfa0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
bfb0: 32 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72  2(db, Tcl_GetStr
bfc0: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 31 36  ing(objv[2]), 16
bfd0: 2c 20 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a  , .      (void *
bfe0: 29 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  )p, testCreateCo
bff0: 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74  llationCmp, test
c000: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44  CreateCollationD
c010: 65 6c 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  el.  );.  if( rc
c020: 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  !=SQLITE_MISUSE 
c030: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
c040: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
c050: 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  "sqlite3_create_
c060: 63 6f 6c 6c 61 74 65 5f 76 32 28 29 20 66 61 69  collate_v2() fai
c070: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 22 0a  led to detect ".
c080: 20 20 20 20 20 20 22 61 6e 20 69 6e 76 61 6c 69        "an invali
c090: 64 20 65 6e 63 6f 64 69 6e 67 22 2c 20 28 63 68  d encoding", (ch
c0a0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
c0b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c0c0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
c0d0: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
c0e0: 6e 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47 65 74  n_v2(db, Tcl_Get
c0f0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
c100: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
c110: 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20       (void *)p, 
c120: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
c130: 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61  ionCmp, testCrea
c140: 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20  teCollationDel. 
c150: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   );.  return TCL
c160: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
c170: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c 6f 61  age: sqlite3_loa
c180: 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48  d_extension DB-H
c190: 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43  ANDLE FILE ?PROC
c1a0: 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ?.*/.static int 
c1b0: 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  test_load_extens
c1c0: 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ion(.  ClientDat
c1d0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
c1e0: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
c1f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
c200: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
c210: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
c220: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
c230: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
c240: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
c250: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c260: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
c270: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
c280: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
c290: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
c2a0: 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63  .  Tcl_CmdInfo c
c2b0: 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  mdInfo;.  sqlite
c2c0: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
c2d0: 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  .  char *zDb;.  
c2e0: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
c2f0: 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20 30 3b 0a  har *zProc = 0;.
c300: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
c310: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
c320: 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
c330: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
c340: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
c350: 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20  bjv, "DB-HANDLE 
c360: 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29 3b 0a 20  FILE ?PROC?");. 
c370: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
c380: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d  ROR;.  }.  zDb =
c390: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c3a0: 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46 69 6c 65  bjv[1]);.  zFile
c3b0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
c3c0: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
c3d0: 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
c3e0: 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47 65 74 53  zProc = Tcl_GetS
c3f0: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
c400: 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63    }..  /* Extrac
c410: 74 20 74 68 65 20 43 20 64 61 74 61 62 61 73 65  t the C database
c420: 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65   handle from the
c430: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   Tcl command nam
c440: 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f  e */.  if( !Tcl_
c450: 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
c460: 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64  nterp, zDb, &cmd
c470: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c  Info) ){.    Tcl
c480: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
c490: 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e  terp, "command n
c4a0: 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62  ot found: ", zDb
c4b0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
c4c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c4d0: 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28  R;.  }.  db = ((
c4e0: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a  struct SqliteDb*
c4f0: 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  )cmdInfo.objClie
c500: 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61  ntData)->db;.  a
c510: 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  ssert(db);..  /*
c520: 20 43 61 6c 6c 20 74 68 65 20 75 6e 64 65 72 6c   Call the underl
c530: 79 69 6e 67 20 43 20 66 75 6e 63 74 69 6f 6e 2e  ying C function.
c540: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
c550: 75 72 73 2c 20 73 65 74 20 72 63 20 74 6f 20 0a  urs, set rc to .
c560: 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f 52 20 61    ** TCL_ERROR a
c570: 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65 72 72 6f  nd load any erro
c580: 72 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 74 68  r string into th
c590: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 49  e interpreter. I
c5a0: 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72 72 6f 72  f no .  ** error
c5b0: 20 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20   occurs, set rc 
c5c0: 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20 2a 2f 0a  to TCL_OK..  */.
c5d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
c5e0: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
c5f0: 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  N.  rc = SQLITE_
c600: 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72 20 3d 20  ERROR;.  zErr = 
c610: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
c620: 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d 69 74  "this build omit
c630: 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  s sqlite3_load_e
c640: 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 23 65  xtension()");.#e
c650: 6c 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  lse.  rc = sqlit
c660: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
c670: 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72  n(db, zFile, zPr
c680: 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23 65 6e 64  oc, &zErr);.#end
c690: 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
c6a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
c6b0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
c6c0: 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45 72 72 20  rp, zErr ? zErr 
c6d0: 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  : "", TCL_VOLATI
c6e0: 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43  LE);.    rc = TC
c6f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  L_ERROR;.  }else
c700: 7b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f  {.    rc = TCL_O
c710: 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  K;.  }.  sqlite3
c720: 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 0a 20 20  _free(zErr);..  
c730: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c740: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
c750: 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  e3_enable_load_e
c760: 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44  xtension DB-HAND
c770: 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61 74  LE ONOFF.*/.stat
c780: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62  ic int test_enab
c790: 6c 65 5f 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e  le_load(.  Clien
c7a0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
c7b0: 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f  , /* Not used */
c7c0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
c7d0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
c7e0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
c7f0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
c800: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
c810: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
c820: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c830: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
c840: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
c850: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
c860: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
c870: 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e  /.){.  Tcl_CmdIn
c880: 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71  fo cmdInfo;.  sq
c890: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
c8a0: 72 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e  r *zDb;.  int on
c8b0: 6f 66 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  off;..  if( objc
c8c0: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
c8d0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
c8e0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
c8f0: 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b  -HANDLE ONOFF");
c900: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
c910: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62  ERROR;.  }.  zDb
c920: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
c930: 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a  (objv[1]);..  /*
c940: 20 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64   Extract the C d
c950: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66  atabase handle f
c960: 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d  rom the Tcl comm
c970: 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66  and name */.  if
c980: 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
c990: 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44  dInfo(interp, zD
c9a0: 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  b, &cmdInfo) ){.
c9b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
c9c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
c9d0: 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a  mmand not found:
c9e0: 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29   ", zDb, (char*)
c9f0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
ca00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
ca10: 64 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71  db = ((struct Sq
ca20: 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e  liteDb*)cmdInfo.
ca30: 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e  objClientData)->
ca40: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29  db;.  assert(db)
ca50: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ;..  /* Get the 
ca60: 6f 6e 6f 66 66 20 70 61 72 61 6d 65 74 65 72 20  onoff parameter 
ca70: 2a 2f 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  */.  if( Tcl_Get
ca80: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
ca90: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
caa0: 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 72  &onoff) ){.    r
cab0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cac0: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
cad0: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
cae0: 54 45 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70  TENSION.  Tcl_Ap
caf0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
cb00: 70 2c 20 22 74 68 69 73 20 62 75 69 6c 64 20 6f  p, "this build o
cb10: 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61  mits sqlite3_loa
cb20: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b  d_extension()");
cb30: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
cb40: 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  ROR;.#else.  sql
cb50: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
cb60: 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f  _extension(db, o
cb70: 6e 6f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  noff);.  return 
cb80: 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d  TCL_OK;.#endif.}
cb90: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
cba0: 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a  sqlite_abort.**.
cbb0: 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
cbc0: 70 72 6f 63 65 73 73 20 69 6d 6d 65 64 69 61 74  process immediat
cbd0: 65 6c 79 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ely.  This is no
cbe0: 74 20 61 20 63 6c 65 61 6e 20 73 68 75 74 64 6f  t a clean shutdo
cbf0: 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  wn..** This comm
cc00: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74  and is used to t
cc10: 65 73 74 20 74 68 65 20 72 65 63 6f 76 65 72 61  est the recovera
cc20: 62 69 6c 69 74 79 20 6f 66 20 61 20 64 61 74 61  bility of a data
cc30: 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65  base in.** the e
cc40: 76 65 6e 74 20 6f 66 20 61 20 70 72 6f 67 72 61  vent of a progra
cc50: 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74  m crash..*/.stat
cc60: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 61 62  ic int sqlite_ab
cc70: 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ort(.  void *Not
cc80: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
cc90: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
cca0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
ccb0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
ccc0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
ccd0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ccf0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
cd00: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
cd10: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
cd20: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
cd30: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
cd40: 61 73 73 65 72 74 28 20 69 6e 74 65 72 70 3d 3d  assert( interp==
cd50: 30 20 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 77  0 );   /* This w
cd60: 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
cd70: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
cd80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
cd90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
cda0: 6e 65 20 69 73 20 61 20 75 73 65 72 2d 64 65 66  ne is a user-def
cdb0: 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f  ined SQL functio
cdc0: 6e 20 77 68 6f 73 65 20 70 75 72 70 6f 73 65 0a  n whose purpose.
cdd0: 2a 2a 20 69 73 20 74 6f 20 74 65 73 74 20 74 68  ** is to test th
cde0: 65 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73  e sqlite_set_res
cdf0: 75 6c 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74  ult() API..*/.st
ce00: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 46 75  atic void testFu
ce10: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
ce20: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
ce30: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
ce40: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
ce50: 77 68 69 6c 65 28 20 61 72 67 63 3e 3d 32 20 29  while( argc>=2 )
ce60: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
ce70: 20 2a 7a 41 72 67 30 20 3d 20 28 63 68 61 72 2a   *zArg0 = (char*
ce80: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
ce90: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
cea0: 20 20 69 66 28 20 7a 41 72 67 30 20 29 7b 0a 20    if( zArg0 ){. 
ceb0: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
cec0: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
ced0: 2c 20 22 69 6e 74 22 29 20 29 7b 0a 20 20 20 20  , "int") ){.    
cee0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
cef0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
cf00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
cf10: 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20  t(argv[1]));.   
cf20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
cf30: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
cf40: 30 2c 22 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b  0,"int64")==0 ){
cf50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cf60: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
cf70: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76  ntext, sqlite3_v
cf80: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
cf90: 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  1]));.      }els
cfa0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
cfb0: 49 43 6d 70 28 7a 41 72 67 30 2c 22 73 74 72 69  ICmp(zArg0,"stri
cfc0: 6e 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ng")==0 ){.     
cfd0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
cfe0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
cff0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
d000: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
d010: 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20  ]), -1,.        
d020: 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53      SQLITE_TRANS
d030: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c  IENT);.      }el
d040: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
d050: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75  rICmp(zArg0,"dou
d060: 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
d070: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
d080: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
d090: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
d0a0: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29  _double(argv[1])
d0b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
d0c0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
d0d0: 70 28 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d  p(zArg0,"null")=
d0e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
d0f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
d100: 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  l(context);.    
d110: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
d120: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
d130: 2c 22 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a  ,"value")==0 ){.
d140: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d150: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
d160: 74 65 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74  text, argv[sqlit
d170: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
d180: 76 5b 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d  v[1])]);.      }
d190: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f  else{.        go
d1a0: 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
d1b0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
d1c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  .      goto erro
d1d0: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
d1e0: 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20   argc -= 2;.    
d1f0: 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20  argv += 2;.  }. 
d200: 20 72 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f   return;..error_
d210: 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72  out:.  sqlite3_r
d220: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
d230: 65 78 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d  ext,"first argum
d240: 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e  ent should be on
d250: 65 20 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69  e of: ".      "i
d260: 6e 74 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20  nt int64 string 
d270: 64 6f 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75  double null valu
d280: 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e", -1);.}../*.*
d290: 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
d2a0: 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f  e_register_test_
d2b0: 66 75 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41  function  DB  NA
d2c0: 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65  ME.**.** Registe
d2d0: 72 20 74 68 65 20 74 65 73 74 20 53 51 4c 20 66  r the test SQL f
d2e0: 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  unction on the d
d2f0: 61 74 61 62 61 73 65 20 44 42 20 75 6e 64 65 72  atabase DB under
d300: 20 74 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a   the name NAME..
d310: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
d320: 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63  st_register_func
d330: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
d340: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
d350: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
d360: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
d370: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
d380: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
d390: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
d3a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d3b0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
d3c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d3e0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
d3f0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
d400: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
d410: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  rc;.  if( argc!=
d420: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
d430: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d440: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
d450: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
d460: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
d470: 20 22 20 44 42 20 46 55 4e 43 54 49 4f 4e 2d 4e   " DB FUNCTION-N
d480: 41 4d 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  AME", 0);.    re
d490: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d4a0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
d4b0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
d4c0: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
d4d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d4e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
d4f0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
d500: 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c  db, argv[2], -1,
d510: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
d520: 20 0a 20 20 20 20 20 20 74 65 73 74 46 75 6e 63   .      testFunc
d530: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
d540: 63 21 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=0 ){.    Tcl_
d550: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d560: 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53  erp, sqlite3ErrS
d570: 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  tr(rc), 0);.    
d580: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d590: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
d5a0: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
d5b0: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
d5c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d5d0: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
d5e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
d5f0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  ge:  sqlite3_fin
d600: 61 6c 69 7a 65 20 20 53 54 4d 54 20 0a 2a 2a 0a  alize  STMT .**.
d610: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20 73 74  ** Finalize a st
d620: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a  atement handle..
d630: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
d640: 73 74 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20 76  st_finalize(.  v
d650: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
d660: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
d670: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
d680: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
d690: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
d6a0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
d6b0: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
d6c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d6d0: 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
d6e0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
d6f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d700: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
d710: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
d720: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
d730: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
d740: 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d  v[0], 0), " <STM
d750: 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  T>", 0);.    ret
d760: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d770: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
d780: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
d790: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
d7a0: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
d7b0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
d7c0: 52 4f 52 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d  ROR;..  if( pStm
d7d0: 74 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 53 74  t ){.    db = St
d7e0: 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 3b 0a 20  mtToDb(pStmt);. 
d7f0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
d800: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
d810: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
d820: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
d830: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
d840: 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
d850: 0a 20 20 69 66 28 20 64 62 20 26 26 20 73 71 6c  .  if( db && sql
d860: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
d870: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
d880: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
d890: 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
d8a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
d8b0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6e 65  age:  sqlite3_ne
d8c0: 78 74 5f 73 74 6d 74 20 20 44 42 20 20 53 54 4d  xt_stmt  DB  STM
d8d0: 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T.**.** Return t
d8e0: 68 65 20 6e 65 78 74 20 73 74 61 74 6d 65 6e 74  he next statment
d8f0: 20 69 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74   in sequence aft
d900: 65 72 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74  er STMT..*/.stat
d910: 69 63 20 69 6e 74 20 74 65 73 74 5f 6e 65 78 74  ic int test_next
d920: 5f 73 74 6d 74 28 0a 20 20 76 6f 69 64 20 2a 20  _stmt(.  void * 
d930: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
d940: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
d950: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
d960: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
d970: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
d980: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
d990: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d9a0: 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
d9b0: 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
d9c0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
d9d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d9e0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
d9f0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
da00: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
da10: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
da20: 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20  jv[0], 0), " DB 
da30: 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
da40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
da50: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44  .  }..  if( getD
da60: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
da70: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
da80: 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
da90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
daa0: 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ;.  if( getStmtP
dab0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
dac0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
dad0: 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[2]), &pStmt) )
dae0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
daf0: 52 3b 0a 20 20 70 53 74 6d 74 20 3d 20 73 71 6c  R;.  pStmt = sql
db00: 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 28 64  ite3_next_stmt(d
db10: 62 2c 20 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  b, pStmt);.  if(
db20: 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
db30: 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
db40: 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
db50: 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
db60: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
db70: 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
db80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
db90: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
dba0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
dbb0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
dbc0: 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  :  sqlite3_reset
dbd0: 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65    STMT .**.** Re
dbe0: 73 65 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  set a statement 
dbf0: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
dc00: 63 20 69 6e 74 20 74 65 73 74 5f 72 65 73 65 74  c int test_reset
dc10: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
dc20: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
dc30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
dc40: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
dc50: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
dc60: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
dc70: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
dc80: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
dc90: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
dca0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
dcb0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
dcc0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
dcd0: 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
dce0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
dcf0: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
dd00: 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72  TMT>", 0);.    r
dd10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
dd20: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
dd30: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
dd40: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
dd50: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
dd60: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
dd70: 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
dd80: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
dd90: 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74  mt);.  if( pStmt
dda0: 20 26 26 20 73 71 6c 69 74 65 33 54 65 73 74 45   && sqlite3TestE
ddb0: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
ddc0: 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
ddd0: 72 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rc) ){.    retur
dde0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
ddf0: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
de00: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
de10: 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
de20: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 2f  , TCL_STATIC);./
de30: 2a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  *.  if( rc ){.  
de40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
de50: 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65 74  OR;.  }.*/.  ret
de60: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
de70: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
de80: 69 74 65 33 5f 65 78 70 69 72 65 64 20 53 54 4d  ite3_expired STM
de90: 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
dea0: 54 52 55 45 20 69 66 20 61 20 72 65 63 6f 6d 70  TRUE if a recomp
deb0: 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
dec0: 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 63 6f  tatement is reco
ded0: 6d 6d 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  mmended..*/.stat
dee0: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 70 69  ic int test_expi
def0: 72 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  red(.  void * cl
df00: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
df10: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
df20: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
df30: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
df40: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
df50: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
df60: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
df70: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
df80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
df90: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
dfa0: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
dfb0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
dfc0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
dfd0: 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
dfe0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
dff0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
e000: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
e010: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
e020: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
e030: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
e040: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e050: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
e060: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
e070: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 73 71 6c 69 74  BooleanObj(sqlit
e080: 65 33 5f 65 78 70 69 72 65 64 28 70 53 74 6d 74  e3_expired(pStmt
e090: 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
e0a0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
e0b0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 74  sage:  sqlite3_t
e0c0: 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73  ransfer_bindings
e0d0: 20 46 52 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54   FROMSTMT TOSTMT
e0e0: 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  .**.** Transfer 
e0f0: 61 6c 6c 20 62 69 6e 64 69 6e 67 73 20 66 72 6f  all bindings fro
e100: 6d 20 46 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20  m FROMSTMT over 
e110: 74 6f 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61  to TOSTMT.*/.sta
e120: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 72 61  tic int test_tra
e130: 6e 73 66 65 72 5f 62 69 6e 64 28 0a 20 20 76 6f  nsfer_bind(.  vo
e140: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
e150: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
e160: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
e170: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
e180: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
e190: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
e1a0: 74 6d 74 31 2c 20 2a 70 53 74 6d 74 32 3b 0a 20  tmt1, *pStmt2;. 
e1b0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
e1c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
e1d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
e1e0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
e1f0: 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
e200: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
e210: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
e220: 20 30 29 2c 20 22 20 46 52 4f 4d 2d 53 54 4d 54   0), " FROM-STMT
e230: 20 54 4f 2d 53 54 4d 54 22 2c 20 30 29 3b 0a 20   TO-STMT", 0);. 
e240: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e250: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
e260: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
e270: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
e280: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
e290: 53 74 6d 74 31 29 29 20 72 65 74 75 72 6e 20 54  Stmt1)) return T
e2a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
e2b0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
e2c0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
e2d0: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26  ring(objv[2]), &
e2e0: 70 53 74 6d 74 32 29 29 20 72 65 74 75 72 6e 20  pStmt2)) return 
e2f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
e300: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
e310: 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f  terp, .     Tcl_
e320: 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
e330: 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69  3_transfer_bindi
e340: 6e 67 73 28 70 53 74 6d 74 31 2c 70 53 74 6d 74  ngs(pStmt1,pStmt
e350: 32 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  2)));.  return T
e360: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
e370: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
e380: 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a  changes DB.**.**
e390: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
e3a0: 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 6d 61  er of changes ma
e3b0: 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
e3c0: 73 65 20 62 79 20 74 68 65 20 6c 61 73 74 20 53  se by the last S
e3d0: 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  QL.** execution.
e3e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
e3f0: 65 73 74 5f 63 68 61 6e 67 65 73 28 0a 20 20 76  est_changes(.  v
e400: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
e410: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
e420: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
e430: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
e440: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
e450: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
e460: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
e470: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
e480: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
e490: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
e4a0: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
e4b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
e4c0: 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
e4d0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
e4e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
e4f0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
e500: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
e510: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
e520: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
e530: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
e540: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
e550: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
e560: 62 6a 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  bj(sqlite3_chang
e570: 65 73 28 64 62 29 29 29 3b 0a 20 20 72 65 74 75  es(db)));.  retu
e580: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
e590: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
e5a0: 22 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  "static_bind_val
e5b0: 75 65 22 20 74 68 61 74 20 76 61 72 69 61 62 6c  ue" that variabl
e5c0: 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20  es are bound to 
e5d0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46 4c 41 47  when.** the FLAG
e5e0: 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74   option of sqlit
e5f0: 65 33 5f 62 69 6e 64 20 69 73 20 22 73 74 61 74  e3_bind is "stat
e600: 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ic".*/.static ch
e610: 61 72 20 2a 73 71 6c 69 74 65 5f 73 74 61 74 69  ar *sqlite_stati
e620: 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20 3d 20 30  c_bind_value = 0
e630: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ;.static int sql
e640: 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
e650: 6e 62 79 74 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  nbyte = 0;../*.*
e660: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
e670: 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44 58 20  3_bind  VM  IDX 
e680: 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a   VALUE  FLAGS.**
e690: 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76 61 6c  .** Sets the val
e6a0: 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d 74 68  ue of the IDX-th
e6b0: 20 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 22 3f   occurance of "?
e6c0: 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  " in the origina
e6d0: 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e  l SQL.** string.
e6e0: 20 20 56 41 4c 55 45 20 69 73 20 74 68 65 20 6e    VALUE is the n
e6f0: 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20 46 4c  ew value.  If FL
e700: 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e  AGS=="null" then
e710: 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e   VALUE is.** ign
e720: 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  ored and the val
e730: 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ue is set to NUL
e740: 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 73  L.  If FLAGS=="s
e750: 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74  tatic" then.** t
e760: 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  he value is set 
e770: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  to the value of 
e780: 61 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c  a static variabl
e790: 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69  e named.** "sqli
e7a0: 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
e7b0: 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41 47 53  alue".  If FLAGS
e7c0: 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20  =="normal" then 
e7d0: 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65  a copy.** of the
e7e0: 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65 2e 20   VALUE is made. 
e7f0: 20 49 66 20 46 4c 41 47 53 3d 3d 22 62 6c 6f 62   If FLAGS=="blob
e800: 31 30 22 20 74 68 65 6e 20 61 20 56 41 4c 55 45  10" then a VALUE
e810: 20 69 73 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61   is ignored.** a
e820: 6e 20 61 20 31 30 2d 62 79 74 65 20 62 6c 6f 62  n a 10-byte blob
e830: 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30   "abc\000xyz\000
e840: 70 71 22 20 69 73 20 69 6e 73 65 72 74 65 64 2e  pq" is inserted.
e850: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
e860: 65 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64  est_bind(.  void
e870: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
e880: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
e890: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
e8a0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
e8b0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
e8c0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
e8d0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
e8e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
e8f0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
e900: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
e910: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
e920: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
e930: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
e940: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
e950: 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
e960: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
e970: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
e980: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
e990: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
e9a0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
e9b0: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 56 4d  0], .       " VM
e9c0: 20 49 44 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c   IDX VALUE (null
e9d0: 7c 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c  |static|normal)\
e9e0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
e9f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ea00: 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
ea10: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
ea20: 72 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20  rgv[1], &pStmt) 
ea30: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
ea40: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
ea50: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
ea60: 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
ea70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ea80: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
ea90: 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20  v[4],"null")==0 
eaa0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
eab0: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
eac0: 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c  tmt, idx);.  }el
ead0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
eae0: 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 22 29 3d  gv[4],"static")=
eaf0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
eb00: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
eb10: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c  (pStmt, idx, sql
eb20: 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
eb30: 76 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20  value, -1, 0);. 
eb40: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
eb50: 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69  p(argv[4],"stati
eb60: 63 2d 6e 62 79 74 65 73 22 29 3d 3d 30 20 29 7b  c-nbytes")==0 ){
eb70: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
eb80: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
eb90: 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73  t, idx, sqlite_s
eba0: 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
ebb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f           sqlite_
ebe0: 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74  static_bind_nbyt
ebf0: 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  e, 0);.  }else i
ec00: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
ec10: 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20 29  ],"normal")==0 )
ec20: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
ec30: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
ec40: 6d 74 2c 20 69 64 78 2c 20 61 72 67 76 5b 33 5d  mt, idx, argv[3]
ec50: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
ec60: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
ec70: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
ec80: 5b 34 5d 2c 22 62 6c 6f 62 31 30 22 29 3d 3d 30  [4],"blob10")==0
ec90: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
eca0: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
ecb0: 53 74 6d 74 2c 20 69 64 78 2c 20 22 61 62 63 5c  Stmt, idx, "abc\
ecc0: 30 30 30 78 79 7a 5c 30 30 30 70 71 22 2c 20 31  000xyz\000pq", 1
ecd0: 30 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  0, SQLITE_STATIC
ece0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ecf0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ed00: 28 69 6e 74 65 72 70 2c 20 22 34 74 68 20 61 72  (interp, "4th ar
ed10: 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
ed20: 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22 6e 75   ".        "\"nu
ed30: 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74 69 63  ll\" or \"static
ed40: 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22  \" or \"normal\"
ed50: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
ed60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
ed70: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
ed80: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
ed90: 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
eda0: 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
edb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
edc0: 20 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20   rc ){.    char 
edd0: 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 70  zBuf[50];.    sp
ede0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64  rintf(zBuf, "(%d
edf0: 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
ee00: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ee10: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
ee20: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
ee30: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
ee40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
ee50: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
ee60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ee70: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
ee80: 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73  * Usage: add_tes
ee90: 74 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74  t_collate <db pt
eea0: 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  r> <utf8> <utf16
eeb0: 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a  le> <utf16be>.**
eec0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
eed0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  n is used to tes
eee0: 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65  t that SQLite se
eef0: 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63  lects the correc
ef00: 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73  t collation.** s
ef10: 65 71 75 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b  equence callback
ef20: 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76   when multiple v
ef30: 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69 66  ersions (for dif
ef40: 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63 6f  ferent text enco
ef50: 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61 76  dings).** are av
ef60: 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43  ailable..**.** C
ef70: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
ef80: 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 74 68  ine registers th
ef90: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
efa0: 65 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61  ence "test_colla
efb0: 74 65 22 0a 2a 2a 20 77 69 74 68 20 64 61 74 61  te".** with data
efc0: 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e  base handle <db>
efd0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
efe0: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20  ument must be a 
eff0: 6c 69 73 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a  list of three.**
f000: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e   boolean values.
f010: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 69 73   If the first is
f020: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65   true, then a ve
f030: 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f  rsion of test_co
f040: 6c 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65 67 69  llate is.** regi
f050: 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 38  stered for UTF-8
f060: 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
f070: 69 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69  is true, a versi
f080: 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64  on is registered
f090: 20 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65   for.** UTF-16le
f0a0: 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20 69  , if the third i
f0b0: 73 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36  s true, a UTF-16
f0c0: 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  be version is av
f0d0: 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76  ailable..** Prev
f0e0: 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66  ious versions of
f0f0: 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72   test_collate ar
f100: 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  e deleted..**.**
f110: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
f120: 65 71 75 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c  equence test_col
f130: 6c 61 74 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e  late is implemen
f140: 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ted by calling t
f150: 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
f160: 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a  TCL script:.**.*
f170: 2a 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74  *   "test_collat
f180: 65 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72  e <enc> <lhs> <r
f190: 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c  hs>".**.** The <
f1a0: 6c 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61  lhs> and <rhs> a
f1b0: 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  re the two value
f1c0: 73 20 62 65 69 6e 67 20 63 6f 6d 70 61 72 65 64  s being compared
f1d0: 2c 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46  , encoded in UTF
f1e0: 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e  -8..** The <enc>
f1f0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
f200: 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68  e encoding of th
f210: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
f220: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c  tion that.** SQL
f230: 69 74 65 20 73 65 6c 65 63 74 65 64 20 74 6f 20  ite selected to 
f240: 63 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20 74 65  call. The TCL te
f250: 73 74 20 73 63 72 69 70 74 20 69 6d 70 6c 65 6d  st script implem
f260: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74 65 73  ents the.** "tes
f270: 74 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e  t_collate" proc.
f280: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
f290: 20 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20   this will only 
f2a0: 77 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e  work with one in
f2b0: 74 65 70 72 65 74 65 72 20 61 74 20 61 20 74 69  tepreter at a ti
f2c0: 6d 65 2c 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e  me, as the.** in
f2d0: 74 65 72 70 20 70 6f 69 6e 74 65 72 20 74 6f 20  terp pointer to 
f2e0: 75 73 65 20 77 68 65 6e 20 65 76 61 6c 75 61 74  use when evaluat
f2f0: 69 6e 67 20 74 68 65 20 54 43 4c 20 73 63 72 69  ing the TCL scri
f300: 70 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a  pt is stored in.
f310: 2a 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49  ** pTestCollateI
f320: 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  nterp..*/.static
f330: 20 54 63 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65   Tcl_Interp* pTe
f340: 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b  stCollateInterp;
f350: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
f360: 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20  _collate_func(. 
f370: 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20   void *pCtx, .  
f380: 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f  int nA, const vo
f390: 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42  id *zA,.  int nB
f3a0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42  , const void *zB
f3b0: 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
f3c0: 20 2a 69 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61   *i = pTestColla
f3d0: 74 65 49 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20  teInterp;.  int 
f3e0: 65 6e 63 69 6e 20 3d 20 28 69 6e 74 29 70 43 74  encin = (int)pCt
f3f0: 78 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  x;.  int res;.  
f400: 69 6e 74 20 6e 3b 0a 0a 20 20 73 71 6c 69 74 65  int n;..  sqlite
f410: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
f420: 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20   Tcl_Obj *pX;.. 
f430: 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72   pX = Tcl_NewStr
f440: 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 63 6f 6c  ingObj("test_col
f450: 6c 61 74 65 22 2c 20 2d 31 29 3b 0a 20 20 54 63  late", -1);.  Tc
f460: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
f470: 58 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 65  X);..  switch( e
f480: 6e 63 69 6e 20 29 7b 0a 20 20 20 20 63 61 73 65  ncin ){.    case
f490: 20 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20   SQLITE_UTF8:.  
f4a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
f4b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
f4c0: 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  X,Tcl_NewStringO
f4d0: 62 6a 28 22 55 54 46 2d 38 22 2c 2d 31 29 29 3b  bj("UTF-8",-1));
f4e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f4f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
f500: 46 31 36 4c 45 3a 0a 20 20 20 20 20 20 54 63 6c  F16LE:.      Tcl
f510: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
f520: 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
f530: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
f540: 2d 31 36 4c 45 22 2c 2d 31 29 29 3b 0a 20 20 20  -16LE",-1));.   
f550: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
f560: 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  se SQLITE_UTF16B
f570: 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  E:.      Tcl_Lis
f580: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f590: 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74  t(i,pX,Tcl_NewSt
f5a0: 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42  ringObj("UTF-16B
f5b0: 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62  E",-1));.      b
f5c0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
f5d0: 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
f5e0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 56 61 6c 20  0);.  }..  pVal 
f5f0: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
f600: 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
f610: 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
f620: 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20   nA, zA, encin, 
f630: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
f640: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
f650: 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b  lue_bytes(pVal);
f660: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
f670: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
f680: 2c 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53  ,.      Tcl_NewS
f690: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
f6a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f6b0: 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20  xt(pVal),n));.  
f6c0: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
f6d0: 74 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42 2c  tr(pVal, nB, zB,
f6e0: 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53   encin, SQLITE_S
f6f0: 54 41 54 49 43 29 3b 0a 20 20 6e 20 3d 20 73 71  TATIC);.  n = sq
f700: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
f710: 73 28 70 56 61 6c 29 3b 0a 20 20 54 63 6c 5f 4c  s(pVal);.  Tcl_L
f720: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f730: 65 6e 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20  ent(i,pX,.      
f740: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
f750: 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
f760: 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
f770: 2c 6e 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ,n));.  sqlite3V
f780: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
f790: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
f7a0: 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63  (i, pX, 0);.  Tc
f7b0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
f7c0: 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74  X);.  Tcl_GetInt
f7d0: 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47  FromObj(i, Tcl_G
f7e0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c 20  etObjResult(i), 
f7f0: 26 72 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  &res);.  return 
f800: 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  res;.}.static in
f810: 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a  t test_collate(.
f820: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
f830: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
f840: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
f850: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
f860: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
f870: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
f880: 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71  .  int val;.  sq
f890: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
f8a0: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  l;.  int rc;..  
f8b0: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f  if( objc!=5 ) go
f8c0: 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 70  to bad_args;.  p
f8d0: 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72  TestCollateInter
f8e0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69 66  p = interp;.  if
f8f0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
f900: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
f910: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
f920: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
f930: 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54  _ERROR;..  if( T
f940: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
f950: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
f960: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
f970: 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
f980: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
f990: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
f9a0: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  llation(db, "tes
f9b0: 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49  t_collate", SQLI
f9c0: 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
f9d0: 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
f9e0: 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65 73  TE_UTF8, val?tes
f9f0: 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30  t_collate_func:0
fa00: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
fa10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
fa20: 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36  nst void *zUtf16
fa30: 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b  ;.    if( TCL_OK
fa40: 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
fa50: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
fa60: 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
fa70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fa80: 52 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  R;.    rc = sqli
fa90: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
faa0: 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63  tion(db, "test_c
fab0: 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
fac0: 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20  UTF16LE, .      
fad0: 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51        (void *)SQ
fae0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 76 61  LITE_UTF16LE, va
faf0: 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  l?test_collate_f
fb00: 75 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66 28 20  unc:0);.    if( 
fb10: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
fb20: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
fb30: 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
fb40: 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
fb50: 4c 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20 30 0a  L_ERROR;..#if 0.
fb60: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
fb70: 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b  iMallocFail>0 ){
fb80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
fb90: 4d 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20  MallocFail++;.  
fba0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73    }.#endif.    s
fbb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
fbc0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
fbd0: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
fbe0: 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
fbf0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
fc00: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
fc10: 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
fc20: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
fc30: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
fc40: 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74 65   zUtf16 = sqlite
fc50: 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
fc60: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
fc70: 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62  IVE);.    if( db
fc80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
fc90: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
fca0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
fcb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
fcc0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
fcd0: 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20  collation16(db, 
fce0: 7a 55 74 66 31 36 2c 20 53 51 4c 49 54 45 5f 55  zUtf16, SQLITE_U
fcf0: 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20  TF16BE, .       
fd00: 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54     (void *)SQLIT
fd10: 45 5f 55 54 46 31 36 42 45 2c 20 76 61 6c 3f 74  E_UTF16BE, val?t
fd20: 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
fd30: 3a 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  :0);.    }.    s
fd40: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
fd50: 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  pVal);.    sqlit
fd60: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
fd70: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20  b->mutex);.  }. 
fd80: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
fd90: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
fda0: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
fdb0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a 20   TCL_ERROR;.  . 
fdc0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fdd0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
fde0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
fdf0: 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  p, sqlite3TestEr
fe00: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
fe10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
fe20: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
fe30: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64  urn TCL_OK;..bad
fe40: 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70  _args:.  Tcl_App
fe50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
fe60: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
fe70: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
fe80: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
fe90: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
fea0: 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c  0], 0), " <DB> <
feb0: 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20  utf8> <utf16le> 
fec0: 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a  <utf16be>", 0);.
fed0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
fee0: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  OR;.}../*.** Whe
fef0: 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  n the collation 
ff00: 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 20  needed callback 
ff10: 69 73 20 69 6e 76 6f 6b 65 64 2c 20 72 65 63 6f  is invoked, reco
ff20: 72 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 0a  rd the name of .
ff30: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
ff40: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
ff50: 69 6f 6e 20 68 65 72 65 2e 20 20 54 68 65 20 72  ion here.  The r
ff60: 65 63 6f 72 64 65 64 20 6e 61 6d 65 20 69 73 20  ecorded name is 
ff70: 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f 20 61 20 54  linked.** to a T
ff80: 43 4c 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20  CL variable and 
ff90: 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
ffa0: 65 20 74 68 61 74 20 74 68 65 20 72 65 71 75 65  e that the reque
ffb0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a  sted collation.*
ffc0: 2a 20 6e 61 6d 65 20 69 73 20 63 6f 72 72 65 63  * name is correc
ffd0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  t..*/.static cha
ffe0: 72 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69  r zNeededCollati
fff0: 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61 74 69 63 20  on[200];.static 
10000 63 68 61 72 20 2a 70 7a 4e 65 65 64 65 64 43 6f  char *pzNeededCo
10010 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e 65 65 64 65  llation = zNeede
10020 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a  dCollation;.../*
10030 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20  .** Called when 
10040 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
10050 65 6e 63 65 20 69 73 20 6e 65 65 64 65 64 2e 20  ence is needed. 
10060 20 52 65 67 69 73 74 65 72 65 64 20 75 73 69 6e   Registered usin
10070 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  g.** sqlite3_col
10080 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28  lation_needed16(
10090 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
100a0 64 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  d test_collate_n
100b0 65 65 64 65 64 5f 63 62 28 0a 20 20 76 6f 69 64  eeded_cb(.  void
100c0 20 2a 70 43 74 78 2c 20 0a 20 20 73 71 6c 69 74   *pCtx, .  sqlit
100d0 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 54  e3 *db,.  int eT
100e0 65 78 74 52 65 70 2c 0a 20 20 63 6f 6e 73 74 20  extRep,.  const 
100f0 76 6f 69 64 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20  void *pName.){. 
10100 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 64   int enc = ENC(d
10110 62 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  b);.  int i;.  c
10120 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20  har *z;.  for(z 
10130 3d 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2c 20  = (char*)pName, 
10140 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b  i=0; *z || z[1];
10150 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
10160 7a 20 29 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  z ) zNeededColla
10170 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a  tion[i++] = *z;.
10180 20 20 7d 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c    }.  zNeededCol
10190 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20  lation[i] = 0;. 
101a0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
101b0 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 20 20 20  collation(.     
101c0 20 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61   db, "test_colla
101d0 74 65 22 2c 20 45 4e 43 28 64 62 29 2c 20 28 76  te", ENC(db), (v
101e0 6f 69 64 20 2a 29 65 6e 63 2c 20 74 65 73 74 5f  oid *)enc, test_
101f0 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d  collate_func);.}
10200 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  ../*.** Usage: a
10210 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  dd_test_collate_
10220 6e 65 65 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61  needed DB.*/.sta
10230 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
10240 6c 61 74 65 5f 6e 65 65 64 65 64 28 0a 20 20 76  late_needed(.  v
10250 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
10260 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
10270 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
10280 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
10290 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
102a0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
102b0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
102c0 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20 62 61  bjc!=2 ) goto ba
102d0 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65  d_args;.  if( ge
102e0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
102f0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
10300 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
10310 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
10320 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
10330 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
10340 64 65 64 31 36 28 64 62 2c 20 30 2c 20 74 65 73  ded16(db, 0, tes
10350 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64  t_collate_needed
10360 5f 63 62 29 3b 0a 20 20 7a 4e 65 65 64 65 64 43  _cb);.  zNeededC
10370 6f 6c 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b  ollation[0] = 0;
10380 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
10390 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
103a0 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
103b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
103c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a  return TCL_OK;..
103d0 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f  bad_args:.  Tcl_
103e0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
103f0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
10400 42 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  B");.  return TC
10410 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  L_ERROR;.}../*.*
10420 2a 20 74 63 6c 63 6d 64 3a 20 20 20 61 64 64 5f  * tclcmd:   add_
10430 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63  alignment_test_c
10440 6f 6c 6c 61 74 69 6f 6e 73 20 20 44 42 0a 2a 2a  ollations  DB.**
10450 0a 2a 2a 20 41 64 64 20 74 77 6f 20 6e 65 77 20  .** Add two new 
10460 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
10470 63 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ces to the datab
10480 61 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20  ase DB.**.**    
10490 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 0a 2a   utf16_aligned.*
104a0 2a 20 20 20 20 20 75 74 66 31 36 5f 75 6e 61 6c  *     utf16_unal
104b0 69 67 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68  igned.**.** Both
104c0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
104d0 6e 63 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  nces use the sam
104e0 65 20 73 6f 72 74 20 6f 72 64 65 72 20 61 73 20  e sort order as 
104f0 42 49 4e 41 52 59 2e 0a 2a 2a 20 54 68 65 20 6f  BINARY..** The o
10500 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20 69  nly difference i
10510 73 20 74 68 61 74 20 74 68 65 20 75 74 66 31 36  s that the utf16
10520 5f 61 6c 69 67 6e 65 64 20 63 6f 6c 6c 61 74 69  _aligned collati
10530 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 69  ng.** sequence i
10540 73 20 64 65 63 6c 61 72 65 64 20 77 69 74 68 20  s declared with 
10550 74 68 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36  the SQLITE_UTF16
10560 5f 41 4c 49 47 4e 45 44 20 66 6c 61 67 2e 0a 2a  _ALIGNED flag..*
10570 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67  * Both collating
10580 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 63 72 65   functions incre
10590 6d 65 6e 74 20 74 68 65 20 75 6e 61 6c 69 67 6e  ment the unalign
105a0 65 64 20 75 74 66 31 36 20 63 6f 75 6e 74 65 72  ed utf16 counter
105b0 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 74 68 65  .** whenever the
105c0 79 20 73 65 65 20 61 20 73 74 72 69 6e 67 20 74  y see a string t
105d0 68 61 74 20 62 65 67 69 6e 73 20 6f 6e 20 61 6e  hat begins on an
105e0 20 6f 64 64 20 62 79 74 65 20 62 6f 75 6e 64 61   odd byte bounda
105f0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
10600 74 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69  t unaligned_stri
10610 6e 67 5f 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a  ng_counter = 0;.
10620 73 74 61 74 69 63 20 69 6e 74 20 61 6c 69 67 6e  static int align
10630 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a 20 20  mentCollFunc(.  
10640 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
10650 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
10660 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20  t void *pKey1,. 
10670 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
10680 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
10690 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20  .  int rc, n;.  
106a0 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20  n = nKey1<nKey2 
106b0 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b  ? nKey1 : nKey2;
106c0 0a 20 20 69 66 28 20 6e 4b 65 79 31 3e 30 20 26  .  if( nKey1>0 &
106d0 26 20 31 3d 3d 28 31 26 28 69 6e 74 29 70 4b 65  & 1==(1&(int)pKe
106e0 79 31 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f  y1) ) unaligned_
106f0 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b  string_counter++
10700 3b 0a 20 20 69 66 28 20 6e 4b 65 79 32 3e 30 20  ;.  if( nKey2>0 
10710 26 26 20 31 3d 3d 28 31 26 28 69 6e 74 29 70 4b  && 1==(1&(int)pK
10720 65 79 32 29 20 29 20 75 6e 61 6c 69 67 6e 65 64  ey2) ) unaligned
10730 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b  _string_counter+
10740 2b 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70  +;.  rc = memcmp
10750 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e  (pKey1, pKey2, n
10760 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
10770 7b 0a 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31  {.    rc = nKey1
10780 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20   - nKey2;.  }.  
10790 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
107a0 74 69 63 20 69 6e 74 20 61 64 64 5f 61 6c 69 67  tic int add_alig
107b0 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
107c0 74 69 6f 6e 73 28 0a 20 20 76 6f 69 64 20 2a 20  tions(.  void * 
107d0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
107e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
107f0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10800 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10810 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
10820 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62  e3 *db;.  if( ob
10830 6a 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc>=2 ){.    if(
10840 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
10850 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
10860 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
10870 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
10880 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
10890 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
108a0 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 75  ion(db, "utf16_u
108b0 6e 61 6c 69 67 6e 65 64 22 2c 0a 20 20 20 20 20  naligned",.     
108c0 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c     SQLITE_UTF16,
108d0 20 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69   .        0, ali
108e0 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b  gnmentCollFunc);
108f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
10900 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
10910 2c 20 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64  , "utf16_aligned
10920 22 2c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  ",.        SQLIT
10930 45 5f 55 54 46 31 36 20 7c 20 53 51 4c 49 54 45  E_UTF16 | SQLITE
10940 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20  _UTF16_ALIGNED, 
10950 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67  .        0, alig
10960 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a  nmentCollFunc);.
10970 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10980 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
10990 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
109a0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20  ITE_OMIT_UTF16) 
109b0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  */../*.** Usage:
109c0 20 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69   add_test_functi
109d0 6f 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66  on <db ptr> <utf
109e0 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74  8> <utf16le> <ut
109f0 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69  f16be>.**.** Thi
10a00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
10a10 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  ed to test that 
10a20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74  SQLite selects t
10a30 68 65 20 63 6f 72 72 65 63 74 20 75 73 65 72 0a  he correct user.
10a40 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ** function call
10a50 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70  back when multip
10a60 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72  le versions (for
10a70 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20   different text 
10a80 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72  encodings).** ar
10a90 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  e available..**.
10aa0 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
10ab0 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
10ac0 73 20 75 70 20 74 6f 20 74 68 72 65 65 20 76 65  s up to three ve
10ad0 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75 73  rsions of the us
10ae0 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22  er function.** "
10af0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77  test_function" w
10b00 69 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e  ith database han
10b10 64 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74 68  dle <db>.  If th
10b20 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
10b30 74 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68  t is.** true, th
10b40 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  en a version of 
10b50 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73  test_function is
10b60 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
10b70 55 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a  UTF-8, if the.**
10b80 20 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20   third is true, 
10b90 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67  a version is reg
10ba0 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d  istered for UTF-
10bb0 31 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f 75  16le, if the fou
10bc0 72 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20  rth is.** true, 
10bd0 61 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69  a UTF-16be versi
10be0 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  on is available.
10bf0 20 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69    Previous versi
10c00 6f 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66  ons of.** test_f
10c10 75 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c 65  unction are dele
10c20 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75  ted..**.** The u
10c30 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ser function is 
10c40 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63  implemented by c
10c50 61 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  alling the follo
10c60 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a  wing TCL script:
10c70 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66  .**.**   "test_f
10c80 75 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61  unction <enc> <a
10c90 72 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65  rg>".**.** Where
10ca0 20 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66   <enc> is one of
10cb0 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45   UTF-8, UTF-16LE
10cc0 20 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e 64   or UTF16BE, and
10cd0 20 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a   <arg> is the.**
10ce0 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
10cf0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 53   passed to the S
10d00 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  QL function. The
10d10 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
10d20 62 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73 63  by.** the TCL sc
10d30 72 69 70 74 20 69 73 20 75 73 65 64 20 61 73 20  ript is used as 
10d40 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
10d50 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63   of the SQL func
10d60 74 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70  tion. It.** is p
10d70 61 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65 20  assed to SQLite 
10d80 75 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20 66  using UTF-16BE f
10d90 6f 72 20 61 20 55 54 46 2d 38 20 74 65 73 74 5f  or a UTF-8 test_
10da0 66 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d  function(), UTF-
10db0 38 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d 31  8.** for a UTF-1
10dc0 36 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  6LE test_functio
10dd0 6e 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c  n(), and UTF-16L
10de0 45 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65  E for an impleme
10df0 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  ntation that.** 
10e00 70 72 65 66 65 72 73 20 55 54 46 2d 31 36 42 45  prefers UTF-16BE
10e10 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
10e20 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73  ITE_OMIT_UTF16.s
10e30 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
10e40 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20  function_utf8(. 
10e50 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
10e60 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
10e70 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
10e80 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
10e90 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10ea0 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
10eb0 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
10ec0 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
10ed0 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
10ee0 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
10ef0 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
10f00 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
10f10 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
10f20 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
10f30 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
10f40 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
10f50 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10f60 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
10f70 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
10f80 38 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  8", -1));.  Tcl_
10f90 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10fa0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
10fb0 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53   .      Tcl_NewS
10fc0 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
10fd0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
10fe0 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29  xt(argv[0]), -1)
10ff0 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
11000 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30  Ex(interp, pX, 0
11010 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
11020 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c  Count(pX);.  sql
11030 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
11040 28 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74  (pCtx, Tcl_GetSt
11050 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
11060 70 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  p), -1, SQLITE_T
11070 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61  RANSIENT);.  pVa
11080 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
11090 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  New(0);.  sqlite
110a0 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
110b0 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74  l, -1, Tcl_GetSt
110c0 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
110d0 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54  p), .      SQLIT
110e0 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
110f0 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
11100 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62  3_result_text16b
11110 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f  e(pCtx, sqlite3_
11120 76 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70  value_text16be(p
11130 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20  Val),.      -1, 
11140 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
11150 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
11160 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73  eFree(pVal);.}.s
11170 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
11180 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65  function_utf16le
11190 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
111a0 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
111b0 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
111c0 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
111d0 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
111e0 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  interp;.  Tcl_Ob
111f0 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  j *pX;.  sqlite3
11200 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
11210 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e  interp = (Tcl_In
11220 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75  terp *)sqlite3_u
11230 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a  ser_data(pCtx);.
11240 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74    pX = Tcl_NewSt
11250 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75  ringObj("test_fu
11260 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20  nction", -1);.  
11270 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
11280 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  (pX);.  Tcl_List
11290 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
112a0 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c  (interp, pX, Tcl
112b0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
112c0 54 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a  TF-16LE", -1));.
112d0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
112e0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
112f0 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63  p, pX, .      Tc
11300 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
11310 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
11320 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
11330 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  ), -1));.  Tcl_E
11340 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
11350 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44   pX, 0);.  Tcl_D
11360 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ecrRefCount(pX);
11370 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
11380 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
11390 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
113a0 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c  tr(pVal, -1, Tcl
113b0 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
113c0 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20  (interp), .     
113d0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
113e0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
113f0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
11400 65 78 74 28 70 43 74 78 2c 28 63 68 61 72 2a 29  ext(pCtx,(char*)
11410 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
11420 78 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49  xt(pVal),-1,SQLI
11430 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
11440 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
11450 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69  e(pVal);.}.stati
11460 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63  c void test_func
11470 74 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20  tion_utf16be(.  
11480 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
11490 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
114a0 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
114b0 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
114c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
114d0 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
114e0 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  X;.  sqlite3_val
114f0 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65  ue *pVal;.  inte
11500 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70  rp = (Tcl_Interp
11510 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   *)sqlite3_user_
11520 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58  data(pCtx);.  pX
11530 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
11540 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69  Obj("test_functi
11550 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  on", -1);.  Tcl_
11560 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
11570 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
11580 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11590 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77  erp, pX, Tcl_New
115a0 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31  StringObj("UTF-1
115b0 36 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  6BE", -1));.  Tc
115c0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
115d0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
115e0 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65  X, .      Tcl_Ne
115f0 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
11600 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
11610 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d  text(argv[0]), -
11620 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  1));.  Tcl_EvalO
11630 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c  bjEx(interp, pX,
11640 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
11650 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70  efCount(pX);.  p
11660 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
11670 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69  ueNew(0);.  sqli
11680 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
11690 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74  Val, -1, Tcl_Get
116a0 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
116b0 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c  erp), .      SQL
116c0 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
116d0 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69  _STATIC);.  sqli
116e0 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31  te3_result_text1
116f0 36 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f  6(pCtx, sqlite3_
11700 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70  value_text16le(p
11710 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20  Val),.      -1, 
11720 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
11730 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
11740 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70 43 74  ult_text16be(pCt
11750 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  x, sqlite3_value
11760 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c  _text16le(pVal),
11770 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54  .      -1, SQLIT
11780 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
11790 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
117a0 65 78 74 31 36 6c 65 28 70 43 74 78 2c 20 73 71  ext16le(pCtx, sq
117b0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
117c0 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20  16le(pVal),.    
117d0 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41    -1, SQLITE_TRA
117e0 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
117f0 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
11800 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
11810 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
11820 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74   */.static int t
11830 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  est_function(.  
11840 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
11850 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
11860 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
11870 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
11880 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
11890 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
118a0 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
118b0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76  te3 *db;.  int v
118c0 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  al;..  if( objc!
118d0 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72  =5 ) goto bad_ar
118e0 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50  gs;.  if( getDbP
118f0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
11900 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
11910 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
11920 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11930 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
11940 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
11950 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
11960 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[2], &val) ) re
11970 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11980 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20    if( val ){.   
11990 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
119a0 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65  function(db, "te
119b0 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c  st_function", 1,
119c0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
119d0 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74         interp, t
119e0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
119f0 38 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  8, 0, 0);.  }.  
11a00 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
11a10 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
11a20 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
11a30 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
11a40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
11a50 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71  f( val ){.    sq
11a60 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11a70 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ction(db, "test_
11a80 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51  function", 1, SQ
11a90 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20  LITE_UTF16LE, . 
11aa0 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74         interp, t
11ab0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
11ac0 31 36 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  16le, 0, 0);.  }
11ad0 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
11ae0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
11af0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
11b00 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[4], &val) ) re
11b10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11b20 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20    if( val ){.   
11b30 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
11b40 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65  function(db, "te
11b50 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c  st_function", 1,
11b60 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
11b70 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70   .        interp
11b80 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  , test_function_
11b90 75 74 66 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a  utf16be, 0, 0);.
11ba0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
11bb0 4c 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a  L_OK;.bad_args:.
11bc0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
11bd0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
11be0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
11bf0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54   be \"",.      T
11c00 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
11c10 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
11c20 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c   " <DB> <utf8> <
11c30 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62  utf16le> <utf16b
11c40 65 3e 22 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20  e>", 0);.#endif 
11c50 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
11c60 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
11c70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f   TCL_ERROR;.}../
11c80 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 20  *.** Usage:     
11c90 20 20 20 20 74 65 73 74 5f 65 72 72 73 74 72 20      test_errstr 
11ca0 3c 65 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a  <err code>.**.**
11cb0 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20 65   Test that the e
11cc0 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
11cd0 73 74 72 69 6e 67 20 65 71 75 69 76 61 6c 65 6e  string equivalen
11ce0 74 73 20 66 6f 72 20 73 71 6c 69 74 65 20 65 72  ts for sqlite er
11cf0 72 6f 72 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65  ror codes.** are
11d00 20 73 61 6e 65 2e 20 54 68 65 20 70 61 72 61 6d   sane. The param
11d10 65 74 65 72 20 69 73 20 61 6e 20 69 6e 74 65 67  eter is an integ
11d20 65 72 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  er representing 
11d30 61 6e 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20  an sqlite error 
11d40 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  code..** The res
11d50 75 6c 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ult is a list of
11d60 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74   two elements, t
11d70 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
11d80 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  entation of the.
11d90 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  ** error code an
11da0 64 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61  d the english la
11db0 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
11dc0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
11dd0 74 20 74 65 73 74 5f 65 72 72 73 74 72 28 0a 20  t test_errstr(. 
11de0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
11df0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
11e00 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
11e10 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
11e20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
11e30 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a  .  char *zCode;.
11e40 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 6f    int i;.  if( o
11e50 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
11e60 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
11e70 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
11e80 22 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22 29 3b  "<error code>");
11e90 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d 20  .  }..  zCode = 
11ea0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11eb0 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  jv[1]);.  for(i=
11ec0 30 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a  0; i<200; i++){.
11ed0 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
11ee0 70 28 74 31 45 72 72 6f 72 4e 61 6d 65 28 69 29  p(t1ErrorName(i)
11ef0 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61 6b  , zCode) ) break
11f00 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52  ;.  }.  Tcl_SetR
11f10 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
11f20 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
11f30 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72 65  Str(i), 0);.  re
11f40 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
11f50 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20  /*.** Usage:    
11f60 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a  breakpoint.**.**
11f70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78   This routine ex
11f80 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75 72  ists for one pur
11f90 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69 64  pose - to provid
11fa0 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75 74  e a place to put
11fb0 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74   a.** breakpoint
11fc0 20 77 69 74 68 20 47 44 42 20 74 68 61 74 20 63   with GDB that c
11fd0 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 64 20  an be triggered 
11fe0 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20  using TCL code. 
11ff0 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20   The use.** for 
12000 74 68 69 73 20 69 73 20 77 68 65 6e 20 61 20 70  this is when a p
12010 61 72 74 69 63 75 6c 61 72 20 74 65 73 74 20 66  articular test f
12020 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74 68  ails on (say) th
12030 65 20 31 34 38 35 74 68 20 69 74 65 72 61 74 69  e 1485th iterati
12040 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43  on..** In the TC
12050 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c 20 77  L test script, w
12060 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20 6c  e can add code l
12070 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
12080 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38 35      if {$i==1485
12090 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a  } breakpoint.**.
120a0 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73 74  ** Then run test
120b0 66 69 78 74 75 72 65 20 69 6e 20 74 68 65 20 64  fixture in the d
120c0 65 62 75 67 67 65 72 20 61 6e 64 20 77 61 69 74  ebugger and wait
120d0 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70 6f   for the breakpo
120e0 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20  int to.** fire. 
120f0 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c   Then additional
12100 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e   breakpoints can
12110 20 62 65 20 73 65 74 20 74 6f 20 74 72 61 63 65   be set to trace
12120 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a   down the bug..*
12130 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
12140 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20  t_breakpoint(.  
12150 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
12160 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
12170 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
12180 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
12190 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
121a0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
121b0 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
121c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
121d0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
121e0 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
121f0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
12200 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
12210 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
12220 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  TCL_OK;         
12230 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
12240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
12250 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
12260 7a 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49  zeroblob  STMT I
12270 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  DX N.**.** Test 
12280 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
12290 5f 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66  _zeroblob interf
122a0 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
122b0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
122c0 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68  nt..** IDX is th
122d0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
122e0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
122f0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
12300 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
12310 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65  * binds a N-byte
12320 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f   zero-filled BLO
12330 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  B to the wildcar
12340 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12350 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
12360 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
12370 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
12380 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
12390 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
123a0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
123b0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
123c0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
123d0 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e  int idx;.  int n
123e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
123f0 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
12400 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
12410 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
12420 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22  jv, "STMT IDX N"
12430 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
12440 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
12450 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
12460 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
12470 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
12480 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
12490 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
124a0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
124b0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
124c0 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
124d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
124e0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
124f0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
12500 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
12510 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12520 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
12530 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
12540 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b  (pStmt, idx, n);
12550 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
12560 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
12570 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
12580 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
12590 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
125a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
125b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
125c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
125d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
125e0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
125f0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
12600 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a    STMT N VALUE.*
12610 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
12620 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69  lite3_bind_int i
12630 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
12640 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
12650 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
12660 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
12670 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
12680 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
12690 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
126a0 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32 2d  d.** binds a 32-
126b0 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55  bit integer VALU
126c0 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61  E to that wildca
126d0 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
126e0 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28  t test_bind_int(
126f0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
12700 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
12710 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
12720 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
12730 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
12740 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
12750 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
12760 69 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65  idx;.  int value
12770 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
12780 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
12790 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
127a0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
127b0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
127c0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
127d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
127e0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
127f0 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
12800 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
12810 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12820 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
12830 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
12840 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
12850 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
12860 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12870 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
12880 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
12890 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
128a0 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
128b0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
128c0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
128d0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
128e0 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e  &value) ) return
128f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
12900 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
12910 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  _int(pStmt, idx,
12920 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73   value);.  if( s
12930 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
12940 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
12950 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
12960 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12970 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
12980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
12990 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
129a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
129b0 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
129c0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
129d0 5f 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d  _bind_int64  STM
129e0 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20  T N VALUE.**.** 
129f0 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
12a00 5f 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65  _bind_int64 inte
12a10 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
12a20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
12a30 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
12a40 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
12a50 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
12a60 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
12a70 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
12a80 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74  * binds a 64-bit
12a90 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74   integer VALUE t
12aa0 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e  o that wildcard.
12ab0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
12ac0 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a  est_bind_int64(.
12ad0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
12ae0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
12af0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
12b00 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
12b10 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
12b20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
12b30 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
12b40 64 78 3b 0a 20 20 69 36 34 20 76 61 6c 75 65 3b  dx;.  i64 value;
12b50 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
12b60 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
12b70 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12b80 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
12b90 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
12ba0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
12bb0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12bc0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
12bd0 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
12be0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
12bf0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
12c00 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
12c10 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
12c20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
12c30 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
12c40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12c50 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
12c60 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
12c70 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
12c80 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12c90 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
12ca0 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
12cb0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
12cc0 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65 74  ], &value) ) ret
12cd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
12ce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
12cf0 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
12d00 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20   idx, value);.  
12d10 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
12d20 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
12d30 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
12d40 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
12d50 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
12d60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12d70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12d80 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
12d90 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
12da0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
12db0 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
12dc0 65 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  e  STMT N VALUE.
12dd0 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
12de0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
12df0 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  le interface.  S
12e00 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
12e10 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
12e20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
12e30 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
12e40 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
12e50 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
12e60 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
12e70 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
12e80 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
12e90 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
12ea0 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
12eb0 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a  double(.  void *
12ec0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
12ed0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12ee0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
12ef0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
12f00 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
12f10 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
12f20 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f  .  int idx;.  do
12f30 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 69 6e  uble value;.  in
12f40 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
12f50 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74 20  ar *zVal;.  int 
12f60 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  i;.  static cons
12f70 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
12f80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
12f90 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
12fa0 20 74 68 65 20 73 70 65 63 69 61 6c 20 66 6c 6f   the special flo
12fb0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
12fc0 65 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  e */.    unsigne
12fd0 64 20 69 6e 74 20 69 55 70 70 65 72 3b 20 20 20  d int iUpper;   
12fe0 2f 2a 20 55 70 70 65 72 20 33 32 20 62 69 74 73  /* Upper 32 bits
12ff0 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
13000 20 69 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 2f   int iLower;   /
13010 2a 20 4c 6f 77 65 72 20 33 32 20 62 69 74 73 20  * Lower 32 bits 
13020 2a 2f 0a 20 20 7d 20 61 53 70 65 63 69 61 6c 46  */.  } aSpecialF
13030 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 20 22  p[] = {.    {  "
13040 4e 61 4e 22 2c 20 20 20 20 20 20 30 78 37 66 66  NaN",      0x7ff
13050 66 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66  fffff, 0xfffffff
13060 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 53 4e 61  f },.    {  "SNa
13070 4e 22 2c 20 20 20 20 20 30 78 37 66 66 37 66 66  N",     0x7ff7ff
13080 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d  ff, 0xffffffff }
13090 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 22 2c  ,.    {  "-NaN",
130a0 20 20 20 20 20 30 78 66 66 66 66 66 66 66 66 2c       0xffffffff,
130b0 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20   0xffffffff },. 
130c0 20 20 20 7b 20 20 22 2d 53 4e 61 4e 22 2c 20 20     {  "-SNaN",  
130d0 20 20 30 78 66 66 66 37 66 66 66 66 2c 20 30 78    0xfff7ffff, 0x
130e0 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20  ffffffff },.    
130f0 7b 20 20 22 2b 49 6e 66 22 2c 20 20 20 20 20 30  {  "+Inf",     0
13100 78 37 66 66 30 30 30 30 30 2c 20 30 78 30 30 30  x7ff00000, 0x000
13110 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20  00000 },.    {  
13120 22 2d 49 6e 66 22 2c 20 20 20 20 20 30 78 66 66  "-Inf",     0xff
13130 66 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  f00000, 0x000000
13140 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 45 70  00 },.    {  "Ep
13150 73 69 6c 6f 6e 22 2c 20 20 30 78 30 30 30 30 30  silon",  0x00000
13160 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 31 20  000, 0x00000001 
13170 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 45 70 73 69  },.    {  "-Epsi
13180 6c 6f 6e 22 2c 20 30 78 38 30 30 30 30 30 30 30  lon", 0x80000000
13190 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d 2c 0a  , 0x00000001 },.
131a0 20 20 20 20 7b 20 20 22 4e 61 4e 30 22 2c 20 20      {  "NaN0",  
131b0 20 20 20 30 78 37 66 66 38 30 30 30 30 2c 20 30     0x7ff80000, 0
131c0 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20  x00000000 },.   
131d0 20 7b 20 20 22 2d 4e 61 4e 30 22 2c 20 20 20 20   {  "-NaN0",    
131e0 30 78 66 66 66 38 30 30 30 30 2c 20 30 78 30 30  0xfff80000, 0x00
131f0 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 0a  000000 },.  };..
13200 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
13210 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
13220 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
13230 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
13240 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
13250 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
13260 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
13270 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
13280 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  ALUE", 0);.    r
13290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
132a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
132b0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
132c0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
132d0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
132e0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
132f0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
13300 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
13310 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
13320 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
13330 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  CL_ERROR;..  /* 
13340 49 6e 74 65 72 63 65 70 74 20 74 68 65 20 73 74  Intercept the st
13350 72 69 6e 67 20 22 4e 61 4e 22 20 61 6e 64 20 67  ring "NaN" and g
13360 65 6e 65 72 61 74 65 20 61 20 4e 61 4e 20 76 61  enerate a NaN va
13370 6c 75 65 20 66 6f 72 20 69 74 2e 0a 20 20 2a 2a  lue for it..  **
13380 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 72 69 6e   All other strin
13390 67 73 20 61 72 65 20 70 61 73 73 65 64 20 74 68  gs are passed th
133a0 72 6f 75 67 68 20 74 6f 20 54 63 6c 5f 47 65 74  rough to Tcl_Get
133b0 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 2e  DoubleFromObj().
133c0 0a 20 20 2a 2a 20 54 63 6c 5f 47 65 74 44 6f 75  .  ** Tcl_GetDou
133d0 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 20 73 68 6f  bleFromObj() sho
133e0 75 6c 64 20 75 6e 64 65 72 73 74 61 6e 64 20 22  uld understand "
133f0 4e 61 4e 22 20 62 75 74 20 73 6f 6d 65 20 76 65  NaN" but some ve
13400 72 73 69 6f 6e 73 0a 20 20 2a 2a 20 63 6f 6e 74  rsions.  ** cont
13410 61 69 6e 20 61 20 62 75 67 2e 0a 20 20 2a 2f 0a  ain a bug..  */.
13420 20 20 7a 56 61 6c 20 3d 20 54 63 6c 5f 47 65 74    zVal = Tcl_Get
13430 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
13440 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
13450 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29  zeof(aSpecialFp)
13460 2f 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c  /sizeof(aSpecial
13470 46 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  Fp[0]); i++){.  
13480 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 53 70    if( strcmp(aSp
13490 65 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e 61 6d 65  ecialFp[i].zName
134a0 2c 20 7a 56 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zVal)==0 ){.  
134b0 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74      sqlite3_uint
134c0 36 34 20 78 3b 0a 20 20 20 20 20 20 78 20 3d 20  64 x;.      x = 
134d0 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69 55  aSpecialFp[i].iU
134e0 70 70 65 72 3b 0a 20 20 20 20 20 20 78 20 3c 3c  pper;.      x <<
134f0 3d 20 33 32 3b 0a 20 20 20 20 20 20 78 20 7c 3d  = 32;.      x |=
13500 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69   aSpecialFp[i].i
13510 4c 6f 77 65 72 3b 0a 20 20 20 20 20 20 61 73 73  Lower;.      ass
13520 65 72 74 28 20 73 69 7a 65 6f 66 28 76 61 6c 75  ert( sizeof(valu
13530 65 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 61  e)==8 );.      a
13540 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
13550 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ==8 );.      mem
13560 63 70 79 28 26 76 61 6c 75 65 2c 20 26 78 2c 20  cpy(&value, &x, 
13570 38 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  8);.      break;
13580 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
13590 20 69 3e 3d 73 69 7a 65 6f 66 28 61 53 70 65 63   i>=sizeof(aSpec
135a0 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53  ialFp)/sizeof(aS
135b0 70 65 63 69 61 6c 46 70 5b 30 5d 29 20 26 26 0a  pecialFp[0]) &&.
135c0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
135d0 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  DoubleFromObj(in
135e0 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
135f0 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 72 65  value) ){.    re
13600 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13610 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
13620 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70  e3_bind_double(p
13630 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
13640 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
13650 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
13660 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
13670 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
13680 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
13690 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
136a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
136b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
136c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
136d0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
136e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
136f0 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a 0a 2a  ull  STMT N.**.*
13700 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
13710 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69 6e 74  e3_bind_null int
13720 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
13730 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
13740 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
13750 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
13760 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
13770 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
13780 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
13790 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c 4c 20  ** binds a NULL 
137a0 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
137b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
137c0 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a 20  est_bind_null(. 
137d0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
137e0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
137f0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
13800 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
13810 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
13820 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
13830 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
13840 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  x;.  int rc;..  
13850 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
13860 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13870 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
13880 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
13890 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
138a0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
138b0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
138c0 30 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c 20 30  0), " STMT N", 0
138d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
138e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
138f0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
13900 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
13910 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
13920 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
13930 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13940 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
13950 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
13960 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
13970 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13980 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
13990 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
139a0 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20 73  t, idx);.  if( s
139b0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
139c0 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
139d0 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
139e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
139f0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
13a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
13a10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13a20 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
13a30 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
13a40 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
13a50 62 69 6e 64 5f 74 65 78 74 20 20 53 54 4d 54 20  bind_text  STMT 
13a60 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a  N STRING BYTES.*
13a70 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
13a80 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
13a90 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
13aa0 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
13ab0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
13ac0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
13ad0 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
13ae0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
13af0 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
13b00 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54  nd.** binds a UT
13b10 46 2d 38 20 73 74 72 69 6e 67 20 53 54 52 49 4e  F-8 string STRIN
13b20 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  G to the wildcar
13b30 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69  d.  The string i
13b40 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a  s BYTES bytes.**
13b50 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   long..*/.static
13b60 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74   int test_bind_t
13b70 65 78 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ext(.  void * cl
13b80 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
13b90 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
13ba0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
13bb0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
13bc0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
13bd0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
13be0 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62  int idx;.  int b
13bf0 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61  ytes;.  char *va
13c00 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
13c10 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b    if( objc!=5 ){
13c20 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
13c30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
13c40 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
13c50 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
13c60 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
13c70 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
13c80 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
13c90 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b  ALUE BYTES", 0);
13ca0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13cb0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
13cc0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
13cd0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
13ce0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
13cf0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
13d00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
13d10 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
13d20 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
13d30 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
13d40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13d50 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a    value = (char*
13d60 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61  )Tcl_GetByteArra
13d70 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  yFromObj(objv[3]
13d80 2c 20 26 62 79 74 65 73 29 3b 0a 20 20 69 66 28  , &bytes);.  if(
13d90 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
13da0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
13db0 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  4], &bytes) ) re
13dc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13dd0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
13de0 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
13df0 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74   idx, value, byt
13e00 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  es, SQLITE_TRANS
13e10 49 45 4e 54 29 3b 0a 20 20 69 66 28 20 73 71 6c  IENT);.  if( sql
13e20 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
13e30 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
13e40 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
13e50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13e60 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13e70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
13e80 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13e90 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74  erp, sqlite3Test
13ea0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
13eb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
13ec0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
13ed0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
13ee0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
13ef0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
13f00 78 74 31 36 20 3f 2d 73 74 61 74 69 63 3f 20 53  xt16 ?-static? S
13f10 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54  TMT N STRING BYT
13f20 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ES.**.** Test th
13f30 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  e sqlite3_bind_t
13f40 65 78 74 31 36 20 69 6e 74 65 72 66 61 63 65 2e  ext16 interface.
13f50 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
13f60 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
13f70 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
13f80 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
13f90 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
13fa0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
13fb0 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
13fc0 73 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e  s a UTF-16 strin
13fd0 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20  g STRING to the 
13fe0 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73  wildcard.  The s
13ff0 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62  tring is BYTES b
14000 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f  ytes.** long..*/
14010 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
14020 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 0a 20 20  _bind_text16(.  
14030 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
14040 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
14050 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
14060 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
14070 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
14080 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14090 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
140a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
140b0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
140c0 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20  t bytes;.  char 
140d0 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63  *value;.  int rc
140e0 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  ;..  void (*xDel
140f0 29 28 29 20 3d 20 28 6f 62 6a 63 3d 3d 36 3f 53  )() = (objc==6?S
14100 51 4c 49 54 45 5f 53 54 41 54 49 43 3a 53 51 4c  QLITE_STATIC:SQL
14110 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
14120 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 6d 74    Tcl_Obj *oStmt
14130 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d      = objv[objc-
14140 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  4];.  Tcl_Obj *o
14150 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a 76 5b 6f  N       = objv[o
14160 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f 4f 62  bjc-3];.  Tcl_Ob
14170 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d 20 6f 62  j *oString  = ob
14180 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20 54 63  jv[objc-2];.  Tc
14190 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73 20 20 20  l_Obj *oBytes   
141a0 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
141b0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
141c0 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20 20 20 20  & objc!=6){.    
141d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
141e0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
141f0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
14200 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
14210 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
14220 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
14230 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20   " STMT N VALUE 
14240 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20  BYTES", 0);.    
14250 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14260 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
14270 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
14280 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
14290 67 28 6f 53 74 6d 74 29 2c 20 26 70 53 74 6d 74  g(oStmt), &pStmt
142a0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
142b0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
142c0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
142d0 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64 78 29 20  terp, oN, &idx) 
142e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
142f0 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63  OR;.  value = (c
14300 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65  har*)Tcl_GetByte
14310 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 53 74  ArrayFromObj(oSt
14320 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69 66 28 20  ring, 0);.  if( 
14330 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
14340 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79 74 65 73  j(interp, oBytes
14350 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
14360 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
14370 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
14380 6e 64 5f 74 65 78 74 31 36 28 70 53 74 6d 74 2c  nd_text16(pStmt,
14390 20 69 64 78 2c 20 28 76 6f 69 64 20 2a 29 76 61   idx, (void *)va
143a0 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 6c  lue, bytes, xDel
143b0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
143c0 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
143d0 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
143e0 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
143f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
14400 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14410 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
14420 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
14430 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f   sqlite3TestErro
14440 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
14450 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14460 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  ROR;.  }..#endif
14470 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
14480 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
14490 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
144a0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
144b0 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d  te3_bind_blob ?-
144c0 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 44  static? STMT N D
144d0 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20  ATA BYTES.**.** 
144e0 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
144f0 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72  _bind_blob inter
14500 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
14510 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
14520 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
14530 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
14540 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
14550 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
14560 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
14570 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f   binds a BLOB to
14580 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20   the wildcard.  
14590 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59 54 45  The BLOB is BYTE
145a0 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  S bytes in size.
145b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
145c0 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20  est_bind_blob(. 
145d0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
145e0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
145f0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
14600 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
14610 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
14620 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
14630 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
14640 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  x;.  int bytes;.
14650 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20    char *value;. 
14660 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
14670 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79  e3_destructor_ty
14680 70 65 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d  pe xDestructor =
14690 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
146a0 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  T;..  if( objc!=
146b0 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a  5 && objc!=6 ){.
146c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
146d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
146e0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
146f0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
14700 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
14710 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
14720 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41   0), " STMT N DA
14730 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  TA BYTES", 0);. 
14740 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14750 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
14760 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78  objc==6 ){.    x
14770 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c  Destructor = SQL
14780 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20  ITE_STATIC;.    
14790 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69  objv++;.  }..  i
147a0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
147b0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
147c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
147d0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
147e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
147f0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
14800 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
14810 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
14820 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14830 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47  .  value = Tcl_G
14840 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
14850 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
14860 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
14870 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
14880 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
14890 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
148a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
148b0 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  b(pStmt, idx, va
148c0 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 73  lue, bytes, xDes
148d0 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28 20  tructor);.  if( 
148e0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
148f0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
14900 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
14910 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
14920 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
14930 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
14940 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14950 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
14960 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
14970 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
14980 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
14990 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a  count  STMT.**.*
149a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
149b0 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64 73  ber of wildcards
149c0 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74   in the given st
149d0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
149e0 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
149f0 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
14a00 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
14a10 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
14a20 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
14a30 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
14a40 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
14a50 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
14a60 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
14a70 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
14a80 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
14a90 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
14aa0 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
14ab0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14ac0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
14ad0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
14ae0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
14af0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
14b00 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
14b10 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
14b20 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
14b30 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
14b40 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
14b50 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
14b60 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
14b70 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
14b80 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
14b90 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
14ba0 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a  _name  STMT  N.*
14bb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
14bc0 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20  name of the Nth 
14bd0 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66  wildcard.  The f
14be0 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69 73  irst wildcard is
14bf0 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20   1..** An empty 
14c00 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
14c10 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ed if N is out o
14c20 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68  f range or if th
14c30 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73  e wildcard.** is
14c40 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74   nameless..*/.st
14c50 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
14c60 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
14c70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
14c80 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
14c90 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
14ca0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
14cb0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
14cc0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
14cd0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
14ce0 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  t i;..  if( objc
14cf0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
14d00 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
14d10 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
14d20 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  MT N");.    retu
14d30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14d40 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
14d50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
14d60 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
14d70 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
14d80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14d90 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
14da0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
14db0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20  p, objv[2], &i) 
14dc0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
14dd0 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
14de0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
14df0 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
14e00 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69  ngObj(sqlite3_bi
14e10 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
14e20 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20  e(pStmt,i),-1). 
14e30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   );.  return TCL
14e40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
14e50 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
14e60 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
14e70 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a  dex  STMT  NAME.
14e80 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
14e90 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77 69   index of the wi
14ea0 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e 41  ldcard called NA
14eb0 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ME.  Return 0 if
14ec0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
14ed0 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a  such wildcard..*
14ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
14ef0 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
14f00 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20 2a  _index(.  void *
14f10 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
14f20 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
14f30 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
14f40 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
14f50 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
14f60 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
14f70 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
14f80 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
14f90 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
14fa0 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e  1, objv, "STMT N
14fb0 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
14fc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
14fd0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
14fe0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
14ff0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
15000 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
15010 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15020 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
15030 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
15040 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a     Tcl_NewIntObj
15050 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  (.       sqlite3
15060 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
15070 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f  index(pStmt,Tcl_
15080 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
15090 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a  ])).     ).  );.
150a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
150b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
150c0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72     sqlite3_clear
150d0 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a 2a  _bindings STMT.*
150e0 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
150f0 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69  test_clear_bindi
15100 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ngs(.  void * cl
15110 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
15120 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
15130 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
15140 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
15150 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
15160 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
15170 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
15180 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
15190 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
151a0 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
151b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
151c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
151d0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
151e0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
151f0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
15200 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
15210 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
15220 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
15230 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
15240 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61 72  bj(sqlite3_clear
15250 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 29  _bindings(pStmt)
15260 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
15270 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
15280 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 73  age:   sqlite3_s
15290 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e 44  leep MILLISECOND
152a0 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  S.*/.static int 
152b0 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20 76 6f  test_sleep(.  vo
152c0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
152d0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
152e0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
152f0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
15300 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
15310 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20 6f  int ms;..  if( o
15320 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
15330 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
15340 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
15350 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
15360 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
15370 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
15380 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
15390 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
153a0 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20 20  1], &ms) ){.    
153b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
153c0 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
153d0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
153e0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
153f0 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d 73 29  qlite3_sleep(ms)
15400 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
15410 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
15420 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72  age: sqlite3_err
15430 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  code DB.**.** Re
15440 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20  turn the string 
15450 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
15460 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
15470 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a  t sqlite3_* API.
15480 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65  ** error code. e
15490 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  .g. "SQLITE_ERRO
154a0 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  R"..*/.static in
154b0 74 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a  t test_errcode(.
154c0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
154d0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
154e0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
154f0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
15500 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
15510 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
15520 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
15530 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69  r zBuf[30];..  i
15540 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
15550 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
15560 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
15570 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
15580 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
15590 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
155a0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
155b0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
155c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
155d0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
155e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
155f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
15600 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
15610 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
15620 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
15630 28 64 62 29 3b 0a 20 20 69 66 28 20 28 72 63 26  (db);.  if( (rc&
15640 30 78 66 66 29 3d 3d 72 63 20 29 7b 0a 20 20 20  0xff)==rc ){.   
15650 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20   zBuf[0] = 0;.  
15660 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e  }else{.    sprin
15670 74 66 28 7a 42 75 66 2c 22 2b 25 64 22 2c 20 72  tf(zBuf,"+%d", r
15680 63 3e 3e 38 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  c>>8);.  }.  Tcl
15690 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
156a0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
156b0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 7a  ErrorName(rc), z
156c0 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
156d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
156e0 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65 73 74  ** Usage:   test
156f0 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a  _errmsg DB.**.**
15700 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54 46   Returns the UTF
15710 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  -8 representatio
15720 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d  n of the error m
15730 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f  essage string fo
15740 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  r the.** most re
15750 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41  cent sqlite3_* A
15760 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  PI call..*/.stat
15770 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d  ic int test_errm
15780 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  sg(.  void * cli
15790 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
157a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
157b0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
157c0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
157d0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
157e0 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
157f0 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20  r *zErr;..  if( 
15800 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
15810 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15820 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
15830 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
15840 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
15850 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
15860 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
15870 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
15880 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
15890 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
158a0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
158b0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
158c0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
158d0 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d  ERROR;..  zErr =
158e0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
158f0 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  db);.  Tcl_SetOb
15900 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
15910 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
15920 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72  (zErr, -1));.  r
15930 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
15940 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
15950 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44 42  test_errmsg16 DB
15960 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  .**.** Returns t
15970 68 65 20 55 54 46 2d 31 36 20 72 65 70 72 65 73  he UTF-16 repres
15980 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
15990 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
159a0 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ring for the.** 
159b0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
159c0 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20  te3_* API call. 
159d0 54 68 69 73 20 69 73 20 61 20 62 79 74 65 20 61  This is a byte a
159e0 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20 74  rray object at t
159f0 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c  he TCL .** level
15a00 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64 65  , and it include
15a10 73 20 74 68 65 20 30 78 30 30 20 30 78 30 30 20  s the 0x00 0x00 
15a20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73  terminator bytes
15a30 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
15a40 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74 72  he.** UTF-16 str
15a50 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
15a60 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36  nt test_errmsg16
15a70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
15a80 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
15a90 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
15aa0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
15ab0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
15ac0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
15ad0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
15ae0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
15af0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b  onst void *zErr;
15b00 0a 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 30  .  int bytes = 0
15b10 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
15b20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
15b30 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
15b40 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
15b50 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
15b60 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
15b70 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
15b80 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
15b90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15ba0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
15bb0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
15bc0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
15bd0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
15be0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15bf0 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
15c00 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a  3_errmsg16(db);.
15c10 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
15c20 20 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65    bytes = sqlite
15c30 33 55 74 66 31 36 42 79 74 65 4c 65 6e 28 7a 45  3Utf16ByteLen(zE
15c40 72 72 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 54  rr, -1);.  }.  T
15c50 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
15c60 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
15c70 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72  yteArrayObj(zErr
15c80 2c 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69  , bytes));.#endi
15c90 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
15ca0 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
15cb0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
15cc0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
15cd0 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71  e3_prepare DB sq
15ce0 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a  l bytes tailvar.
15cf0 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
15d00 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
15d10 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
15d20 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
15d30 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
15d40 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
15d50 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
15d60 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
15d70 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
15d80 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
15d90 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
15da0 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
15db0 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
15dc0 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
15dd0 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
15de0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
15df0 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20 20 76  est_prepare(.  v
15e00 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15e10 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15e20 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15e30 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15e40 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15e50 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
15e60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
15e70 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
15e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
15e90 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  il = 0;.  sqlite
15ea0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
15eb0 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
15ec0 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
15ed0 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
15ee0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
15ef0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
15f00 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
15f10 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
15f20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
15f30 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
15f40 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
15f50 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 0);.    retu
15f60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15f70 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
15f80 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
15f90 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
15fa0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
15fb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15fc0 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
15fd0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
15fe0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
15ff0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
16000 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
16010 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16020 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
16030 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20  te3_prepare(db, 
16040 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
16050 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20  tmt, &zTail);.  
16060 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
16070 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
16080 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
16090 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
160a0 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 69 66   zTail ){.    if
160b0 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
160c0 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65      bytes = byte
160d0 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29  s - (zTail-zSql)
160e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
160f0 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3c 62 79  strlen(zTail)<by
16100 74 65 73 20 29 7b 0a 20 20 20 20 20 20 62 79 74  tes ){.      byt
16110 65 73 20 3d 20 73 74 72 6c 65 6e 28 7a 54 61 69  es = strlen(zTai
16120 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  l);.    }.    Tc
16130 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
16140 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c  erp, objv[4], 0,
16150 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
16160 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c  j(zTail, bytes),
16170 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
16180 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16190 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d      assert( pStm
161a0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69  t==0 );.    spri
161b0 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20  ntf(zBuf, "(%d) 
161c0 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f  ", rc);.    Tcl_
161d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
161e0 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74  erp, zBuf, sqlit
161f0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
16200 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16210 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
16220 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
16230 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
16240 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
16250 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
16260 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
16270 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
16280 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16290 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
162a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
162b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
162c0 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
162d0 61 72 65 5f 76 32 20 44 42 20 73 71 6c 20 62 79  are_v2 DB sql by
162e0 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a  tes tailvar.**.*
162f0 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
16300 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
16310 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
16320 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
16330 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
16340 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
16350 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
16360 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
16370 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
16380 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
16390 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
163a0 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
163b0 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
163c0 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
163d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
163e0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
163f0 70 72 65 70 61 72 65 5f 76 32 28 0a 20 20 76 6f  prepare_v2(.  vo
16400 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
16410 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
16420 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
16430 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
16440 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
16450 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
16460 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
16470 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
16480 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69  const char *zTai
16490 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
164a0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
164b0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30  ;.  char zBuf[50
164c0 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
164d0 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
164e0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
164f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
16500 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
16510 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
16520 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
16530 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73  objv[0]), " DB s
16540 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
16550 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
16560 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16570 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
16580 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
16590 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
165a0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
165b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
165c0 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sql = Tcl_GetStr
165d0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
165e0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
165f0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16600 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
16610 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16620 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
16630 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
16640 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26  , zSql, bytes, &
16650 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a  pStmt, &zTail);.
16660 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
16670 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d  ITE_OK || pStmt=
16680 3d 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  =0);.  if( sqlit
16690 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
166a0 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
166b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
166c0 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b  ;.  if( zTail ){
166d0 0a 20 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d  .    if( bytes>=
166e0 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73  0 ){.      bytes
166f0 20 3d 20 62 79 74 65 73 20 2d 20 28 7a 54 61 69   = bytes - (zTai
16700 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  l-zSql);.    }. 
16710 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
16720 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
16730 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ], 0, Tcl_NewStr
16740 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79  ingObj(zTail, by
16750 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  tes), 0);.  }.  
16760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16770 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
16780 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20   pStmt==0 );.   
16790 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
167a0 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20  (%d) ", rc);.   
167b0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
167c0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
167d0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
167e0 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  b), 0);.    retu
167f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16800 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
16810 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
16820 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
16830 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
16840 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
16850 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16860 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16870 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
16880 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
16890 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
168a0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
168b0 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34  _prepare_tkt3134
168c0 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61   DB.**.** Genera
168d0 74 65 20 61 20 70 72 65 70 61 72 65 64 20 73 74  te a prepared st
168e0 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 20 7a 65  atement for a ze
168f0 72 6f 2d 62 79 74 65 20 73 74 72 69 6e 67 20 61  ro-byte string a
16900 73 20 61 20 74 65 73 74 0a 2a 2a 20 66 6f 72 20  s a test.** for 
16910 74 69 63 6b 65 74 20 23 33 31 33 34 2e 20 20 54  ticket #3134.  T
16920 68 65 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64  he string should
16930 20 62 65 20 70 72 65 63 65 65 64 65 64 20 62 79   be preceeded by
16940 20 61 20 7a 65 72 6f 20 62 79 74 65 2e 0a 2a 2f   a zero byte..*/
16950 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
16960 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34  _prepare_tkt3134
16970 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
16980 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
16990 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
169a0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
169b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
169c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
169d0 62 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  b;.  static cons
169e0 74 20 63 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20  t char zSql[] = 
169f0 22 5c 30 30 30 53 45 4c 45 43 54 20 31 22 3b 0a  "\000SELECT 1";.
16a00 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
16a10 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
16a20 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e  r zBuf[50];.  in
16a30 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
16a40 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
16a50 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16a60 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
16a70 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
16a80 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
16a90 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
16aa0 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
16ab0 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a  s tailvar", 0);.
16ac0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16ad0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
16ae0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
16af0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
16b00 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
16b10 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16b20 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
16b30 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
16b40 64 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c  db, &zSql[1], 0,
16b50 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 61   &pStmt, 0);.  a
16b60 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
16b70 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29  _OK || pStmt==0)
16b80 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
16b90 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
16ba0 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
16bb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16bc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16bd0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
16be0 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ( pStmt==0 );.  
16bf0 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
16c00 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20  "(%d) ", rc);.  
16c10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
16c20 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
16c30 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
16c40 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  db), 0);.    ret
16c50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16c60 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
16c70 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
16c80 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
16c90 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
16ca0 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
16cb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16cc0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
16cd0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
16ce0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
16cf0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
16d00 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
16d10 33 5f 70 72 65 70 61 72 65 31 36 20 44 42 20 73  3_prepare16 DB s
16d20 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
16d30 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
16d40 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
16d50 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
16d60 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
16d70 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
16d80 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
16d90 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
16da0 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
16db0 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
16dc0 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
16dd0 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
16de0 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
16df0 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
16e00 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
16e10 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
16e20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16e30 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 28 0a  test_prepare16(.
16e40 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
16e50 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
16e60 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
16e70 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
16e80 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
16e90 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
16ea0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
16eb0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
16ec0 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20  st void *zSql;. 
16ed0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61   const void *zTa
16ee0 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62  il = 0;.  Tcl_Ob
16ef0 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20  j *pTail = 0;.  
16f00 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
16f10 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
16f20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74  zBuf[50]; .  int
16f30 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73   rc;.  int bytes
16f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16f50 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20   /* The integer 
16f60 73 70 65 63 69 66 69 65 64 20 61 73 20 61 72 67  specified as arg
16f70 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c   3 */.  int objl
16f80 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
16f90 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72    /* The byte-ar
16fa0 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72  ray length of ar
16fb0 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  g 2 */..  if( ob
16fc0 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
16fd0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16fe0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
16ff0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
17000 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
17010 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
17020 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
17030 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b  es tailvar", 0);
17040 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17050 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
17060 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
17070 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
17080 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
17090 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
170a0 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
170b0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
170c0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
170d0 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28   &objlen);.  if(
170e0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
170f0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
17100 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
17110 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17120 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
17130 70 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53  prepare16(db, zS
17140 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
17150 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66  t, &zTail);.  if
17160 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
17170 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
17180 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
17190 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
171a0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
171b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
171c0 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
171d0 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c     objlen = objl
171e0 65 6e 20 2d 20 28 28 75 38 20 2a 29 7a 54 61 69  en - ((u8 *)zTai
171f0 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20  l-(u8 *)zSql);. 
17200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 62 6a 6c   }else{.    objl
17210 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54  en = 0;.  }.  pT
17220 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  ail = Tcl_NewByt
17230 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29  eArrayObj((u8 *)
17240 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a  zTail, objlen);.
17250 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
17260 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 54 63 6c  nt(pTail);.  Tcl
17270 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
17280 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20  rp, objv[4], 0, 
17290 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 54 63 6c  pTail, 0);.  Tcl
172a0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _DecrRefCount(pT
172b0 61 69 6c 29 3b 0a 0a 20 20 69 66 28 20 70 53 74  ail);..  if( pSt
172c0 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
172d0 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
172e0 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
172f0 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
17300 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17310 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e  .  }.  Tcl_Appen
17320 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
17330 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66  zBuf, 0);.#endif
17340 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
17350 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
17360 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
17370 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
17380 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 44  3_prepare16_v2 D
17390 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
173a0 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  var.**.** Compil
173b0 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
173c0 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
173d0 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
173e0 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
173f0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
17400 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
17410 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
17420 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
17430 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
17440 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
17450 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
17460 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
17470 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
17480 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
17490 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
174a0 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 31  nt test_prepare1
174b0 36 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63  6_v2(.  void * c
174c0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
174d0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
174e0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
174f0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
17500 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
17510 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
17520 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  6.  sqlite3 *db;
17530 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
17540 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Sql;.  const voi
17550 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20  d *zTail = 0;.  
17560 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d  Tcl_Obj *pTail =
17570 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
17580 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
17590 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20   char zBuf[50]; 
175a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
175b0 20 62 79 74 65 73 3b 20 20 20 20 20 20 20 20 20   bytes;         
175c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
175d0 74 65 67 65 72 20 73 70 65 63 69 66 69 65 64 20  teger specified 
175e0 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e  as arg 3 */.  in
175f0 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20  t objlen;       
17600 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
17610 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68  yte-array length
17620 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20   of arg 2 */..  
17630 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
17640 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
17650 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
17660 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
17670 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
17680 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
17690 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73  objv[0]), " DB s
176a0 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
176b0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
176c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
176d0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
176e0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
176f0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
17700 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
17710 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
17720 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Sql = Tcl_GetByt
17730 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
17740 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b  jv[2], &objlen);
17750 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
17760 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
17770 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73   objv[3], &bytes
17780 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17790 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
177a0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f  lite3_prepare16_
177b0 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74  v2(db, zSql, byt
177c0 65 73 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54 61  es, &pStmt, &zTa
177d0 69 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  il);.  if( sqlit
177e0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
177f0 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
17800 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17810 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
17820 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17830 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a  OR;.  }..  if( z
17840 54 61 69 6c 20 29 7b 0a 20 20 20 20 6f 62 6a 6c  Tail ){.    objl
17850 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 28  en = objlen - ((
17860 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a  u8 *)zTail-(u8 *
17870 29 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  )zSql);.  }else{
17880 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b  .    objlen = 0;
17890 0a 20 20 7d 0a 20 20 70 54 61 69 6c 20 3d 20 54  .  }.  pTail = T
178a0 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
178b0 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20  bj((u8 *)zTail, 
178c0 6f 62 6a 6c 65 6e 29 3b 0a 20 20 54 63 6c 5f 49  objlen);.  Tcl_I
178d0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ncrRefCount(pTai
178e0 6c 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 53 65 74  l);.  Tcl_ObjSet
178f0 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
17900 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20  v[4], 0, pTail, 
17910 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
17920 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 0a  fCount(pTail);..
17930 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
17940 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
17950 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
17960 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
17970 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
17980 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
17990 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
179a0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
179b0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
179c0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
179d0 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
179e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
179f0 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20  e: sqlite3_open 
17a00 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e  filename ?option
17a10 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69  s-list?.*/.stati
17a20 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28  c int test_open(
17a30 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
17a40 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
17a50 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
17a60 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
17a70 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
17a80 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
17a90 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71  *zFilename;.  sq
17aa0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
17ab0 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66   rc;.  char zBuf
17ac0 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
17ad0 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=3 && objc!=2
17ae0 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20   && objc!=1 ){. 
17af0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
17b00 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
17b10 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
17b20 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
17b30 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
17b40 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65  objv[0]), " file
17b50 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73  name options-lis
17b60 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  t", 0);.    retu
17b70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17b80 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  }..  zFilename =
17b90 20 6f 62 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65   objc>1 ? Tcl_Ge
17ba0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
17bb0 20 3a 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   : 0;.  rc = sql
17bc0 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e  ite3_open(zFilen
17bd0 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20  ame, &db);.  .  
17be0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
17bf0 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
17c00 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20  terp, zBuf, db) 
17c10 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17c20 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  OR;.  Tcl_Append
17c30 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
17c40 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
17c50 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
17c60 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
17c70 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d  3_open16 filenam
17c80 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61  e options.*/.sta
17c90 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65  tic int test_ope
17ca0 6e 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  n16(.  void * cl
17cb0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
17cc0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
17cd0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
17ce0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
17cf0 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
17d00 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
17d10 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
17d20 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69  Filename;.  sqli
17d30 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
17d40 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  c;.  char zBuf[1
17d50 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
17d60 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
17d70 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
17d80 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
17d90 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
17da0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
17db0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
17dc0 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  , " filename opt
17dd0 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a  ions-list", 0);.
17de0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17df0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69  RROR;.  }..  zFi
17e00 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  lename = Tcl_Get
17e10 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
17e20 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
17e30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
17e40 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  n16(zFilename, &
17e50 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71  db);.  .  if( sq
17e60 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
17e70 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
17e80 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75  zBuf, db) ) retu
17e90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17ea0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17eb0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
17ec0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
17ed0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
17ee0 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
17ef0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
17f00 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c  e: sqlite3_compl
17f10 65 74 65 31 36 20 3c 55 54 46 2d 31 36 20 73 74  ete16 <UTF-16 st
17f20 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ring>.**.** Retu
17f30 72 6e 20 31 20 69 66 20 74 68 65 20 73 75 70 70  rn 1 if the supp
17f40 6c 69 65 64 20 61 72 67 75 6d 65 6e 74 20 69 73  lied argument is
17f50 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20   a complete SQL 
17f60 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65  statement, or ze
17f70 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ro.** otherwise.
17f80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
17f90 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 28 0a  est_complete16(.
17fa0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17fb0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17fc0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17fd0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17fe0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17ff0 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  {.#if !defined(S
18000 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c  QLITE_OMIT_COMPL
18010 45 54 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  ETE) && !defined
18020 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46  (SQLITE_OMIT_UTF
18030 31 36 29 0a 20 20 63 68 61 72 20 2a 7a 42 75 66  16).  char *zBuf
18040 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
18050 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
18060 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
18070 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d   1, objv, "<utf-
18080 31 36 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72  16 sql>");.    r
18090 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
180a0 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 28  .  }..  zBuf = (
180b0 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74  char*)Tcl_GetByt
180c0 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
180d0 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c  jv[1], 0);.  Tcl
180e0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
180f0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
18100 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70  Obj(sqlite3_comp
18110 6c 65 74 65 31 36 28 7a 42 75 66 29 29 29 3b 0a  lete16(zBuf)));.
18120 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
18130 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26  _OMIT_COMPLETE &
18140 26 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  & SQLITE_OMIT_UT
18150 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
18160 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
18170 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
18180 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  step STMT.**.** 
18190 41 64 76 61 6e 63 65 20 74 68 65 20 73 74 61 74  Advance the stat
181a0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78  ement to the nex
181b0 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t row..*/.static
181c0 20 69 6e 74 20 74 65 73 74 5f 73 74 65 70 28 0a   int test_step(.
181d0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
181e0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
181f0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18200 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
18210 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18220 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
18230 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
18240 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
18250 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
18260 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
18270 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
18280 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
18290 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
182a0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
182b0 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20  " STMT", 0);.   
182c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
182d0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
182e0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
182f0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
18300 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
18310 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
18320 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
18330 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
18340 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72  mt);..  /* if( r
18350 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26  c!=SQLITE_DONE &
18360 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  & rc!=SQLITE_ROW
18370 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18380 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65  ROR; */.  Tcl_Se
18390 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
183a0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
183b0 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
183c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
183d0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
183e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
183f0 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52  nt STMT .**.** R
18400 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
18410 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75   of columns retu
18420 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 20  rned by the sql 
18430 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a  statement STMT..
18440 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
18450 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  st_column_count(
18460 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
18470 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
18480 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
18490 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
184a0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
184b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
184c0 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
184d0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
184e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
184f0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
18500 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
18510 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
18520 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18530 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
18540 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
18550 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18560 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
18570 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
18580 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
18590 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
185a0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
185b0 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65  ERROR;..  Tcl_Se
185c0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
185d0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
185e0 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
185f0 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a  count(pStmt)));.
18600 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
18610 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
18620 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
18630 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  type STMT column
18640 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
18650 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 64 61  e type of the da
18660 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f  ta in column 'co
18670 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72  lumn' of the cur
18680 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  rent row..*/.sta
18690 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
186a0 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f 69 64  umn_type(.  void
186b0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
186c0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
186d0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
186e0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
186f0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
18700 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
18710 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
18720 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f  int tp;..  if( o
18730 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
18740 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18750 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
18760 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
18770 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
18780 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18790 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
187a0 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
187b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
187c0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
187d0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
187e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
187f0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
18800 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18810 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
18820 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
18830 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
18840 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
18850 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20  _ERROR;..  tp = 
18860 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
18870 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  ype(pStmt, col);
18880 0a 20 20 73 77 69 74 63 68 28 20 74 70 20 29 7b  .  switch( tp ){
18890 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
188a0 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20 20 20  _INTEGER: .     
188b0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
188c0 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45 52 22  nterp, "INTEGER"
188d0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
188e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
188f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
18900 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  L:.      Tcl_Set
18910 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
18920 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49  NULL", TCL_STATI
18930 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
18940 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
18950 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54  E_FLOAT:.      T
18960 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
18970 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43  erp, "FLOAT", TC
18980 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
18990 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
189a0 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20  e SQLITE_TEXT:. 
189b0 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
189c0 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45 58 54  lt(interp, "TEXT
189d0 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
189e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
189f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
18a00 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  OB:.      Tcl_Se
18a10 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
18a20 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54  "BLOB", TCL_STAT
18a30 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
18a40 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
18a50 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
18a60 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
18a70 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
18a80 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
18a90 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54  olumn_int64 STMT
18aa0 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
18ab0 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e  turn the data in
18ac0 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
18ad0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
18ae0 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e 0a 2a  row cast as an.*
18af0 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74 29 20  * wide (64-bit) 
18b00 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
18b10 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
18b20 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  mn_int64(.  void
18b30 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18b40 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18b50 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18b60 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18b70 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
18b80 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
18b90 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
18ba0 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28  i64 iVal;..  if(
18bb0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
18bc0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18bd0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
18be0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
18bf0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
18c00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18c10 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
18c20 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
18c30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18c40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
18c50 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
18c60 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
18c70 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
18c80 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
18c90 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
18ca0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
18cb0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
18cc0 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
18cd0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61  CL_ERROR;..  iVa
18ce0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
18cf0 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
18d00 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  col);.  Tcl_SetO
18d10 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
18d20 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
18d30 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(iVal));.  ret
18d40 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
18d50 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
18d60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20  te3_column_blob 
18d70 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
18d80 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
18d90 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f  olumn_blob(.  vo
18da0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
18db0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
18dc0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
18dd0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
18de0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
18df0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
18e00 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
18e10 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f  .  int len;.  co
18e20 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b  nst void *pBlob;
18e30 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
18e40 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
18e50 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18e60 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
18e70 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
18e80 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
18e90 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
18ea0 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
18eb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18ec0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
18ed0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
18ee0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
18ef0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
18f00 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
18f10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18f20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
18f30 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
18f40 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
18f50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18f60 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65  ..  len = sqlite
18f70 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
18f80 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 70 42  Stmt, col);.  pB
18f90 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
18fa0 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
18fb0 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
18fc0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
18fd0 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
18fe0 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e  ayObj(pBlob, len
18ff0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
19000 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
19010 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
19020 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20  umn_double STMT 
19030 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74  column.**.** Ret
19040 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20  urn the data in 
19050 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20  column 'column' 
19060 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
19070 6f 77 20 63 61 73 74 20 61 73 20 61 20 64 6f 75  ow cast as a dou
19080 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
19090 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64  nt test_column_d
190a0 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20  ouble(.  void * 
190b0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
190c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
190d0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
190e0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
190f0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
19100 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
19110 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75    int col;.  dou
19120 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28  ble rVal;..  if(
19130 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
19140 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19150 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
19160 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
19170 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
19180 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19190 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
191a0 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
191b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
191c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
191d0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
191e0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
191f0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
19200 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
19210 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
19220 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
19230 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
19240 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
19250 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61  CL_ERROR;..  rVa
19260 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
19270 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c  mn_double(pStmt,
19280 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
19290 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
192a0 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  , Tcl_NewDoubleO
192b0 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(rVal));.  ret
192c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
192d0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
192e0 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53  te3_data_count S
192f0 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
19300 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
19310 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
19320 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74   by the sql stat
19330 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73  ement STMT..*/.s
19340 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64  tatic int test_d
19350 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  ata_count(.  voi
19360 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
19370 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
19380 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
19390 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
193a0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
193b0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
193c0 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
193d0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
193e0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
193f0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
19400 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
19410 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
19420 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
19430 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
19440 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
19450 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
19460 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
19470 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
19480 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19490 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
194a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
194b0 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
194c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
194d0 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
194e0 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 53  e3_data_count(pS
194f0 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
19500 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
19510 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
19520 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d  _column_text STM
19530 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
19540 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
19550 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54  lumn_decltype ST
19560 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
19570 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
19580 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20  olumn_name STMT 
19590 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
195a0 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75   int test_stmt_u
195b0 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tf8(.  void * cl
195c0 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20  ientData,       
195d0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
195e0 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69  QLite API functi
195f0 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20  on to be invoke 
19600 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
19610 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
19620 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
19630 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
19640 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19650 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
19660 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
19670 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
19680 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20 20  _stmt*, int);.  
19690 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74  const char *zRet
196a0 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f  ;..  xFunc = (co
196b0 6e 73 74 20 63 68 61 72 20 2a 28 2a 29 28 73 71  nst char *(*)(sq
196c0 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
196d0 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ))clientData;.  
196e0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
196f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
19700 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
19710 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
19720 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
19730 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
19740 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
19750 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
19760 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19770 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
19780 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
19790 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
197a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
197b0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
197c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
197d0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
197e0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
197f0 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
19800 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
19810 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53 74 6d  Ret = xFunc(pStm
19820 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a  t, col);.  if( z
19830 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  Ret ){.    Tcl_S
19840 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
19850 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c 20 30   (char *)zRet, 0
19860 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19870 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  TCL_OK;.}..stati
19880 63 20 69 6e 74 20 74 65 73 74 5f 67 6c 6f 62 61  c int test_globa
19890 6c 5f 72 65 63 6f 76 65 72 28 0a 20 20 76 6f 69  l_recover(.  voi
198a0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
198b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
198c0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
198d0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
198e0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
198f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19900 5f 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a 20  _GLOBALRECOVER. 
19910 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f   int rc;.  if( o
19920 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
19930 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
19940 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
19950 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "");.    return 
19960 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
19970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c   rc = sqlite3_gl
19980 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a  obal_recover();.
19990 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
199a0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
199b0 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
199c0 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65   TCL_STATIC);.#e
199d0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
199e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
199f0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
19a00 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63  lumn_text STMT c
19a10 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
19a20 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
19a30 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20  n_decltype STMT 
19a40 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
19a50 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
19a60 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c  mn_name STMT col
19a70 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
19a80 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  t test_stmt_utf1
19a90 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
19aa0 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 50  ntData,     /* P
19ab0 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65  ointer to SQLite
19ac0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f   API function to
19ad0 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20   be invoked */. 
19ae0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19af0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19b00 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19b10 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
19b20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19b30 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f  UTF16.  sqlite3_
19b40 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
19b50 6e 74 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62  nt col;.  Tcl_Ob
19b60 6a 20 2a 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74  j *pRet;.  const
19b70 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a   void *zName16;.
19b80 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a    const void *(*
19b90 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73  xFunc)(sqlite3_s
19ba0 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78  tmt*, int);..  x
19bb0 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f  Func = (const vo
19bc0 69 64 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f  id *(*)(sqlite3_
19bd0 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65  stmt*, int))clie
19be0 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62  ntData;.  if( ob
19bf0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
19c00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19c10 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
19c20 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
19c30 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
19c40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
19c50 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
19c60 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
19c70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19c80 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
19c90 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
19ca0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19cb0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
19cc0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19cd0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
19ce0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
19cf0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
19d00 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
19d10 45 52 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31  ERROR;..  zName1
19d20 36 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c  6 = xFunc(pStmt,
19d30 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61   col);.  if( zNa
19d40 6d 65 31 36 20 29 7b 0a 20 20 20 20 70 52 65 74  me16 ){.    pRet
19d50 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
19d60 72 61 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20  rayObj(zName16, 
19d70 73 71 6c 69 74 65 33 55 74 66 31 36 42 79 74 65  sqlite3Utf16Byte
19d80 4c 65 6e 28 7a 4e 61 6d 65 31 36 2c 20 2d 31 29  Len(zName16, -1)
19d90 2b 32 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  +2);.    Tcl_Set
19da0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
19db0 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e  , pRet);.  }.#en
19dc0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
19dd0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 20 20 72  IT_UTF16 */..  r
19de0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
19df0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
19e00 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
19e10 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
19e20 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
19e30 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53  3_column_bytes S
19e40 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
19e50 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
19e60 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 53  column_bytes16 S
19e70 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f  TMT column.**.*/
19e80 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
19e90 5f 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69  _stmt_int(.  voi
19ea0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  d * clientData, 
19eb0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
19ec0 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63   SQLite API func
19ed0 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
19ee0 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
19ef0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
19f00 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
19f10 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
19f20 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
19f30 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
19f40 63 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75  col;.  int (*xFu
19f50 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
19f60 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e  *, int);..  xFun
19f70 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 20  c = (const void 
19f80 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  *(*)(sqlite3_stm
19f90 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44  t*, int))clientD
19fa0 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ata;.  if( objc!
19fb0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
19fc0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19fd0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
19fe0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
19ff0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1a000 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1a010 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1a020 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a030 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1a040 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1a050 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1a060 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1a070 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1a080 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a090 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1a0a0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1a0b0 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1a0c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a0d0 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  OR;..  Tcl_SetOb
1a0e0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1a0f0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46  Tcl_NewIntObj(xF
1a100 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29  unc(pStmt, col))
1a110 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1a120 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1a130 67 65 3a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f  ge:  sqlite_set_
1a140 6d 61 67 69 63 20 20 44 42 20 20 4d 41 47 49 43  magic  DB  MAGIC
1a150 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65  -NUMBER.**.** Se
1a160 74 20 74 68 65 20 64 62 2d 3e 6d 61 67 69 63 20  t the db->magic 
1a170 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20  value.  This is 
1a180 75 73 65 64 20 74 6f 20 74 65 73 74 20 65 72 72  used to test err
1a190 6f 72 20 72 65 63 6f 76 65 72 79 20 6c 6f 67 69  or recovery logi
1a1a0 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
1a1b0 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69   sqlite_set_magi
1a1c0 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  c(.  void * clie
1a1d0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1a1e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1a1f0 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1a200 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
1a210 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1a220 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
1a230 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a240 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1a250 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1a260 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
1a270 20 20 20 20 20 20 20 20 22 20 44 42 20 4d 41 47          " DB MAG
1a280 49 43 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  IC", 0);.    ret
1a290 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a2a0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1a2b0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1a2c0 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1a2d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a2e0 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
1a2f0 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41  v[2], "SQLITE_MA
1a300 47 49 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b  GIC_OPEN")==0 ){
1a310 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
1a320 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50   SQLITE_MAGIC_OP
1a330 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
1a340 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20  strcmp(argv[2], 
1a350 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c  "SQLITE_MAGIC_CL
1a360 4f 53 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20  OSED")==0 ){.   
1a370 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
1a380 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
1a390 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
1a3a0 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53  rcmp(argv[2], "S
1a3b0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
1a3c0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
1a3d0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
1a3e0 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65  MAGIC_BUSY;.  }e
1a3f0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
1a400 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f  rgv[2], "SQLITE_
1a410 4d 41 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30  MAGIC_ERROR")==0
1a420 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
1a430 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
1a440 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20  _ERROR;.  }else 
1a450 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
1a460 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20  nterp, argv[2], 
1a470 26 64 62 2d 3e 6d 61 67 69 63 29 20 29 7b 0a 20  &db->magic) ){. 
1a480 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a490 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
1a4a0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1a4b0 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
1a4c0 65 33 5f 69 6e 74 65 72 72 75 70 74 20 20 44 42  e3_interrupt  DB
1a4d0 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20   .**.** Trigger 
1a4e0 61 6e 20 69 6e 74 65 72 72 75 70 74 20 6f 6e 20  an interrupt on 
1a4f0 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DB.*/.static int
1a500 20 74 65 73 74 5f 69 6e 74 65 72 72 75 70 74 28   test_interrupt(
1a510 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1a520 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1a530 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1a540 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1a550 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
1a560 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1a570 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
1a580 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a590 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1a5a0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1a5b0 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44  "", argv[0], " D
1a5c0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
1a5d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a5e0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1a5f0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1a600 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1a610 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a620 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
1a630 70 74 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  pt(db);.  return
1a640 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   TCL_OK;.}..stat
1a650 69 63 20 75 38 20 2a 73 71 6c 69 74 65 33 5f 73  ic u8 *sqlite3_s
1a660 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20  tack_baseline = 
1a670 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  0;../*.** Fill t
1a680 68 65 20 73 74 61 63 6b 20 77 69 74 68 20 61 20  he stack with a 
1a690 6b 6e 6f 77 6e 20 62 69 74 70 61 74 74 65 72 6e  known bitpattern
1a6a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a6b0 20 70 72 65 70 53 74 61 63 6b 28 76 6f 69 64 29   prepStack(void)
1a6c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32  {.  int i;.  u32
1a6d0 20 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a   bigBuf[65536];.
1a6e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
1a6f0 65 6f 66 28 62 69 67 42 75 66 29 3b 20 69 2b 2b  eof(bigBuf); i++
1a700 29 20 62 69 67 42 75 66 5b 69 5d 20 3d 20 30 78  ) bigBuf[i] = 0x
1a710 64 65 61 64 62 65 65 66 3b 0a 20 20 73 71 6c 69  deadbeef;.  sqli
1a720 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69  te3_stack_baseli
1a730 6e 65 20 3d 20 28 75 38 2a 29 26 62 69 67 42 75  ne = (u8*)&bigBu
1a740 66 5b 36 35 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a  f[65536];.}../*.
1a750 2a 2a 20 47 65 74 20 74 68 65 20 63 75 72 72 65  ** Get the curre
1a760 6e 74 20 73 74 61 63 6b 20 64 65 70 74 68 2e 20  nt stack depth. 
1a770 20 55 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   Used for debugg
1a780 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36 34  ing only..*/.u64
1a790 20 73 71 6c 69 74 65 33 53 74 61 63 6b 44 65 70   sqlite3StackDep
1a7a0 74 68 28 76 6f 69 64 29 7b 0a 20 20 75 38 20 78  th(void){.  u8 x
1a7b0 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 36 34 29  ;.  return (u64)
1a7c0 28 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62  (sqlite3_stack_b
1a7d0 61 73 65 6c 69 6e 65 20 2d 20 26 78 29 3b 0a 7d  aseline - &x);.}
1a7e0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1a7f0 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 75 73  sqlite3_stack_us
1a800 65 64 20 44 42 20 53 51 4c 0a 2a 2a 0a 2a 2a 20  ed DB SQL.**.** 
1a810 54 72 79 20 74 6f 20 6d 65 61 73 75 72 65 20 74  Try to measure t
1a820 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 74 61  he amount of sta
1a830 63 6b 20 73 70 61 63 65 20 75 73 65 64 20 62 79  ck space used by
1a840 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
1a850 65 33 5f 65 78 65 63 0a 2a 2f 0a 73 74 61 74 69  e3_exec.*/.stati
1a860 63 20 69 6e 74 20 74 65 73 74 5f 73 74 61 63 6b  c int test_stack
1a870 5f 75 73 65 64 28 0a 20 20 76 6f 69 64 20 2a 20  _used(.  void * 
1a880 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1a890 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1a8a0 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1a8b0 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1a8c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1a8d0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67  int i;.  if( arg
1a8e0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1a8f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a900 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1a910 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a920 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1a930 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20       " DB SQL", 
1a940 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a950 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a960 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1a970 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
1a980 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1a990 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 72 65  TCL_ERROR;.  pre
1a9a0 70 53 74 61 63 6b 28 29 3b 0a 20 20 28 76 6f 69  pStack();.  (voi
1a9b0 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  d)sqlite3_exec(d
1a9c0 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30  b, argv[2], 0, 0
1a9d0 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 36 35  , 0);.  for(i=65
1a9e0 35 33 35 3b 20 69 3e 3d 30 20 26 26 20 28 28 75  535; i>=0 && ((u
1a9f0 33 32 2a 29 73 71 6c 69 74 65 33 5f 73 74 61 63  32*)sqlite3_stac
1aa00 6b 5f 62 61 73 65 6c 69 6e 65 29 5b 2d 69 5d 3d  k_baseline)[-i]=
1aa10 3d 30 78 64 65 61 64 62 65 65 66 3b 20 69 2d 2d  =0xdeadbeef; i--
1aa20 29 7b 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ){}.  Tcl_SetObj
1aa30 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1aa40 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 2a 34  cl_NewIntObj(i*4
1aa50 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1aa60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1aa70 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65  age: sqlite_dele
1aa80 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20 66  te_function DB f
1aa90 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a  unction-name.**.
1aaa0 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 75 73  ** Delete the us
1aab0 65 72 20 66 75 6e 63 74 69 6f 6e 20 27 66 75 6e  er function 'fun
1aac0 63 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d  ction-name' from
1aad0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1aae0 20 44 42 2e 20 49 74 0a 2a 2a 20 69 73 20 61 73   DB. It.** is as
1aaf0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 75  sumed that the u
1ab00 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  ser function was
1ab10 20 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38   created as UTF8
1ab20 2c 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 0a  , any number of.
1ab30 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 28 74 68  ** arguments (th
1ab40 65 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e  e way the TCL in
1ab50 74 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29  terface does it)
1ab60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ab70 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 28  delete_function(
1ab80 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1ab90 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1aba0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1abb0 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1abc0 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
1abd0 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
1abe0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
1abf0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1ac00 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1ac10 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1ac20 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1ac30 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
1ac40 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61  " DB function-na
1ac50 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  me", 0);.    ret
1ac60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ac70 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1ac80 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1ac90 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1aca0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1acb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
1acc0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
1acd0 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20  b, argv[2], -1, 
1ace0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
1acf0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  0, 0, 0);.  Tcl_
1ad00 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1ad10 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
1ad20 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
1ad30 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
1ad40 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1ad50 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f  * Usage: sqlite_
1ad60 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  delete_collation
1ad70 20 44 42 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61   DB collation-na
1ad80 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  me.**.** Delete 
1ad90 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1ada0 71 75 65 6e 63 65 20 27 63 6f 6c 6c 61 74 69 6f  quence 'collatio
1adb0 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74  n-name' from dat
1adc0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
1add0 20 44 42 2e 20 49 74 20 69 73 20 61 73 73 75 6d   DB. It is assum
1ade0 65 64 20 74 68 61 74 20 74 68 65 20 63 6f 6c 6c  ed that the coll
1adf0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
1ae00 61 73 20 63 72 65 61 74 65 64 20 61 73 20 55 54  as created as UT
1ae10 46 38 20 28 74 68 65 20 0a 2a 2a 20 77 61 79 20  F8 (the .** way 
1ae20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63  the TCL interfac
1ae30 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73  e does it)..*/.s
1ae40 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65 74 65  tatic int delete
1ae50 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 76 6f  _collation(.  vo
1ae60 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1ae70 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1ae80 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
1ae90 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
1aea0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1aeb0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1aec0 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
1aed0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1aee0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1aef0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1af00 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1af10 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20  , .        " DB 
1af20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20  function-name", 
1af30 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1af40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1af50 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1af60 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
1af70 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1af80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1af90 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
1afa0 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 61  _collation(db, a
1afb0 72 67 76 5b 32 5d 2c 20 53 51 4c 49 54 45 5f 55  rgv[2], SQLITE_U
1afc0 54 46 38 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  TF8, 0, 0);.  Tc
1afd0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1afe0 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
1aff0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
1b000 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
1b010 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1b020 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1b030 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
1b040 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  t DB.**.** Retur
1b050 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 64 61  n true if the da
1b060 74 61 62 61 73 65 20 44 42 20 69 73 20 63 75 72  tabase DB is cur
1b070 72 65 6e 74 6c 79 20 69 6e 20 61 75 74 6f 2d 63  rently in auto-c
1b080 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52  ommit mode..** R
1b090 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 6e  eturn false if n
1b0a0 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1b0b0 74 20 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  t get_autocommit
1b0c0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1b0d0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1b0e0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1b0f0 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1b100 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72  **argv.){.  char
1b110 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 73 71 6c   zBuf[30];.  sql
1b120 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1b130 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
1b140 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1b150 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1b160 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1b170 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
1b180 20 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30          " DB", 0
1b190 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1b1a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1b1b0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1b1c0 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
1b1d0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1b1e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70 72 69  CL_ERROR;.  spri
1b1f0 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
1b200 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
1b210 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20 20 54  commit(db));.  T
1b220 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1b230 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1b240 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1b250 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1b260 65 3a 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  e: sqlite3_busy_
1b270 74 69 6d 65 6f 75 74 20 44 42 20 4d 53 0a 2a 2a  timeout DB MS.**
1b280 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
1b290 20 74 69 6d 65 6f 75 74 2e 20 20 54 68 69 73 20   timeout.  This 
1b2a0 69 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 64  is more easily d
1b2b0 6f 6e 65 20 75 73 69 6e 67 20 74 68 65 20 74 69  one using the ti
1b2c0 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f 64 20  meout.** method 
1b2d0 6f 66 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  of the TCL inter
1b2e0 66 61 63 65 2e 20 20 42 75 74 20 77 65 20 6e 65  face.  But we ne
1b2f0 65 64 20 61 20 77 61 79 20 74 6f 20 74 65 73 74  ed a way to test
1b300 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
1b310 72 65 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  re it returns SQ
1b320 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a  LITE_MISUSE..*/.
1b330 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1b340 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20  busy_timeout(.  
1b350 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1b360 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1b370 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1b380 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1b390 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  gv.){.  int rc, 
1b3a0 6d 73 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ms;.  sqlite3 *d
1b3b0 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  b;.  if( argc!=3
1b3c0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1b3d0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b3e0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1b3f0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1b400 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1b410 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
1b420 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b430 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1b440 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1b450 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1b460 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b470 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1b480 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
1b490 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75  [2], &ms) ) retu
1b4a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b4b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 75 73  rc = sqlite3_bus
1b4c0 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73  y_timeout(db, ms
1b4d0 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
1b4e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
1b4f0 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61  lite3TestErrorNa
1b500 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
1b510 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1b520 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 74 63  /*.** Usage:  tc
1b530 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 20  l_variable_type 
1b540 56 41 52 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a  VARIABLENAME.**.
1b550 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
1b560 6d 65 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e  me of the intern
1b570 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  al representatio
1b580 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c  n for the.** val
1b590 75 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ue of the given 
1b5a0 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1b5b0 74 69 63 20 69 6e 74 20 74 63 6c 5f 76 61 72 69  tic int tcl_vari
1b5c0 61 62 6c 65 5f 74 79 70 65 28 0a 20 20 76 6f 69  able_type(.  voi
1b5d0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1b5e0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1b5f0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1b600 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1b610 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54  ST objv[].){.  T
1b620 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20  cl_Obj *pVar;.  
1b630 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1b640 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1b650 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1b660 62 6a 76 2c 20 22 56 41 52 49 41 42 4c 45 22 29  bjv, "VARIABLE")
1b670 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1b680 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56  _ERROR;.  }.  pV
1b690 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32  ar = Tcl_GetVar2
1b6a0 45 78 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  Ex(interp, Tcl_G
1b6b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1b6c0 29 2c 20 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f  ), 0, TCL_LEAVE_
1b6d0 45 52 52 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20  ERR_MSG);.  if( 
1b6e0 70 56 61 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  pVar==0 ) return
1b6f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1b700 28 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20  ( pVar->typePtr 
1b710 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
1b720 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1b730 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1b740 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e  (pVar->typePtr->
1b750 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a  name, -1));.  }.
1b760 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1b770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1b780 20 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73    sqlite3_releas
1b790 65 5f 6d 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a  e_memory ?N?.**.
1b7a0 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65  ** Attempt to re
1b7b0 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 63 75 72  lease memory cur
1b7c0 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 75 74 20  rently held but 
1b7d0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71  not actually req
1b7e0 75 69 72 65 64 2e 0a 2a 2a 20 54 68 65 20 69 6e  uired..** The in
1b7f0 74 65 67 65 72 20 4e 20 69 73 20 74 68 65 20 6e  teger N is the n
1b800 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
1b810 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
1b820 72 65 6c 65 61 73 65 2e 20 20 54 68 65 20 0a 2a  release.  The .*
1b830 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
1b840 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
1b850 6d 65 6d 6f 72 79 20 61 63 74 75 61 6c 6c 79 20  memory actually 
1b860 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 61  released..*/.sta
1b870 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6c  tic int test_rel
1b880 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76  ease_memory(.  v
1b890 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1b8a0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1b8b0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1b8c0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1b8d0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
1b8e0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1b8f0 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
1b900 4d 41 4e 41 47 45 4d 45 4e 54 29 20 26 26 20 21  MANAGEMENT) && !
1b910 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1b920 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 69 6e  MIT_DISKIO).  in
1b930 74 20 4e 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a  t N;.  int amt;.
1b940 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26    if( objc!=1 &&
1b950 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1b960 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1b970 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1b980 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65  , "?N?");.    re
1b990 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b9a0 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d    }.  if( objc==
1b9b0 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  2 ){.    if( Tcl
1b9c0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1b9d0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
1b9e0 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &N) ) return TCL
1b9f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
1ba00 0a 20 20 20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d  .    N = -1;.  }
1ba10 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33  .  amt = sqlite3
1ba20 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
1ba30 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  N);.  Tcl_SetObj
1ba40 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1ba50 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74  cl_NewIntObj(amt
1ba60 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  ));.#endif.  ret
1ba70 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1ba80 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1ba90 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
1baa0 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51  imit ?N?.**.** Q
1bab0 75 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20  uery or set the 
1bac0 73 6f 66 74 20 68 65 61 70 20 6c 69 6d 69 74 20  soft heap limit 
1bad0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1bae0 74 68 72 65 61 64 2e 20 20 54 68 65 0a 2a 2a 20  thread.  The.** 
1baf0 6c 69 6d 69 74 20 69 73 20 6f 6e 6c 79 20 63 68  limit is only ch
1bb00 61 6e 67 65 64 20 69 66 20 74 68 65 20 4e 20 69  anged if the N i
1bb10 73 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  s present.  The 
1bb20 70 72 65 76 69 6f 75 73 20 6c 69 6d 69 74 0a 2a  previous limit.*
1bb30 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
1bb40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1bb50 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  t_soft_heap_limi
1bb60 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
1bb70 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1bb80 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1bb90 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1bba0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1bbb0 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  ].){.  static in
1bbc0 74 20 73 6f 66 74 48 65 61 70 4c 69 6d 69 74 20  t softHeapLimit 
1bbd0 3d 20 30 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a  = 0;.  int amt;.
1bbe0 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26    if( objc!=1 &&
1bbf0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1bc00 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1bc10 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1bc20 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65  , "?N?");.    re
1bc30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1bc40 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 6f 66 74    }.  amt = soft
1bc50 48 65 61 70 4c 69 6d 69 74 3b 0a 20 20 69 66 28  HeapLimit;.  if(
1bc60 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
1bc70 69 6e 74 20 4e 3b 0a 20 20 20 20 69 66 28 20 54  int N;.    if( T
1bc80 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1bc90 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
1bca0 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54  , &N) ) return T
1bcb0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  CL_ERROR;.    sq
1bcc0 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
1bcd0 6c 69 6d 69 74 28 4e 29 3b 0a 20 20 20 20 73 6f  limit(N);.    so
1bce0 66 74 48 65 61 70 4c 69 6d 69 74 20 3d 20 4e 3b  ftHeapLimit = N;
1bcf0 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
1bd00 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1bd10 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6d  Tcl_NewIntObj(am
1bd20 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  t));.  return TC
1bd30 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1bd40 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1bd50 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 0a 2a  thread_cleanup.*
1bd60 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
1bd70 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
1bd80 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a 73 74 61  anup API..*/.sta
1bd90 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 68 72  tic int test_thr
1bda0 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a 20 20 76  ead_cleanup(.  v
1bdb0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1bdc0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1bdd0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1bde0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1bdf0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1be00 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
1be10 63 6c 65 61 6e 75 70 28 29 3b 0a 20 20 72 65 74  cleanup();.  ret
1be20 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
1be30 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
1be40 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66  qlite3_pager_ref
1be50 63 6f 75 6e 74 73 20 20 44 42 0a 2a 2a 0a 2a 2a  counts  DB.**.**
1be60 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f   Return a list o
1be70 66 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20  f numbers which 
1be80 61 72 65 20 74 68 65 20 50 61 67 65 72 52 65 66  are the PagerRef
1be90 63 6f 75 6e 74 20 66 6f 72 20 61 6c 6c 0a 2a 2a  count for all.**
1bea0 20 70 61 67 65 72 73 20 6f 6e 20 65 61 63 68 20   pagers on each 
1beb0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1bec0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1bed0 6e 74 20 74 65 73 74 5f 70 61 67 65 72 5f 72 65  nt test_pager_re
1bee0 66 63 6f 75 6e 74 73 28 0a 20 20 76 6f 69 64 20  fcounts(.  void 
1bef0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1bf00 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1bf10 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1bf20 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1bf30 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1bf40 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
1bf50 69 3b 0a 20 20 69 6e 74 20 76 2c 20 2a 61 3b 0a  i;.  int v, *a;.
1bf60 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
1bf70 6c 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  lt;..  if( objc!
1bf80 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1bf90 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1bfa0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1bfb0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1bfc0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
1bfd0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
1bfe0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22  jv[0], 0), " DB"
1bff0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c000 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c010 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1c020 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1c030 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1c040 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1c050 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 52   TCL_ERROR;.  pR
1c060 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  esult = Tcl_NewO
1c070 62 6a 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  bj();.  for(i=0;
1c080 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1c090 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44  {.    if( db->aD
1c0a0 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 7b 0a 20  b[i].pBt==0 ){. 
1c0b0 20 20 20 20 20 76 20 3d 20 2d 31 3b 0a 20 20 20       v = -1;.   
1c0c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1c0d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c0e0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1c0f0 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 50      a = sqlite3P
1c100 61 67 65 72 53 74 61 74 73 28 73 71 6c 69 74 65  agerStats(sqlite
1c110 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
1c120 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20  aDb[i].pBt));.  
1c130 20 20 20 20 76 20 3d 20 61 5b 30 5d 3b 0a 20 20      v = a[0];.  
1c140 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1c150 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1c160 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  x);.    }.    Tc
1c170 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1c180 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 73 75 6c  lement(0, pResul
1c190 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
1c1a0 28 76 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  (v));.  }.  Tcl_
1c1b0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1c1c0 65 72 70 2c 20 70 52 65 73 75 6c 74 29 3b 0a 20  erp, pResult);. 
1c1d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1c1e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
1c1f0 3a 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69  :   working_64bi
1c200 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  t_int.**.** Some
1c210 20 54 43 4c 20 62 75 69 6c 64 73 20 28 65 78 3a   TCL builds (ex:
1c220 20 63 79 67 77 69 6e 29 20 64 6f 20 6e 6f 74 20   cygwin) do not 
1c230 73 75 70 70 6f 72 74 20 36 34 2d 62 69 74 20 69  support 64-bit i
1c240 6e 74 65 67 65 72 73 2e 20 20 54 68 69 73 0a 2a  ntegers.  This.*
1c250 2a 20 6c 65 61 64 73 20 74 6f 20 61 20 6e 75 6d  * leads to a num
1c260 62 65 72 20 6f 66 20 74 65 73 74 20 66 61 69 6c  ber of test fail
1c270 75 72 65 73 2e 20 20 54 68 65 20 70 72 65 73 65  ures.  The prese
1c280 6e 74 20 63 6f 6d 6d 61 6e 64 20 63 68 65 63 6b  nt command check
1c290 73 20 74 68 65 0a 2a 2a 20 54 43 4c 20 62 75 69  s the.** TCL bui
1c2a0 6c 64 20 74 6f 20 73 65 65 20 77 68 65 74 68 65  ld to see whethe
1c2b0 72 20 6f 72 20 6e 6f 74 20 69 74 20 73 75 70 70  r or not it supp
1c2c0 6f 72 74 73 20 36 34 2d 62 69 74 20 69 6e 74 65  orts 64-bit inte
1c2d0 67 65 72 73 2e 20 20 49 74 0a 2a 2a 20 72 65 74  gers.  It.** ret
1c2e0 75 72 6e 73 20 54 52 55 45 20 69 66 20 69 74 20  urns TRUE if it 
1c2f0 64 6f 65 73 20 61 6e 64 20 46 41 4c 53 45 20 69  does and FALSE i
1c300 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  f not..**.** Thi
1c310 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  s command is use
1c320 64 20 74 6f 20 77 61 72 6e 20 75 73 65 72 73 20  d to warn users 
1c330 74 68 61 74 20 74 68 65 69 72 20 54 43 4c 20 62  that their TCL b
1c340 75 69 6c 64 20 69 73 20 64 65 66 65 63 74 69 76  uild is defectiv
1c350 65 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 74 68  e.** and that th
1c360 65 20 65 72 72 6f 72 73 20 74 68 65 79 20 61 72  e errors they ar
1c370 65 20 73 65 65 69 6e 67 20 69 6e 20 74 68 65 20  e seeing in the 
1c380 74 65 73 74 20 73 63 72 69 70 74 73 20 6d 69 67  test scripts mig
1c390 68 74 20 62 65 0a 2a 2a 20 61 20 72 65 73 75 6c  ht be.** a resul
1c3a0 74 20 6f 66 20 74 68 65 69 72 20 64 65 66 65 63  t of their defec
1c3b0 74 69 76 65 20 54 43 4c 20 72 61 74 68 65 72 20  tive TCL rather 
1c3c0 74 68 61 6e 20 70 72 6f 62 6c 65 6d 73 20 69 6e  than problems in
1c3d0 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74   SQLite..*/.stat
1c3e0 69 63 20 69 6e 74 20 77 6f 72 6b 69 6e 67 5f 36  ic int working_6
1c3f0 34 62 69 74 5f 69 6e 74 28 0a 20 20 43 6c 69 65  4bit_int(.  Clie
1c400 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
1c410 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
1c420 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
1c430 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
1c440 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c450 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1c460 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1c470 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1c480 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1c490 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
1c4a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c4b0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1c4c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1c4d0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
1c4e0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
1c4f0 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  .){.  Tcl_Obj *p
1c500 54 65 73 74 4f 62 6a 3b 0a 20 20 69 6e 74 20 77  TestObj;.  int w
1c510 6f 72 6b 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 70  orking = 0;..  p
1c520 54 65 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  TestObj = Tcl_Ne
1c530 77 57 69 64 65 49 6e 74 4f 62 6a 28 31 30 30 30  wWideIntObj(1000
1c540 30 30 30 2a 28 69 36 34 29 31 32 33 34 35 36 37  000*(i64)1234567
1c550 38 39 30 29 3b 0a 20 20 77 6f 72 6b 69 6e 67 20  890);.  working 
1c560 3d 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74  = strcmp(Tcl_Get
1c570 53 74 72 69 6e 67 28 70 54 65 73 74 4f 62 6a 29  String(pTestObj)
1c580 2c 20 22 31 32 33 34 35 36 37 38 39 30 30 30 30  , "1234567890000
1c590 30 30 30 22 29 3d 3d 30 3b 0a 20 20 54 63 6c 5f  000")==0;.  Tcl_
1c5a0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 65  DecrRefCount(pTe
1c5b0 73 74 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 53 65  stObj);.  Tcl_Se
1c5c0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1c5d0 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
1c5e0 6e 4f 62 6a 28 77 6f 72 6b 69 6e 67 29 29 3b 0a  nObj(working));.
1c5f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c600 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  .}.../*.** tclcm
1c610 64 3a 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f  d:   vfs_unlink_
1c620 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  test.**.** This 
1c630 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75 6e 72 65  TCL command unre
1c640 67 69 73 74 65 72 73 20 74 68 65 20 70 72 69 6d  gisters the prim
1c650 61 72 79 20 56 46 53 20 61 6e 64 20 74 68 65 6e  ary VFS and then
1c660 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 69 74   registers.** it
1c670 20 62 61 63 6b 20 61 67 61 69 6e 2e 20 20 54 68   back again.  Th
1c680 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
1c690 73 74 20 74 68 65 20 61 62 69 6c 69 74 79 20 74  st the ability t
1c6a0 6f 20 72 65 67 69 73 74 65 72 20 61 0a 2a 2a 20  o register a.** 
1c6b0 56 46 53 20 77 68 65 6e 20 6e 6f 6e 65 20 61 72  VFS when none ar
1c6c0 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
1c6d0 69 73 74 65 72 65 64 2c 20 61 6e 64 20 74 68 65  istered, and the
1c6e0 20 61 62 69 6c 69 74 79 20 74 6f 20 0a 2a 2a 20   ability to .** 
1c6f0 75 6e 72 65 67 69 73 74 65 72 20 74 68 65 20 6f  unregister the o
1c700 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 56 46  nly available VF
1c710 53 2e 20 20 54 69 63 6b 65 74 20 23 32 37 33 38  S.  Ticket #2738
1c720 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1c730 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 28 0a  fs_unlink_test(.
1c740 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
1c750 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
1c760 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
1c770 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
1c780 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
1c790 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
1c7a0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
1c7b0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
1c7c0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
1c7d0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c7f0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
1c800 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
1c810 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
1c820 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
1c830 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
1c840 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  i;.  sqlite3_vfs
1c850 20 2a 70 4d 61 69 6e 3b 0a 20 20 73 71 6c 69 74   *pMain;.  sqlit
1c860 65 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30  e3_vfs *apVfs[20
1c870 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ];.  sqlite3_vfs
1c880 20 6f 6e 65 2c 20 74 77 6f 3b 0a 0a 20 20 73 71   one, two;..  sq
1c890 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
1c8a0 73 74 65 72 28 30 29 3b 20 20 20 2f 2a 20 55 6e  ster(0);   /* Un
1c8b0 72 65 67 69 73 74 65 72 20 6f 66 20 4e 55 4c 4c  register of NULL
1c8c0 20 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a   is harmless */.
1c8d0 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f    one.zName = "_
1c8e0 5f 6f 6e 65 22 3b 0a 20 20 74 77 6f 2e 7a 4e 61  _one";.  two.zNa
1c8f0 6d 65 20 3d 20 22 5f 5f 74 77 6f 22 3b 0a 0a 20  me = "__two";.. 
1c900 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69   /* Calling sqli
1c910 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1c920 20 77 69 74 68 20 32 6e 64 20 61 72 67 75 6d 65   with 2nd argume
1c930 6e 74 20 6f 66 20 30 20 64 6f 65 73 20 6e 6f 74  nt of 0 does not
1c940 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 74 68 65  .  ** change the
1c950 20 64 65 66 61 75 6c 74 20 56 46 53 0a 20 20 2a   default VFS.  *
1c960 2f 0a 20 20 70 4d 61 69 6e 20 3d 20 73 71 6c 69  /.  pMain = sqli
1c970 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
1c980 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
1c990 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 30 29  egister(&one, 0)
1c9a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 69  ;.  assert( pMai
1c9b0 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73  n==0 || pMain==s
1c9c0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1c9d0 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  0) );.  sqlite3_
1c9e0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 74 77  vfs_register(&tw
1c9f0 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  o, 0);.  assert(
1ca00 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61   pMain==0 || pMa
1ca10 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  in==sqlite3_vfs_
1ca20 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a  find(0) );..  /*
1ca30 20 57 65 20 63 61 6e 20 66 69 6e 64 20 61 20 56   We can find a V
1ca40 46 53 20 62 79 20 69 74 73 20 6e 61 6d 65 20 2a  FS by its name *
1ca50 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
1ca60 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
1ca70 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  one")==&one );. 
1ca80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ca90 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
1caa0 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 0a 20 20 2f  ")==&two );..  /
1cab0 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  * Calling sqlite
1cac0 5f 76 66 73 5f 72 65 67 69 73 74 65 72 20 77 69  _vfs_register wi
1cad0 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73 65 63 6f  th non-zero seco
1cae0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 63 68 61  nd parameter cha
1caf0 6e 67 65 73 20 74 68 65 0a 20 20 2a 2a 20 64 65  nges the.  ** de
1cb00 66 61 75 6c 74 20 56 46 53 2c 20 65 76 65 6e 20  fault VFS, even 
1cb10 69 66 20 74 68 65 20 31 73 74 20 70 61 72 61 6d  if the 1st param
1cb20 65 74 65 72 20 69 73 20 61 6e 20 65 78 69 73 74  eter is an exist
1cb30 69 67 20 56 46 53 20 74 68 61 74 20 69 73 0a 20  ig VFS that is. 
1cb40 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
1cb50 65 67 69 73 74 65 72 65 64 20 61 73 20 74 68 65  egistered as the
1cb60 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 2e 0a 20 20   non-default..  
1cb70 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
1cb80 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20  _register(&one, 
1cb90 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  1);.  assert( sq
1cba0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
1cbb0 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b  __one")==&one );
1cbc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1cbd0 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74  e3_vfs_find("__t
1cbe0 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20  wo")==&two );.  
1cbf0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1cc00 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 26 6f 6e  vfs_find(0)==&on
1cc10 65 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  e );.  sqlite3_v
1cc20 66 73 5f 72 65 67 69 73 74 65 72 28 26 74 77 6f  fs_register(&two
1cc30 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 1);.  assert( 
1cc40 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1cc50 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20  ("__one")==&one 
1cc60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1cc70 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
1cc80 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a  _two")==&two );.
1cc90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1cca0 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 26  3_vfs_find(0)==&
1ccb0 74 77 6f 20 29 3b 0a 20 20 69 66 28 20 70 4d 61  two );.  if( pMa
1ccc0 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
1ccd0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70  3_vfs_register(p
1cce0 4d 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20 61 73  Main, 1);.    as
1ccf0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
1cd00 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d  s_find("__one")=
1cd10 3d 26 6f 6e 65 20 29 3b 0a 20 20 20 20 61 73 73  =&one );.    ass
1cd20 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
1cd30 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
1cd40 26 74 77 6f 20 29 3b 0a 20 20 20 20 61 73 73 65  &two );.    asse
1cd50 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
1cd60 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29  find(0)==pMain )
1cd70 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 55 6e  ;.  }.  .  /* Un
1cd80 6c 69 6e 6b 20 74 68 65 20 64 65 66 61 75 6c 74  link the default
1cd90 20 56 46 53 2e 20 20 52 65 70 65 61 74 20 75 6e   VFS.  Repeat un
1cda0 74 69 6c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  til there are no
1cdb0 20 6d 6f 72 65 20 56 46 53 65 73 0a 20 20 2a 2a   more VFSes.  **
1cdc0 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20 2a   registered..  *
1cdd0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  /.  for(i=0; i<s
1cde0 69 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a  izeof(apVfs)/siz
1cdf0 65 6f 66 28 61 70 56 66 73 5b 30 5d 29 3b 20 69  eof(apVfs[0]); i
1ce00 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66 73 5b 69  ++){.    apVfs[i
1ce10 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ] = sqlite3_vfs_
1ce20 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 69 66 28  find(0);.    if(
1ce30 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20   apVfs[i] ){.   
1ce40 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73     assert( apVfs
1ce50 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  [i]==sqlite3_vfs
1ce60 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e  _find(apVfs[i]->
1ce70 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 20 20  zName) );.      
1ce80 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
1ce90 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 29  gister(apVfs[i])
1cea0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ceb0 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  0==sqlite3_vfs_f
1cec0 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e  ind(apVfs[i]->zN
1ced0 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ame) );.    }.  
1cee0 7d 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73  }.  assert( 0==s
1cef0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1cf00 30 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 52 65  0) );.  .  /* Re
1cf10 67 69 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20  gister the main 
1cf20 56 46 53 20 61 73 20 6e 6f 6e 2d 64 65 66 61 75  VFS as non-defau
1cf30 6c 74 20 28 77 69 6c 6c 20 62 65 20 6d 61 64 65  lt (will be made
1cf40 20 64 65 66 61 75 6c 74 2c 20 73 69 6e 63 65 0a   default, since.
1cf50 20 20 2a 2a 20 69 74 27 6c 6c 20 62 65 20 74 68    ** it'll be th
1cf60 65 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 20 65 78  e only one in ex
1cf70 69 73 74 65 6e 63 65 29 2e 0a 20 20 2a 2f 0a 20  istence)..  */. 
1cf80 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
1cf90 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 30 29 3b  ister(pMain, 0);
1cfa0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1cfb0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
1cfc0 70 4d 61 69 6e 20 29 3b 0a 20 20 0a 20 20 2f 2a  pMain );.  .  /*
1cfd0 20 55 6e 2d 72 65 67 69 73 74 65 72 20 74 68 65   Un-register the
1cfe0 20 6d 61 69 6e 20 56 46 53 20 61 67 61 69 6e 20   main VFS again 
1cff0 74 6f 20 72 65 73 74 6f 72 65 20 61 6e 20 65 6d  to restore an em
1d000 70 74 79 20 56 46 53 20 6c 69 73 74 20 2a 2f 0a  pty VFS list */.
1d010 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
1d020 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 29 3b  register(pMain);
1d030 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71  .  assert( 0==sq
1d040 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1d050 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 69 6e  ) );..  /* Relin
1d060 6b 20 61 6c 6c 20 56 46 53 65 73 20 69 6e 20 72  k all VFSes in r
1d070 65 76 65 72 73 65 20 6f 72 64 65 72 2e 20 2a 2f  everse order. */
1d080 20 20 0a 20 20 66 6f 72 28 69 3d 73 69 7a 65 6f    .  for(i=sizeo
1d090 66 28 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28  f(apVfs)/sizeof(
1d0a0 61 70 56 66 73 5b 30 5d 29 2d 31 3b 20 69 3e 3d  apVfs[0])-1; i>=
1d0b0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
1d0c0 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20   apVfs[i] ){.   
1d0d0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
1d0e0 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d  egister(apVfs[i]
1d0f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 1);.      asse
1d100 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71  rt( apVfs[i]==sq
1d110 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1d120 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1d130 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c  t( apVfs[i]==sql
1d140 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70  ite3_vfs_find(ap
1d150 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29  Vfs[i]->zName) )
1d160 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1d170 2a 20 55 6e 72 65 67 69 73 74 65 72 20 6f 75 74  * Unregister out
1d180 20 73 61 6d 70 6c 65 20 56 46 53 65 73 2e 20 2a   sample VFSes. *
1d190 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  /.  sqlite3_vfs_
1d1a0 75 6e 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29  unregister(&one)
1d1b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
1d1c0 75 6e 72 65 67 69 73 74 65 72 28 26 74 77 6f 29  unregister(&two)
1d1d0 3b 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74  ;..  /* Unregist
1d1e0 65 72 69 6e 67 20 61 20 56 46 53 20 74 68 61 74  ering a VFS that
1d1f0 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
1d200 79 20 72 65 67 69 73 74 65 72 65 64 20 69 73 20  y registered is 
1d210 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 73 71  harmless */.  sq
1d220 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
1d230 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71  ster(&one);.  sq
1d240 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
1d250 73 74 65 72 28 26 74 77 6f 29 3b 0a 20 20 61 73  ster(&two);.  as
1d260 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
1d270 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d  s_find("__one")=
1d280 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1d290 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1d2a0 28 22 5f 5f 74 77 6f 22 29 3d 3d 30 20 29 3b 0a  ("__two")==0 );.
1d2b0 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20  .  /* We should 
1d2c0 62 65 20 6c 65 66 74 20 77 69 74 68 20 74 68 65  be left with the
1d2d0 20 6f 72 69 67 69 6e 61 6c 20 64 65 66 61 75 6c   original defaul
1d2e0 74 20 56 46 53 20 62 61 63 6b 20 61 73 20 74 68  t VFS back as th
1d2f0 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
1d300 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1d310 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1d320 3d 3d 70 4d 61 69 6e 20 29 3b 0a 0a 20 20 72 65  ==pMain );..  re
1d330 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d340 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
1d350 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73  vfs_initfail_tes
1d360 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  t.**.** This TCL
1d370 20 63 6f 6d 6d 61 6e 64 20 61 74 74 65 6d 70 74   command attempt
1d380 73 20 74 6f 20 76 66 73 5f 66 69 6e 64 20 61 6e  s to vfs_find an
1d390 64 20 76 66 73 5f 72 65 67 69 73 74 65 72 20 77  d vfs_register w
1d3a0 68 65 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  hen the.** sqlit
1d3b0 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
1d3c0 69 6e 74 65 72 66 61 63 65 20 69 73 20 66 61 69  interface is fai
1d3d0 6c 69 6e 67 2e 20 20 41 6c 6c 20 63 61 6c 6c 73  ling.  All calls
1d3e0 20 73 68 6f 75 6c 64 20 66 61 69 6c 2e 0a 2a 2f   should fail..*/
1d3f0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f  .static int vfs_
1d400 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 28 0a 20  initfail_test(. 
1d410 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
1d420 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
1d430 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
1d440 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
1d450 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
1d460 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1d470 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1d480 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1d490 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1d4a0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
1d4b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d4c0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1d4d0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
1d4e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
1d4f0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
1d500 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
1d510 65 33 5f 76 66 73 20 6f 6e 65 3b 0a 20 20 6f 6e  e3_vfs one;.  on
1d520 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65  e.zName = "__one
1d530 22 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ";..  if( sqlite
1d540 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20  3_vfs_find(0) ) 
1d550 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d560 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
1d570 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 30  register(&one, 0
1d580 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1d590 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20 72  _vfs_find(0) ) r
1d5a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d5b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
1d5c0 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 31 29  egister(&one, 1)
1d5d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
1d5e0 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65  vfs_find(0) ) re
1d5f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d600 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1d610 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 64 20  .}../*.** Saved 
1d620 56 46 53 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  VFSes.*/.static 
1d630 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56  sqlite3_vfs *apV
1d640 66 73 5b 32 30 5d 3b 0a 73 74 61 74 69 63 20 69  fs[20];.static i
1d650 6e 74 20 6e 56 66 73 20 3d 20 30 3b 0a 0a 2f 2a  nt nVfs = 0;../*
1d660 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66  .** tclcmd:   vf
1d670 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
1d680 0a 2a 2a 0a 2a 2a 20 55 6e 72 65 67 69 73 74 65  .**.** Unregiste
1d690 72 20 61 6c 6c 20 56 46 53 65 73 2e 0a 2a 2f 0a  r all VFSes..*/.
1d6a0 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 75  static int vfs_u
1d6b0 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20  nregister_all(. 
1d6c0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
1d6d0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
1d6e0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
1d6f0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
1d700 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
1d710 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1d720 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1d730 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1d740 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1d750 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
1d760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d770 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1d780 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
1d790 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
1d7a0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
1d7b0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
1d7c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ;.  for(i=0; i<A
1d7d0 72 72 61 79 53 69 7a 65 28 61 70 56 66 73 29 3b  rraySize(apVfs);
1d7e0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66 73   i++){.    apVfs
1d7f0 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  [i] = sqlite3_vf
1d800 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 69  s_find(0);.    i
1d810 66 28 20 61 70 56 66 73 5b 69 5d 3d 3d 30 20 29  f( apVfs[i]==0 )
1d820 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69   break;.    sqli
1d830 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
1d840 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20  er(apVfs[i]);.  
1d850 7d 0a 20 20 6e 56 66 73 20 3d 20 69 3b 0a 20 20  }.  nVfs = i;.  
1d860 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1d870 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
1d880 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f   vfs_reregister_
1d890 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72  all.**.** Restor
1d8a0 65 20 61 6c 6c 20 56 46 53 65 73 20 74 68 61 74  e all VFSes that
1d8b0 20 77 65 72 65 20 72 65 6d 6f 76 65 64 20 75 73   were removed us
1d8c0 69 6e 67 20 76 66 73 5f 75 6e 72 65 67 69 73 74  ing vfs_unregist
1d8d0 65 72 5f 61 6c 6c 0a 2a 2f 0a 73 74 61 74 69 63  er_all.*/.static
1d8e0 20 69 6e 74 20 76 66 73 5f 72 65 72 65 67 69 73   int vfs_reregis
1d8f0 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e  ter_all(.  Clien
1d900 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
1d910 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
1d920 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
1d930 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
1d940 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1d950 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1d960 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1d970 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1d980 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1d990 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
1d9a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d9b0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1d9c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1d9d0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
1d9e0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
1d9f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1da00 72 28 69 3d 30 3b 20 69 3c 6e 56 66 73 3b 20 69  r(i=0; i<nVfs; i
1da10 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1da20 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 61 70  _vfs_register(ap
1da30 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20  Vfs[i], i==0);. 
1da40 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1da50 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  OK;.}.../*.** tc
1da60 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
1da70 74 72 6f 6c 5f 74 65 73 74 20 44 42 0a 2a 2a 0a  trol_test DB.**.
1da80 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
1da90 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
1daa0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
1dab0 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a  l interface and.
1dac0 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72  ** verifies corr
1dad0 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
1dae0 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74   the same..*/.st
1daf0 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f  atic int file_co
1db00 6e 74 72 6f 6c 5f 74 65 73 74 28 0a 20 20 43 6c  ntrol_test(.  Cl
1db10 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1db20 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
1db30 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
1db40 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
1db50 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1db60 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1db70 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1db80 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1db90 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1dba0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
1dbb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1dbc0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1dbd0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
1dbe0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
1dbf0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
1dc00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67  */.){.  int iArg
1dc10 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
1dc20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
1dc30 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1dc40 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1dc50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1dc60 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1dc70 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
1dc80 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1dc90 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
1dca0 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  , 0), " DB", 0);
1dcb0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1dcc0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1dcd0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1dce0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1dcf0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1dd00 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1dd10 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1dd20 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
1dd30 6f 6c 28 64 62 2c 20 30 2c 20 30 2c 20 26 69 41  ol(db, 0, 0, &iA
1dd40 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  rg);.  assert( r
1dd50 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
1dd60 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1dd70 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
1dd80 62 2c 20 22 6e 6f 74 61 64 61 74 61 62 61 73 65  b, "notadatabase
1dd90 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
1dda0 4c 4f 43 4b 53 54 41 54 45 2c 20 26 69 41 72 67  LOCKSTATE, &iArg
1ddb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
1ddc0 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b  =SQLITE_ERROR );
1ddd0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1dde0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
1ddf0 20 22 6d 61 69 6e 22 2c 20 2d 31 2c 20 26 69 41   "main", -1, &iA
1de00 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  rg);.  assert( r
1de10 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
1de20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1de30 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
1de40 62 2c 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26  b, "temp", -1, &
1de50 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28  iArg);.  assert(
1de60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f   rc==SQLITE_ERRO
1de70 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  R );.  return TC
1de80 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  L_OK;  .}../*.**
1de90 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74   tclcmd:   sqlit
1dea0 65 33 5f 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a  e3_vfs_list.**.*
1deb0 2a 20 20 20 52 65 74 75 72 6e 20 61 20 74 63 6c  *   Return a tcl
1dec0 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
1ded0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
1dee0 6c 20 72 65 67 69 73 74 65 72 65 64 20 76 66 73  l registered vfs
1def0 27 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  's..*/.static in
1df00 74 20 76 66 73 5f 6c 69 73 74 28 0a 20 20 43 6c  t vfs_list(.  Cl
1df10 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1df20 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
1df30 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
1df40 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
1df50 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1df60 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1df70 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1df80 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1df90 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1dfa0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
1dfb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1dfc0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1dfd0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
1dfe0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
1dff0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
1e000 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
1e010 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 54 63 6c  vfs *pVfs;.  Tcl
1e020 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c  _Obj *pRet = Tcl
1e030 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 69 66 28  _NewObj();.  if(
1e040 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
1e050 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1e060 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1e070 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72  , "");.    retur
1e080 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1e090 0a 20 20 66 6f 72 28 70 56 66 73 3d 73 71 6c 69  .  for(pVfs=sqli
1e0a0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
1e0b0 20 70 56 66 73 3b 20 70 56 66 73 3d 70 56 66 73   pVfs; pVfs=pVfs
1e0c0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 54 63  ->pNext){.    Tc
1e0d0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1e0e0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
1e0f0 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
1e100 6e 67 4f 62 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d  ngObj(pVfs->zNam
1e110 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 54  e, -1));.  }.  T
1e120 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1e130 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
1e140 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
1e150 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
1e160 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d  d:   sqlite3_lim
1e170 69 74 20 44 42 20 49 44 20 56 41 4c 55 45 0a 2a  it DB ID VALUE.*
1e180 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
1e190 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
1e1a0 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 69 6e 74  qlite3_limit int
1e1b0 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65  erface and.** ve
1e1c0 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f  rifies correct o
1e1d0 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
1e1e0 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  same..*/.static 
1e1f0 69 6e 74 20 74 65 73 74 5f 6c 69 6d 69 74 28 0a  int test_limit(.
1e200 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
1e210 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
1e220 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
1e230 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
1e240 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
1e250 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
1e260 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
1e270 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
1e280 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
1e290 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e2b0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
1e2c0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
1e2d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
1e2e0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
1e2f0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
1e300 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
1e310 63 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  c;.  static cons
1e320 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
1e330 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
1e340 20 20 69 6e 74 20 69 64 3b 0a 20 20 7d 20 61 49    int id;.  } aI
1e350 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53  d[] = {.    { "S
1e360 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
1e370 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  TH",            
1e380 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c    SQLITE_LIMIT_L
1e390 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20  ENGTH           
1e3a0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
1e3b0 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
1e3c0 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20  ENGTH",         
1e3d0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51   SQLITE_LIMIT_SQ
1e3e0 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20  L_LENGTH        
1e3f0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
1e400 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
1e410 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
1e420 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
1e430 55 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  UMN             
1e440 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
1e450 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
1e460 50 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 53  PTH",          S
1e470 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
1e480 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20  _DEPTH          
1e490 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
1e4a0 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
1e4b0 5f 53 45 4c 45 43 54 22 2c 20 20 20 20 20 53 51  _SELECT",     SQ
1e4c0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
1e4d0 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20  UND_SELECT      
1e4e0 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
1e4f0 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 22 2c  _LIMIT_VDBE_OP",
1e500 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1e510 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
1e520 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  P              }
1e530 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
1e540 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
1e550 52 47 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49  RG",        SQLI
1e560 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
1e570 4e 5f 41 52 47 20 20 20 20 20 20 20 20 20 7d 2c  N_ARG         },
1e580 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
1e590 49 4d 49 54 5f 41 54 54 41 43 48 45 44 22 2c 20  IMIT_ATTACHED", 
1e5a0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1e5b0 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1e5d0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
1e5e0 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
1e5f0 5f 4c 45 4e 47 54 48 22 2c 20 53 51 4c 49 54 45  _LENGTH", SQLITE
1e600 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
1e610 45 52 4e 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a 20  ERN_LENGTH  },. 
1e620 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
1e630 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
1e640 45 52 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  ER",     SQLITE_
1e650 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
1e660 55 4d 42 45 52 20 20 20 20 20 20 7d 2c 0a 20 20  UMBER      },.  
1e670 20 20 0a 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66    .    /* Out of
1e680 20 72 61 6e 67 65 20 74 65 73 74 20 63 61 73 65   range test case
1e690 73 20 2a 2f 0a 20 20 20 20 7b 20 22 53 51 4c 49  s */.    { "SQLI
1e6a0 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c  TE_LIMIT_TOOSMAL
1e6b0 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d  L",            -
1e6c0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6e0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
1e6f0 45 5f 4c 49 4d 49 54 5f 54 4f 4f 42 49 47 22 2c  E_LIMIT_TOOBIG",
1e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1e710 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
1e720 42 4c 45 5f 4e 55 4d 42 45 52 2b 31 20 20 20 20  BLE_NUMBER+1    
1e730 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
1e740 20 69 64 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a   id;.  int val;.
1e750 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
1e760 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  d;..  if( objc!=
1e770 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
1e780 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1e790 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1e7a0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
1e7b0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
1e7c0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
1e7d0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 49  v[0], 0), " DB I
1e7e0 44 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  D VALUE", 0);.  
1e7f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e800 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1e810 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1e820 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1e830 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1e840 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1e850 4f 52 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f  OR;.  zId = Tcl_
1e860 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
1e870 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
1e880 3c 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a  <sizeof(aId)/siz
1e890 65 6f 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b  eof(aId[0]); i++
1e8a0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
1e8b0 70 28 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e  p(zId, aId[i].zN
1e8c0 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
1e8d0 20 69 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b   id = aId[i].id;
1e8e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e8f0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e    }.  }.  if( i>
1e900 3d 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a  =sizeof(aId)/siz
1e910 65 6f 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20  eof(aId[0]) ){. 
1e920 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1e930 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b  ult(interp, "unk
1e940 6e 6f 77 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a  nown limit type:
1e950 20 22 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a 29   ", zId, (char*)
1e960 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1e970 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1e980 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1e990 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1e9a0 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
1e9b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e9c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1e9d0 6c 69 6d 69 74 28 64 62 2c 20 69 64 2c 20 76 61  limit(db, id, va
1e9e0 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
1e9f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1ea00 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29  cl_NewIntObj(rc)
1ea10 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1ea20 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
1ea30 63 6c 63 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e  clcmd:  save_prn
1ea40 67 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61  g_state.**.** Sa
1ea50 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
1ea60 74 68 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f  the pseudo-rando
1ea70 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74  m number generat
1ea80 6f 72 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73 61  or..** At the sa
1ea90 6d 65 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20  me time, verify 
1eaa0 74 68 61 74 20 73 71 6c 69 74 65 33 5f 74 65 73  that sqlite3_tes
1eab0 74 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20  t_control works 
1eac0 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c  even when.** cal
1ead0 6c 65 64 20 77 69 74 68 20 61 6e 20 6f 75 74 2d  led with an out-
1eae0 6f 66 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e  of-range opcode.
1eaf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1eb00 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a  ave_prng_state(.
1eb10 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
1eb20 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
1eb30 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
1eb40 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
1eb50 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
1eb60 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
1eb70 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
1eb80 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
1eb90 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
1eba0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ebc0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
1ebd0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
1ebe0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
1ebf0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
1ec00 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
1ec10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  rc = sqlite3_tes
1ec20 74 5f 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b  t_control(9999);
1ec30 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
1ec40 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
1ec50 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ec60 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  -1);.  assert( r
1ec70 63 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c==0 );.  sqlite
1ec80 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1ec90 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1eca0 52 4e 47 5f 53 41 56 45 29 3b 0a 20 20 72 65 74  RNG_SAVE);.  ret
1ecb0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
1ecc0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73  .** tclcmd:  res
1ecd0 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a  tore_prng_state.
1ece0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1ecf0 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
1ed00 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
1ed10 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
1ed20 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
1ed30 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
1ed40 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
1ed50 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
1ed60 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
1ed70 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
1ed80 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
1ed90 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1edb0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
1edc0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
1edd0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
1ede0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
1edf0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
1ee00 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1ee10 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1ee20 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 29  RL_PRNG_RESTORE)
1ee30 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1ee40 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  K;.}./*.** tclcm
1ee50 64 3a 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73  d:  reset_prng_s
1ee60 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tate.*/.static i
1ee70 6e 74 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74  nt reset_prng_st
1ee80 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ate(.  ClientDat
1ee90 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
1eea0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
1eeb0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
1eec0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
1eed0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1eee0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1eef0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1ef00 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1ef10 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
1ef20 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
1ef30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1ef40 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
1ef50 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1ef60 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
1ef70 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
1ef80 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1ef90 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1efa0 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
1efb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1efc0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  OK;.}.../*.** Re
1efd0 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20  gister commands 
1efe0 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74  with the TCL int
1eff0 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74  erpreter..*/.int
1f000 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69   Sqlitetest1_Ini
1f010 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
1f020 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e 20  terp){.  extern 
1f030 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
1f040 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  ch_count;.  exte
1f050 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
1f060 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a  nterrupt_count;.
1f070 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
1f080 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  ite3_open_file_c
1f090 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
1f0a0 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  nt sqlite3_sort_
1f0b0 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
1f0c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
1f0d0 65 6e 74 5f 74 69 6d 65 3b 0a 20 20 65 78 74 65  ent_time;.  exte
1f0e0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  rn int sqlite3_m
1f0f0 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65  ax_blobsize;.  e
1f100 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1f110 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68  3BtreeSharedCach
1f120 65 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20  eReport(void*,. 
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f150 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 74           Tcl_Int
1f160 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a  erp*,int,Tcl_Obj
1f170 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74  *CONST*);.  stat
1f180 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
1f190 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
1f1a0 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a     Tcl_CmdProc *
1f1b0 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b  xProc;.  } aCmd[
1f1c0 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64 62  ] = {.     { "db
1f1d0 5f 65 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  _enter",        
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
1f1f0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65  cl_CmdProc*)db_e
1f200 6e 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  nter            
1f210 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62     },.     { "db
1f220 5f 6c 65 61 76 65 22 2c 20 20 20 20 20 20 20 20  _leave",        
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
1f240 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c  cl_CmdProc*)db_l
1f250 65 61 76 65 20 20 20 20 20 20 20 20 20 20 20 20  eave            
1f260 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1f270 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
1f280 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  t",           (T
1f290 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
1f2a0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20  te3_mprintf_int 
1f2b0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1f2c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
1f2d0 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 28 54  t64",         (T
1f2e0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
1f2f0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36  te3_mprintf_int6
1f300 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  4  },.     { "sq
1f310 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
1f320 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  r",           (T
1f330 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
1f340 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20  te3_mprintf_str 
1f350 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1f360 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73  lite3_snprintf_s
1f370 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  tr",          (T
1f380 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
1f390 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72  te3_snprintf_str
1f3a0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1f3b0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
1f3c0 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28 54  ronly",       (T
1f3d0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
1f3e0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
1f3f0 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  nly},.     { "sq
1f400 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f  lite3_mprintf_do
1f410 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28 54  uble",        (T
1f420 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
1f430 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
1f440 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  le },.     { "sq
1f450 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
1f460 61 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28 54  aled",        (T
1f470 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
1f480 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
1f490 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ed },.     { "sq
1f4a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
1f4b0 78 64 6f 75 62 6c 65 22 2c 20 20 20 28 54 63 6c  xdouble",   (Tcl
1f4c0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
1f4d0 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75  3_mprintf_hexdou
1f4e0 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ble},.     { "sq
1f4f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f  lite3_mprintf_z_
1f500 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54  test",        (T
1f510 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
1f520 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20  _mprintf_z      
1f530 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1f540 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74  ite3_mprintf_n_t
1f550 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63  est",        (Tc
1f560 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
1f570 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20 20 20 20  mprintf_n       
1f580 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1f590 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74  te3_snprintf_int
1f5a0 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ",          (Tcl
1f5b0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73  _CmdProc*)test_s
1f5c0 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 20  nprintf_int     
1f5d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1f5e0 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
1f5f0 6f 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f  owid",     (Tcl_
1f600 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61  CmdProc*)test_la
1f610 73 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d  st_rowid       }
1f620 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1f630 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20  3_exec_printf", 
1f640 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
1f650 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
1f660 63 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c  c_printf      },
1f670 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1f680 5f 65 78 65 63 22 2c 20 20 20 20 20 20 20 20 20  _exec",         
1f690 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
1f6a0 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1f6c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1f6d0 65 78 65 63 5f 6e 72 22 2c 20 20 20 20 20 20 20  exec_nr",       
1f6e0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1f6f0 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f  Proc*)test_exec_
1f700 6e 72 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23  nr          },.#
1f710 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f720 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 20 20 20  IT_GET_TABLE.   
1f730 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74    { "sqlite3_get
1f740 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20  _table_printf", 
1f750 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
1f760 63 2a 29 74 65 73 74 5f 67 65 74 5f 74 61 62 6c  c*)test_get_tabl
1f770 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64  e_printf },.#end
1f780 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
1f790 65 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20  e3_close",      
1f7a0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
1f7b0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f  CmdProc*)sqlite_
1f7c0 74 65 73 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d  test_close     }
1f7d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1f7e0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1f7f0 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43  n",       (Tcl_C
1f800 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65  mdProc*)test_cre
1f810 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c  ate_function  },
1f820 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1f830 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74  _create_aggregat
1f840 65 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  e",      (Tcl_Cm
1f850 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61  dProc*)test_crea
1f860 74 65 5f 61 67 67 72 65 67 61 74 65 20 7d 2c 0a  te_aggregate },.
1f870 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 72       { "sqlite_r
1f880 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e  egister_test_fun
1f890 63 74 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64  ction", (Tcl_Cmd
1f8a0 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 67 69 73  Proc*)test_regis
1f8b0 74 65 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20  ter_func    },. 
1f8c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 61 62      { "sqlite_ab
1f8d0 6f 72 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  ort",           
1f8e0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1f8f0 72 6f 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72  roc*)sqlite_abor
1f900 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  t          },.  
1f910 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e     { "sqlite_bin
1f920 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  d",             
1f930 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
1f940 6f 63 2a 29 74 65 73 74 5f 62 69 6e 64 20 20 20  oc*)test_bind   
1f950 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1f960 20 20 7b 20 22 62 72 65 61 6b 70 6f 69 6e 74 22    { "breakpoint"
1f970 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f980 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
1f990 63 2a 29 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  c*)test_breakpoi
1f9a0 6e 74 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  nt       },.    
1f9b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6b 65 79 22   { "sqlite3_key"
1f9c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f9d0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1f9e0 2a 29 74 65 73 74 5f 6b 65 79 20 20 20 20 20 20  *)test_key      
1f9f0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
1fa00 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6b 65 79  { "sqlite3_rekey
1fa10 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
1fa20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
1fa30 29 74 65 73 74 5f 72 65 6b 65 79 20 20 20 20 20  )test_rekey     
1fa40 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
1fa50 20 22 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67   "sqlite_set_mag
1fa60 69 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ic",            
1fa70 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1fa80 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
1fa90 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
1faa0 22 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75  "sqlite3_interru
1fab0 70 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  pt",            
1fac0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
1fad0 65 73 74 5f 69 6e 74 65 72 72 75 70 74 20 20 20  est_interrupt   
1fae0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
1faf0 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75  sqlite_delete_fu
1fb00 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  nction",        
1fb10 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65  (Tcl_CmdProc*)de
1fb20 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20  lete_function   
1fb30 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1fb40 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c  qlite_delete_col
1fb50 6c 61 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28  lation",       (
1fb60 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c  Tcl_CmdProc*)del
1fb70 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20  ete_collation   
1fb80 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1fb90 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
1fba0 6d 6d 69 74 22 2c 20 20 20 20 20 20 20 20 28 54  mmit",        (T
1fbb0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f  cl_CmdProc*)get_
1fbc0 61 75 74 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20  autocommit      
1fbd0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1fbe0 69 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 22  ite3_stack_used"
1fbf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ,            (Tc
1fc00 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
1fc10 73 74 61 63 6b 5f 75 73 65 64 20 20 20 20 20 20  stack_used      
1fc20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1fc30 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
1fc40 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ",          (Tcl
1fc50 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62  _CmdProc*)test_b
1fc60 75 73 79 5f 74 69 6d 65 6f 75 74 20 20 20 20 20  usy_timeout     
1fc70 7d 2c 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74  },.     { "print
1fc80 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  f",             
1fc90 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
1fca0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 70 72  CmdProc*)test_pr
1fcb0 69 6e 74 66 20 20 20 20 20 20 20 20 20 20 20 7d  intf           }
1fcc0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1fcd0 33 49 6f 54 72 61 63 65 22 2c 20 20 20 20 20 20  3IoTrace",      
1fce0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1fcf0 50 72 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72  Proc*)test_io_tr
1fd00 61 63 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ace         },. 
1fd10 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72   };.  static str
1fd20 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
1fd30 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
1fd40 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72  _ObjCmdProc *xPr
1fd50 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63  oc;.     void *c
1fd60 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61  lientData;.  } a
1fd70 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20  ObjCmd[] = {.   
1fd80 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e    { "sqlite3_con
1fd90 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22  nection_pointer"
1fda0 2c 20 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f  ,    get_sqlite_
1fdb0 70 6f 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20  pointer, 0 },.  
1fdc0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
1fdd0 6e 64 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  nd_int",        
1fde0 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
1fdf0 69 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20  int,      0 },. 
1fe00 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
1fe10 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20  ind_zeroblob",  
1fe20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
1fe30 5f 7a 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a  _zeroblob, 0 },.
1fe40 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1fe50 62 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20  bind_int64",    
1fe60 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
1fe70 64 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c  d_int64,    0 },
1fe80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1fe90 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20  _bind_double",  
1fea0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
1feb0 6e 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d  nd_double,   0 }
1fec0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1fed0 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20  3_bind_null",   
1fee0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
1fef0 69 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20  ind_null     ,0 
1ff00 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1ff10 65 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20  e3_bind_text",  
1ff20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
1ff30 62 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30  bind_text     ,0
1ff40 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1ff50 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22  te3_bind_text16"
1ff60 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
1ff70 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c  _bind_text16   ,
1ff80 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
1ff90 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c  ite3_bind_blob",
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
1ffb0 74 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20  t_bind_blob     
1ffc0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
1ffd0 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
1ffe0 65 74 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65  eter_count",  te
1fff0 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
20000 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20  r_count, 0},.   
20010 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
20020 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
20030 22 2c 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70  ",   test_bind_p
20040 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20  arameter_name,  
20050 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
20060 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
20070 65 72 5f 69 6e 64 65 78 22 2c 20 20 74 65 73 74  er_index",  test
20080 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
20090 69 6e 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20  index, 0},.     
200a0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 65 61 72  { "sqlite3_clear
200b0 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20  _bindings",     
200c0 20 20 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69     test_clear_bi
200d0 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20  ndings, 0},.    
200e0 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65   { "sqlite3_slee
200f0 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
20100 20 20 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20      test_sleep, 
20110 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20           0},.   
20120 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
20130 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20  code",          
20140 20 20 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64       test_errcod
20150 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  e       ,0 },.  
20160 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
20170 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20 20  rmsg",          
20180 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73        test_errms
20190 67 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  g        ,0 },. 
201a0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
201b0 72 72 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20  rrmsg16",       
201c0 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d         test_errm
201d0 73 67 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a  sg16      ,0 },.
201e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
201f0 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20  open",          
20200 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65          test_ope
20210 6e 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  n          ,0 },
20220 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
20230 5f 6f 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20  _open16",       
20240 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70           test_op
20250 65 6e 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d  en16        ,0 }
20260 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
20270 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20  3_complete16",  
20280 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
20290 6f 6d 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20  omplete16    ,0 
202a0 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
202b0 74 65 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20  te3_prepare",   
202c0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
202d0 5f 70 72 65 70 61 72 65 20 20 20 20 20 20 20 2c  _prepare       ,
202e0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
202f0 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c  ite3_prepare16",
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
20310 74 5f 70 72 65 70 61 72 65 31 36 20 20 20 20 20  t_prepare16     
20320 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
20330 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
20340 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
20350 73 74 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20  st_prepare_v2   
20360 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
20370 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74  qlite3_prepare_t
20380 6b 74 33 31 33 34 22 2c 20 20 20 20 20 20 20 74  kt3134",       t
20390 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  est_prepare_tkt3
203a0 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  134, 0},.     { 
203b0 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
203c0 31 36 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  16_v2",         
203d0 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f   test_prepare16_
203e0 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  v2  ,0 },.     {
203f0 20 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69   "sqlite3_finali
20400 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
20410 20 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20    test_finalize 
20420 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
20430 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74  { "sqlite3_reset
20440 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
20450 20 20 20 74 65 73 74 5f 72 65 73 65 74 20 20 20     test_reset   
20460 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
20470 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70 69   { "sqlite3_expi
20480 72 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  red",           
20490 20 20 20 20 74 65 73 74 5f 65 78 70 69 72 65 64      test_expired
204a0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
204b0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72 61    { "sqlite3_tra
204c0 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c  nsfer_bindings",
204d0 20 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73 66       test_transf
204e0 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20  er_bind ,0 },.  
204f0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 68     { "sqlite3_ch
20500 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20  anges",         
20510 20 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e 67        test_chang
20520 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  es       ,0 },. 
20530 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
20540 74 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  tep",           
20550 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 65 70         test_step
20560 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
20570 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20580 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20 20 20  next_stmt",     
20590 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e 65 78          test_nex
205a0 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20 7d 2c  t_stmt     ,0 },
205b0 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ..     { "sqlite
205c0 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
205d0 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 72  ",        test_r
205e0 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20  elease_memory,  
205f0 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
20600 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
20610 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20 20 74  _limit",       t
20620 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  est_soft_heap_li
20630 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20 20 20  mit,    0},.    
20640 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68 72 65   { "sqlite3_thre
20650 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20 20 20  ad_cleanup",    
20660 20 20 20 20 74 65 73 74 5f 74 68 72 65 61 64 5f      test_thread_
20670 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30 7d 2c  cleanup,     0},
20680 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
20690 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
206a0 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70 61  ",       test_pa
206b0 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c 20 20  ger_refcounts,  
206c0 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73    0},..     { "s
206d0 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
206e0 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 74  nsion",        t
206f0 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  est_load_extensi
20700 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  on,     0},.    
20710 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62   { "sqlite3_enab
20720 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
20730 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  n", test_enable_
20740 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30 7d 2c  load,        0},
20750 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
20760 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
20770 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f 65 78  _codes", test_ex
20780 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f  tended_result_co
20790 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  des, 0},.     { 
207a0 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 22 2c  "sqlite3_limit",
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20 20 20   test_limit,    
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c               0},
207e0 0a 0a 20 20 20 20 20 7b 20 22 73 61 76 65 5f 70  ..     { "save_p
207f0 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20  rng_state",     
20800 20 20 20 20 20 20 20 20 20 20 73 61 76 65 5f 70            save_p
20810 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 20 30 20  rng_state,    0 
20820 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 74 6f  },.     { "resto
20830 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20  re_prng_state", 
20840 20 20 20 20 20 20 20 20 20 20 20 72 65 73 74 6f             resto
20850 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 30  re_prng_state, 0
20860 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 65   },.     { "rese
20870 74 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20  t_prng_state",  
20880 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
20890 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20  t_prng_state,   
208a0 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71  0 },..     /* sq
208b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29  lite3_column_*()
208c0 20 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22   API */.     { "
208d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
208e0 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
208f0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  test_column_coun
20900 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  t  ,0 },.     { 
20910 22 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f  "sqlite3_data_co
20920 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  unt",           
20930 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74   test_data_count
20940 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
20950 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
20960 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20  _type",         
20970 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79    test_column_ty
20980 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  pe   ,0 },.     
20990 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
209a0 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  n_blob",        
209b0 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62     test_column_b
209c0 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  lob   ,0 },.    
209d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
209e0 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20  mn_double",     
209f0 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
20a00 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20  double ,0 },.   
20a10 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
20a20 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20  umn_int64",     
20a30 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
20a40 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20  _int64  ,0 },.  
20a50 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
20a60 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 74 65  lumn_text",   te
20a70 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28  st_stmt_utf8,  (
20a80 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
20a90 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c 0a 20 20 20  lumn_text },.   
20aa0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
20ab0 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73  umn_name",   tes
20ac0 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76  t_stmt_utf8,  (v
20ad0 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
20ae0 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a 20 20 20 20  umn_name },.    
20af0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
20b00 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 74 65 73 74  mn_int",    test
20b10 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f  _stmt_int,   (vo
20b20 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
20b30 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20 20 20 20 20  mn_int  },.     
20b40 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
20b50 6e 5f 62 79 74 65 73 22 2c 20 20 74 65 73 74 5f  n_bytes",  test_
20b60 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69  stmt_int,   (voi
20b70 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
20b80 6e 5f 62 79 74 65 73 7d 2c 0a 23 69 66 6e 64 65  n_bytes},.#ifnde
20b90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
20ba0 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73  CLTYPE.     { "s
20bb0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
20bc0 63 6c 74 79 70 65 22 2c 74 65 73 74 5f 73 74 6d  cltype",test_stm
20bd0 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
20be0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
20bf0 6c 74 79 70 65 7d 2c 0a 23 65 6e 64 69 66 0a 23  ltype},.#endif.#
20c00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
20c10 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
20c20 41 54 41 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63  ATA.{ "sqlite3_c
20c30 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
20c40 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  ame",test_stmt_u
20c50 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  tf8,(void*)sqlit
20c60 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
20c70 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c  se_name},.{ "sql
20c80 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
20c90 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d  e_name",test_stm
20ca0 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
20cb0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
20cc0 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c  le_name},.{ "sql
20cd0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
20ce0 69 6e 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74  in_name",test_st
20cf0 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73  mt_utf8,(void*)s
20d00 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
20d10 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64  igin_name},.#end
20d20 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
20d30 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
20d40 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
20d50 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 74  lumn_bytes16", t
20d60 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 28 76  est_stmt_int, (v
20d70 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
20d80 75 6d 6e 5f 62 79 74 65 73 31 36 20 7d 2c 0a 20  umn_bytes16 },. 
20d90 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
20da0 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20  olumn_text16",  
20db0 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
20dc0 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
20dd0 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a  column_text16},.
20de0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20df0 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20  column_name16", 
20e00 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
20e10 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
20e20 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c  _column_name16},
20e30 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 61 6c 69  .     { "add_ali
20e40 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
20e50 61 74 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69  ations", add_ali
20e60 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
20e70 61 74 69 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d  ations, 0      }
20e80 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
20e90 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
20ea0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
20eb0 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36  olumn_decltype16
20ec0 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  ",test_stmt_utf1
20ed0 36 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  6,(void*)sqlite3
20ee0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
20ef0 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64  16},.#endif.#ifd
20f00 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
20f10 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
20f20 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .{"sqlite3_colum
20f30 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31  n_database_name1
20f40 36 22 2c 0a 20 20 74 65 73 74 5f 73 74 6d 74 5f  6",.  test_stmt_
20f50 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63  utf16, sqlite3_c
20f60 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
20f70 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65  ame16},.{"sqlite
20f80 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e  3_column_table_n
20f90 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d  ame16", test_stm
20fa0 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29  t_utf16, (void*)
20fb0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
20fc0 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22  able_name16},.{"
20fd0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f  sqlite3_column_o
20fe0 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c 20 74  rigin_name16", t
20ff0 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
21000 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
21010 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
21020 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6e  e16},.#endif.#en
21030 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
21040 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
21050 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63  tion_v2", test_c
21060 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
21070 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  v2, 0 },.     { 
21080 22 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f  "sqlite3_global_
21090 72 65 63 6f 76 65 72 22 2c 20 20 20 20 20 74 65  recover",     te
210a0 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65  st_global_recove
210b0 72 2c 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  r, 0   },.     {
210c0 20 22 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f   "working_64bit_
210d0 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 77  int",          w
210e0 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74  orking_64bit_int
210f0 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  ,   0   },.     
21100 7b 20 22 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65  { "vfs_unlink_te
21110 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  st",            
21120 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 2c  vfs_unlink_test,
21130 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20       0   },.    
21140 20 7b 20 22 76 66 73 5f 69 6e 69 74 66 61 69 6c   { "vfs_initfail
21150 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20  _test",         
21160 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65   vfs_initfail_te
21170 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  st,   0   },.   
21180 20 20 7b 20 22 76 66 73 5f 75 6e 72 65 67 69 73    { "vfs_unregis
21190 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20  ter_all",       
211a0 20 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72    vfs_unregister
211b0 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20  _all,  0   },.  
211c0 20 20 20 7b 20 22 76 66 73 5f 72 65 72 65 67 69     { "vfs_reregi
211d0 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20  ster_all",      
211e0 20 20 20 76 66 73 5f 72 65 72 65 67 69 73 74 65     vfs_reregiste
211f0 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20  r_all,  0   },. 
21200 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
21210 72 6f 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20  rol_test",      
21220 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c      file_control
21230 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a  _test,   0   },.
21240 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
21250 76 66 73 5f 6c 69 73 74 22 2c 20 20 20 20 20 20  vfs_list",      
21260 20 20 20 20 20 76 66 73 5f 6c 69 73 74 2c 20 20       vfs_list,  
21270 20 20 20 30 20 20 20 7d 2c 0a 0a 20 20 20 20 20     0   },..     
21280 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f  /* Functions fro
21290 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66 6e 64 65  m os.h */.#ifnde
212a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
212b0 46 31 36 0a 20 20 20 20 20 7b 20 22 61 64 64 5f  F16.     { "add_
212c0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 20  test_collate",  
212d0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 6c 61        test_colla
212e0 74 65 2c 20 30 20 20 20 20 20 20 20 20 20 20 20  te, 0           
212f0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f   },.     { "add_
21300 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
21310 64 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c 6c 61  ded", test_colla
21320 74 65 5f 6e 65 65 64 65 64 2c 20 30 20 20 20 20  te_needed, 0    
21330 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f   },.     { "add_
21340 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
21350 20 20 20 20 20 20 74 65 73 74 5f 66 75 6e 63 74        test_funct
21360 69 6f 6e 2c 20 30 20 20 20 20 20 20 20 20 20 20  ion, 0          
21370 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
21380 7b 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  { "sqlite3_test_
21390 65 72 72 73 74 72 22 2c 20 20 20 20 20 74 65 73  errstr",     tes
213a0 74 5f 65 72 72 73 74 72 2c 20 30 20 20 20 20 20  t_errstr, 0     
213b0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
213c0 7b 20 22 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f  { "tcl_variable_
213d0 74 79 70 65 22 2c 20 20 20 20 20 20 20 74 63 6c  type",       tcl
213e0 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 2c 20  _variable_type, 
213f0 30 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64  0       },.#ifnd
21400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
21410 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
21420 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62   { "sqlite3_enab
21430 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 22  le_shared_cache"
21440 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68  , test_enable_sh
21450 61 72 65 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20  ared, 0  },.    
21460 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 68 61 72   { "sqlite3_shar
21470 65 64 5f 63 61 63 68 65 5f 72 65 70 6f 72 74 22  ed_cache_report"
21480 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  , sqlite3BtreeSh
21490 61 72 65 64 43 61 63 68 65 52 65 70 6f 72 74 2c  aredCacheReport,
214a0 20 30 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20   0},.#endif.    
214b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 62 76   { "sqlite3_libv
214c0 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 22 2c 20  ersion_number", 
214d0 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  test_libversion_
214e0 6e 75 6d 62 65 72 2c 20 30 20 20 7d 2c 0a 23 69  number, 0  },.#i
214f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
21500 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
21510 54 41 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  TA.     { "sqlit
21520 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
21530 6d 65 74 61 64 61 74 61 22 2c 20 74 65 73 74 5f  metadata", test_
21540 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
21550 61 64 61 74 61 2c 20 30 20 20 7d 2c 0a 23 65 6e  adata, 0  },.#en
21560 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
21570 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
21580 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
21590 5f 62 6c 6f 62 5f 72 65 61 64 22 2c 20 20 74 65  _blob_read",  te
215a0 73 74 5f 62 6c 6f 62 5f 72 65 61 64 2c 20 30 20  st_blob_read, 0 
215b0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
215c0 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 22 2c  te3_blob_write",
215d0 20 74 65 73 74 5f 62 6c 6f 62 5f 77 72 69 74 65   test_blob_write
215e0 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  , 0  },.#endif. 
215f0 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   };.  static int
21600 20 62 69 74 6d 61 73 6b 5f 73 69 7a 65 20 3d 20   bitmask_size = 
21610 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
21620 38 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 65 78  8;.  int i;.  ex
21630 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
21640 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 73 71 6c  _sync_count, sql
21650 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
21660 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
21670 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
21680 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  mp_count;.  exte
21690 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  rn int sqlite3_l
216a0 69 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ike_count;.  ext
216b0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
216c0 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a 20  xferopt_count;. 
216d0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
216e0 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
216f0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
21700 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
21710 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
21720 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
21730 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
21740 74 65 6a 5f 63 6f 75 6e 74 3b 0a 23 69 66 20 53  tej_count;.#if S
21750 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26  QLITE_OS_UNIX &&
21760 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
21770 54 45 53 54 29 20 26 26 20 53 51 4c 49 54 45 5f  TEST) && SQLITE_
21780 54 48 52 45 41 44 53 41 46 45 0a 20 20 65 78 74  THREADSAFE.  ext
21790 65 72 6e 20 69 6e 74 20 74 68 72 65 61 64 73 4f  ern int threadsO
217a0 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
217b0 73 4c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 23  sLocks;.#endif.#
217c0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
217d0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
217e0 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b 0a 23  lite3_os_type;.#
217f0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
21800 49 54 45 5f 44 45 42 55 47 0a 20 20 65 78 74 65  ITE_DEBUG.  exte
21810 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68  rn int sqlite3Wh
21820 65 72 65 54 72 61 63 65 3b 0a 20 20 65 78 74 65  ereTrace;.  exte
21830 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53  rn int sqlite3OS
21840 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20  Trace;.  extern 
21850 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
21860 64 64 6f 70 54 72 61 63 65 3b 0a 23 65 6e 64 69  ddopTrace;.#endi
21870 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
21880 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e  TEST.  extern in
21890 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  t sqlite3_enable
218a0 5f 69 6e 5f 6f 70 74 3b 0a 20 20 65 78 74 65 72  _in_opt;.  exter
218b0 6e 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71  n char sqlite3_q
218c0 75 65 72 79 5f 70 6c 61 6e 5b 5d 3b 0a 20 20 73  uery_plan[];.  s
218d0 74 61 74 69 63 20 63 68 61 72 20 2a 71 75 65 72  tatic char *quer
218e0 79 5f 70 6c 61 6e 20 3d 20 73 71 6c 69 74 65 33  y_plan = sqlite3
218f0 5f 71 75 65 72 79 5f 70 6c 61 6e 3b 0a 23 65 6e  _query_plan;.#en
21900 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  dif..  for(i=0; 
21910 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73  i<sizeof(aCmd)/s
21920 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20  izeof(aCmd[0]); 
21930 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72  i++){.    Tcl_Cr
21940 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
21950 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d  rp, aCmd[i].zNam
21960 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63  e, aCmd[i].xProc
21970 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66  , 0, 0);.  }.  f
21980 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
21990 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66  (aObjCmd)/sizeof
219a0 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b  (aObjCmd[0]); i+
219b0 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  +){.    Tcl_Crea
219c0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
219d0 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e  erp, aObjCmd[i].
219e0 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
219f0 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63  aObjCmd[i].xProc
21a00 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69  , aObjCmd[i].cli
21a10 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d  entData, 0);.  }
21a20 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
21a30 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
21a40 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20  earch_count", . 
21a50 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
21a60 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
21a70 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
21a80 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
21a90 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
21aa0 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  sort_count", .  
21ab0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
21ac0 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20  te3_sort_count, 
21ad0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
21ae0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
21af0 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61  erp, "sqlite3_ma
21b00 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a 20 20  x_blobsize", .  
21b10 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
21b20 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65  te3_max_blobsize
21b30 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
21b40 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
21b50 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c  nterp, "sqlite_l
21b60 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  ike_count", .   
21b70 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
21b80 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20 54  e3_like_count, T
21b90 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
21ba0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
21bb0 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65  rp, "sqlite_inte
21bc0 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20  rrupt_count", . 
21bd0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
21be0 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
21bf0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
21c00 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
21c10 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
21c20 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  te_open_file_cou
21c30 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
21c40 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e  r*)&sqlite3_open
21c50 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c  _file_count, TCL
21c60 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
21c70 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
21c80 2c 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e  , "sqlite_curren
21c90 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20  t_time", .      
21ca0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
21cb0 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43  current_time, TC
21cc0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
21cd0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
21ce0 70 2c 20 22 73 71 6c 69 74 65 33 5f 78 66 65 72  p, "sqlite3_xfer
21cf0 6f 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  opt_count",.    
21d00 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
21d10 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c  3_xferopt_count,
21d20 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
21d30 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
21d40 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70  terp, "sqlite3_p
21d50 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
21d60 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
21d70 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  )&sqlite3_pager_
21d80 72 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43  readdb_count, TC
21d90 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
21da0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
21db0 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65  p, "sqlite3_page
21dc0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 22  r_writedb_count"
21dd0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
21de0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
21df0 69 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c  itedb_count, TCL
21e00 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
21e10 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
21e20 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  , "sqlite3_pager
21e30 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a  _writej_count",.
21e40 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
21e50 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
21e60 65 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  ej_count, TCL_LI
21e70 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66  NK_INT);.#ifndef
21e80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
21e90 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  16.  Tcl_LinkVar
21ea0 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 6c 69 67  (interp, "unalig
21eb0 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74  ned_string_count
21ec0 65 72 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  er",.      (char
21ed0 2a 29 26 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72  *)&unaligned_str
21ee0 69 6e 67 5f 63 6f 75 6e 74 65 72 2c 20 54 43 4c  ing_counter, TCL
21ef0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64  _LINK_INT);.#end
21f00 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  if.#if SQLITE_OS
21f10 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64  _UNIX && defined
21f20 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
21f30 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
21f40 46 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  FE.  Tcl_LinkVar
21f50 28 69 6e 74 65 72 70 2c 20 22 74 68 72 65 61 64  (interp, "thread
21f60 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
21f70 65 72 73 4c 6f 63 6b 73 22 2c 0a 20 20 20 20 20  ersLocks",.     
21f80 20 28 63 68 61 72 2a 29 26 74 68 72 65 61 64 73   (char*)&threads
21f90 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
21fa0 72 73 4c 6f 63 6b 73 2c 20 54 43 4c 5f 4c 49 4e  rsLocks, TCL_LIN
21fb0 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23  K_INT);.#endif.#
21fc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21fd0 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c  IT_UTF16.  Tcl_L
21fe0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
21ff0 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65 65 64  sqlite_last_need
22000 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20  ed_collation",. 
22010 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 7a 4e       (char*)&pzN
22020 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 2c 20  eededCollation, 
22030 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c  TCL_LINK_STRING|
22040 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e  TCL_LINK_READ_ON
22050 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  LY);.#endif.#if 
22060 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20  SQLITE_OS_WIN.  
22070 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
22080 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74  rp, "sqlite_os_t
22090 79 70 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ype",.      (cha
220a0 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  r*)&sqlite3_os_t
220b0 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ype, TCL_LINK_IN
220c0 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  T);.#endif.#ifde
220d0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
220e0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
220f0 72 70 2c 20 22 73 71 6c 69 74 65 5f 71 75 65 72  rp, "sqlite_quer
22100 79 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20 28  y_plan",.      (
22110 63 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c 61  char*)&query_pla
22120 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  n, TCL_LINK_STRI
22130 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44  NG|TCL_LINK_READ
22140 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23  _ONLY);.#endif.#
22150 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22160 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  UG.  Tcl_LinkVar
22170 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
22180 5f 61 64 64 6f 70 5f 74 72 61 63 65 22 2c 0a 20  _addop_trace",. 
22190 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
221a0 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
221b0 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ce, TCL_LINK_INT
221c0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
221d0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
221e0 5f 77 68 65 72 65 5f 74 72 61 63 65 22 2c 0a 20  _where_trace",. 
221f0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
22200 69 74 65 33 57 68 65 72 65 54 72 61 63 65 2c 20  ite3WhereTrace, 
22210 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
22220 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
22230 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f  erp, "sqlite_os_
22240 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63  trace",.      (c
22250 68 61 72 2a 29 26 73 71 6c 69 74 65 33 4f 53 54  har*)&sqlite3OST
22260 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
22270 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e  NT);.#endif.#ifn
22280 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22290 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f 4c 69 6e  DISKIO.  Tcl_Lin
222a0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
222b0 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  lite_opentemp_co
222c0 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
222d0 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e  r*)&sqlite3_open
222e0 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  temp_count, TCL_
222f0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
22300 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  f.  Tcl_LinkVar(
22310 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
22320 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
22330 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
22340 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  )&sqlite_static_
22350 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c 5f  bind_value, TCL_
22360 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20  LINK_STRING);.  
22370 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
22380 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  rp, "sqlite_stat
22390 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 22 2c 0a  ic_bind_nbyte",.
223a0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
223b0 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
223c0 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c 49 4e 4b  _nbyte, TCL_LINK
223d0 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
223e0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
223f0 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72 65 63 74  lite_temp_direct
22400 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ory",.      (cha
22410 72 2a 29 26 73 71 6c 69 74 65 33 5f 74 65 6d 70  r*)&sqlite3_temp
22420 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f  _directory, TCL_
22430 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20  LINK_STRING);.  
22440 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
22450 72 70 2c 20 22 62 69 74 6d 61 73 6b 5f 73 69 7a  rp, "bitmask_siz
22460 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
22470 29 26 62 69 74 6d 61 73 6b 5f 73 69 7a 65 2c 20  )&bitmask_size, 
22480 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c  TCL_LINK_INT|TCL
22490 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29  _LINK_READ_ONLY)
224a0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
224b0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
224c0 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  sync_count",.   
224d0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
224e0 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54  e3_sync_count, T
224f0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
22500 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
22510 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 75 6c 6c  rp, "sqlite_full
22520 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  sync_count",.   
22530 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
22540 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
22550 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
22560 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
22570 54 45 53 54 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  TEST.  Tcl_LinkV
22580 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
22590 74 65 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74  te_enable_in_opt
225a0 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
225b0 26 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f  &sqlite3_enable_
225c0 69 6e 5f 6f 70 74 2c 20 54 43 4c 5f 4c 49 4e 4b  in_opt, TCL_LINK
225d0 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _INT);.#endif.  
225e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
225f0 0a                                               .