/ Hex Artifact Content
Login

Artifact 81063a634c0970a7dcb8ba8b58b7645be166a328:


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 33 35 20 32 30 30 38 2f 31 32 2f 30   1.335 2008/12/0
0240: 33 20 32 32 3a 33 32 3a 34 35 20 64 72 68 20 45  3 22:32:45 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 29  ;.  switch( rc )
0b50: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
0b60: 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20 20  E_OK:           
0b70: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0b80: 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20  SQLITE_OK";     
0b90: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
0ba0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0bb0: 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20  E_ERROR:        
0bc0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0bd0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20  SQLITE_ERROR";  
0be0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
0bf0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0c00: 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20  E_INTERNAL:     
0c10: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0c20: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22  SQLITE_INTERNAL"
0c30: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
0c40: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0c50: 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 20 20  E_PERM:         
0c60: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0c70: 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20  SQLITE_PERM";   
0c80: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
0c90: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0ca0: 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 20 20  E_ABORT:        
0cb0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0cc0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20  SQLITE_ABORT";  
0cd0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
0ce0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0cf0: 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20 20 20  E_BUSY:         
0d00: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0d10: 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20  SQLITE_BUSY";   
0d20: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
0d30: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0d40: 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20  E_LOCKED:       
0d50: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0d60: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20  SQLITE_LOCKED"; 
0d70: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
0d80: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0d90: 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20  E_NOMEM:        
0da0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0db0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20  SQLITE_NOMEM";  
0dc0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
0dd0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0de0: 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20  E_READONLY:     
0df0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0e00: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22  SQLITE_READONLY"
0e10: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
0e20: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0e30: 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20  E_INTERRUPT:    
0e40: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0e50: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
0e60: 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";         break
0e70: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0e80: 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20 20  E_IOERR:        
0e90: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0ea0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20  SQLITE_IOERR";  
0eb0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
0ec0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0ed0: 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20  E_CORRUPT:      
0ee0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0ef0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b  SQLITE_CORRUPT";
0f00: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
0f10: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0f20: 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20  E_NOTFOUND:     
0f30: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0f40: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22  SQLITE_NOTFOUND"
0f50: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
0f60: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0f70: 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20  E_FULL:         
0f80: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0f90: 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20  SQLITE_FULL";   
0fa0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
0fb0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0fc0: 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20  E_CANTOPEN:     
0fd0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0fe0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22  SQLITE_CANTOPEN"
0ff0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
1000: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1010: 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20  E_PROTOCOL:     
1020: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1030: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22  SQLITE_PROTOCOL"
1040: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
1050: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1060: 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 20 20  E_EMPTY:        
1070: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1080: 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20  SQLITE_EMPTY";  
1090: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
10a0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
10b0: 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 20 20  E_SCHEMA:       
10c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
10d0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20  SQLITE_SCHEMA"; 
10e0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
10f0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1100: 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20 20 20  E_TOOBIG:       
1110: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1120: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20  SQLITE_TOOBIG"; 
1130: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1140: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1150: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20  E_CONSTRAINT:   
1160: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1170: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1180: 54 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  T";        break
1190: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
11a0: 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 20 20  E_MISMATCH:     
11b0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
11c0: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22  SQLITE_MISMATCH"
11d0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
11e0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
11f0: 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 20 20  E_MISUSE:       
1200: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1210: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20  SQLITE_MISUSE"; 
1220: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1230: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1240: 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20 20  E_NOLFS:        
1250: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1260: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20  SQLITE_NOLFS";  
1270: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1280: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1290: 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20 20 20  E_AUTH:         
12a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
12b0: 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20 20 20  SQLITE_AUTH";   
12c0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
12d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
12e0: 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20  E_FORMAT:       
12f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1300: 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20  SQLITE_FORMAT"; 
1310: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1320: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1330: 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20  E_RANGE:        
1340: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1350: 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20  SQLITE_RANGE";  
1360: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1370: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1380: 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20  E_NOTADB:       
1390: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
13a0: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20  SQLITE_NOTADB"; 
13b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
13c0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
13d0: 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20  E_ROW:          
13e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
13f0: 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20  SQLITE_ROW";    
1400: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1410: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1420: 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20 20  E_DONE:         
1430: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1440: 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20  SQLITE_DONE";   
1450: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1460: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1470: 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20 20 20  E_IOERR_READ:   
1480: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1490: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
14a0: 44 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  D";        break
14b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
14c0: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
14d0: 41 44 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  AD:    zName = "
14e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
14f0: 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65 61 6b  RT_READ";  break
1500: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1510: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20  E_IOERR_WRITE:  
1520: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1530: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1540: 54 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  TE";       break
1550: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1560: 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20  E_IOERR_FSYNC:  
1570: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1580: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
1590: 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  NC";       break
15a0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
15b0: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
15c0: 43 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  C:     zName = "
15d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
15e0: 5f 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b  _FSYNC";   break
15f0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1600: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1610: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
1620: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1630: 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b  NCATE";    break
1640: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1650: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20 20  E_IOERR_FSTAT:  
1660: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1670: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1680: 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  AT";       break
1690: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
16a0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20  E_IOERR_UNLOCK: 
16b0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
16c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
16d0: 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b  OCK";      break
16e0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
16f0: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20  E_IOERR_RDLOCK: 
1700: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1710: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
1720: 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b  OCK";      break
1730: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1740: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20  E_IOERR_DELETE: 
1750: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1760: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
1770: 45 54 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b  ETE";      break
1780: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1790: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3a  E_IOERR_BLOCKED:
17a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
17b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
17c0: 43 4b 45 44 22 3b 20 20 20 20 20 62 72 65 61 6b  CKED";     break
17d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
17e0: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20  E_IOERR_NOMEM:  
17f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1800: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1810: 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  EM";       break
1820: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1830: 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a 20  E_IOERR_ACCESS: 
1840: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1850: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
1860: 45 53 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b  ESS";      break
1870: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1880: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
1890: 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20  ERVEDLOCK:.     
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
18c0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
18d0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
18e0: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  K"; break;.    c
18f0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
1900: 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 20  _LOCK:          
1910: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
1920: 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20  IOERR_LOCK";    
1930: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
1940: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
1970: 55 6e 6b 6e 6f 77 6e 22 3b 20 20 20 20 20 20 20  Unknown";       
1980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
1990: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
19a0: 0a 23 64 65 66 69 6e 65 20 74 31 45 72 72 6f 72  .#define t1Error
19b0: 4e 61 6d 65 20 73 71 6c 69 74 65 33 54 65 73 74  Name sqlite3Test
19c0: 45 72 72 6f 72 4e 61 6d 65 0a 0a 2f 2a 0a 2a 2a  ErrorName../*.**
19d0: 20 43 6f 6e 76 65 72 74 20 61 6e 20 73 71 6c 69   Convert an sqli
19e0: 74 65 33 5f 73 74 6d 74 2a 20 69 6e 74 6f 20 61  te3_stmt* into a
19f0: 6e 20 73 71 6c 69 74 65 33 2a 2e 20 20 54 68 69  n sqlite3*.  Thi
1a00: 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  s depends on the
1a10: 0a 2a 2a 20 66 61 63 74 20 74 68 61 74 20 74 68  .** fact that th
1a20: 65 20 73 71 6c 69 74 65 33 2a 20 69 73 20 74 68  e sqlite3* is th
1a30: 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 6e  e first field in
1a40: 20 74 68 65 20 56 64 62 65 20 73 74 72 75 63 74   the Vdbe struct
1a50: 75 72 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ure..*/.#define 
1a60: 53 74 6d 74 54 6f 44 62 28 58 29 20 20 20 73 71  StmtToDb(X)   sq
1a70: 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28  lite3_db_handle(
1a80: 58 29 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  X)../*.** Check 
1a90: 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 74  a return value t
1aa0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 61  o make sure it a
1ab0: 67 72 65 65 73 20 77 69 74 68 20 74 68 65 20 72  grees with the r
1ac0: 65 73 75 6c 74 73 0a 2a 2a 20 66 72 6f 6d 20 73  esults.** from s
1ad0: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 2e 0a  qlite3_errcode..
1ae0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65  */.int sqlite3Te
1af0: 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f 49 6e  stErrCode(Tcl_In
1b00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 73 71  terp *interp, sq
1b10: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 72  lite3 *db, int r
1b20: 63 29 7b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  c){.  if( rc!=SQ
1b30: 4c 49 54 45 5f 4d 49 53 55 53 45 20 26 26 20 72  LITE_MISUSE && r
1b40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1b50: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
1b60: 64 62 29 21 3d 72 63 20 29 7b 0a 20 20 20 20 63  db)!=rc ){.    c
1b70: 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
1b80: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
1b90: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
1ba0: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
1bb0: 66 2c 20 22 65 72 72 6f 72 20 63 6f 64 65 20 25  f, "error code %
1bc0: 73 20 28 25 64 29 20 64 6f 65 73 20 6e 6f 74 20  s (%d) does not 
1bd0: 6d 61 74 63 68 20 73 71 6c 69 74 65 33 5f 65 72  match sqlite3_er
1be0: 72 63 6f 64 65 20 25 73 20 28 25 64 29 22 2c 0a  rcode %s (%d)",.
1bf0: 20 20 20 20 20 20 20 74 31 45 72 72 6f 72 4e 61         t1ErrorNa
1c00: 6d 65 28 72 63 29 2c 20 72 63 2c 20 74 31 45 72  me(rc), rc, t1Er
1c10: 72 6f 72 4e 61 6d 65 28 72 32 29 2c 20 72 32 29  rorName(r2), r2)
1c20: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  ;.    Tcl_ResetR
1c30: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
1c40: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1c50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1c60: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c70: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
1c80: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63   0;.}../*.** Dec
1c90: 6f 64 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ode a pointer to
1ca0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   an sqlite3_stmt
1cb0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
1cc0: 69 63 20 69 6e 74 20 67 65 74 53 74 6d 74 50 6f  ic int getStmtPo
1cd0: 69 6e 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74  inter(.  Tcl_Int
1ce0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20  erp *interp, .  
1cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
1d00: 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ,  .  sqlite3_st
1d10: 6d 74 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20  mt **ppStmt.){. 
1d20: 20 2a 70 70 53 74 6d 74 20 3d 20 28 73 71 6c 69   *ppStmt = (sqli
1d30: 74 65 33 5f 73 74 6d 74 2a 29 73 71 6c 69 74 65  te3_stmt*)sqlite
1d40: 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a  3TestTextToPtr(z
1d50: 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  Arg);.  return T
1d60: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1d70: 47 65 6e 65 72 61 74 65 20 61 20 74 65 78 74 20  Generate a text 
1d80: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
1d90: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  f a pointer that
1da0: 20 63 61 6e 20 62 65 20 75 6e 64 65 72 73 74 6f   can be understo
1db0: 6f 64 0a 2a 2a 20 62 79 20 74 68 65 20 67 65 74  od.** by the get
1dc0: 44 62 50 6f 69 6e 74 65 72 20 61 6e 64 20 67 65  DbPointer and ge
1dd0: 74 56 6d 50 6f 69 6e 74 65 72 20 72 6f 75 74 69  tVmPointer routi
1de0: 6e 65 73 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  nes above..**.**
1df0: 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 2c   The problem is,
1e00: 20 6f 6e 20 73 6f 6d 65 20 6d 61 63 68 69 6e 65   on some machine
1e10: 73 20 28 53 6f 6c 61 72 69 73 29 20 69 66 20 79  s (Solaris) if y
1e20: 6f 75 20 64 6f 20 61 20 70 72 69 6e 74 66 20 77  ou do a printf w
1e30: 69 74 68 0a 2a 2a 20 22 25 70 22 20 79 6f 75 20  ith.** "%p" you 
1e40: 63 61 6e 6e 6f 74 20 74 75 72 6e 20 61 72 6f 75  cannot turn arou
1e50: 6e 64 20 61 6e 64 20 64 6f 20 61 20 73 63 61 6e  nd and do a scan
1e60: 66 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  f with the same 
1e70: 22 25 70 22 20 61 6e 64 0a 2a 2a 20 67 65 74 20  "%p" and.** get 
1e80: 79 6f 75 72 20 70 6f 69 6e 74 65 72 20 62 61 63  your pointer bac
1e90: 6b 2e 20 20 59 6f 75 20 68 61 76 65 20 74 6f 20  k.  You have to 
1ea0: 70 72 65 70 65 6e 64 20 61 20 22 30 78 22 20 62  prepend a "0x" b
1eb0: 65 66 6f 72 65 20 69 74 20 77 69 6c 6c 0a 2a 2a  efore it will.**
1ec0: 20 77 6f 72 6b 2e 20 20 4f 72 20 61 74 20 6c 65   work.  Or at le
1ed0: 61 73 74 20 74 68 61 74 20 69 73 20 77 68 61 74  ast that is what
1ee0: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
1ef0: 6d 65 20 28 64 72 68 29 2e 20 20 42 75 74 20 74  me (drh).  But t
1f00: 68 69 73 0a 2a 2a 20 62 65 68 61 76 69 6f 72 20  his.** behavior 
1f10: 76 61 72 69 65 73 20 66 72 6f 6d 20 6d 61 63 68  varies from mach
1f20: 69 6e 65 20 74 6f 20 6d 61 63 68 69 6e 65 2e 20  ine to machine. 
1f30: 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 75 73   The solution us
1f40: 65 64 20 68 65 72 20 69 73 0a 2a 2a 20 74 6f 20  ed her is.** to 
1f50: 74 65 73 74 20 74 68 65 20 73 74 72 69 6e 67 20  test the string 
1f60: 72 69 67 68 74 20 61 66 74 65 72 20 69 74 20 69  right after it i
1f70: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73  s generated to s
1f80: 65 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 0a  ee if it can be.
1f90: 2a 2a 20 75 6e 64 65 72 73 74 6f 6f 64 20 62 79  ** understood by
1fa0: 20 73 63 61 6e 66 2c 20 61 6e 64 20 69 66 20 6e   scanf, and if n
1fb0: 6f 74 2c 20 74 72 79 20 70 72 65 70 65 6e 64 69  ot, try prependi
1fc0: 6e 67 20 61 6e 20 22 30 78 22 20 74 6f 20 73 65  ng an "0x" to se
1fd0: 65 20 69 66 0a 2a 2a 20 74 68 61 74 20 68 65 6c  e if.** that hel
1fe0: 70 73 2e 20 20 49 66 20 6e 6f 74 68 69 6e 67 20  ps.  If nothing 
1ff0: 77 6f 72 6b 73 2c 20 61 20 66 61 74 61 6c 20 65  works, a fatal e
2000: 72 72 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65  rror is generate
2010: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2020: 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
2030: 53 74 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  Str(Tcl_Interp *
2040: 69 6e 74 65 72 70 2c 20 63 68 61 72 20 2a 7a 50  interp, char *zP
2050: 74 72 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20  tr, void *p){.  
2060: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2070: 28 31 30 30 2c 20 7a 50 74 72 2c 20 22 25 70 22  (100, zPtr, "%p"
2080: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , p);.  return T
2090: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
20a0: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  The callback rou
20b0: 74 69 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33  tine for sqlite3
20c0: 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 29 2e 0a  _exec_printf()..
20d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
20e0: 65 63 5f 70 72 69 6e 74 66 5f 63 62 28 76 6f 69  ec_printf_cb(voi
20f0: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 61 72 67  d *pArg, int arg
2100: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20  c, char **argv, 
2110: 63 68 61 72 20 2a 2a 6e 61 6d 65 29 7b 0a 20 20  char **name){.  
2120: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 73 74 72  Tcl_DString *str
2130: 20 3d 20 28 54 63 6c 5f 44 53 74 72 69 6e 67 2a   = (Tcl_DString*
2140: 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a  )pArg;.  int i;.
2150: 0a 20 20 69 66 28 20 54 63 6c 5f 44 53 74 72 69  .  if( Tcl_DStri
2160: 6e 67 4c 65 6e 67 74 68 28 73 74 72 29 3d 3d 30  ngLength(str)==0
2170: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
2180: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
2190: 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67       Tcl_DString
21a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74  AppendElement(st
21b0: 72 2c 20 6e 61 6d 65 5b 69 5d 20 3f 20 6e 61 6d  r, name[i] ? nam
21c0: 65 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  e[i] : "NULL");.
21d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
21e0: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
21f0: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ){.    Tcl_DStri
2200: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
2210: 73 74 72 2c 20 61 72 67 76 5b 69 5d 20 3f 20 61  str, argv[i] ? a
2220: 72 67 76 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29  rgv[i] : "NULL")
2230: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49  ;.}../*.** The I
2250: 2f 4f 20 74 72 61 63 69 6e 67 20 63 61 6c 6c 62  /O tracing callb
2260: 61 63 6b 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ack..*/.#if !def
2270: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2280: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
2290: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
22a0: 5f 49 4f 54 52 41 43 45 29 0a 73 74 61 74 69 63  _IOTRACE).static
22b0: 20 46 49 4c 45 20 2a 69 6f 74 72 61 63 65 5f 66   FILE *iotrace_f
22c0: 69 6c 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ile = 0;.static 
22d0: 76 6f 69 64 20 69 6f 5f 74 72 61 63 65 5f 63 61  void io_trace_ca
22e0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 63 68 61  llback(const cha
22f0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
2300: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
2310: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
2320: 46 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69  Format);.  vfpri
2330: 6e 74 66 28 69 6f 74 72 61 63 65 5f 66 69 6c 65  ntf(iotrace_file
2340: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
2350: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
2360: 66 66 6c 75 73 68 28 69 6f 74 72 61 63 65 5f 66  fflush(iotrace_f
2370: 69 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ile);.}.#endif..
2380: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 69 6f  /*.** Usage:  io
2390: 5f 74 72 61 63 65 20 46 49 4c 45 4e 41 4d 45 0a  _trace FILENAME.
23a0: 2a 2a 0a 2a 2a 20 54 75 72 6e 20 49 2f 4f 20 74  **.** Turn I/O t
23b0: 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66  racing on or off
23c0: 2e 20 20 49 66 20 46 49 4c 45 4e 41 4d 45 20 69  .  If FILENAME i
23d0: 73 20 6e 6f 74 20 61 6e 20 65 6d 70 74 79 20 73  s not an empty s
23e0: 74 72 69 6e 67 2c 0a 2a 2a 20 49 2f 4f 20 74 72  tring,.** I/O tr
23f0: 61 63 69 6e 67 20 62 65 67 69 6e 73 20 67 6f 69  acing begins goi
2400: 6e 67 20 69 6e 74 6f 20 46 49 4c 45 4e 41 4d 45  ng into FILENAME
2410: 2e 20 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73  . If FILENAME is
2420: 20 61 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72   an empty.** str
2430: 69 6e 67 2c 20 49 2f 4f 20 74 72 61 63 69 6e 67  ing, I/O tracing
2440: 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a   is turned off..
2450: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
2460: 73 74 5f 69 6f 5f 74 72 61 63 65 28 0a 20 20 76  st_io_trace(.  v
2470: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2480: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2490: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
24a0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
24b0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
24c0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
24d0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
24e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24f0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2500: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2510: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2520: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2530: 2a 2f 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e  */.){.#if !defin
2540: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
2550: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
2560: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
2570: 4f 54 52 41 43 45 29 0a 20 20 69 66 28 20 61 72  OTRACE).  if( ar
2580: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
2590: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
25a0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
25b0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
25c0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
25d0: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
25e0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
25f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2600: 20 20 7d 0a 20 20 69 66 28 20 69 6f 74 72 61 63    }.  if( iotrac
2610: 65 5f 66 69 6c 65 20 29 7b 0a 20 20 20 20 69 66  e_file ){.    if
2620: 28 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 21 3d  ( iotrace_file!=
2630: 73 74 64 6f 75 74 20 26 26 20 69 6f 74 72 61 63  stdout && iotrac
2640: 65 5f 66 69 6c 65 21 3d 73 74 64 65 72 72 20 29  e_file!=stderr )
2650: 7b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69  {.      fclose(i
2660: 6f 74 72 61 63 65 5f 66 69 6c 65 29 3b 0a 20 20  otrace_file);.  
2670: 20 20 7d 0a 20 20 20 20 69 6f 74 72 61 63 65 5f    }.    iotrace_
2680: 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  file = 0;.    sq
2690: 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30  lite3IoTrace = 0
26a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 76  ;.  }.  if( argv
26b0: 5b 31 5d 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66  [1][0] ){.    if
26c0: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d  ( strcmp(argv[1]
26d0: 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b  ,"stdout")==0 ){
26e0: 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66  .      iotrace_f
26f0: 69 6c 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  ile = stdout;.  
2700: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
2710: 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74 64 65  mp(argv[1],"stde
2720: 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rr")==0 ){.     
2730: 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20   iotrace_file = 
2740: 73 74 64 65 72 72 3b 0a 20 20 20 20 7d 65 6c 73  stderr;.    }els
2750: 65 7b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65  e{.      iotrace
2760: 5f 66 69 6c 65 20 3d 20 66 6f 70 65 6e 28 61 72  _file = fopen(ar
2770: 67 76 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20  gv[1], "w");.   
2780: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f   }.    sqlite3Io
2790: 54 72 61 63 65 20 3d 20 69 6f 5f 74 72 61 63 65  Trace = io_trace
27a0: 5f 63 61 6c 6c 62 61 63 6b 3b 0a 20 20 7d 0a 23  _callback;.  }.#
27b0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
27c0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
27d0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
27e0: 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42  _exec_printf  DB
27f0: 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47    FORMAT  STRING
2800: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
2810: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70  e sqlite3_exec_p
2820: 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63  rintf() interfac
2830: 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e  e using the open
2840: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e   database.** DB.
2850: 20 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65    The SQL is the
2860: 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20   string FORMAT. 
2870: 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   The format stri
2880: 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  ng should contai
2890: 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25  n.** one %s or %
28a0: 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68  q.  STRING is th
28b0: 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64  e value inserted
28c0: 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a   into %s or %q..
28d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
28e0: 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a  st_exec_printf(.
28f0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
2900: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2910: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2920: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2930: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2940: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2950: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
2960: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2970: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2980: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
29a0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
29b0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
29c0: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
29d0: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
29e0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
29f0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
2a00: 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  Sql;.  char zBuf
2a10: 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63  [30];.  if( argc
2a20: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
2a30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2a40: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2a50: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2a60: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
2a70: 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53     " DB FORMAT S
2a80: 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20  TRING", 0);.    
2a90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2aa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2ab0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2ac0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
2ad0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2ae0: 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  R;.  Tcl_DString
2af0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53  Init(&str);.  zS
2b00: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
2b10: 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 20 61 72  intf(argv[2], ar
2b20: 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[3]);.  rc = s
2b30: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2b40: 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74  zSql, exec_print
2b50: 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72  f_cb, &str, &zEr
2b60: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
2b70: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69  ee(zSql);.  spri
2b80: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
2b90: 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rc);.  Tcl_Appen
2ba0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2bb0: 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
2bc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2bd0: 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rp, rc==SQLITE_O
2be0: 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  K ? Tcl_DStringV
2bf0: 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72  alue(&str) : zEr
2c00: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
2c10: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69  gFree(&str);.  i
2c20: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
2c30: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
2c40: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
2c50: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
2c60: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
2c70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
2c80: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2c90: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 64 62 5f  *.** Usage:  db_
2ca0: 65 6e 74 65 72 20 44 42 0a 2a 2a 20 20 20 20 20  enter DB.**     
2cb0: 20 20 20 20 64 62 5f 6c 65 61 76 65 20 44 42 0a      db_leave DB.
2cc0: 2a 2a 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20 6c  **.** Enter or l
2cd0: 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20 6f  eave the mutex o
2ce0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  n a database con
2cf0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
2d00: 69 63 20 69 6e 74 20 64 62 5f 65 6e 74 65 72 28  ic int db_enter(
2d10: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
2d20: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2d30: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2d40: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2d50: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2d60: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2d70: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
2d80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2d90: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2da0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
2db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
2dc0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
2dd0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
2de0: 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
2df0: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
2e00: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2e10: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
2e20: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
2e30: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
2e40: 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b        " DB", 0);
2e50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2e60: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2e70: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2e80: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
2e90: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
2ea0: 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
2eb0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
2ec0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
2ed0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61  rn TCL_OK;.}.sta
2ee0: 74 69 63 20 69 6e 74 20 64 62 5f 6c 65 61 76 65  tic int db_leave
2ef0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
2f00: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
2f10: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2f20: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2f30: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2f40: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2f50: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
2f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f70: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2f80: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2fa0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
2fb0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
2fc0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
2fd0: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
2fe0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2ff0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
3000: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
3010: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
3020: 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29         " DB", 0)
3030: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3040: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3050: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
3060: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
3070: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
3080: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
3090: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
30a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
30b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
30c0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
30d0: 69 74 65 33 5f 65 78 65 63 20 20 44 42 20 20 53  ite3_exec  DB  S
30e0: 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  QL.**.** Invoke 
30f0: 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63  the sqlite3_exec
3100: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
3110: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
3120: 73 65 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20  se DB.*/.static 
3130: 69 6e 74 20 74 65 73 74 5f 65 78 65 63 28 0a 20  int test_exec(. 
3140: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
3150: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3160: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
3170: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
3180: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
3190: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
31a0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
31b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
31c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
31d0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
31e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
31f0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
3200: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
3210: 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74  3 *db;.  Tcl_DSt
3220: 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20  ring str;.  int 
3230: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
3240: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53   = 0;.  char *zS
3250: 71 6c 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ql;.  int i, j;.
3260: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
3270: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
3280: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
3290: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
32a0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
32b0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
32c0: 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20  v[0], .       " 
32d0: 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20  DB SQL", 0);.   
32e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
32f0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
3300: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
3310: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
3320: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
3330: 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  OR;.  Tcl_DStrin
3340: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a  gInit(&str);.  z
3350: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
3360: 72 69 6e 74 66 28 22 25 73 22 2c 20 61 72 67 76  rintf("%s", argv
3370: 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  [2]);.  for(i=j=
3380: 30 3b 20 7a 53 71 6c 5b 69 5d 3b 29 7b 0a 20 20  0; zSql[i];){.  
3390: 20 20 69 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d 27    if( zSql[i]=='
33a0: 25 27 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  %' ){.      zSql
33b0: 5b 6a 2b 2b 5d 20 3d 20 28 74 65 73 74 48 65 78  [j++] = (testHex
33c0: 54 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 31 5d 29  ToInt(zSql[i+1])
33d0: 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54 6f  <<4) + testHexTo
33e0: 49 6e 74 28 7a 53 71 6c 5b 69 2b 32 5d 29 3b 0a  Int(zSql[i+2]);.
33f0: 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20 20        i += 3;.  
3400: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
3410: 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 7a 53 71 6c 5b  Sql[j++] = zSql[
3420: 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  i++];.    }.  }.
3430: 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
3440: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
3450: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65  ec(db, zSql, exe
3460: 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74  c_printf_cb, &st
3470: 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c  r, &zErr);.  sql
3480: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
3490: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
34a0: 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63   "%d", rc);.  Tc
34b0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
34c0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
34d0: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
34e0: 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53  nt(interp, rc==S
34f0: 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44  QLITE_OK ? Tcl_D
3500: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
3510: 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c  ) : zErr);.  Tcl
3520: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
3530: 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29  r);.  if( zErr )
3540: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
3550: 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rr);.  if( sqlit
3560: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
3570: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
3580: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3590: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
35a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
35b0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  e:  sqlite3_exec
35c0: 5f 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a  _nr  DB  SQL.**.
35d0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
35e0: 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72  lite3_exec inter
35f0: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
3600: 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 2e  pen database DB.
3610: 20 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c 6c    Discard.** all
3620: 20 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61 74   results.*/.stat
3630: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63  ic int test_exec
3640: 5f 6e 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  _nr(.  void *Not
3650: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
3660: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
3670: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
3680: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
3690: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
36a0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
36c0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
36d0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
36e0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
36f0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
3700: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
3710: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
3720: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
3730: 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  Err = 0;.  if( a
3740: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
3750: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3760: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3770: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3780: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
3790: 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c        " DB SQL",
37a0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
37b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
37c0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
37d0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
37e0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
37f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
3800: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
3810: 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20  db, argv[2], 0, 
3820: 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28  0, &zErr);.  if(
3830: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
3840: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
3850: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
3860: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
3870: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
3880: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
3890: 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74  3_mprintf_z_test
38a0: 20 20 53 45 50 41 52 41 54 4f 52 20 20 41 52 47    SEPARATOR  ARG
38b0: 30 20 20 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a  0  ARG1 ....**.*
38c0: 2a 20 54 65 73 74 20 74 68 65 20 25 7a 20 66 6f  * Test the %z fo
38d0: 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 4d 50  rmat of sqliteMP
38e0: 72 69 6e 74 66 28 29 2e 20 20 55 73 65 20 6d 75  rintf().  Use mu
38f0: 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74 66 28 29  ltiple mprintf()
3900: 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f   calls to .** co
3910: 6e 63 61 74 65 6e 61 74 65 20 61 72 67 30 20 74  ncatenate arg0 t
3920: 68 72 6f 75 67 68 20 61 72 67 6e 20 75 73 69 6e  hrough argn usin
3930: 67 20 73 65 70 61 72 61 74 6f 72 20 61 73 20 74  g separator as t
3940: 68 65 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2a  he separator..**
3950: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
3960: 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lt..*/.static in
3970: 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 7a  t test_mprintf_z
3980: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3990: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
39a0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
39b0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
39c0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
39d0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
39e0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
39f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3a00: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
3a10: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3a30: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
3a40: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ment */.){.  cha
3a50: 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a  r *zResult = 0;.
3a60: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28    int i;..  for(
3a70: 69 3d 32 3b 20 69 3c 61 72 67 63 20 26 26 20 28  i=2; i<argc && (
3a80: 69 3d 3d 32 20 7c 7c 20 7a 52 65 73 75 6c 74 29  i==2 || zResult)
3a90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 52 65 73  ; i++){.    zRes
3aa0: 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ult = sqlite3MPr
3ab0: 69 6e 74 66 28 30 2c 20 22 25 7a 25 73 25 73 22  intf(0, "%z%s%s"
3ac0: 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72 67 76 5b  , zResult, argv[
3ad0: 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  1], argv[i]);.  
3ae0: 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
3af0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 52 65  sult(interp, zRe
3b00: 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  sult, 0);.  sqli
3b10: 74 65 33 5f 66 72 65 65 28 7a 52 65 73 75 6c 74  te3_free(zResult
3b20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
3b30: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
3b40: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
3b50: 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20 53 54 52  intf_n_test  STR
3b60: 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  ING.**.** Test t
3b70: 68 65 20 25 6e 20 66 6f 72 6d 61 74 20 6f 66 20  he %n format of 
3b80: 73 71 6c 69 74 65 4d 50 72 69 6e 74 66 28 29 2e  sqliteMPrintf().
3b90: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e    Return the len
3ba0: 67 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  gth of the.** in
3bb0: 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  put string..*/.s
3bc0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d  tatic int test_m
3bd0: 70 72 69 6e 74 66 5f 6e 28 0a 20 20 76 6f 69 64  printf_n(.  void
3be0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
3bf0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3c00: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
3c10: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
3c20: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
3c30: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
3c40: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
3c50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
3c60: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
3c70: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
3c80: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
3c90: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
3ca0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 74 72 3b  ){.  char *zStr;
3cb0: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
3cc0: 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  zStr = sqlite3MP
3cd0: 72 69 6e 74 66 28 30 2c 20 22 25 73 25 6e 22 2c  rintf(0, "%s%n",
3ce0: 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 3b 0a 20   argv[1], &n);. 
3cf0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
3d00: 74 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  tr);.  Tcl_SetOb
3d10: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
3d20: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 29  Tcl_NewIntObj(n)
3d30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
3d40: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
3d50: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ge:  sqlite3_snp
3d60: 72 69 6e 74 66 5f 69 6e 74 20 20 53 49 5a 45 20  rintf_int  SIZE 
3d70: 46 4f 52 4d 41 54 20 20 49 4e 54 0a 2a 2a 0a 2a  FORMAT  INT.**.*
3d80: 2a 20 54 65 73 74 20 74 68 65 20 6f 66 20 73 71  * Test the of sq
3d90: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 29  lite3_snprintf()
3da0: 20 72 6f 75 74 69 6e 65 2e 20 20 53 49 5a 45 20   routine.  SIZE 
3db0: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
3dc0: 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66  he.** output buf
3dd0: 66 65 72 20 69 6e 20 62 79 74 65 73 2e 20 20 54  fer in bytes.  T
3de0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
3df0: 69 73 20 31 30 30 2e 20 20 46 4f 52 4d 41 54 20  is 100.  FORMAT 
3e00: 69 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74  is the.** format
3e10: 20 73 74 72 69 6e 67 2e 20 20 49 4e 54 20 69 73   string.  INT is
3e20: 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65   a single intege
3e30: 72 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65  r argument.  The
3e40: 20 46 4f 52 4d 41 54 0a 2a 2a 20 73 74 72 69 6e   FORMAT.** strin
3e50: 67 20 6d 75 73 74 20 72 65 71 75 69 72 65 20 6e  g must require n
3e60: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 69 73  o more than this
3e70: 20 6f 6e 65 20 69 6e 74 65 67 65 72 20 61 72 67   one integer arg
3e80: 75 6d 65 6e 74 2e 20 20 49 66 0a 2a 2a 20 59 6f  ument.  If.** Yo
3e90: 75 20 70 61 73 73 20 69 6e 20 61 20 66 6f 72 6d  u pass in a form
3ea0: 61 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 72  at string that r
3eb0: 65 71 75 69 72 65 73 20 6d 6f 72 65 20 74 68 61  equires more tha
3ec0: 6e 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2c 0a  n one argument,.
3ed0: 2a 2a 20 62 61 64 20 74 68 69 6e 67 73 20 77 69  ** bad things wi
3ee0: 6c 6c 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a 73 74  ll happen..*/.st
3ef0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e  atic int test_sn
3f00: 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f  printf_int(.  vo
3f10: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
3f20: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3f30: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
3f40: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
3f50: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
3f60: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3f70: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3f80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3f90: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3fa0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3fb0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3fc0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3fd0: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 53 74 72  /.){.  char zStr
3fe0: 5b 31 30 30 5d 3b 0a 20 20 69 6e 74 20 6e 20 3d  [100];.  int n =
3ff0: 20 61 74 6f 69 28 61 72 67 76 5b 31 5d 29 3b 0a   atoi(argv[1]);.
4000: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
4010: 6f 72 6d 61 74 20 3d 20 61 72 67 76 5b 32 5d 3b  ormat = argv[2];
4020: 0a 20 20 69 6e 74 20 61 31 20 3d 20 61 74 6f 69  .  int a1 = atoi
4030: 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28  (argv[3]);.  if(
4040: 20 6e 3e 73 69 7a 65 6f 66 28 7a 53 74 72 29 20   n>sizeof(zStr) 
4050: 29 20 6e 20 3d 20 73 69 7a 65 6f 66 28 7a 53 74  ) n = sizeof(zSt
4060: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  r);.  sqlite3_sn
4070: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53  printf(sizeof(zS
4080: 74 72 29 2c 20 7a 53 74 72 2c 20 22 61 62 63 64  tr), zStr, "abcd
4090: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
40a0: 75 76 77 78 79 7a 22 29 3b 0a 20 20 73 71 6c 69  uvwxyz");.  sqli
40b0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20  te3_snprintf(n, 
40c0: 7a 53 74 72 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  zStr, zFormat, a
40d0: 31 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  1);.  Tcl_Append
40e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
40f0: 53 74 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Str, 0);.  retur
4100: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
4110: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4120: 5f 47 45 54 5f 54 41 42 4c 45 0a 0a 2f 2a 0a 2a  _GET_TABLE../*.*
4130: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
4140: 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e  3_get_table_prin
4150: 74 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20 20  tf  DB  FORMAT  
4160: 53 54 52 49 4e 47 20 20 3f 2d 2d 6e 6f 2d 63 6f  STRING  ?--no-co
4170: 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f  unts?.**.** Invo
4180: 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 67  ke the sqlite3_g
4190: 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28  et_table_printf(
41a0: 29 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  ) interface usin
41b0: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
41c0: 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20  ase.** DB.  The 
41d0: 53 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e  SQL is the strin
41e0: 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66  g FORMAT.  The f
41f0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f  ormat string sho
4200: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f  uld contain.** o
4210: 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54  ne %s or %q.  ST
4220: 52 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75  RING is the valu
4230: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
4240: 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61  %s or %q..*/.sta
4250: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67 65 74  tic int test_get
4260: 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 0a 20  _table_printf(. 
4270: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4280: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4290: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
42a0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
42b0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
42c0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
42d0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
42e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
42f0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4300: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
4310: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
4320: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4330: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
4340: 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74  3 *db;.  Tcl_DSt
4350: 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20  ring str;.  int 
4360: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
4370: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 6f 77   = 0;.  int nRow
4380: 2c 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  , nCol;.  char *
4390: 2a 61 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20  *aResult;.  int 
43a0: 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33  i;.  char zBuf[3
43b0: 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  0];.  char *zSql
43c0: 3b 0a 20 20 69 6e 74 20 72 65 73 43 6f 75 6e 74  ;.  int resCount
43d0: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 61 72 67   = -1;.  if( arg
43e0: 63 3d 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20  c==5 ){.    if( 
43f0: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
4400: 70 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 65 73  p, argv[4], &res
4410: 43 6f 75 6e 74 29 20 29 20 72 65 74 75 72 6e 20  Count) ) return 
4420: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4430: 20 69 66 28 20 61 72 67 63 21 3d 34 20 26 26 20   if( argc!=4 && 
4440: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
4450: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4460: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
4470: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
4480: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
4490: 20 20 20 20 20 20 20 22 20 44 42 20 46 4f 52 4d         " DB FORM
44a0: 41 54 20 53 54 52 49 4e 47 20 3f 43 4f 55 4e 54  AT STRING ?COUNT
44b0: 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
44c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
44d0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
44e0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
44f0: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
4500: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4510: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
4520: 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d  (&str);.  zSql =
4530: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
4540: 28 61 72 67 76 5b 32 5d 2c 61 72 67 76 5b 33 5d  (argv[2],argv[3]
4550: 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35  );.  if( argc==5
4560: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
4570: 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64  ite3_get_table(d
4580: 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c  b, zSql, &aResul
4590: 74 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b  t, 0, 0, &zErr);
45a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
45b0: 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74   = sqlite3_get_t
45c0: 61 62 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20 26  able(db, zSql, &
45d0: 61 52 65 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20  aResult, &nRow, 
45e0: 26 6e 43 6f 6c 2c 20 26 7a 45 72 72 29 3b 0a 20  &nCol, &zErr);. 
45f0: 20 20 20 72 65 73 43 6f 75 6e 74 20 3d 20 28 6e     resCount = (n
4600: 52 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 0a 20 20 7d  Row+1)*nCol;.  }
4610: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
4620: 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66  zSql);.  sprintf
4630: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29  (zBuf, "%d", rc)
4640: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
4650: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42  ement(interp, zB
4660: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  uf);.  if( rc==S
4670: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4680: 69 66 28 20 61 72 67 63 3d 3d 34 20 29 7b 0a 20  if( argc==4 ){. 
4690: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75       sprintf(zBu
46a0: 66 2c 20 22 25 64 22 2c 20 6e 52 6f 77 29 3b 0a  f, "%d", nRow);.
46b0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
46c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
46d0: 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 73 70 72  zBuf);.      spr
46e0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
46f0: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63   nCol);.      Tc
4700: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4710: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
4720: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
4730: 3b 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b  ; i<resCount; i+
4740: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  +){.      Tcl_Ap
4750: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4760: 72 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f  rp, aResult[i] ?
4770: 20 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e   aResult[i] : "N
4780: 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ULL");.    }.  }
4790: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70  else{.    Tcl_Ap
47a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
47b0: 72 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  rp, zErr);.  }. 
47c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61   sqlite3_free_ta
47d0: 62 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20  ble(aResult);.  
47e0: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
47f0: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
4800: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
4810: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
4820: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
4830: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
4840: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
4850: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4860: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20  _OMIT_GET_TABLE 
4870: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  */.../*.** Usage
4880: 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  :  sqlite3_last_
4890: 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a  insert_rowid DB.
48a0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
48b0: 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20  e integer ROWID 
48c0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
48d0: 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74  nt insert..*/.st
48e0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 61  atic int test_la
48f0: 73 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64  st_rowid(.  void
4900: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
4910: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4920: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
4930: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
4940: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
4950: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
4960: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
4970: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
4980: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
4990: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
49a0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
49b0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
49c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
49d0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
49e0: 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ];..  if( argc!=
49f0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
4a00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4a10: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4a20: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4a30: 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22  argv[0], " DB\""
4a40: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
4a50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4a60: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
4a70: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
4a80: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
4a90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
4aa0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 6c  printf(zBuf, "%l
4ab0: 6c 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73  ld", sqlite3_las
4ac0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64  t_insert_rowid(d
4ad0: 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  b));.  Tcl_Appen
4ae0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4af0: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
4b00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
4b10: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
4b20: 71 6c 69 74 65 33 5f 6b 65 79 20 44 42 20 4b 45  qlite3_key DB KE
4b30: 59 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  Y.**.** Set the 
4b40: 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74  codec key..*/.st
4b50: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6b 65  atic int test_ke
4b60: 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  y(.  void *NotUs
4b70: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
4b80: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
4b90: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
4ba0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
4bb0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
4bc0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
4bd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4be0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
4bf0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
4c00: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
4c10: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
4c20: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
4c30: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
4c40: 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20  st char *zKey;. 
4c50: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28   int nKey;.  if(
4c60: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
4c70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
4c80: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
4c90: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
4ca0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
4cb0: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
4cc0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
4cd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4ce0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
4cf0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
4d00: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
4d10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4d20: 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32  .  zKey = argv[2
4d30: 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c  ];.  nKey = strl
4d40: 65 6e 28 7a 4b 65 79 29 3b 0a 23 69 66 64 65 66  en(zKey);.#ifdef
4d50: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4d60: 43 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28  C.  sqlite3_key(
4d70: 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b  db, zKey, nKey);
4d80: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
4d90: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
4da0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
4db0: 33 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a 2a  3_rekey DB KEY.*
4dc0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
4dd0: 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74  codec key..*/.st
4de0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65  atic int test_re
4df0: 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  key(.  void *Not
4e00: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
4e10: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
4e20: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
4e30: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
4e40: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
4e50: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4e70: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
4e80: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
4e90: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
4ea0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
4eb0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
4ec0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
4ed0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b  onst char *zKey;
4ee0: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
4ef0: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
4f00: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4f10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
4f20: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
4f30: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
4f40: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
4f50: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
4f60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4f70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
4f80: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
4f90: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
4fa0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4fb0: 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76  R;.  zKey = argv
4fc0: 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74  [2];.  nKey = st
4fd0: 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23 69 66 64  rlen(zKey);.#ifd
4fe0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
4ff0: 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  DEC.  sqlite3_re
5000: 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b  key(db, zKey, nK
5010: 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ey);.#endif.  re
5020: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5030: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
5040: 6c 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a  lite3_close DB.*
5050: 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20  *.** Closes the 
5060: 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
5070: 62 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e  by sqlite3_open.
5080: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5090: 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65  qlite_test_close
50a0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
50b0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
50c0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
50d0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
50e0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
50f0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
5100: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
5110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5120: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
5130: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
5140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5150: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
5160: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
5170: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
5180: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  rc;.  if( argc!=
5190: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
51a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
51b0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
51c0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
51d0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
51e0: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
51f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
5200: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
5210: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
5220: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
5230: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
5240: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
5250: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
5260: 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  b);.  Tcl_SetRes
5270: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
5280: 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
5290: 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
52a0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
52b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  K;.}../*.** Impl
52c0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
52d0: 65 20 78 5f 63 6f 61 6c 65 73 63 65 28 29 20 66  e x_coalesce() f
52e0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75  unction..** Retu
52f0: 72 6e 20 74 68 65 20 66 69 72 73 74 20 61 72 67  rn the first arg
5300: 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  ument non-NULL a
5310: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
5320: 69 63 20 76 6f 69 64 20 74 31 5f 69 66 6e 75 6c  ic void t1_ifnul
5330: 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  lFunc(.  sqlite3
5340: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
5350: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
5360: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
5370: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69  *argv.){.  int i
5380: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  ;.  for(i=0; i<a
5390: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rgc; i++){.    i
53a0: 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d  f( SQLITE_NULL!=
53b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
53c0: 70 65 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20  pe(argv[i]) ){. 
53d0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
53e0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
53f0: 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20  (argv[i]);.     
5400: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5410: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
5420: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5430: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29  ue_text(argv[i])
5440: 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 2c 20 53  ,.          n, S
5450: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
5460: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5470: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
5480: 2a 20 54 68 65 73 65 20 61 72 65 20 74 65 73 74  * These are test
5490: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 20 20 68   functions.    h
54a0: 65 78 38 28 29 20 69 6e 74 65 72 70 72 65 74 73  ex8() interprets
54b0: 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 61 73   its argument as
54c0: 0a 2a 2a 20 55 54 46 38 20 61 6e 64 20 72 65 74  .** UTF8 and ret
54d0: 75 72 6e 73 20 61 20 68 65 78 20 65 6e 63 6f 64  urns a hex encod
54e0: 69 6e 67 2e 20 20 68 65 78 31 36 6c 65 28 29 20  ing.  hex16le() 
54f0: 69 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61  interprets its a
5500: 72 67 75 6d 65 6e 74 0a 2a 2a 20 61 73 20 55 54  rgument.** as UT
5510: 46 31 36 6c 65 20 61 6e 64 20 72 65 74 75 72 6e  F16le and return
5520: 73 20 61 20 68 65 78 20 65 6e 63 6f 64 69 6e 67  s a hex encoding
5530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5540: 20 68 65 78 38 46 75 6e 63 28 73 71 6c 69 74 65   hex8Func(sqlite
5550: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e  3_context *p, in
5560: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
5570: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
5580: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
5590: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69  char *z;.  int i
55a0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30  ;.  char zBuf[20
55b0: 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  0];.  z = sqlite
55c0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
55d0: 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[0]);.  for(i=0
55e0: 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29  ; i<sizeof(zBuf)
55f0: 2f 32 20 2d 20 32 20 26 26 20 7a 5b 69 5d 3b 20  /2 - 2 && z[i]; 
5600: 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  i++){.    sprint
5610: 66 28 26 7a 42 75 66 5b 69 2a 32 5d 2c 20 22 25  f(&zBuf[i*2], "%
5620: 30 32 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29  02x", z[i]&0xff)
5630: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32  ;.  }.  zBuf[i*2
5640: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
5650: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20  _result_text(p, 
5660: 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c  (char*)zBuf, -1,
5670: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
5680: 54 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51  T);.}.#ifndef SQ
5690: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
56a0: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 31  static void hex1
56b0: 36 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  6Func(sqlite3_co
56c0: 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72  ntext *p, int ar
56d0: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
56e0: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e  e **argv){.  con
56f0: 73 74 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  st unsigned shor
5700: 74 20 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20  t int *z;.  int 
5710: 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34  i;.  char zBuf[4
5720: 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  00];.  z = sqlit
5730: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
5740: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28  argv[0]);.  for(
5750: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42  i=0; i<sizeof(zB
5760: 75 66 29 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69  uf)/4 - 4 && z[i
5770: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72  ]; i++){.    spr
5780: 69 6e 74 66 28 26 7a 42 75 66 5b 69 2a 34 5d 2c  intf(&zBuf[i*4],
5790: 20 22 25 30 34 78 22 2c 20 7a 5b 69 5d 26 30 78   "%04x", z[i]&0x
57a0: 66 66 29 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  ff);.  }.  zBuf[
57b0: 69 2a 34 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  i*4] = 0;.  sqli
57c0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
57d0: 70 2c 20 28 63 68 61 72 2a 29 7a 42 75 66 2c 20  p, (char*)zBuf, 
57e0: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
57f0: 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  IENT);.}.#endif.
5800: 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75  ./*.** A structu
5810: 72 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f  re into which to
5820: 20 61 63 63 75 6d 75 6c 61 74 65 20 74 65 78 74   accumulate text
5830: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 64 73 74 72  ..*/.struct dstr
5840: 20 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b   {.  int nAlloc;
5850: 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
5860: 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55  ated */.  int nU
5870: 73 65 64 3b 20 20 20 2f 2a 20 53 70 61 63 65 20  sed;   /* Space 
5880: 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  used */.  char *
5890: 7a 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70  z;     /* The sp
58a0: 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ace */.};../*.**
58b0: 20 41 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20   Append text to 
58c0: 61 20 64 73 74 72 0a 2a 2f 0a 73 74 61 74 69 63  a dstr.*/.static
58d0: 20 76 6f 69 64 20 64 73 74 72 41 70 70 65 6e 64   void dstrAppend
58e0: 28 73 74 72 75 63 74 20 64 73 74 72 20 2a 70 2c  (struct dstr *p,
58f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
5900: 69 6e 74 20 64 69 76 69 64 65 72 29 7b 0a 20 20  int divider){.  
5910: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  int n = strlen(z
5920: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65  );.  if( p->nUse
5930: 64 20 2b 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e  d + n + 2 > p->n
5940: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 63 68 61  Alloc ){.    cha
5950: 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e  r *zNew;.    p->
5960: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c  nAlloc = p->nAll
5970: 6f 63 2a 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a  oc*2 + n + 200;.
5980: 20 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74      zNew = sqlit
5990: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c  e3_realloc(p->z,
59a0: 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
59b0: 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a   if( zNew==0 ){.
59c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
59d0: 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  ee(p->z);.      
59e0: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
59f0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20  eof(*p));.      
5a00: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
5a10: 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20    p->z = zNew;. 
5a20: 20 7d 0a 20 20 69 66 28 20 64 69 76 69 64 65 72   }.  if( divider
5a30: 20 26 26 20 70 2d 3e 6e 55 73 65 64 3e 30 20 29   && p->nUsed>0 )
5a40: 7b 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55  {.    p->z[p->nU
5a50: 73 65 64 2b 2b 5d 20 3d 20 64 69 76 69 64 65 72  sed++] = divider
5a60: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26  ;.  }.  memcpy(&
5a70: 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20  p->z[p->nUsed], 
5a80: 7a 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55  z, n+1);.  p->nU
5a90: 73 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  sed += n;.}../*.
5aa0: 2a 2a 20 49 6e 76 6f 6b 65 64 20 66 6f 72 20 65  ** Invoked for e
5ab0: 61 63 68 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f  ach callback fro
5ac0: 6d 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e  m sqlite3ExecFun
5ad0: 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  c.*/.static int 
5ae0: 65 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b  execFuncCallback
5af0: 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e  (void *pData, in
5b00: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
5b10: 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55  rgv, char **NotU
5b20: 73 65 64 29 7b 0a 20 20 73 74 72 75 63 74 20 64  sed){.  struct d
5b30: 73 74 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74  str *p = (struct
5b40: 20 64 73 74 72 2a 29 70 44 61 74 61 3b 0a 20 20   dstr*)pData;.  
5b50: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
5b60: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
5b70: 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 3d      if( argv[i]=
5b80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 73 74 72  =0 ){.      dstr
5b90: 41 70 70 65 6e 64 28 70 2c 20 22 4e 55 4c 4c 22  Append(p, "NULL"
5ba0: 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 65 6c 73  , ' ');.    }els
5bb0: 65 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70 70  e{.      dstrApp
5bc0: 65 6e 64 28 70 2c 20 61 72 67 76 5b 69 5d 2c 20  end(p, argv[i], 
5bd0: 27 20 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ' ');.    }.  }.
5be0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5bf0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
5c00: 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 73 71 6c  ion of the x_sql
5c10: 69 74 65 5f 65 78 65 63 28 29 20 66 75 6e 63 74  ite_exec() funct
5c20: 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ion.  This funct
5c30: 69 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20 61 20 73  ion takes.** a s
5c40: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 61  ingle argument a
5c50: 6e 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65  nd attempts to e
5c60: 78 65 63 75 74 65 20 74 68 61 74 20 61 72 67 75  xecute that argu
5c70: 6d 65 6e 74 20 61 73 20 53 51 4c 20 63 6f 64 65  ment as SQL code
5c80: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 69 6c 6c  ..** This is ill
5c90: 65 67 61 6c 20 61 6e 64 20 73 68 6f 75 6c 64 20  egal and should 
5ca0: 73 65 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  set the SQLITE_M
5cb0: 49 53 55 53 45 20 66 6c 61 67 20 6f 6e 20 74 68  ISUSE flag on th
5cc0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
5cd0: 2a 20 32 30 30 34 2d 4a 61 6e 2d 30 37 3a 20 20  * 2004-Jan-07:  
5ce0: 57 65 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  We have changed 
5cf0: 74 68 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20  this to make it 
5d00: 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71  legal to call sq
5d10: 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20  lite3_exec().** 
5d20: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 66 75  from within a fu
5d30: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a  nction call.  .*
5d40: 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
5d50: 6e 65 20 73 69 6d 75 6c 61 74 65 73 20 74 68 65  ne simulates the
5d60: 20 65 66 66 65 63 74 20 6f 66 20 68 61 76 69 6e   effect of havin
5d70: 67 20 74 77 6f 20 74 68 72 65 61 64 73 20 61 74  g two threads at
5d80: 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 75 73 65 20  tempt to.** use 
5d90: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
5da0: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
5db0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
5dc0: 69 64 20 73 71 6c 69 74 65 33 45 78 65 63 46 75  id sqlite3ExecFu
5dd0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
5de0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
5df0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20  .  int argc,  . 
5e00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
5e10: 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74 72 75 63  *argv.){.  struc
5e20: 74 20 64 73 74 72 20 78 3b 0a 20 20 6d 65 6d 73  t dstr x;.  mems
5e30: 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&x, 0, sizeof
5e40: 28 78 29 29 3b 0a 20 20 28 76 6f 69 64 29 73 71  (x));.  (void)sq
5e50: 6c 69 74 65 33 5f 65 78 65 63 28 28 73 71 6c 69  lite3_exec((sqli
5e60: 74 65 33 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  te3*)sqlite3_use
5e70: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 2c  r_data(context),
5e80: 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71  .      (char*)sq
5e90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5ea0: 28 61 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20  (argv[0]),.     
5eb0: 20 65 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63   execFuncCallbac
5ec0: 6b 2c 20 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c  k, &x, 0);.  sql
5ed0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
5ee0: 28 63 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78  (context, x.z, x
5ef0: 2e 6e 55 73 65 64 2c 20 53 51 4c 49 54 45 5f 54  .nUsed, SQLITE_T
5f00: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
5f10: 69 74 65 33 5f 66 72 65 65 28 78 2e 7a 29 3b 0a  ite3_free(x.z);.
5f20: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
5f30: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 6b 74 32 32  ntation of tkt22
5f40: 31 33 66 75 6e 63 28 29 2c 20 61 20 73 63 61 6c  13func(), a scal
5f50: 61 72 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ar function that
5f60: 20 74 61 6b 65 73 20 65 78 61 63 74 6c 79 0a 2a   takes exactly.*
5f70: 2a 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2e 20  * one argument. 
5f80: 49 74 20 68 61 73 20 74 77 6f 20 69 6e 74 65 72  It has two inter
5f90: 65 73 74 69 6e 67 20 66 65 61 74 75 72 65 73 3a  esting features:
5fa0: 0a 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63 61 6c 6c  .**.** * It call
5fb0: 73 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  s sqlite3_value_
5fc0: 74 65 78 74 28 29 20 33 20 74 69 6d 65 73 20 6f  text() 3 times o
5fd0: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 73  n the argument s
5fe0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2e 0a 2a  qlite3_value*..*
5ff0: 2a 20 20 20 49 66 20 74 68 65 20 74 68 72 65 65  *   If the three
6000: 20 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e   pointers return
6010: 65 64 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73  ed are not the s
6020: 61 6d 65 20 61 6e 20 53 51 4c 20 65 72 72 6f 72  ame an SQL error
6030: 20 69 73 20 72 61 69 73 65 64 2e 0a 2a 2a 0a 2a   is raised..**.*
6040: 2a 20 2a 20 4f 74 68 65 72 77 69 73 65 20 69 74  * * Otherwise it
6050: 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20   returns a copy 
6060: 6f 66 20 74 68 65 20 74 65 78 74 20 72 65 70 72  of the text repr
6070: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 74  esentation of it
6080: 73 20 0a 2a 2a 20 20 20 61 72 67 75 6d 65 6e 74  s .**   argument
6090: 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61   in such a way a
60a0: 73 20 74 68 65 20 56 44 42 45 20 72 65 70 72 65  s the VDBE repre
60b0: 73 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 20 4d  sentation is a M
60c0: 65 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20 20 20 77  em* cell .**   w
60d0: 69 74 68 20 74 68 65 20 4d 45 4d 5f 54 65 72 6d  ith the MEM_Term
60e0: 20 66 6c 61 67 20 63 6c 65 61 72 2e 20 0a 2a 2a   flag clear. .**
60f0: 0a 2a 2a 20 54 69 63 6b 65 74 20 23 32 32 31 33  .** Ticket #2213
6100: 20 63 61 6e 20 74 68 65 72 65 66 6f 72 65 20 62   can therefore b
6110: 65 20 74 65 73 74 65 64 20 62 79 20 65 76 61 6c  e tested by eval
6120: 75 61 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  uating the follo
6130: 77 69 6e 67 0a 2a 2a 20 53 51 4c 20 65 78 70 72  wing.** SQL expr
6140: 65 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  ession:.**.**   
6150: 74 6b 74 32 32 31 33 66 75 6e 63 28 74 6b 74 32  tkt2213func(tkt2
6160: 32 31 33 66 75 6e 63 28 27 61 20 73 74 72 69 6e  213func('a strin
6170: 67 27 29 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  g'));.*/.static 
6180: 76 6f 69 64 20 74 6b 74 32 32 31 33 46 75 6e 63  void tkt2213Func
6190: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  tion(.  sqlite3_
61a0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
61b0: 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  , .  int argc,  
61c0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
61d0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
61e0: 20 6e 54 65 78 74 3b 0a 20 20 75 6e 73 69 67 6e   nText;.  unsign
61f0: 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  ed char const *z
6200: 54 65 78 74 31 3b 0a 20 20 75 6e 73 69 67 6e 65  Text1;.  unsigne
6210: 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54  d char const *zT
6220: 65 78 74 32 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ext2;.  unsigned
6230: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65   char const *zTe
6240: 78 74 33 3b 0a 0a 20 20 6e 54 65 78 74 20 3d 20  xt3;..  nText = 
6250: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
6260: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
6270: 7a 54 65 78 74 31 20 3d 20 73 71 6c 69 74 65 33  zText1 = sqlite3
6280: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
6290: 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 32 20 3d  [0]);.  zText2 =
62a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
62b0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
62c0: 7a 54 65 78 74 33 20 3d 20 73 71 6c 69 74 65 33  zText3 = sqlite3
62d0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
62e0: 5b 30 5d 29 3b 0a 0a 20 20 69 66 28 20 7a 54 65  [0]);..  if( zTe
62f0: 78 74 31 21 3d 7a 54 65 78 74 32 20 7c 7c 20 7a  xt1!=zText2 || z
6300: 54 65 78 74 32 21 3d 7a 54 65 78 74 33 20 29 7b  Text2!=zText3 ){
6310: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
6320: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
6330: 74 2c 20 22 74 6b 74 32 32 31 33 20 69 73 20 6e  t, "tkt2213 is n
6340: 6f 74 20 66 69 78 65 64 22 2c 20 2d 31 29 3b 0a  ot fixed", -1);.
6350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
6360: 72 20 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61 72  r *zCopy = (char
6370: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
6380: 63 28 6e 54 65 78 74 29 3b 0a 20 20 20 20 6d 65  c(nText);.    me
6390: 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 54 65 78  mcpy(zCopy, zTex
63a0: 74 31 2c 20 6e 54 65 78 74 29 3b 0a 20 20 20 20  t1, nText);.    
63b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
63c0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 43 6f  ext(context, zCo
63d0: 70 79 2c 20 6e 54 65 78 74 2c 20 73 71 6c 69 74  py, nText, sqlit
63e0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a  e3_free);.  }.}.
63f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
6400: 77 69 6e 67 20 53 51 4c 20 66 75 6e 63 74 69 6f  wing SQL functio
6410: 6e 20 74 61 6b 65 73 20 34 20 61 72 67 75 6d 65  n takes 4 argume
6420: 6e 74 73 2e 20 20 54 68 65 20 32 6e 64 20 61 6e  nts.  The 2nd an
6430: 64 0a 2a 2a 20 34 74 68 20 61 72 67 75 6d 65 6e  d.** 4th argumen
6440: 74 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  t must be one of
6450: 20 74 68 65 73 65 20 73 74 72 69 6e 67 73 3a 20   these strings: 
6460: 20 27 74 65 78 74 27 2c 20 27 74 65 78 74 31 36   'text', 'text16
6470: 27 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f 62 27 20  ',.** or 'blob' 
6480: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
6490: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 0a 2a   API functions.*
64a0: 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
64b0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 0a 2a  3_value_text().*
64c0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  *      sqlite3_v
64d0: 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 2a 2a  alue_text16().**
64e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
64f0: 6c 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a 0a 2a 2a  lue_blob().**.**
6500: 20 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   The third argum
6510: 65 6e 74 20 69 73 20 61 20 73 74 72 69 6e 67 2c  ent is a string,
6520: 20 65 69 74 68 65 72 20 27 62 79 74 65 73 27 20   either 'bytes' 
6530: 6f 72 20 27 62 79 74 65 73 31 36 27 20 6f 72 20  or 'bytes16' or 
6540: 27 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f 72 72 65  'noop',.** corre
6550: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 73  sponding to APIs
6560: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
6570: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
6580: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
6590: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36  e3_value_bytes16
65a0: 28 29 0a 2a 2a 20 20 20 20 20 20 6e 6f 6f 70 0a  ().**      noop.
65b0: 2a 2a 0a 2a 2a 20 54 68 65 20 41 50 49 73 20 64  **.** The APIs d
65c0: 65 73 69 67 6e 61 74 65 64 20 62 79 20 74 68 65  esignated by the
65d0: 20 32 6e 64 20 74 68 72 6f 75 67 68 20 34 74 68   2nd through 4th
65e0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61   arguments are a
65f0: 70 70 6c 69 65 64 0a 2a 2a 20 74 6f 20 74 68 65  pplied.** to the
6600: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
6610: 69 6e 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68  in order.  If th
6620: 65 20 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72  e pointers retur
6630: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 65  ned by the.** se
6640: 63 6f 6e 64 20 61 6e 64 20 66 6f 75 72 74 68 20  cond and fourth 
6650: 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74  are different, t
6660: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
6670: 72 6e 73 20 31 2e 20 20 4f 74 68 65 72 77 69 73  rns 1.  Otherwis
6680: 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  e,.** this routi
6690: 6e 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  ne returns 0..**
66a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
66b0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  n is used to tes
66c0: 74 20 74 6f 20 73 65 65 20 77 68 65 6e 20 72 65  t to see when re
66d0: 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 73 20  turned pointers 
66e0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f 74 65 78  from.** the _tex
66f0: 74 28 29 2c 20 5f 74 65 78 74 31 36 28 29 20 61  t(), _text16() a
6700: 6e 64 20 5f 62 6c 6f 62 28 29 20 41 50 49 73 20  nd _blob() APIs 
6710: 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 61 74  become invalidat
6720: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
6730: 69 64 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69  id ptrChngFuncti
6740: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
6750: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
6760: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20  .  int argc,  . 
6770: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6780: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
6790: 20 76 6f 69 64 20 2a 70 31 2c 20 2a 70 32 3b 0a   void *p1, *p2;.
67a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
67b0: 6d 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  md;.  if( argc!=
67c0: 34 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 43  4 ) return;.  zC
67d0: 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  md = (const char
67e0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
67f0: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  text(argv[1]);. 
6800: 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72   if( zCmd==0 ) r
6810: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72  eturn;.  if( str
6820: 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29  cmp(zCmd,"text")
6830: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20  ==0 ){.    p1 = 
6840: 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c  (const void*)sql
6850: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6860: 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65  argv[0]);.#ifnde
6870: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
6880: 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  F16.  }else if( 
6890: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65  strcmp(zCmd, "te
68a0: 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20  xt16")==0 ){.   
68b0: 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69   p1 = (const voi
68c0: 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  d*)sqlite3_value
68d0: 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29  _text16(argv[0])
68e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
68f0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6900: 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a  , "blob")==0 ){.
6910: 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20      p1 = (const 
6920: 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61  void*)sqlite3_va
6930: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
6940: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6950: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43  return;.  }.  zC
6960: 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  md = (const char
6970: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6980: 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20  text(argv[2]);. 
6990: 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72   if( zCmd==0 ) r
69a0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72  eturn;.  if( str
69b0: 63 6d 70 28 7a 43 6d 64 2c 22 62 79 74 65 73 22  cmp(zCmd,"bytes"
69c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
69d0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
69e0: 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65  argv[0]);.#ifnde
69f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
6a00: 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  F16.  }else if( 
6a10: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 79  strcmp(zCmd, "by
6a20: 74 65 73 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20  tes16")==0 ){.  
6a30: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
6a40: 62 79 74 65 73 31 36 28 61 72 67 76 5b 30 5d 29  bytes16(argv[0])
6a50: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
6a60: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6a70: 2c 20 22 6e 6f 6f 70 22 29 3d 3d 30 20 29 7b 0a  , "noop")==0 ){.
6a80: 20 20 20 20 2f 2a 20 64 6f 20 6e 6f 74 68 69 6e      /* do nothin
6a90: 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  g */.  }else{.  
6aa0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
6ab0: 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68  zCmd = (const ch
6ac0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
6ad0: 65 5f 74 65 78 74 28 61 72 67 76 5b 33 5d 29 3b  e_text(argv[3]);
6ae0: 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29  .  if( zCmd==0 )
6af0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
6b00: 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74  trcmp(zCmd,"text
6b10: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20  ")==0 ){.    p2 
6b20: 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73  = (const void*)s
6b30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6b40: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e  t(argv[0]);.#ifn
6b50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6b60: 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66  UTF16.  }else if
6b70: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22  ( strcmp(zCmd, "
6b80: 74 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20  text16")==0 ){. 
6b90: 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76     p2 = (const v
6ba0: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
6bb0: 75 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30  ue_text16(argv[0
6bc0: 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  ]);.#endif.  }el
6bd0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  se if( strcmp(zC
6be0: 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29  md, "blob")==0 )
6bf0: 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73  {.    p2 = (cons
6c00: 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  t void*)sqlite3_
6c10: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
6c20: 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0]);.  }else{.  
6c30: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
6c40: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
6c50: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 31 21 3d  nt(context, p1!=
6c60: 70 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  p2);.}.../*.** U
6c70: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 74 65  sage:  sqlite_te
6c80: 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
6c90: 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  on DB.**.** Call
6ca0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65   the sqlite3_cre
6cb0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49  ate_function API
6cc0: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61   on the given da
6cd0: 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a  tabase in order.
6ce0: 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61 20 66  ** to create a f
6cf0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78  unction named "x
6d00: 5f 63 6f 61 6c 65 73 63 65 22 2e 20 20 54 68 69  _coalesce".  Thi
6d10: 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
6d20: 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a  the same thing.*
6d30: 2a 20 61 73 20 74 68 65 20 22 63 6f 61 6c 65 73  * as the "coales
6d40: 63 65 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ce" function.  T
6d50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73  his function als
6d60: 6f 20 72 65 67 69 73 74 65 72 73 20 61 6e 20 53  o registers an S
6d70: 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e  QL function.** n
6d80: 61 6d 65 64 20 22 78 5f 73 71 6c 69 74 65 5f 65  amed "x_sqlite_e
6d90: 78 65 63 22 20 74 68 61 74 20 69 6e 76 6f 6b 65  xec" that invoke
6da0: 73 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  s sqlite3_exec()
6db0: 2e 20 20 49 6e 76 6f 6b 69 6e 67 20 73 71 6c 69  .  Invoking sqli
6dc0: 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 69 6e  te3_exec().** in
6dd0: 20 74 68 69 73 20 77 61 79 20 69 73 20 69 6c 6c   this way is ill
6de0: 65 67 61 6c 20 72 65 63 75 72 73 69 6f 6e 20 61  egal recursion a
6df0: 6e 64 20 73 68 6f 75 6c 64 20 72 61 69 73 65 20  nd should raise 
6e00: 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  an SQLITE_MISUSE
6e10: 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68 65 20 65   error..** The e
6e20: 66 66 65 63 74 20 69 73 20 73 69 6d 69 6c 61 72  ffect is similar
6e30: 20 74 6f 20 74 72 79 69 6e 67 20 74 6f 20 75 73   to trying to us
6e40: 65 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  e the same datab
6e50: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ase connection f
6e60: 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74 68 72 65 61  rom.** two threa
6e70: 64 73 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  ds at the same t
6e80: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ime..**.** The o
6e90: 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69  riginal motivati
6ea0: 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  on for this rout
6eb0: 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61 62  ine was to be ab
6ec0: 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a  le to call the.*
6ed0: 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
6ee0: 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69  _function functi
6ef0: 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65 72 79  on while a query
6f00: 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20   is in progress 
6f10: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74  in order.** to t
6f20: 65 73 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  est the SQLITE_M
6f30: 49 53 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20  ISUSE detection 
6f40: 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  logic..*/.static
6f50: 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65   int test_create
6f60: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69  _function(.  voi
6f70: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
6f80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
6f90: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
6fa0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
6fb0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
6fc0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
6fd0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
6fe0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
6ff0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
7000: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
7010: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
7020: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
7030: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
7040: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
7050: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
7060: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7070: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
7080: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
7090: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
70a0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 44 42 5c 22  ],.       " DB\"
70b0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
70c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
70d0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
70e0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
70f0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
7100: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7110: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7120: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7130: 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2c 20 2d   "x_coalesce", -
7140: 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30  1, SQLITE_ANY, 0
7150: 2c 20 0a 20 20 20 20 20 20 20 20 74 31 5f 69 66  , .        t1_if
7160: 6e 75 6c 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b  nullFunc, 0, 0);
7170: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7180: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
7190: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
71a0: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65  function(db, "he
71b0: 78 38 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41  x8", 1, SQLITE_A
71c0: 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  NY, 0, .        
71d0: 20 20 68 65 78 38 46 75 6e 63 2c 20 30 2c 20 30    hex8Func, 0, 0
71e0: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
71f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
7200: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7210: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
7220: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7230: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65  function(db, "he
7240: 78 31 36 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  x16", 1, SQLITE_
7250: 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  ANY, 0, .       
7260: 20 20 20 68 65 78 31 36 46 75 6e 63 2c 20 30 2c     hex16Func, 0,
7270: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
7280: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7290: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
72a0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
72b0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 6b 74  unction(db, "tkt
72c0: 32 32 31 33 66 75 6e 63 22 2c 20 31 2c 20 53 51  2213func", 1, SQ
72d0: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20  LITE_ANY, 0, .  
72e0: 20 20 20 20 20 20 20 20 74 6b 74 32 32 31 33 46          tkt2213F
72f0: 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a  unction, 0, 0);.
7300: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
7310: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7320: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
7330: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
7340: 22 70 6f 69 6e 74 65 72 5f 63 68 61 6e 67 65 22  "pointer_change"
7350: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 4, SQLITE_ANY,
7360: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70   0, .          p
7370: 74 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e 2c 20  trChngFunction, 
7380: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  0, 0);.  }..#ifn
7390: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
73a0: 55 54 46 31 36 0a 20 20 2f 2a 20 55 73 65 20 74  UTF16.  /* Use t
73b0: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
73c0: 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 29 20 41  e_function16() A
73d0: 50 49 20 68 65 72 65 2e 20 4d 61 69 6e 6c 79 20  PI here. Mainly 
73e0: 66 6f 72 20 66 75 6e 2c 20 62 75 74 20 61 6c 73  for fun, but als
73f0: 6f 20 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  o .  ** because 
7400: 69 74 20 69 73 20 6e 6f 74 20 74 65 73 74 65 64  it is not tested
7410: 20 61 6e 79 77 68 65 72 65 20 65 6c 73 65 2e 20   anywhere else. 
7420: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
7430: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
7440: 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36  nst void *zUtf16
7450: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  ;.    sqlite3_va
7460: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 73  lue *pVal;.    s
7470: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7480: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
7490: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
74a0: 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
74b0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
74c0: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
74d0: 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 2c  "x_sqlite_exec",
74e0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
74f0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7500: 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74    zUtf16 = sqlit
7510: 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
7520: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
7530: 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  TIVE);.    if( d
7540: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7550: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
7560: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7570: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
7580: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
7590: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 64 62 2c 20  _function16(db, 
75a0: 7a 55 74 66 31 36 2c 20 0a 20 20 20 20 20 20 20  zUtf16, .       
75b0: 20 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49           1, SQLI
75c0: 54 45 5f 55 54 46 31 36 2c 20 64 62 2c 20 73 71  TE_UTF16, db, sq
75d0: 6c 69 74 65 33 45 78 65 63 46 75 6e 63 2c 20 30  lite3ExecFunc, 0
75e0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
75f0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
7600: 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  (pVal);.    sqli
7610: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7620: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
7630: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71  #endif..  if( sq
7640: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
7650: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
7660: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
7670: 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ROR;.  Tcl_SetRe
7680: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
7690: 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
76a0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
76b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
76c0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
76d0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 78 5f  implement the x_
76e0: 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74  count() aggregat
76f0: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  e function..**.*
7700: 2a 20 78 5f 63 6f 75 6e 74 28 29 20 63 6f 75 6e  * x_count() coun
7710: 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ts the number of
7720: 20 6e 6f 6e 2d 6e 75 6c 6c 20 61 72 67 75 6d 65   non-null argume
7730: 6e 74 73 2e 20 20 42 75 74 20 74 68 65 72 65 20  nts.  But there 
7740: 61 72 65 0a 2a 2a 20 73 6f 6d 65 20 74 77 69 73  are.** some twis
7750: 74 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ts for testing p
7760: 75 72 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  urposes..**.** I
7770: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
7780: 6f 20 78 5f 63 6f 75 6e 74 28 29 20 69 73 20 34  o x_count() is 4
7790: 30 20 74 68 65 6e 20 61 20 55 54 46 2d 38 20 65  0 then a UTF-8 e
77a0: 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64  rror is reported
77b0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 65 70 20  .** on the step 
77c0: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 78 5f  function.  If x_
77d0: 63 6f 75 6e 74 28 34 31 29 20 69 73 20 73 65 65  count(41) is see
77e0: 6e 2c 20 74 68 65 6e 20 61 20 55 54 46 2d 31 36  n, then a UTF-16
77f0: 20 65 72 72 6f 72 0a 2a 2a 20 69 73 20 72 65 70   error.** is rep
7800: 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 73 74 65  orted on the ste
7810: 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20  p function.  If 
7820: 74 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20  the total count 
7830: 69 73 20 34 32 2c 20 74 68 65 6e 0a 2a 2a 20 61  is 42, then.** a
7840: 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20   UTF-8 error is 
7850: 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20  reported on the 
7860: 66 69 6e 61 6c 69 7a 65 20 66 75 6e 63 74 69 6f  finalize functio
7870: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
7880: 72 75 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20  ruct t1CountCtx 
7890: 74 31 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75  t1CountCtx;.stru
78a0: 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20 7b 0a  ct t1CountCtx {.
78b0: 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74    int n;.};.stat
78c0: 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 53  ic void t1CountS
78d0: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tep(.  sqlite3_c
78e0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
78f0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
7900: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7910: 72 67 76 0a 29 7b 0a 20 20 74 31 43 6f 75 6e 74  rgv.){.  t1Count
7920: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
7930: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
7940: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
7950: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
7960: 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20  if( (argc==0 || 
7970: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
7980: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
7990: 61 72 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20  argv[0]) ) && p 
79a0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20  ){.    p->n++;. 
79b0: 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 30 20   }.  if( argc>0 
79c0: 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 73  ){.    int v = s
79d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
79e0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
79f0: 66 28 20 76 3d 3d 34 30 20 29 7b 0a 20 20 20 20  f( v==40 ){.    
7a00: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7a10: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
7a20: 22 76 61 6c 75 65 20 6f 66 20 34 30 20 68 61 6e  "value of 40 han
7a30: 64 65 64 20 74 6f 20 78 5f 63 6f 75 6e 74 22 2c  ded to x_count",
7a40: 20 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51   -1);.#ifndef SQ
7a50: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
7a60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3d      }else if( v=
7a70: 3d 34 31 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  =41 ){.      con
7a80: 73 74 20 63 68 61 72 20 7a 55 74 66 31 36 45 72  st char zUtf16Er
7a90: 72 4d 73 67 5b 5d 20 3d 20 7b 20 30 2c 20 30 78  rMsg[] = { 0, 0x
7aa0: 36 31 2c 20 30 2c 20 30 78 36 32 2c 20 30 2c 20  61, 0, 0x62, 0, 
7ab0: 30 78 36 33 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  0x63, 0, 0, 0};.
7ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7ad0: 73 75 6c 74 5f 65 72 72 6f 72 31 36 28 63 6f 6e  sult_error16(con
7ae0: 74 65 78 74 2c 20 26 7a 55 74 66 31 36 45 72 72  text, &zUtf16Err
7af0: 4d 73 67 5b 31 2d 53 51 4c 49 54 45 5f 42 49 47  Msg[1-SQLITE_BIG
7b00: 45 4e 44 49 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65  ENDIAN], -1);.#e
7b10: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ndif.    }.  }.}
7b20: 20 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20     .static void 
7b30: 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28  t1CountFinalize(
7b40: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7b50: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 74 31 43  *context){.  t1C
7b60: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
7b70: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
7b80: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
7b90: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
7ba0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
7bb0: 20 69 66 28 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b   if( p->n==42 ){
7bc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7bd0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
7be0: 65 78 74 2c 20 22 78 5f 63 6f 75 6e 74 20 74 6f  ext, "x_count to
7bf0: 74 61 6c 73 20 74 6f 20 34 32 22 2c 20 2d 31 29  tals to 42", -1)
7c00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7c10: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7c20: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
7c30: 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20   ? p->n : 0);.  
7c40: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
7c50: 63 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75  c void legacyCou
7c60: 6e 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65  ntStep(.  sqlite
7c70: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7c80: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
7c90: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
7ca0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e  **argv.){.  /* n
7cb0: 6f 2d 6f 70 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64  o-op */.}..#ifnd
7cc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
7cd0: 45 50 52 45 43 41 54 45 44 0a 73 74 61 74 69 63  EPRECATED.static
7ce0: 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e   void legacyCoun
7cf0: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
7d00: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7d10: 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  xt){.  sqlite3_r
7d20: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
7d30: 74 2c 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t, sqlite3_aggre
7d40: 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65  gate_count(conte
7d50: 78 74 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  xt));.}.#endif..
7d60: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
7d70: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67  lite3_create_agg
7d80: 72 65 67 61 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20  regate DB.**.** 
7d90: 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33  Call the sqlite3
7da0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7db0: 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65   API on the give
7dc0: 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72  n database in or
7dd0: 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  der.** to create
7de0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65   a function name
7df0: 64 20 22 78 5f 63 6f 75 6e 74 22 2e 20 20 54 68  d "x_count".  Th
7e00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
7e10: 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 74 68 65  imilar.** to the
7e20: 20 62 75 69 6c 74 2d 69 6e 20 63 6f 75 6e 74 28   built-in count(
7e30: 29 20 66 75 6e 63 74 69 6f 6e 2c 20 77 69 74 68  ) function, with
7e40: 20 61 20 66 65 77 20 73 70 65 63 69 61 6c 20 71   a few special q
7e50: 75 69 72 6b 73 0a 2a 2a 20 66 6f 72 20 74 65 73  uirks.** for tes
7e60: 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  ting the sqlite3
7e70: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 20  _result_error() 
7e80: 41 50 49 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  APIs..**.** The 
7e90: 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74  original motivat
7ea0: 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ion for this rou
7eb0: 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61  tine was to be a
7ec0: 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a  ble to call the.
7ed0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
7ee0: 65 5f 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e_aggregate func
7ef0: 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65  tion while a que
7f00: 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  ry is in progres
7f10: 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  s in order.** to
7f20: 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54 45   test the SQLITE
7f30: 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69 6f  _MISUSE detectio
7f40: 6e 20 6c 6f 67 69 63 2e 20 20 53 65 65 20 6d 69  n logic.  See mi
7f50: 73 75 73 65 2e 74 65 73 74 2e 0a 2a 2a 0a 2a 2a  suse.test..**.**
7f60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
7f70: 73 20 6c 61 74 65 72 20 65 78 74 65 6e 64 65 64  s later extended
7f80: 20 74 6f 20 74 65 73 74 20 74 68 65 20 75 73 65   to test the use
7f90: 20 6f 66 20 73 71 6c 69 74 65 33 5f 72 65 73 75   of sqlite3_resu
7fa0: 6c 74 5f 65 72 72 6f 72 28 29 0a 2a 2a 20 77 69  lt_error().** wi
7fb0: 74 68 69 6e 20 61 67 67 72 65 67 61 74 65 20 66  thin aggregate f
7fc0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  unctions..**.** 
7fd0: 4c 61 74 65 72 3a 20 49 74 20 69 73 20 6e 6f 77  Later: It is now
7fe0: 20 61 6c 73 6f 20 65 78 74 65 6e 64 65 64 20 74   also extended t
7ff0: 6f 20 72 65 67 69 73 74 65 72 20 74 68 65 20 61  o register the a
8000: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
8010: 6e 0a 2a 2a 20 22 6c 65 67 61 63 79 5f 63 6f 75  n.** "legacy_cou
8020: 6e 74 28 29 22 20 77 69 74 68 20 74 68 65 20 73  nt()" with the s
8030: 75 70 70 6c 69 65 64 20 64 61 74 61 62 61 73 65  upplied database
8040: 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
8050: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 74 65 73 74   used.** to test
8060: 20 74 68 65 20 64 65 70 72 65 63 61 74 65 64 20   the deprecated 
8070: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
8080: 65 5f 63 6f 75 6e 74 28 29 20 41 50 49 2e 0a 2a  e_count() API..*
8090: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
80a0: 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  t_create_aggrega
80b0: 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  te(.  void *NotU
80c0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
80d0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
80e0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
80f0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
8100: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
8110: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
8120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8130: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8140: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
8150: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
8160: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
8170: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
8180: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
8190: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
81a0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
81b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
81c0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
81d0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
81e0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
81f0: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
8200: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8210: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8220: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
8230: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
8240: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
8250: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
8260: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
8270: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
8280: 78 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c  x_count", 0, SQL
8290: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a  ITE_UTF8, 0, 0,.
82a0: 20 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65        t1CountSte
82b0: 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a  p,t1CountFinaliz
82c0: 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
82d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
82e0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
82f0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
8300: 22 78 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51  "x_count", 1, SQ
8310: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c  LITE_UTF8, 0, 0,
8320: 0a 20 20 20 20 20 20 20 20 74 31 43 6f 75 6e 74  .        t1Count
8330: 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61  Step,t1CountFina
8340: 6c 69 7a 65 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  lize);.  }.#ifnd
8350: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
8360: 45 50 52 45 43 41 54 45 44 0a 20 20 69 66 28 20  EPRECATED.  if( 
8370: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8380: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8390: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
83a0: 6e 28 64 62 2c 20 22 6c 65 67 61 63 79 5f 63 6f  n(db, "legacy_co
83b0: 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f  unt", 0, SQLITE_
83c0: 41 4e 59 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  ANY, 0, 0,.     
83d0: 20 20 20 6c 65 67 61 63 79 43 6f 75 6e 74 53 74     legacyCountSt
83e0: 65 70 2c 20 6c 65 67 61 63 79 43 6f 75 6e 74 46  ep, legacyCountF
83f0: 69 6e 61 6c 69 7a 65 0a 20 20 20 20 29 3b 0a 20  inalize.    );. 
8400: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
8410: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
8420: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
8430: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
8440: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
8450: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
8460: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
8470: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
8480: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8490: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 70  ./*.** Usage:  p
84a0: 72 69 6e 74 66 20 54 45 58 54 0a 2a 2a 0a 2a 2a  rintf TEXT.**.**
84b0: 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
84c0: 70 72 69 6e 74 66 2e 20 20 55 73 65 20 74 68 69  printf.  Use thi
84d0: 73 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 75  s rather than pu
84e0: 74 73 20 74 6f 20 6d 65 72 67 65 20 74 68 65 20  ts to merge the 
84f0: 6f 75 74 70 75 74 0a 2a 2a 20 69 6e 20 74 68 65  output.** in the
8500: 20 63 6f 72 72 65 63 74 20 73 65 71 75 65 6e 63   correct sequenc
8510: 65 20 77 69 74 68 20 64 65 62 75 67 67 69 6e 67  e with debugging
8520: 20 70 72 69 6e 74 66 73 20 69 6e 73 65 72 74 65   printfs inserte
8530: 64 20 69 6e 74 6f 20 43 20 63 6f 64 65 2e 0a 2a  d into C code..*
8540: 2a 20 50 75 74 73 20 75 73 65 73 20 61 20 73 65  * Puts uses a se
8550: 70 61 72 61 74 65 20 62 75 66 66 65 72 20 61 6e  parate buffer an
8560: 64 20 64 65 62 75 67 67 69 6e 67 20 73 74 61 74  d debugging stat
8570: 65 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 6f  ements will be o
8580: 75 74 20 6f 66 0a 2a 2a 20 73 65 71 75 65 6e 63  ut of.** sequenc
8590: 65 20 69 66 20 69 74 20 69 73 20 75 73 65 64 2e  e if it is used.
85a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
85b0: 65 73 74 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f  est_printf(.  vo
85c0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
85d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
85e0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
85f0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8600: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8610: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8620: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8630: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8640: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8650: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8660: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8670: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8680: 2f 0a 29 7b 0a 20 20 69 66 28 20 61 72 67 63 21  /.){.  if( argc!
8690: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
86a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
86b0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
86c0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
86d0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
86e0: 20 22 20 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a   " TEXT\"", 0);.
86f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8700: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 72 69 6e  RROR;.  }.  prin
8710: 74 66 28 22 25 73 5c 6e 22 2c 20 61 72 67 76 5b  tf("%s\n", argv[
8720: 31 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1]);.  return TC
8730: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  L_OK;.}..../*.**
8740: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
8750: 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52  _mprintf_int FOR
8760: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
8770: 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a  GER INTEGER.**.*
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 68 72 65 65 20 69 6e 74 65 67 65  ith three intege
87a0: 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73  r arguments.*/.s
87b0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
87c0: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20  3_mprintf_int(. 
87d0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
87e0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
87f0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8800: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8810: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8820: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8830: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8840: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8850: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8860: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
8870: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
8880: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
8890: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b  t */.){.  int a[
88a0: 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  3], i;.  char *z
88b0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
88c0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
88d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
88e0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
88f0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
8900: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
8910: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49  FORMAT INT INT I
8920: 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NT\"", 0);.    r
8930: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8940: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
8950: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
8960: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
8970: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
8980: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
8990: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
89a0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
89b0: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
89c0: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29  [0], a[1], a[2])
89d0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
89e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
89f0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
8a00: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
8a10: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
8a20: 20 49 66 20 7a 4e 75 6d 20 72 65 70 72 65 73 65   If zNum represe
8a30: 6e 74 73 20 61 6e 20 69 6e 74 65 67 65 72 20 74  nts an integer t
8a40: 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20  hat will fit in 
8a50: 36 34 2d 62 69 74 73 2c 20 74 68 65 6e 20 73 65  64-bits, then se
8a60: 74 0a 2a 2a 20 2a 70 56 61 6c 75 65 20 74 6f 20  t.** *pValue to 
8a70: 74 68 61 74 20 69 6e 74 65 67 65 72 20 61 6e 64  that integer and
8a80: 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 4f   return true.  O
8a90: 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
8aa0: 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  false..*/.static
8ab0: 20 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 49   int sqlite3GetI
8ac0: 6e 74 36 34 28 63 6f 6e 73 74 20 63 68 61 72 20  nt64(const char 
8ad0: 2a 7a 4e 75 6d 2c 20 69 36 34 20 2a 70 56 61 6c  *zNum, i64 *pVal
8ae0: 75 65 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  ue){.  if( sqlit
8af0: 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a  e3FitsIn64Bits(z
8b00: 4e 75 6d 2c 20 30 29 20 29 7b 0a 20 20 20 20 73  Num, 0) ){.    s
8b10: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 4e 75  qlite3Atoi64(zNu
8b20: 6d 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  m, pValue);.    
8b30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
8b40: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
8b50: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
8b60: 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34  e3_mprintf_int64
8b70: 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20   FORMAT INTEGER 
8b80: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a  INTEGER INTEGER.
8b90: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
8ba0: 74 66 20 77 69 74 68 20 74 68 72 65 65 20 36 34  tf with three 64
8bb0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61 72 67  -bit integer arg
8bc0: 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  uments.*/.static
8bd0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
8be0: 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20 20 76 6f  intf_int64(.  vo
8bf0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
8c00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8c10: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8c20: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8c30: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8c40: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8c50: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8c60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8c70: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8c80: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8c90: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8ca0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8cb0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
8cc0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 61 5b 33  sqlite_int64 a[3
8cd0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
8ce0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
8cf0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8d00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8d10: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8d20: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8d30: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
8d40: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
8d50: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
8d60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8d70: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
8d80: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
8d90: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 36 34 28  sqlite3GetInt64(
8da0: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
8db0: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ) ){.      Tcl_A
8dc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8dd0: 72 70 2c 20 22 61 72 67 75 6d 65 6e 74 20 69 73  rp, "argument is
8de0: 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 36 34 2d   not a valid 64-
8df0: 62 69 74 20 69 6e 74 65 67 65 72 22 2c 20 30 29  bit integer", 0)
8e00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
8e10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8e20: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
8e30: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
8e40: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61  ], a[0], a[1], a
8e50: 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
8e60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8e70: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
8e80: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
8e90: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
8ea0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
8eb0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
8ec0: 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20   FORMAT INTEGER 
8ed0: 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a 2a  INTEGER STRING.*
8ee0: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
8ef0: 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67  f with two integ
8f00: 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64  er arguments and
8f10: 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67 75   one string argu
8f20: 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ment.*/.static i
8f30: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
8f40: 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20 2a  tf_str(.  void *
8f50: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
8f60: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
8f70: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
8f80: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
8f90: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
8fa0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
8fb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8fc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
8fd0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
8fe0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
8ff0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
9000: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
9010: 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a  .  int a[3], i;.
9020: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
9030: 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67 63 3e   argc<4 || argc>
9040: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
9050: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9060: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
9070: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
9080: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
9090: 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  " FORMAT INT INT
90a0: 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29   ?STRING?\"", 0)
90b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
90c0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
90d0: 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29  r(i=2; i<4; i++)
90e0: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
90f0: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
9100: 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29  v[i], &a[i-2]) )
9110: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9120: 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  R;.  }.  z = sql
9130: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
9140: 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[1], a[0], a[1]
9150: 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76 5b  , argc>4 ? argv[
9160: 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54 63  4] : NULL);.  Tc
9170: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9180: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
9190: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
91a0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
91b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
91c0: 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  :  sqlite3_snpri
91d0: 6e 74 66 5f 73 74 72 20 49 4e 54 45 47 45 52 20  ntf_str INTEGER 
91e0: 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49  FORMAT INTEGER I
91f0: 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a 2a 2a  NTEGER STRING.**
9200: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
9210: 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65   with two intege
9220: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20  r arguments and 
9230: 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d  one string argum
9240: 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ent.*/.static in
9250: 74 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  t sqlite3_snprin
9260: 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20 2a  tf_str(.  void *
9270: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
9280: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
9290: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
92a0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
92b0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
92c0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
92d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
92e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
92f0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
9300: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
9310: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
9320: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
9330: 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a  .  int a[3], i;.
9340: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
9350: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 35  *z;.  if( argc<5
9360: 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a 20 20   || argc>6 ){.  
9370: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9380: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
9390: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
93a0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
93b0: 2c 0a 20 20 20 20 20 20 20 22 20 49 4e 54 20 46  ,.       " INT F
93c0: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f 53  ORMAT INT INT ?S
93d0: 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20  TRING?\"", 0);. 
93e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
93f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
9400: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
9410: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20 29  , argv[1], &n) )
9420: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9430: 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a  R;.  if( n<0 ){.
9440: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9450: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 20  sult(interp, "N 
9460: 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  must be non-nega
9470: 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  tive", 0);.    r
9480: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9490: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20  .  }.  for(i=3; 
94a0: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
94b0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
94c0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
94d0: 61 5b 69 2d 33 5d 29 20 29 20 72 65 74 75 72 6e  a[i-3]) ) return
94e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
94f0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    z = sqlite3_ma
9500: 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 73  lloc( n+1 );.  s
9510: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9520: 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c 20 61  n, z, argv[2], a
9530: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e  [0], a[1], argc>
9540: 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20 4e 55  4 ? argv[5] : NU
9550: 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  LL);.  Tcl_Appen
9560: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9570: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
9580: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
9590: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
95a0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
95b0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
95c0: 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  le FORMAT INTEGE
95d0: 52 20 49 4e 54 45 47 45 52 20 44 4f 55 42 4c 45  R INTEGER DOUBLE
95e0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
95f0: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
9600: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
9610: 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72  nd one double ar
9620: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
9630: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
9640: 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76  intf_double(.  v
9650: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
9660: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
9670: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
9680: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
9690: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
96a0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
96b0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
96c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
96d0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
96e0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
96f0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
9700: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
9710: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d  */.){.  int a[3]
9720: 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b  , i;.  double r;
9730: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
9740: 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  ( argc!=5 ){.   
9750: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9760: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
9770: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
9780: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
9790: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
97a0: 20 49 4e 54 20 49 4e 54 20 44 4f 55 42 4c 45 5c   INT INT DOUBLE\
97b0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
97c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
97d0: 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34  }.  for(i=2; i<4
97e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
97f0: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
9800: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69  p, argv[i], &a[i
9810: 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  -2]) ) return TC
9820: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
9830: 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65  f( Tcl_GetDouble
9840: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d  (interp, argv[4]
9850: 2c 20 26 72 29 20 29 20 72 65 74 75 72 6e 20 54  , &r) ) return T
9860: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20  CL_ERROR;.  z = 
9870: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9880: 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61  argv[1], a[0], a
9890: 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41  [1], r);.  Tcl_A
98a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
98b0: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
98c0: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
98d0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
98e0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
98f0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
9900: 73 63 61 6c 65 64 20 46 4f 52 4d 41 54 20 44 4f  scaled FORMAT DO
9910: 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a  UBLE DOUBLE.**.*
9920: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
9930: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75  ith a single dou
9940: 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  ble argument whi
9950: 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75 63  ch is the produc
9960: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20  t of the.** two 
9970: 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20  arguments given 
9980: 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20  above.  This is 
9990: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
99a0: 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e   overflow and un
99b0: 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c  derflow.** doubl
99c0: 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  es to test that 
99d0: 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74  they are convert
99e0: 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ed properly..*/.
99f0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
9a00: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
9a10: 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  d(.  void *NotUs
9a20: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
9a30: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
9a40: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
9a50: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
9a60: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
9a70: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
9a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9a90: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
9aa0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
9ab0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
9ac0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
9ad0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
9ae0: 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 5b  t i;.  double r[
9af0: 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  2];.  char *z;. 
9b00: 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b 0a   if( argc!=4 ){.
9b10: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9b20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
9b30: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
9b40: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
9b50: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
9b60: 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c  MAT DOUBLE DOUBL
9b70: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
9b80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9b90: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
9ba0: 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <4; i++){.    if
9bb0: 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28  ( Tcl_GetDouble(
9bc0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c  interp, argv[i],
9bd0: 20 26 72 5b 69 2d 32 5d 29 20 29 20 72 65 74 75   &r[i-2]) ) retu
9be0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9bf0: 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  }.  z = sqlite3_
9c00: 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c  mprintf(argv[1],
9c10: 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a 20 20 54   r[0]*r[1]);.  T
9c20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9c30: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
9c40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
9c50: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
9c60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
9c70: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
9c80: 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46 4f 52 4d  ntf_stronly FORM
9c90: 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20  AT STRING.**.** 
9ca0: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
9cb0: 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c  h a single doubl
9cc0: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
9cd0: 20 69 73 20 74 68 65 20 70 72 6f 64 75 63 74 20   is the product 
9ce0: 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72  of the.** two ar
9cf0: 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61 62  guments given ab
9d00: 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  ove.  This is us
9d10: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 6f  ed to generate o
9d20: 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65  verflow and unde
9d30: 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73  rflow.** doubles
9d40: 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 74 68   to test that th
9d50: 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  ey are converted
9d60: 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74   properly..*/.st
9d70: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
9d80: 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79  _mprintf_stronly
9d90: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
9da0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
9db0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
9dc0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
9dd0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
9de0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
9df0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
9e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9e10: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
9e20: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9e40: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
9e50: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ment */.){.  cha
9e60: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
9e70: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
9e80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9e90: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9ea0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9eb0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9ec0: 20 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49 4e    " FORMAT STRIN
9ed0: 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  G\"", 0);.    re
9ee0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9ef0: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
9f00: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
9f10: 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20 54  ], argv[2]);.  T
9f20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9f30: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
9f40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
9f50: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
9f60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
9f70: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
9f80: 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 20 46 4f  ntf_hexdouble FO
9f90: 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a 2a 20 43  RMAT HEX.**.** C
9fa0: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
9fb0: 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65   a single double
9fc0: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
9fd0: 69 73 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20  is derived from 
9fe0: 74 68 65 0a 2a 2a 20 68 65 78 61 64 65 63 69 6d  the.** hexadecim
9ff0: 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  al encoding of a
a000: 6e 20 49 45 45 45 20 64 6f 75 62 6c 65 2e 0a 2a  n IEEE double..*
a010: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
a020: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78  ite3_mprintf_hex
a030: 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a  double(.  void *
a040: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
a050: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
a060: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
a070: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
a080: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
a090: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
a0a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a0b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
a0c0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
a0d0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
a0e0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
a0f0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
a100: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 64 6f  .  char *z;.  do
a110: 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73 69 67 6e  uble r;.  unsign
a120: 65 64 20 69 6e 74 20 78 31 2c 20 78 32 3b 0a 20  ed int x1, x2;. 
a130: 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 64   sqlite_uint64 d
a140: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
a150: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
a160: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a170: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
a180: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
a190: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
a1a0: 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22  FORMAT STRING\""
a1b0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
a1c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a1d0: 20 20 69 66 28 20 73 73 63 61 6e 66 28 61 72 67    if( sscanf(arg
a1e0: 76 5b 32 5d 2c 20 22 25 30 38 78 25 30 38 78 22  v[2], "%08x%08x"
a1f0: 2c 20 26 78 32 2c 20 26 78 31 29 21 3d 32 20 29  , &x2, &x1)!=2 )
a200: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
a210: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a220: 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  2nd argument sho
a230: 75 6c 64 20 62 65 20 31 36 2d 63 68 61 72 61 63  uld be 16-charac
a240: 74 65 72 73 20 6f 66 20 68 65 78 22 2c 20 30 29  ters of hex", 0)
a250: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
a260: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 20  _ERROR;.  }.  d 
a270: 3d 20 78 32 3b 0a 20 20 64 20 3d 20 28 64 3c 3c  = x2;.  d = (d<<
a280: 33 32 29 20 2b 20 78 31 3b 0a 20 20 6d 65 6d 63  32) + x1;.  memc
a290: 70 79 28 26 72 2c 20 26 64 2c 20 73 69 7a 65 6f  py(&r, &d, sizeo
a2a0: 66 28 72 29 29 3b 0a 20 20 7a 20 3d 20 73 71 6c  f(r));.  z = sql
a2b0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
a2c0: 76 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f  v[1], r);.  Tcl_
a2d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a2e0: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
a2f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
a300: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
a310: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
a320: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
a330: 68 61 72 65 64 5f 63 61 63 68 65 20 3f 42 4f 4f  hared_cache ?BOO
a340: 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2f 0a 23 69 66 20  LEAN?.**.*/.#if 
a350: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a360: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
a370: 45 29 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  E).static int te
a380: 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  st_enable_shared
a390: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
a3a0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
a3b0: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
a3c0: 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
a3d0: 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
a3e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
a3f0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
a400: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
a410: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
a420: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a440: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
a450: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
a460: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
a470: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
a480: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
a490: 74 20 72 63 3b 0a 20 20 69 6e 74 20 65 6e 61 62  t rc;.  int enab
a4a0: 6c 65 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20  le;.  int ret = 
a4b0: 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
a4c0: 32 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a  2 && objc!=1 ){.
a4d0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
a4e0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
a4f0: 6f 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45 41 4e 3f  objv, "?BOOLEAN?
a500: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
a510: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a520: 72 65 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  ret = sqlite3Glo
a530: 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
a540: 43 61 63 68 65 45 6e 61 62 6c 65 64 3b 0a 0a 20  CacheEnabled;.. 
a550: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
a560: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
a570: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
a580: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
a590: 65 6e 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  enable) ){.     
a5a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a5b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
a5c0: 3d 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  = sqlite3_enable
a5d0: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 65 6e  _shared_cache(en
a5e0: 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  able);.    if( r
a5f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a600: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
a610: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
a620: 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74  r *)sqlite3ErrSt
a630: 72 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  r(rc), TCL_STATI
a640: 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  C);.      return
a650: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
a660: 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  }.  }.  Tcl_SetO
a670: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
a680: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
a690: 62 6a 28 72 65 74 29 29 3b 0a 20 20 72 65 74 75  bj(ret));.  retu
a6a0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
a6b0: 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  dif..../*.** Usa
a6c0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78 74 65  ge: sqlite3_exte
a6d0: 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
a6e0: 73 20 20 20 44 42 20 20 20 20 42 4f 4f 4c 45 41  s   DB    BOOLEA
a6f0: 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  N.**.*/.static i
a700: 6e 74 20 74 65 73 74 5f 65 78 74 65 6e 64 65 64  nt test_extended
a710: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 0a 20  _result_codes(. 
a720: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
a730: 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
a740: 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
a750: 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
a760: 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
a770: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
a780: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
a790: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
a7a0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
a7b0: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
a7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a7d0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a7e0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
a7f0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
a800: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
a810: 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65  ts */.){.  int e
a820: 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  nable;.  sqlite3
a830: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   *db;..  if( obj
a840: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
a850: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
a860: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
a870: 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20  B BOOLEAN");.   
a880: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a890: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
a8a0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
a8b0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
a8c0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
a8d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a8e0: 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
a8f0: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
a900: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
a910: 26 65 6e 61 62 6c 65 29 20 29 20 72 65 74 75 72  &enable) ) retur
a920: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
a930: 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
a940: 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 64 62 2c  result_codes(db,
a950: 20 65 6e 61 62 6c 65 29 3b 0a 20 20 72 65 74 75   enable);.  retu
a960: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
a970: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
a980: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  e3_libversion_nu
a990: 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  mber.**.*/.stati
a9a0: 63 20 69 6e 74 20 74 65 73 74 5f 6c 69 62 76 65  c int test_libve
a9b0: 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a 20 20  rsion_number(.  
a9c0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
a9d0: 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
a9e0: 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
a9f0: 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
aa00: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
aa10: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
aa20: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
aa30: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
aa40: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
aa50: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
aa60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
aa70: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
aa80: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
aa90: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
aaa0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
aab0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 53 65  s */.){.  Tcl_Se
aac0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
aad0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
aae0: 28 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  (sqlite3_libvers
aaf0: 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29 3b 0a  ion_number()));.
ab00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ab10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
ab20: 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
ab30: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 20 44  olumn_metadata D
ab40: 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65  B dbname tblname
ab50: 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f 0a 23   colname.**.*/.#
ab60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ab70: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
ab80: 41 54 41 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ATA.static int t
ab90: 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  est_table_column
aba0: 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 43 6c 69  _metadata(.  Cli
abb0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
abc0: 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
abd0: 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
abe0: 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
abf0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
ac00: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
ac10: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
ac20: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
ac30: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
ac40: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
ac50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ac60: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
ac70: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
ac80: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
ac90: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
aca0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
acb0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
acc0: 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63   *zDb;.  const c
acd0: 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 6f 6e  har *zTbl;.  con
ace0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20  st char *zCol;. 
acf0: 20 69 6e 74 20 72 63 3b 0a 20 20 54 63 6c 5f 4f   int rc;.  Tcl_O
ad00: 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f 6e  bj *pRet;..  con
ad10: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 74 79  st char *zDataty
ad20: 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pe;.  const char
ad30: 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20 20 69 6e   *zCollseq;.  in
ad40: 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 6e 74  t notnull;.  int
ad50: 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69   primarykey;.  i
ad60: 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  nt autoincrement
ad70: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
ad80: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
ad90: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
ada0: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62   1, objv, "DB db
adb0: 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c  name tblname col
adc0: 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72 65 74 75  name");.    retu
add0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ade0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
adf0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
ae00: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
ae10: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
ae20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ae30: 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
ae40: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
ae50: 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zTbl = Tcl_GetSt
ae60: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
ae70: 20 7a 43 6f 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zCol = Tcl_GetS
ae80: 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a  tring(objv[4]);.
ae90: 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 44  .  if( strlen(zD
aea0: 62 29 3d 3d 30 20 29 20 7a 44 62 20 3d 20 30 3b  b)==0 ) zDb = 0;
aeb0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
aec0: 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
aed0: 74 61 64 61 74 61 28 64 62 2c 20 7a 44 62 2c 20  tadata(db, zDb, 
aee0: 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a 20 20 20  zTbl, zCol, .   
aef0: 20 20 20 26 7a 44 61 74 61 74 79 70 65 2c 20 26     &zDatatype, &
af00: 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f 74 6e 75  zCollseq, &notnu
af10: 6c 6c 2c 20 26 70 72 69 6d 61 72 79 6b 65 79 2c  ll, &primarykey,
af20: 20 26 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29   &autoincrement)
af30: 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ;..  if( rc!=SQL
af40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
af50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
af60: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65  nterp, sqlite3_e
af70: 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20  rrmsg(db), 0);. 
af80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
af90: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74  ROR;.  }..  pRet
afa0: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
afb0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
afc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
afd0: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
afe0: 6e 67 4f 62 6a 28 7a 44 61 74 61 74 79 70 65 2c  ngObj(zDatatype,
aff0: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
b000: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
b010: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
b020: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 43 6f 6c  ewStringObj(zCol
b030: 6c 73 65 71 2c 20 2d 31 29 29 3b 0a 20 20 54 63  lseq, -1));.  Tc
b040: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b050: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
b060: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 6f  Tcl_NewIntObj(no
b070: 74 6e 75 6c 6c 29 29 3b 0a 20 20 54 63 6c 5f 4c  tnull));.  Tcl_L
b080: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
b090: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
b0a0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 72 69 6d 61  _NewIntObj(prima
b0b0: 72 79 6b 65 79 29 29 3b 0a 20 20 54 63 6c 5f 4c  rykey));.  Tcl_L
b0c0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
b0d0: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
b0e0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 75 74 6f 69  _NewIntObj(autoi
b0f0: 6e 63 72 65 6d 65 6e 74 29 29 3b 0a 20 20 54 63  ncrement));.  Tc
b100: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
b110: 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20  nterp, pRet);.. 
b120: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
b130: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
b140: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
b150: 43 52 42 4c 4f 42 0a 0a 2f 2a 0a 2a 2a 20 73 71  CRBLOB../*.** sq
b160: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20  lite3_blob_read 
b170: 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20   CHANNEL OFFSET 
b180: 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 63  N.**.**   This c
b190: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
b1a0: 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69 74  o test the sqlit
b1b0: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 20 69  e3_blob_read() i
b1c0: 6e 20 77 61 79 73 20 74 68 61 74 0a 2a 2a 20 20  n ways that.**  
b1d0: 20 74 68 65 20 54 63 6c 20 63 68 61 6e 6e 65 6c   the Tcl channel
b1e0: 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20   interface does 
b1f0: 6e 6f 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  not. The first a
b200: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 0a 2a  rgument should.*
b210: 2a 20 20 20 62 65 20 74 68 65 20 6e 61 6d 65 20  *   be the name 
b220: 6f 66 20 61 20 76 61 6c 69 64 20 63 68 61 6e 6e  of a valid chann
b230: 65 6c 20 63 72 65 61 74 65 64 20 62 79 20 74 68  el created by th
b240: 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d 65 74  e [incrblob] met
b250: 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61 20 64 61  hod.**   of a da
b260: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54  tabase handle. T
b270: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
b280: 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  ls sqlite3_blob_
b290: 72 65 61 64 28 29 0a 2a 2a 20 20 20 74 6f 20 72  read().**   to r
b2a0: 65 61 64 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  ead N bytes from
b2b0: 20 6f 66 66 73 65 74 20 4f 46 46 53 45 54 20 66   offset OFFSET f
b2c0: 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  rom the underlyi
b2d0: 6e 67 20 53 51 4c 69 74 65 0a 2a 2a 20 20 20 62  ng SQLite.**   b
b2e0: 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a 0a 2a  lob handle..**.*
b2f0: 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  *   On success, 
b300: 61 20 62 79 74 65 2d 61 72 72 61 79 20 6f 62 6a  a byte-array obj
b310: 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ect containing t
b320: 68 65 20 72 65 61 64 20 64 61 74 61 20 69 73 20  he read data is 
b330: 0a 2a 2a 20 20 20 72 65 74 75 72 6e 65 64 2e 20  .**   returned. 
b340: 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  On failure, the 
b350: 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73 75  interpreter resu
b360: 6c 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  lt is set to the
b370: 0a 2a 2a 20 20 20 74 65 78 74 20 72 65 70 72 65  .**   text repre
b380: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
b390: 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
b3a0: 63 6f 64 65 20 28 69 2e 65 2e 20 22 53 51 4c 49  code (i.e. "SQLI
b3b0: 54 45 5f 4e 4f 4d 45 4d 22 29 0a 2a 2a 20 20 20  TE_NOMEM").**   
b3c0: 61 6e 64 20 61 20 54 63 6c 20 65 78 63 65 70 74  and a Tcl except
b3d0: 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a  ion is thrown..*
b3e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
b3f0: 74 5f 62 6c 6f 62 5f 72 65 61 64 28 0a 20 20 43  t_blob_read(.  C
b400: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
b410: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
b420: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
b430: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
b440: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
b450: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
b460: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
b470: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
b480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b490: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
b4a0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
b4b0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
b4c0: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
b4d0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43  ts */.){.  Tcl_C
b4e0: 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a  hannel channel;.
b4f0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
b500: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 73 71 6c  tanceData;.  sql
b510: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
b520: 3b 0a 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b  ;.  int notUsed;
b530: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
b540: 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 75  int iOffset;.  u
b550: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42  nsigned char *zB
b560: 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  uf;.  int rc;.  
b570: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
b580: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
b590: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
b5a0: 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c  , objv, "CHANNEL
b5b0: 20 4f 46 46 53 45 54 20 4e 22 29 3b 0a 20 20 20   OFFSET N");.   
b5c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b5d0: 52 3b 0a 20 20 7d 0a 0a 20 20 63 68 61 6e 6e 65  R;.  }..  channe
b5e0: 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  l = Tcl_GetChann
b5f0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
b600: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
b610: 29 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  ), &notUsed);.  
b620: 69 66 28 20 21 63 68 61 6e 6e 65 6c 0a 20 20 20  if( !channel.   
b630: 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  || TCL_OK!=Tcl_G
b640: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
b650: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
b660: 4f 66 66 73 65 74 29 0a 20 20 20 7c 7c 20 54 43  Offset).   || TC
b670: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
b680: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b690: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 79 74 65 29  objv[3], &nByte)
b6a0: 0a 20 20 20 7c 7c 20 6e 42 79 74 65 3c 30 20 7c  .   || nByte<0 |
b6b0: 7c 20 69 4f 66 66 73 65 74 3c 30 0a 20 20 29 7b  | iOffset<0.  ){
b6c0: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c   .    return TCL
b6d0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
b6e0: 6e 73 74 61 6e 63 65 44 61 74 61 20 3d 20 54 63  nstanceData = Tc
b6f0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
b700: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 6e 65 6c  anceData(channel
b710: 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 2a 28 28  );.  pBlob = *((
b720: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29  sqlite3_blob **)
b730: 69 6e 73 74 61 6e 63 65 44 61 74 61 29 3b 0a 0a  instanceData);..
b740: 20 20 7a 42 75 66 20 3d 20 28 75 6e 73 69 67 6e    zBuf = (unsign
b750: 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 41 6c  ed char *)Tcl_Al
b760: 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 72 63  loc(nByte);.  rc
b770: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
b780: 72 65 61 64 28 70 42 6c 6f 62 2c 20 7a 42 75 66  read(pBlob, zBuf
b790: 2c 20 6e 42 79 74 65 2c 20 69 4f 66 66 73 65 74  , nByte, iOffset
b7a0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
b7b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
b7c0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
b7d0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79  nterp, Tcl_NewBy
b7e0: 74 65 41 72 72 61 79 4f 62 6a 28 7a 42 75 66 2c  teArrayObj(zBuf,
b7f0: 20 6e 42 79 74 65 29 29 3b 0a 20 20 7d 65 6c 73   nByte));.  }els
b800: 65 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  e{.    Tcl_SetRe
b810: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
b820: 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74  ar *)sqlite3Test
b830: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
b840: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
b850: 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  }.  Tcl_Free((ch
b860: 61 72 20 2a 29 7a 42 75 66 29 3b 0a 0a 20 20 72  ar *)zBuf);..  r
b870: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
b880: 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20  E_OK ? TCL_OK : 
b890: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 2f  TCL_ERROR);.}../
b8a0: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f  *.** sqlite3_blo
b8b0: 62 5f 77 72 69 74 65 20 43 48 41 4e 4e 45 4c 20  b_write CHANNEL 
b8c0: 4f 46 46 53 45 54 20 44 41 54 41 20 3f 4e 44 41  OFFSET DATA ?NDA
b8d0: 54 41 3f 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  TA?.**.**   This
b8e0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
b8f0: 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c   to test the sql
b900: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28  ite3_blob_write(
b910: 29 20 69 6e 20 77 61 79 73 20 74 68 61 74 0a 2a  ) in ways that.*
b920: 2a 20 20 20 74 68 65 20 54 63 6c 20 63 68 61 6e  *   the Tcl chan
b930: 6e 65 6c 20 69 6e 74 65 72 66 61 63 65 20 64 6f  nel interface do
b940: 65 73 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73  es not. The firs
b950: 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  t argument shoul
b960: 64 0a 2a 2a 20 20 20 62 65 20 74 68 65 20 6e 61  d.**   be the na
b970: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 20 63 68  me of a valid ch
b980: 61 6e 6e 65 6c 20 63 72 65 61 74 65 64 20 62 79  annel created by
b990: 20 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20   the [incrblob] 
b9a0: 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61  method.**   of a
b9b0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
b9c0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
b9d0: 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c  calls sqlite3_bl
b9e0: 6f 62 5f 77 72 69 74 65 28 29 0a 2a 2a 20 20 20  ob_write().**   
b9f0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 44 41 54  to write the DAT
ba00: 41 20 62 79 74 65 2d 61 72 72 61 79 20 74 6f 20  A byte-array to 
ba10: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 53  the underlying S
ba20: 51 4c 69 74 65 20 62 6c 6f 62 20 68 61 6e 64 6c  QLite blob handl
ba30: 65 2e 0a 2a 2a 20 20 20 61 74 20 6f 66 66 73 65  e..**   at offse
ba40: 74 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  t OFFSET..**.** 
ba50: 20 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 6e    On success, an
ba60: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73   empty string is
ba70: 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e 20 66 61   returned. On fa
ba80: 69 6c 75 72 65 2c 20 74 68 65 20 69 6e 74 65 72  ilure, the inter
ba90: 70 72 65 74 65 72 0a 2a 2a 20 20 20 72 65 73 75  preter.**   resu
baa0: 6c 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  lt is set to the
bab0: 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
bac0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 74 75  tion of the retu
bad0: 72 6e 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20  rned error code 
bae0: 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 22 53 51 4c  .**   (i.e. "SQL
baf0: 49 54 45 5f 4e 4f 4d 45 4d 22 29 20 61 6e 64 20  ITE_NOMEM") and 
bb00: 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 20  a Tcl exception 
bb10: 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73 74  is thrown..*/.st
bb20: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c  atic int test_bl
bb30: 6f 62 5f 77 72 69 74 65 28 0a 20 20 43 6c 69 65  ob_write(.  Clie
bb40: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
bb50: 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a  a, /* Not used *
bb60: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
bb70: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
bb80: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
bb90: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
bba0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
bbb0: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
bbc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
bbd0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
bbe0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
bbf0: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
bc00: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
bc10: 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 68 61 6e  */.){.  Tcl_Chan
bc20: 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20 43  nel channel;.  C
bc30: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
bc40: 63 65 44 61 74 61 3b 0a 20 20 73 71 6c 69 74 65  ceData;.  sqlite
bc50: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20  3_blob *pBlob;. 
bc60: 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20   int notUsed;.  
bc70: 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69  int iOffset;.  i
bc80: 6e 74 20 72 63 3b 0a 0a 20 20 75 6e 73 69 67 6e  nt rc;..  unsign
bc90: 65 64 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20  ed char *zBuf;. 
bca0: 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20 0a 20 20   int nBuf;.  .  
bcb0: 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f  if( objc!=4 && o
bcc0: 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
bcd0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
bce0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
bcf0: 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20  "CHANNEL OFFSET 
bd00: 44 41 54 41 20 3f 4e 44 41 54 41 3f 22 29 3b 0a  DATA ?NDATA?");.
bd10: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
bd20: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 63 68 61  RROR;.  }..  cha
bd30: 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68  nnel = Tcl_GetCh
bd40: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
bd50: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
bd60: 5b 31 5d 29 2c 20 26 6e 6f 74 55 73 65 64 29 3b  [1]), &notUsed);
bd70: 0a 20 20 69 66 28 20 21 63 68 61 6e 6e 65 6c 20  .  if( !channel 
bd80: 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  || TCL_OK!=Tcl_G
bd90: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
bda0: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
bdb0: 4f 66 66 73 65 74 29 20 29 7b 20 0a 20 20 20 20  Offset) ){ .    
bdc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bdd0: 3b 0a 20 20 7d 0a 0a 20 20 69 6e 73 74 61 6e 63  ;.  }..  instanc
bde0: 65 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 43  eData = Tcl_GetC
bdf0: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
be00: 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 70  ta(channel);.  p
be10: 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69 74 65  Blob = *((sqlite
be20: 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74 61 6e  3_blob **)instan
be30: 63 65 44 61 74 61 29 3b 0a 0a 20 20 7a 42 75 66  ceData);..  zBuf
be40: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
be50: 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
be60: 33 5d 2c 20 26 6e 42 75 66 29 3b 0a 20 20 69 66  3], &nBuf);.  if
be70: 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 54 63 6c  ( objc==5 && Tcl
be80: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
be90: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
bea0: 26 6e 42 75 66 29 20 29 7b 0a 20 20 20 20 72 65  &nBuf) ){.    re
beb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bec0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
bed0: 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42  e3_blob_write(pB
bee0: 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42 75 66 2c  lob, zBuf, nBuf,
bef0: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69 66 28   iOffset);.  if(
bf00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
bf10: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
bf20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
bf30: 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74 45  r *)sqlite3TestE
bf40: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
bf50: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d  L_VOLATILE);.  }
bf60: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
bf70: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f  SQLITE_OK ? TCL_
bf80: 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b  OK : TCL_ERROR);
bf90: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
bfa0: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
bfb0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
bfc0: 5f 76 32 20 44 42 2d 48 41 4e 44 4c 45 20 4e 41  _v2 DB-HANDLE NA
bfd0: 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d  ME CMP-PROC DEL-
bfe0: 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  PROC.**.**   Thi
bff0: 73 20 54 63 6c 20 70 72 6f 63 20 69 73 20 75 73  s Tcl proc is us
c000: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74  ed for testing t
c010: 68 65 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a  he experimental.
c020: 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  **   sqlite3_cre
c030: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c040: 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  () interface..*/
c050: 0a 73 74 72 75 63 74 20 54 65 73 74 43 6f 6c 6c  .struct TestColl
c060: 61 74 69 6f 6e 58 20 7b 0a 20 20 54 63 6c 5f 49  ationX {.  Tcl_I
c070: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
c080: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 70 3b 0a   Tcl_Obj *pCmp;.
c090: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 6c 3b    Tcl_Obj *pDel;
c0a0: 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  .};.typedef stru
c0b0: 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  ct TestCollation
c0c0: 58 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58  X TestCollationX
c0d0: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  ;.static void te
c0e0: 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  stCreateCollatio
c0f0: 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43 74 78 29  nDel(void *pCtx)
c100: 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  {.  TestCollatio
c110: 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c  nX *p = (TestCol
c120: 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a  lationX *)pCtx;.
c130: 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f  .  int rc = Tcl_
c140: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
c150: 65 72 70 2c 20 70 2d 3e 70 44 65 6c 2c 20 54 43  erp, p->pDel, TC
c160: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43  L_EVAL_DIRECT|TC
c170: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a  L_EVAL_GLOBAL);.
c180: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
c190: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b   ){.    Tcl_Back
c1a0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69  groundError(p->i
c1b0: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20 54  nterp);.  }..  T
c1c0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
c1d0: 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f  p->pCmp);.  Tcl_
c1e0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
c1f0: 70 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  pDel);.  sqlite3
c200: 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29 70 29  _free((void *)p)
c210: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ;.}.static int t
c220: 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69  estCreateCollati
c230: 6f 6e 43 6d 70 28 0a 20 20 76 6f 69 64 20 2a 70  onCmp(.  void *p
c240: 43 74 78 2c 0a 20 20 69 6e 74 20 6e 4c 65 66 74  Ctx,.  int nLeft
c250: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
c260: 7a 4c 65 66 74 2c 0a 20 20 69 6e 74 20 6e 52 69  zLeft,.  int nRi
c270: 67 68 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  ght,.  const voi
c280: 64 20 2a 7a 52 69 67 68 74 0a 29 7b 0a 20 20 54  d *zRight.){.  T
c290: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70  estCollationX *p
c2a0: 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f   = (TestCollatio
c2b0: 6e 58 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  nX *)pCtx;.  Tcl
c2c0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20  _Obj *pScript = 
c2d0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
c2e0: 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 69 6e 74  (p->pCmp);.  int
c2f0: 20 69 52 65 73 20 3d 20 30 3b 0a 0a 20 20 54 63   iRes = 0;..  Tc
c300: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
c310: 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c  Script);.  Tcl_L
c320: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
c330: 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20  ent(0, pScript, 
c340: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
c350: 28 28 63 68 61 72 20 2a 29 7a 4c 65 66 74 2c 20  ((char *)zLeft, 
c360: 6e 4c 65 66 74 29 29 3b 0a 20 20 54 63 6c 5f 4c  nLeft));.  Tcl_L
c370: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
c380: 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20  ent(0, pScript, 
c390: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
c3a0: 28 28 63 68 61 72 20 2a 29 7a 52 69 67 68 74 2c  ((char *)zRight,
c3b0: 6e 52 69 67 68 74 29 29 3b 0a 0a 20 20 69 66 28  nRight));..  if(
c3c0: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61   TCL_OK!=Tcl_Eva
c3d0: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
c3e0: 2c 20 70 53 63 72 69 70 74 2c 20 54 43 4c 5f 45  , pScript, TCL_E
c3f0: 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45  VAL_DIRECT|TCL_E
c400: 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20 20 20 7c  VAL_GLOBAL).   |
c410: 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  | TCL_OK!=Tcl_Ge
c420: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 70 2d 3e 69  tIntFromObj(p->i
c430: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 4f 62  nterp, Tcl_GetOb
c440: 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  jResult(p->inter
c450: 70 29 2c 20 26 69 52 65 73 29 0a 20 20 29 7b 0a  p), &iRes).  ){.
c460: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
c470: 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72  ndError(p->inter
c480: 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65  p);.  }.  Tcl_De
c490: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
c4a0: 70 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 69  pt);..  return i
c4b0: 52 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  Res;.}.static in
c4c0: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f  t test_create_co
c4d0: 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c  llation_v2(.  Cl
c4e0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
c4f0: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
c500: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
c510: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
c520: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
c530: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
c540: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
c550: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
c560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c570: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
c580: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
c590: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
c5a0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
c5b0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 65 73 74 43 6f  s */.){.  TestCo
c5c0: 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a 20 20 73  llationX *p;.  s
c5d0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
c5e0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
c5f0: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
c600: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
c610: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
c620: 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20 43 4d  B-HANDLE NAME CM
c630: 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f 43 22  P-PROC DEL-PROC"
c640: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c650: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
c660: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
c670: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
c680: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
c690: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
c6a0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 20 3d 20  L_ERROR;..  p = 
c6b0: 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20  (TestCollationX 
c6c0: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
c6d0: 28 73 69 7a 65 6f 66 28 54 65 73 74 43 6f 6c 6c  (sizeof(TestColl
c6e0: 61 74 69 6f 6e 58 29 29 3b 0a 20 20 70 2d 3e 70  ationX));.  p->p
c6f0: 43 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20  Cmp = objv[3];. 
c700: 20 70 2d 3e 70 44 65 6c 20 3d 20 6f 62 6a 76 5b   p->pDel = objv[
c710: 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20  4];.  p->interp 
c720: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f  = interp;.  Tcl_
c730: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  IncrRefCount(p->
c740: 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  pCmp);.  Tcl_Inc
c750: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65  rRefCount(p->pDe
c760: 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  l);..  rc = sqli
c770: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
c780: 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63 6c 5f  tion_v2(db, Tcl_
c790: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
c7a0: 5d 29 2c 20 31 36 2c 20 0a 20 20 20 20 20 20 28  ]), 16, .      (
c7b0: 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74 43 72  void *)p, testCr
c7c0: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70  eateCollationCmp
c7d0: 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c  , testCreateColl
c7e0: 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20  ationDel.  );.  
c7f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d  if( rc!=SQLITE_M
c800: 49 53 55 53 45 20 29 7b 0a 20 20 20 20 54 63 6c  ISUSE ){.    Tcl
c810: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
c820: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 63  terp, "sqlite3_c
c830: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 65 5f 76 32  reate_collate_v2
c840: 28 29 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  () failed to det
c850: 65 63 74 20 22 0a 20 20 20 20 20 20 22 61 6e 20  ect ".      "an 
c860: 69 6e 76 61 6c 69 64 20 65 6e 63 6f 64 69 6e 67  invalid encoding
c870: 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
c880: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c890: 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
c8a0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
c8b0: 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54  llation_v2(db, T
c8c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
c8d0: 76 5b 32 5d 29 2c 20 53 51 4c 49 54 45 5f 55 54  v[2]), SQLITE_UT
c8e0: 46 38 2c 20 0a 20 20 20 20 20 20 28 76 6f 69 64  F8, .      (void
c8f0: 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61 74 65   *)p, testCreate
c900: 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20 74 65  CollationCmp, te
c910: 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  stCreateCollatio
c920: 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 72 65 74 75  nDel.  );.  retu
c930: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
c940: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
c950: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
c960: 6e 20 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45  n DB-HANDLE FILE
c970: 20 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69   ?PROC?.*/.stati
c980: 63 20 69 6e 74 20 74 65 73 74 5f 6c 6f 61 64 5f  c int test_load_
c990: 65 78 74 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69  extension(.  Cli
c9a0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
c9b0: 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  ta, /* Not used 
c9c0: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
c9d0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
c9e0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
c9f0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
ca00: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
ca10: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
ca20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ca30: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
ca40: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
ca50: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
ca60: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
ca70: 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64   */.){.  Tcl_Cmd
ca80: 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
ca90: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
caa0: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
cab0: 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  Db;.  char *zFil
cac0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 63  e;.  char *zProc
cad0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45   = 0;.  char *zE
cae0: 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  rr = 0;..  if( o
caf0: 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d  bjc!=4 && objc!=
cb00: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
cb10: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
cb20: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48  , 1, objv, "DB-H
cb30: 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43  ANDLE FILE ?PROC
cb40: 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
cb50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
cb60: 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
cb70: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
cb80: 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
cb90: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
cba0: 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  .  if( objc==4 )
cbb0: 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 54 63  {.    zProc = Tc
cbc0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
cbd0: 5b 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  [3]);.  }..  /* 
cbe0: 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64 61  Extract the C da
cbf0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72  tabase handle fr
cc00: 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61  om the Tcl comma
cc10: 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28  nd name */.  if(
cc20: 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
cc30: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62  Info(interp, zDb
cc40: 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
cc50: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
cc60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
cc70: 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
cc80: 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30  ", zDb, (char*)0
cc90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
cca0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64  L_ERROR;.  }.  d
ccb0: 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c  b = ((struct Sql
ccc0: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
ccd0: 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64  bjClientData)->d
cce0: 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b  b;.  assert(db);
ccf0: 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20  ..  /* Call the 
cd00: 75 6e 64 65 72 6c 79 69 6e 67 20 43 20 66 75 6e  underlying C fun
cd10: 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72  ction. If an err
cd20: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 72  or occurs, set r
cd30: 63 20 74 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45  c to .  ** TCL_E
cd40: 52 52 4f 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e  RROR and load an
cd50: 79 20 65 72 72 6f 72 20 73 74 72 69 6e 67 20 69  y error string i
cd60: 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65  nto the interpre
cd70: 74 65 72 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a  ter. If no .  **
cd80: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
cd90: 65 74 20 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e  et rc to TCL_OK.
cda0: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
cdb0: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
cdc0: 54 45 4e 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53  TENSION.  rc = S
cdd0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a  QLITE_ERROR;.  z
cde0: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
cdf0: 72 69 6e 74 66 28 22 74 68 69 73 20 62 75 69 6c  rintf("this buil
ce00: 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33 5f  d omits sqlite3_
ce10: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29  load_extension()
ce20: 22 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d  ");.#else.  rc =
ce30: 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78   sqlite3_load_ex
ce40: 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a 46 69 6c  tension(db, zFil
ce50: 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 29  e, zProc, &zErr)
ce60: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  ;.#endif.  if( r
ce70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ce80: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
ce90: 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 20 3f  t(interp, zErr ?
cea0: 20 7a 45 72 72 20 3a 20 22 22 2c 20 54 43 4c 5f   zErr : "", TCL_
ceb0: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
cec0: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
ced0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
cee0: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73   TCL_OK;.  }.  s
cef0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
cf00: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
cf10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
cf20: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
cf30: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44  load_extension D
cf40: 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 0a 2a  B-HANDLE ONOFF.*
cf50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
cf60: 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 28 0a 20  t_enable_load(. 
cf70: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
cf80: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
cf90: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
cfa0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
cfb0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
cfc0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
cfd0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
cfe0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d000: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
d010: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
d020: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
d030: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
d040: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
d050: 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f  _CmdInfo cmdInfo
d060: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
d070: 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  .  char *zDb;.  
d080: 69 6e 74 20 6f 6e 6f 66 66 3b 0a 0a 20 20 69 66  int onoff;..  if
d090: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
d0a0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
d0b0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
d0c0: 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4f 4e  v, "DB-HANDLE ON
d0d0: 4f 46 46 22 29 3b 0a 20 20 20 20 72 65 74 75 72  OFF");.    retur
d0e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
d0f0: 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74  .  zDb = Tcl_Get
d100: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
d110: 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74  ..  /* Extract t
d120: 68 65 20 43 20 64 61 74 61 62 61 73 65 20 68 61  he C database ha
d130: 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 54 63  ndle from the Tc
d140: 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a  l command name *
d150: 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74  /.  if( !Tcl_Get
d160: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
d170: 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66  rp, zDb, &cmdInf
d180: 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  o) ){.    Tcl_Ap
d190: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d1a0: 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20  p, "command not 
d1b0: 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28  found: ", zDb, (
d1c0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
d1d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d1e0: 20 20 7d 0a 20 20 64 62 20 3d 20 28 28 73 74 72    }.  db = ((str
d1f0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
d200: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
d210: 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65  ata)->db;.  asse
d220: 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65  rt(db);..  /* Ge
d230: 74 20 74 68 65 20 6f 6e 6f 66 66 20 70 61 72 61  t the onoff para
d240: 6d 65 74 65 72 20 2a 2f 0a 20 20 69 66 28 20 54  meter */.  if( T
d250: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
d260: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
d270: 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b  v[2], &onoff) ){
d280: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
d290: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66 64  ERROR;.  }..#ifd
d2a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
d2b0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
d2c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d2d0: 28 69 6e 74 65 72 70 2c 20 22 74 68 69 73 20 62  (interp, "this b
d2e0: 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74  uild omits sqlit
d2f0: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
d300: 6e 28 29 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  n()");.  return 
d310: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
d320: 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  .  sqlite3_enabl
d330: 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
d340: 28 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 72  (db, onoff);.  r
d350: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65  eturn TCL_OK;.#e
d360: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  ndif.}../*.** Us
d370: 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 61 62 6f  age:  sqlite_abo
d380: 72 74 0a 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  rt.**.** Shutdow
d390: 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 6d  n the process im
d3a0: 6d 65 64 69 61 74 65 6c 79 2e 20 20 54 68 69 73  mediately.  This
d3b0: 20 69 73 20 6e 6f 74 20 61 20 63 6c 65 61 6e 20   is not a clean 
d3c0: 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69  shutdown..** Thi
d3d0: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  s command is use
d3e0: 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 72 65  d to test the re
d3f0: 63 6f 76 65 72 61 62 69 6c 69 74 79 20 6f 66 20  coverability of 
d400: 61 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a  a database in.**
d410: 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
d420: 70 72 6f 67 72 61 6d 20 63 72 61 73 68 2e 0a 2a  program crash..*
d430: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
d440: 69 74 65 5f 61 62 6f 72 74 28 0a 20 20 76 6f 69  ite_abort(.  voi
d450: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
d460: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
d470: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
d480: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
d490: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
d4a0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
d4b0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
d4c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
d4d0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
d4e0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
d4f0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
d500: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
d510: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 6e  .){.  assert( in
d520: 74 65 72 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  terp==0 );   /* 
d530: 54 68 69 73 20 77 69 6c 6c 20 61 6c 77 61 79 73  This will always
d540: 20 66 61 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72   fail */.  retur
d550: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
d560: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d570: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 75 73   routine is a us
d580: 65 72 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66  er-defined SQL f
d590: 75 6e 63 74 69 6f 6e 20 77 68 6f 73 65 20 70 75  unction whose pu
d5a0: 72 70 6f 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74  rpose.** is to t
d5b0: 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 5f 73  est the sqlite_s
d5c0: 65 74 5f 72 65 73 75 6c 74 28 29 20 41 50 49 2e  et_result() API.
d5d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d5e0: 74 65 73 74 46 75 6e 63 28 73 71 6c 69 74 65 33  testFunc(sqlite3
d5f0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
d600: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
d610: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
d620: 76 29 7b 0a 20 20 77 68 69 6c 65 28 20 61 72 67  v){.  while( arg
d630: 63 3e 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73  c>=2 ){.    cons
d640: 74 20 63 68 61 72 20 2a 7a 41 72 67 30 20 3d 20  t char *zArg0 = 
d650: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
d660: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
d670: 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67  ]);.    if( zArg
d680: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30  0 ){.      if( 0
d690: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
d6a0: 28 7a 41 72 67 30 2c 20 22 69 6e 74 22 29 20 29  (zArg0, "int") )
d6b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d6c0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
d6d0: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
d6e0: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
d6f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
d700: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
d710: 70 28 7a 41 72 67 30 2c 22 69 6e 74 36 34 22 29  p(zArg0,"int64")
d720: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
d730: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
d740: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  t64(context, sql
d750: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
d760: 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20  (argv[1]));.    
d770: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
d780: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
d790: 2c 22 73 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b  ,"string")==0 ){
d7a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d7b0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
d7c0: 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73 71 6c  text, (char*)sql
d7d0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
d7e0: 61 72 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20  argv[1]), -1,.  
d7f0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
d800: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
d810: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
d820: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
d830: 30 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29  0,"double")==0 )
d840: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d850: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
d860: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
d870: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
d880: 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d  gv[1]));.      }
d890: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
d8a0: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e  StrICmp(zArg0,"n
d8b0: 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ull")==0 ){.    
d8c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
d8d0: 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29  lt_null(context)
d8e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
d8f0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
d900: 28 7a 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d  (zArg0,"value")=
d910: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
d920: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
d930: 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  ue(context, argv
d940: 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69  [sqlite3_value_i
d950: 6e 74 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20  nt(argv[1])]);. 
d960: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d970: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
d980: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
d990: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74  }else{.      got
d9a0: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
d9b0: 20 7d 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32   }.    argc -= 2
d9c0: 3b 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b  ;.    argv += 2;
d9d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  .  }.  return;..
d9e0: 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  error_out:.  sql
d9f0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
da00: 72 28 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74  r(context,"first
da10: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
da20: 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20   be one of: ".  
da30: 20 20 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73      "int int64 s
da40: 74 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c  tring double nul
da50: 6c 20 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d  l value", -1);.}
da60: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
da70: 20 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72   sqlite_register
da80: 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20  _test_function  
da90: 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  DB  NAME.**.** R
daa0: 65 67 69 73 74 65 72 20 74 68 65 20 74 65 73 74  egister the test
dab0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e   SQL function on
dac0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42   the database DB
dad0: 20 75 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20   under the name 
dae0: 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NAME..*/.static 
daf0: 69 6e 74 20 74 65 73 74 5f 72 65 67 69 73 74 65  int test_registe
db00: 72 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  r_func(.  void *
db10: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
db20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
db30: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
db40: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
db50: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
db60: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
db70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
db80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
db90: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
dba0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
dbb0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
dbc0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
dbd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
dbe0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
dbf0: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
dc00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
dc10: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
dc20: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
dc30: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
dc40: 20 20 20 20 20 20 20 22 20 44 42 20 46 55 4e 43         " DB FUNC
dc50: 54 49 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a  TION-NAME", 0);.
dc60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dc70: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
dc80: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
dc90: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
dca0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
dcb0: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
dcc0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
dcd0: 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32  ction(db, argv[2
dce0: 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ], -1, SQLITE_UT
dcf0: 46 38 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65  F8, 0, .      te
dd00: 73 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  stFunc, 0, 0);. 
dd10: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
dd20: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
dd30: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
dd40: 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29  e3ErrStr(rc), 0)
dd50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
dd60: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
dd70: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
dd80: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
dd90: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
dda0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
ddb0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
ddc0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
ddd0: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d  e3_finalize  STM
dde0: 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a  T .**.** Finaliz
ddf0: 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61  e a statement ha
de00: 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
de10: 69 6e 74 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a  int test_finaliz
de20: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
de30: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
de40: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
de50: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
de60: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
de70: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
de80: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
de90: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
dea0: 2a 64 62 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  *db = 0;..  if( 
deb0: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
dec0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ded0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
dee0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
def0: 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
df00: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
df10: 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
df20: 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20  " <STMT>", 0);. 
df30: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
df40: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
df50: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
df60: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
df70: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
df80: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
df90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66  TCL_ERROR;..  if
dfa0: 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 64  ( pStmt ){.    d
dfb0: 62 20 3d 20 53 74 6d 74 54 6f 44 62 28 70 53 74  b = StmtToDb(pSt
dfc0: 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  mt);.  }.  rc = 
dfd0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
dfe0: 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53  (pStmt);.  Tcl_S
dff0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
e000: 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
e010: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
e020: 41 54 49 43 29 3b 0a 20 20 69 66 28 20 64 62 20  ATIC);.  if( db 
e030: 26 26 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  && sqlite3TestEr
e040: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
e050: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
e060: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
e070: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
e080: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
e090: 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 20  te3_stmt_status 
e0a0: 20 53 54 4d 54 20 20 43 4f 44 45 20 20 52 45 53   STMT  CODE  RES
e0b0: 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 47 65 74  ETFLAG.**.** Get
e0c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
e0d0: 73 74 61 74 75 73 20 63 6f 75 6e 74 65 72 20 66  status counter f
e0e0: 72 6f 6d 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  rom a statement.
e0f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
e100: 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  est_stmt_status(
e110: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
e120: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
e130: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
e140: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
e150: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
e160: 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 3b  ){.  int iValue;
e170: 0a 20 20 69 6e 74 20 69 2c 20 6f 70 2c 20 72 65  .  int i, op, re
e180: 73 65 74 46 6c 61 67 3b 0a 20 20 63 6f 6e 73 74  setFlag;.  const
e190: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a   char *zOpName;.
e1a0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
e1b0: 70 53 74 6d 74 3b 0a 0a 20 20 73 74 61 74 69 63  pStmt;..  static
e1c0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
e1d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e1e0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6f  zName;.    int o
e1f0: 70 3b 0a 20 20 7d 20 61 4f 70 5b 5d 20 3d 20 7b  p;.  } aOp[] = {
e200: 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53  .    { "SQLITE_S
e210: 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
e220: 41 4e 5f 53 54 45 50 22 2c 20 20 20 53 51 4c 49  AN_STEP",   SQLI
e230: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
e240: 4c 4c 53 43 41 4e 5f 53 54 45 50 20 20 20 7d 2c  LLSCAN_STEP   },
e250: 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53  .    { "SQLITE_S
e260: 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 22 2c  TMTSTATUS_SORT",
e270: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
e280: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
e290: 52 54 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  RT            },
e2a0: 0a 20 20 7d 3b 0a 20 20 69 66 28 20 6f 62 6a 63  .  };.  if( objc
e2b0: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
e2c0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
e2d0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
e2e0: 4d 54 20 50 41 52 41 4d 45 54 45 52 20 52 45 53  MT PARAMETER RES
e2f0: 45 54 46 4c 41 47 22 29 3b 0a 20 20 20 20 72 65  ETFLAG");.    re
e300: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e310: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
e320: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
e330: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
e340: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
e350: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
e360: 52 4f 52 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d  ROR;.  zOpName =
e370: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
e380: 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[2]);.  for(i
e390: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
e3a0: 61 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aOp); i++){.    
e3b0: 69 66 28 20 73 74 72 63 6d 70 28 61 4f 70 5b 69  if( strcmp(aOp[i
e3c0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4f 70 4e 61 6d 65  ].zName, zOpName
e3d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 70  )==0 ){.      op
e3e0: 20 3d 20 61 4f 70 5b 69 5d 2e 6f 70 3b 0a 20 20   = aOp[i].op;.  
e3f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e400: 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 41 72  .  }.  if( i>=Ar
e410: 72 61 79 53 69 7a 65 28 61 4f 70 29 20 29 7b 0a  raySize(aOp) ){.
e420: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
e430: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
e440: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 70 29 20  , objv[2], &op) 
e450: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
e460: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
e470: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
e480: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
e490: 5b 33 5d 2c 20 26 72 65 73 65 74 46 6c 61 67 29  [3], &resetFlag)
e4a0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
e4b0: 52 4f 52 3b 0a 20 20 69 56 61 6c 75 65 20 3d 20  ROR;.  iValue = 
e4c0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
e4d0: 74 75 73 28 70 53 74 6d 74 2c 20 6f 70 2c 20 72  tus(pStmt, op, r
e4e0: 65 73 65 74 46 6c 61 67 29 3b 0a 20 20 54 63 6c  esetFlag);.  Tcl
e4f0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
e500: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
e510: 4f 62 6a 28 69 56 61 6c 75 65 29 29 3b 0a 20 20  Obj(iValue));.  
e520: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
e530: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
e540: 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d  sqlite3_next_stm
e550: 74 20 20 44 42 20 20 53 54 4d 54 0a 2a 2a 0a 2a  t  DB  STMT.**.*
e560: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * Return the nex
e570: 74 20 73 74 61 74 6d 65 6e 74 20 69 6e 20 73 65  t statment in se
e580: 71 75 65 6e 63 65 20 61 66 74 65 72 20 53 54 4d  quence after STM
e590: 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
e5a0: 20 74 65 73 74 5f 6e 65 78 74 5f 73 74 6d 74 28   test_next_stmt(
e5b0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
e5c0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
e5d0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
e5e0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
e5f0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
e600: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
e610: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 73 71 6c 69  t *pStmt;.  sqli
e620: 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20 63  te3 *db = 0;.  c
e630: 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20  har zBuf[50];.. 
e640: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
e650: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
e660: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
e670: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
e680: 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
e690: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
e6a0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
e6b0: 20 30 29 2c 20 22 20 44 42 20 53 54 4d 54 22 2c   0), " DB STMT",
e6c0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
e6d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
e6e0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
e6f0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
e700: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
e710: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
e720: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
e730: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
e740: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
e750: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
e760: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
e770: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70  n TCL_ERROR;.  p
e780: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e  Stmt = sqlite3_n
e790: 65 78 74 5f 73 74 6d 74 28 64 62 2c 20 70 53 74  ext_stmt(db, pSt
e7a0: 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74  mt);.  if( pStmt
e7b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
e7c0: 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
e7d0: 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
e7e0: 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
e7f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e800: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
e810: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
e820: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
e830: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
e840: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
e850: 69 74 65 33 5f 72 65 73 65 74 20 20 53 54 4d 54  ite3_reset  STMT
e860: 20 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20   .**.** Reset a 
e870: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
e880: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e890: 74 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f  test_reset(.  vo
e8a0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
e8b0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
e8c0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
e8d0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
e8e0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
e8f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
e900: 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  tmt;.  int rc;..
e910: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
e920: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e930: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
e940: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
e950: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
e960: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
e970: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
e980: 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c  , 0), " <STMT>",
e990: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
e9a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
e9b0: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
e9c0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
e9d0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
e9e0: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
e9f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ea00: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
ea10: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
ea20: 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71   if( pStmt && sq
ea30: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
ea40: 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
ea50: 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 7b  b(pStmt), rc) ){
ea60: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ea70: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
ea80: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
ea90: 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
eaa0: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
eab0: 53 54 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66  STATIC);./*.  if
eac0: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
ead0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
eae0: 7d 0a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  }.*/.  return TC
eaf0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
eb00: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
eb10: 78 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a  xpired STMT .**.
eb20: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
eb30: 66 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  f a recompilatio
eb40: 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
eb50: 6e 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65  nt is recommende
eb60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
eb70: 20 74 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20   test_expired(. 
eb80: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
eb90: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
eba0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
ebb0: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
ebc0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
ebd0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ebe0: 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
ebf0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
ec00: 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a  pStmt;.  if( obj
ec10: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
ec20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ec30: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
ec40: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
ec50: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
ec60: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
ec70: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
ec80: 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20  STMT>", 0);.    
ec90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
eca0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
ecb0: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
ecc0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
ecd0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
ece0: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
ecf0: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
ed00: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
ed10: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
ed20: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69  Obj(sqlite3_expi
ed30: 72 65 64 28 70 53 74 6d 74 29 29 29 3b 0a 23 65  red(pStmt)));.#e
ed40: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
ed50: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
ed60: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 74  sage:  sqlite3_t
ed70: 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73  ransfer_bindings
ed80: 20 46 52 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54   FROMSTMT TOSTMT
ed90: 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  .**.** Transfer 
eda0: 61 6c 6c 20 62 69 6e 64 69 6e 67 73 20 66 72 6f  all bindings fro
edb0: 6d 20 46 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20  m FROMSTMT over 
edc0: 74 6f 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61  to TOSTMT.*/.sta
edd0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 72 61  tic int test_tra
ede0: 6e 73 66 65 72 5f 62 69 6e 64 28 0a 20 20 76 6f  nsfer_bind(.  vo
edf0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
ee00: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
ee10: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
ee20: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
ee30: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
ee40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ee50: 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73  T_DEPRECATED.  s
ee60: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
ee70: 6d 74 31 2c 20 2a 70 53 74 6d 74 32 3b 0a 20 20  mt1, *pStmt2;.  
ee80: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
ee90: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
eea0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
eeb0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
eec0: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
eed0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
eee0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
eef0: 30 29 2c 20 22 20 46 52 4f 4d 2d 53 54 4d 54 20  0), " FROM-STMT 
ef00: 54 4f 2d 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20  TO-STMT", 0);.  
ef10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ef20: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
ef30: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
ef40: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
ef50: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
ef60: 74 6d 74 31 29 29 20 72 65 74 75 72 6e 20 54 43  tmt1)) return TC
ef70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67  L_ERROR;.  if( g
ef80: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
ef90: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
efa0: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70  ing(objv[2]), &p
efb0: 53 74 6d 74 32 29 29 20 72 65 74 75 72 6e 20 54  Stmt2)) return T
efc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
efd0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
efe0: 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e  erp, .     Tcl_N
eff0: 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
f000: 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e  _transfer_bindin
f010: 67 73 28 70 53 74 6d 74 31 2c 70 53 74 6d 74 32  gs(pStmt1,pStmt2
f020: 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  )));.#endif.  re
f030: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
f040: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
f050: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 20 44 42  lite3_changes DB
f060: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
f070: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
f080: 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
f090: 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65 20  database by the 
f0a0: 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63  last SQL.** exec
f0b0: 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
f0c0: 20 69 6e 74 20 74 65 73 74 5f 63 68 61 6e 67 65   int test_change
f0d0: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
f0e0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
f0f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
f100: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
f110: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
f120: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
f130: 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  db;.  if( objc!=
f140: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
f150: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f160: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
f170: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
f180: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
f190: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
f1a0: 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
f1b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f1c0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
f1d0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
f1e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f1f0: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
f200: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f210: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
f220: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
f230: 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
f240: 5f 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a  _changes(db)));.
f250: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
f260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
f270: 73 20 74 68 65 20 22 73 74 61 74 69 63 5f 62 69  s the "static_bi
f280: 6e 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76  nd_value" that v
f290: 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75  ariables are bou
f2a0: 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68  nd to when.** th
f2b0: 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66  e FLAG option of
f2c0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73   sqlite3_bind is
f2d0: 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61   "static".*/.sta
f2e0: 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65  tic char *sqlite
f2f0: 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
f300: 75 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69  ue = 0;.static i
f310: 6e 74 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  nt sqlite_static
f320: 5f 62 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b  _bind_nbyte = 0;
f330: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
f340: 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d  sqlite3_bind  VM
f350: 20 20 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c    IDX  VALUE  FL
f360: 41 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74  AGS.**.** Sets t
f370: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
f380: 49 44 58 2d 74 68 20 6f 63 63 75 72 61 6e 63 65  IDX-th occurance
f390: 20 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f   of "?" in the o
f3a0: 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73  riginal SQL.** s
f3b0: 74 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73  tring.  VALUE is
f3c0: 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20   the new value. 
f3d0: 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c   If FLAGS=="null
f3e0: 22 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a  " then VALUE is.
f3f0: 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74  ** ignored and t
f400: 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  he value is set 
f410: 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41  to NULL.  If FLA
f420: 47 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65  GS=="static" the
f430: 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
f440: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
f450: 75 65 20 6f 66 20 61 20 73 74 61 74 69 63 20 76  ue of a static v
f460: 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a  ariable named.**
f470: 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f   "sqlite_static_
f480: 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66  bind_value".  If
f490: 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22   FLAGS=="normal"
f4a0: 20 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20   then a copy.** 
f4b0: 6f 66 20 74 68 65 20 56 41 4c 55 45 20 69 73 20  of the VALUE is 
f4c0: 6d 61 64 65 2e 20 20 49 66 20 46 4c 41 47 53 3d  made.  If FLAGS=
f4d0: 3d 22 62 6c 6f 62 31 30 22 20 74 68 65 6e 20 61  ="blob10" then a
f4e0: 20 56 41 4c 55 45 20 69 73 20 69 67 6e 6f 72 65   VALUE is ignore
f4f0: 64 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79 74  d.** an a 10-byt
f500: 65 20 62 6c 6f 62 20 22 61 62 63 5c 30 30 30 78  e blob "abc\000x
f510: 79 7a 5c 30 30 30 70 71 22 20 69 73 20 69 6e 73  yz\000pq" is ins
f520: 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  erted..*/.static
f530: 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 28 0a   int test_bind(.
f540: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
f550: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
f560: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
f570: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
f580: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
f590: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
f5a0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
f5b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f5c0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
f5d0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
f5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
f5f0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
f600: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
f610: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
f620: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
f630: 69 64 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21  idx;.  if( argc!
f640: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
f650: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f660: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
f670: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
f680: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
f690: 20 20 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45    " VM IDX VALUE
f6a0: 20 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f   (null|static|no
f6b0: 72 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20  rmal)\"", 0);.  
f6c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f6d0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
f6e0: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
f6f0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70  erp, argv[1], &p
f700: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
f710: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
f720: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
f730: 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78  p, argv[2], &idx
f740: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
f750: 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63  RROR;.  if( strc
f760: 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c  mp(argv[4],"null
f770: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
f780: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
f790: 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
f7a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
f7b0: 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61  cmp(argv[4],"sta
f7c0: 74 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tic")==0 ){.    
f7d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
f7e0: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
f7f0: 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  x, sqlite_static
f800: 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c  _bind_value, -1,
f810: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
f820: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
f830: 22 73 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29  "static-nbytes")
f840: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
f850: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
f860: 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71  t(pStmt, idx, sq
f870: 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
f880: 5f 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20  _value,.        
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
f8b0: 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
f8c0: 64 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d  d_nbyte, 0);.  }
f8d0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
f8e0: 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22  argv[4],"normal"
f8f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
f900: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
f910: 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61  xt(pStmt, idx, a
f920: 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[3], -1, SQLI
f930: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
f940: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
f950: 70 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31  p(argv[4],"blob1
f960: 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  0")==0 ){.    rc
f970: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
f980: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
f990: 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30   "abc\000xyz\000
f9a0: 70 71 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f  pq", 10, SQLITE_
f9b0: 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65  STATIC);.  }else
f9c0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
f9d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f9e0: 34 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  4th argument sho
f9f0: 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
fa00: 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22   "\"null\" or \"
fa10: 73 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f  static\" or \"no
fa20: 72 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20  rmal\"", 0);.   
fa30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fa40: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  R;.  }.  if( sql
fa50: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
fa60: 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
fa70: 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
fa80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fa90: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
faa0: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
fab0: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
fac0: 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
fad0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
fae0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
faf0: 66 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  f, sqlite3ErrStr
fb00: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
fb10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fb20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
fb30: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
fb40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
fb50: 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  6./*.** Usage: a
fb60: 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  dd_test_collate 
fb70: 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20  <db ptr> <utf8> 
fb80: 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
fb90: 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  be>.**.** This f
fba0: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
fbb0: 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
fbc0: 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20  ite selects the 
fbd0: 63 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f  correct collatio
fbe0: 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61  n.** sequence ca
fbf0: 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74  llback when mult
fc00: 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66  iple versions (f
fc10: 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78  or different tex
fc20: 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20  t encodings).** 
fc30: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  are available..*
fc40: 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
fc50: 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  s routine regist
fc60: 65 72 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ers the collatio
fc70: 6e 20 73 65 71 75 65 6e 63 65 20 22 74 65 73 74  n sequence "test
fc80: 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74  _collate".** wit
fc90: 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  h database handl
fca0: 65 20 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f  e <db>. The seco
fcb0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  nd argument must
fcc0: 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68   be a list of th
fcd0: 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76  ree.** boolean v
fce0: 61 6c 75 65 73 2e 20 49 66 20 74 68 65 20 66 69  alues. If the fi
fcf0: 72 73 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  rst is true, the
fd00: 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  n a version of t
fd10: 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a  est_collate is.*
fd20: 2a 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  * registered for
fd30: 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73   UTF-8, if the s
fd40: 65 63 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61  econd is true, a
fd50: 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69   version is regi
fd60: 73 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54  stered for.** UT
fd70: 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74  F-16le, if the t
fd80: 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20  hird is true, a 
fd90: 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e  UTF-16be version
fda0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
fdb0: 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  * Previous versi
fdc0: 6f 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c  ons of test_coll
fdd0: 61 74 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e  ate are deleted.
fde0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
fdf0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65  tion sequence te
fe00: 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d  st_collate is im
fe10: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c  plemented by cal
fe20: 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  ling the.** foll
fe30: 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  owing TCL script
fe40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f  :.**.**   "test_
fe50: 63 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c  collate <enc> <l
fe60: 68 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a  hs> <rhs>".**.**
fe70: 20 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c   The <lhs> and <
fe80: 72 68 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f  rhs> are the two
fe90: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f   values being co
fea0: 6d 70 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20  mpared, encoded 
feb0: 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65  in UTF-8..** The
fec0: 20 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72   <enc> parameter
fed0: 20 69 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   is the encoding
fee0: 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   of the collatio
fef0: 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  n function that.
ff00: 2a 2a 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74  ** SQLite select
ff10: 65 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20  ed to call. The 
ff20: 54 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 20  TCL test script 
ff30: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a  implements the.*
ff40: 2a 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  * "test_collate"
ff50: 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   proc..**.** Not
ff60: 65 20 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c  e that this will
ff70: 20 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20   only work with 
ff80: 6f 6e 65 20 69 6e 74 65 70 72 65 74 65 72 20 61  one intepreter a
ff90: 74 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68 65  t a time, as the
ffa0: 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e 74  .** interp point
ffb0: 65 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20 65  er to use when e
ffc0: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54 43  valuating the TC
ffd0: 4c 20 73 63 72 69 70 74 20 69 73 20 73 74 6f 72  L script is stor
ffe0: 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f  ed in.** pTestCo
fff0: 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a  llateInterp..*/.
10000 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72  static Tcl_Inter
10010 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49  p* pTestCollateI
10020 6e 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69 6e  nterp;.static in
10030 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  t test_collate_f
10040 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  unc(.  void *pCt
10050 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f  x, .  int nA, co
10060 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
10070 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f  int nB, const vo
10080 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f  id *zB.){.  Tcl_
10090 49 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65 73  Interp *i = pTes
100a0 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a  tCollateInterp;.
100b0 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 28 69    int encin = (i
100c0 6e 74 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 72  nt)pCtx;.  int r
100d0 65 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  es;.  int n;..  
100e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
100f0 56 61 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Val;.  Tcl_Obj *
10100 70 58 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f  pX;..  pX = Tcl_
10110 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
10120 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29  st_collate", -1)
10130 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
10140 6f 75 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69  ount(pX);..  swi
10150 74 63 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20  tch( encin ){.  
10160 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
10170 46 38 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  F8:.      Tcl_Li
10180 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10190 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53  nt(i,pX,Tcl_NewS
101a0 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22  tringObj("UTF-8"
101b0 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65  ,-1));.      bre
101c0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
101d0 49 54 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20  ITE_UTF16LE:.   
101e0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
101f0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
10200 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  ,Tcl_NewStringOb
10210 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29  j("UTF-16LE",-1)
10220 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10230 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
10240 55 54 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54  UTF16BE:.      T
10250 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10260 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
10270 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
10280 54 46 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20  TF-16BE",-1));. 
10290 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
102a0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
102b0 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20  ssert(0);.  }.. 
102c0 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
102d0 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71  alueNew(0);.  sq
102e0 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
102f0 28 70 56 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65  (pVal, nA, zA, e
10300 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  ncin, SQLITE_STA
10310 54 49 43 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  TIC);.  n = sqli
10320 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
10330 70 56 61 6c 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  pVal);.  Tcl_Lis
10340 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10350 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 54 63  t(i,pX,.      Tc
10360 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
10370 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
10380 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e  lue_text(pVal),n
10390 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  ));.  sqlite3Val
103a0 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e  ueSetStr(pVal, n
103b0 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51  B, zB, encin, SQ
103c0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
103d0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
103e0 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20  e_bytes(pVal);. 
103f0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10400 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a  ndElement(i,pX,.
10410 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
10420 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
10430 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
10440 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 73 71  (pVal),n));.  sq
10450 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
10460 56 61 6c 29 3b 0a 0a 20 20 54 63 6c 5f 45 76 61  Val);..  Tcl_Eva
10470 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c 20 30 29  lObjEx(i, pX, 0)
10480 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
10490 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
104a0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 2c  GetIntFromObj(i,
104b0 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
104c0 74 28 69 29 2c 20 26 72 65 73 29 3b 0a 20 20 72  t(i), &res);.  r
104d0 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61  eturn res;.}.sta
104e0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
104f0 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  late(.  void * c
10500 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10510 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10520 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10530 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
10540 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
10550 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c  3 *db;.  int val
10560 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
10570 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72  e *pVal;.  int r
10580 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
10590 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67  5 ) goto bad_arg
105a0 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c 61 74  s;.  pTestCollat
105b0 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  eInterp = interp
105c0 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ;.  if( getDbPoi
105d0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
105e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
105f0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
10600 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
10610 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
10620 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
10630 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
10640 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  2], &val) ) retu
10650 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10660 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
10670 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
10680 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
10690 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a  , SQLITE_UTF8, .
106a0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20            (void 
106b0 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 76  *)SQLITE_UTF8, v
106c0 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  al?test_collate_
106d0 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28 20 72  func:0);.  if( r
106e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
106f0 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
10700 7a 55 74 66 31 36 3b 0a 20 20 20 20 69 66 28 20  zUtf16;.    if( 
10710 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
10720 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
10730 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
10740 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
10750 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 63 20  L_ERROR;.    rc 
10760 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
10770 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
10780 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53  test_collate", S
10790 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a  QLITE_UTF16LE, .
107a0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
107b0 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36  d *)SQLITE_UTF16
107c0 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c  LE, val?test_col
107d0 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20  late_func:0);.  
107e0 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
107f0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
10800 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
10810 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [4], &val) ) ret
10820 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
10830 23 69 66 20 30 0a 20 20 20 20 69 66 28 20 73 71  #if 0.    if( sq
10840 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
10850 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  l>0 ){.      sql
10860 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  ite3_iMallocFail
10870 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ++;.    }.#endif
10880 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
10890 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
108a0 65 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20  ex);.    pVal = 
108b0 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
108c0 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
108d0 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
108e0 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f 6c 6c  , -1, "test_coll
108f0 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ate", SQLITE_UTF
10900 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
10910 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d 20  );.    zUtf16 = 
10920 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
10930 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
10940 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20  F16NATIVE);.    
10950 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
10960 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
10970 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
10980 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10990 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
109a0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
109b0 36 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 53 51  6(db, zUtf16, SQ
109c0 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20  LITE_UTF16BE, . 
109d0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a           (void *
109e0 29 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c  )SQLITE_UTF16BE,
109f0 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74   val?test_collat
10a00 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 7d  e_func:0);.    }
10a10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
10a20 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20  eFree(pVal);.   
10a30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10a40 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
10a50 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
10a60 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
10a70 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
10a80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10a90 3b 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 53  ;.  .  if( rc!=S
10aa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10ab0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10ac0 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
10ad0 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63  TestErrorName(rc
10ae0 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
10af0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10b00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
10b10 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  ;..bad_args:.  T
10b20 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10b30 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
10b40 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
10b50 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f   \"",.      Tcl_
10b60 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
10b70 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
10b80 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  <DB> <utf8> <utf
10b90 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22  16le> <utf16be>"
10ba0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
10bb0 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  CL_ERROR;.}../*.
10bc0 2a 2a 20 57 68 65 6e 20 74 68 65 20 63 6f 6c 6c  ** When the coll
10bd0 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 63 61 6c  ation needed cal
10be0 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
10bf0 2c 20 72 65 63 6f 72 64 20 74 68 65 20 6e 61 6d  , record the nam
10c00 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 72 65 71  e of .** the req
10c10 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6e 67  uested collating
10c20 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20   function here. 
10c30 20 54 68 65 20 72 65 63 6f 72 64 65 64 20 6e 61   The recorded na
10c40 6d 65 20 69 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20  me is linked.** 
10c50 74 6f 20 61 20 54 43 4c 20 76 61 72 69 61 62 6c  to a TCL variabl
10c60 65 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61  e and used to ma
10c70 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
10c80 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
10c90 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20 69 73 20  tion.** name is 
10ca0 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74  correct..*/.stat
10cb0 69 63 20 63 68 61 72 20 7a 4e 65 65 64 65 64 43  ic char zNeededC
10cc0 6f 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d 3b 0a 73  ollation[200];.s
10cd0 74 61 74 69 63 20 63 68 61 72 20 2a 70 7a 4e 65  tatic char *pzNe
10ce0 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20  ededCollation = 
10cf0 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
10d00 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64  ;.../*.** Called
10d10 20 77 68 65 6e 20 61 20 63 6f 6c 6c 61 74 69 6e   when a collatin
10d20 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 65  g sequence is ne
10d30 65 64 65 64 2e 20 20 52 65 67 69 73 74 65 72 65  eded.  Registere
10d40 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  d using.** sqlit
10d50 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
10d60 64 65 64 31 36 28 29 2e 0a 2a 2f 0a 73 74 61 74  ded16()..*/.stat
10d70 69 63 20 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c  ic void test_col
10d80 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a  late_needed_cb(.
10d90 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20    void *pCtx, . 
10da0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
10db0 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20  int eTextRep,.  
10dc0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4e 61 6d  const void *pNam
10dd0 65 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 63 20 3d  e.){.  int enc =
10de0 20 45 4e 43 28 64 62 29 3b 0a 20 20 69 6e 74 20   ENC(db);.  int 
10df0 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
10e00 66 6f 72 28 7a 20 3d 20 28 63 68 61 72 2a 29 70  for(z = (char*)p
10e10 4e 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a 20 7c 7c  Name, i=0; *z ||
10e20 20 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20   z[1]; z++){.   
10e30 20 69 66 28 20 2a 7a 20 29 20 7a 4e 65 65 64 65   if( *z ) zNeede
10e40 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b 2b 5d 20  dCollation[i++] 
10e50 3d 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a 4e 65 65  = *z;.  }.  zNee
10e60 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 5d 20  dedCollation[i] 
10e70 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  = 0;.  sqlite3_c
10e80 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
10e90 0a 20 20 20 20 20 20 64 62 2c 20 22 74 65 73 74  .      db, "test
10ea0 5f 63 6f 6c 6c 61 74 65 22 2c 20 45 4e 43 28 64  _collate", ENC(d
10eb0 62 29 2c 20 28 76 6f 69 64 20 2a 29 65 6e 63 2c  b), (void *)enc,
10ec0 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75   test_collate_fu
10ed0 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  nc);.}../*.** Us
10ee0 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f  age: add_test_co
10ef0 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20 44 42 0a  llate_needed DB.
10f00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
10f10 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
10f20 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
10f30 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
10f40 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
10f50 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
10f60 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
10f70 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
10f80 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
10f90 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67   if( objc!=2 ) g
10fa0 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
10fb0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
10fc0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10fd0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
10fe0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
10ff0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
11000 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
11010 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c 20  on_needed16(db, 
11020 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  0, test_collate_
11030 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a 4e  needed_cb);.  zN
11040 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30  eededCollation[0
11050 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  ] = 0;.  if( sql
11060 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
11070 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
11080 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
11090 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
110a0 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a  _OK;..bad_args:.
110b0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
110c0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
110d0 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74  jv, "DB");.  ret
110e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
110f0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
11100 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f    add_alignment_
11110 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20  test_collations 
11120 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 77   DB.**.** Add tw
11130 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  o new collating 
11140 73 65 71 75 65 6e 63 65 73 20 74 6f 20 74 68 65  sequences to the
11150 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2a 0a   database DB.**.
11160 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 61 6c 69  **     utf16_ali
11170 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74 66 31  gned.**     utf1
11180 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a  6_unaligned.**.*
11190 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67  * Both collating
111a0 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 20 74   sequences use t
111b0 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72 64  he same sort ord
111c0 65 72 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a 2a  er as BINARY..**
111d0 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72   The only differ
111e0 65 6e 63 65 20 69 73 20 74 68 61 74 20 74 68 65  ence is that the
111f0 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 20 63   utf16_aligned c
11200 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
11210 65 6e 63 65 20 69 73 20 64 65 63 6c 61 72 65 64  ence is declared
11220 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
11230 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 66  _UTF16_ALIGNED f
11240 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c  lag..** Both col
11250 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lating functions
11260 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 75   increment the u
11270 6e 61 6c 69 67 6e 65 64 20 75 74 66 31 36 20 63  naligned utf16 c
11280 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65 76  ounter.** whenev
11290 65 72 20 74 68 65 79 20 73 65 65 20 61 20 73 74  er they see a st
112a0 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73  ring that begins
112b0 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74 65 20   on an odd byte 
112c0 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74 61  boundary..*/.sta
112d0 74 69 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e 65  tic int unaligne
112e0 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
112f0 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74   = 0;.static int
11300 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75   alignmentCollFu
11310 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nc(.  void *NotU
11320 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  sed,.  int nKey1
11330 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
11340 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
11350 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
11360 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c  ey2.){.  int rc,
11370 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c   n;.  n = nKey1<
11380 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20  nKey2 ? nKey1 : 
11390 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b 65  nKey2;.  if( nKe
113a0 79 31 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 69  y1>0 && 1==(1&(i
113b0 6e 74 29 70 4b 65 79 31 29 20 29 20 75 6e 61 6c  nt)pKey1) ) unal
113c0 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75  igned_string_cou
113d0 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b  nter++;.  if( nK
113e0 65 79 32 3e 30 20 26 26 20 31 3d 3d 28 31 26 28  ey2>0 && 1==(1&(
113f0 69 6e 74 29 70 4b 65 79 32 29 20 29 20 75 6e 61  int)pKey2) ) una
11400 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
11410 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d 20  unter++;.  rc = 
11420 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b  memcmp(pKey1, pK
11430 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72  ey2, n);.  if( r
11440 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==0 ){.    rc =
11450 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a   nKey1 - nKey2;.
11460 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11470 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  .}.static int ad
11480 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74  d_alignment_test
11490 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20 76  _collations(.  v
114a0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
114b0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
114c0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
114d0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
114e0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
114f0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
11500 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20  if( objc>=2 ){. 
11510 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e     if( getDbPoin
11520 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
11530 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
11540 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
11550 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11560 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
11570 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75  collation(db, "u
11580 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22 2c  tf16_unaligned",
11590 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
115a0 55 54 46 31 36 2c 20 0a 20 20 20 20 20 20 20 20  UTF16, .        
115b0 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c  0, alignmentColl
115c0 46 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  Func);.    sqlit
115d0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
115e0 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 61  ion(db, "utf16_a
115f0 6c 69 67 6e 65 64 22 2c 0a 20 20 20 20 20 20 20  ligned",.       
11600 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 20   SQLITE_UTF16 | 
11610 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
11620 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20 20 30  GNED, .        0
11630 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46  , alignmentCollF
11640 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  unc);.  }.  retu
11650 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11660 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
11670 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ed(SQLITE_OMIT_U
11680 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TF16) */../*.** 
11690 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f  Usage: add_test_
116a0 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74 72  function <db ptr
116b0 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c  > <utf8> <utf16l
116c0 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a  e> <utf16be>.**.
116d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
116e0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
116f0 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c   that SQLite sel
11700 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63 74  ects the correct
11710 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69 6f   user.** functio
11720 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20  n callback when 
11730 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e  multiple version
11740 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74  s (for different
11750 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29   text encodings)
11760 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c  .** are availabl
11770 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67  e..**.** Calling
11780 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
11790 67 69 73 74 65 72 73 20 75 70 20 74 6f 20 74 68  gisters up to th
117a0 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ree versions of 
117b0 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  the user functio
117c0 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63 74  n.** "test_funct
117d0 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61 62 61  ion" with databa
117e0 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20  se handle <db>. 
117f0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
11800 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74 72  rgument is.** tr
11810 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69  ue, then a versi
11820 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e 63 74  on of test_funct
11830 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65  ion is registere
11840 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20  d for UTF-8, if 
11850 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69 73 20  the.** third is 
11860 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20  true, a version 
11870 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  is registered fo
11880 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74  r UTF-16le, if t
11890 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a 20  he fourth is.** 
118a0 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65  true, a UTF-16be
118b0 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
118c0 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f 75 73  lable.  Previous
118d0 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a 20   versions of.** 
118e0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61 72  test_function ar
118f0 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  e deleted..**.**
11900 20 54 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   The user functi
11910 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
11920 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  d by calling the
11930 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73   following TCL s
11940 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  cript:.**.**   "
11950 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 65  test_function <e
11960 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a 2a  nc> <arg>".**.**
11970 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69 73 20   Where <enc> is 
11980 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20 55 54  one of UTF-8, UT
11990 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31 36 42  F-16LE or UTF16B
119a0 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69 73 20  E, and <arg> is 
119b0 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61 72  the.** single ar
119c0 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
119d0 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f   the SQL functio
119e0 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  n. The value ret
119f0 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  urned by.** the 
11a00 54 43 4c 20 73 63 72 69 70 74 20 69 73 20 75 73  TCL script is us
11a10 65 64 20 61 73 20 74 68 65 20 72 65 74 75 72 6e  ed as the return
11a20 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 53 51   value of the SQ
11a30 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a 2a  L function. It.*
11a40 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 53  * is passed to S
11a50 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54 46 2d  QLite using UTF-
11a60 31 36 42 45 20 66 6f 72 20 61 20 55 54 46 2d 38  16BE for a UTF-8
11a70 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29   test_function()
11a80 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20 61  , UTF-8.** for a
11a90 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74 5f 66   UTF-16LE test_f
11aa0 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20 55  unction(), and U
11ab0 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20 69  TF-16LE for an i
11ac0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
11ad0 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20 55 54  at.** prefers UT
11ae0 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e 64  F-16BE..*/.#ifnd
11af0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
11b00 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64  TF16.static void
11b10 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
11b20 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tf8(.  sqlite3_c
11b30 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
11b40 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
11b50 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
11b60 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  v.){.  Tcl_Inter
11b70 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
11b80 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69  _Obj *pX;.  sqli
11b90 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
11ba0 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c  .  interp = (Tcl
11bb0 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65  _Interp *)sqlite
11bc0 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
11bd0 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  );.  pX = Tcl_Ne
11be0 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
11bf0 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b  _function", -1);
11c00 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
11c10 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c  unt(pX);.  Tcl_L
11c20 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11c30 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
11c40 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11c50 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a  ("UTF-8", -1));.
11c60 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
11c70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11c80 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63  p, pX, .      Tc
11c90 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
11ca0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
11cb0 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
11cc0 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  ), -1));.  Tcl_E
11cd0 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
11ce0 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44   pX, 0);.  Tcl_D
11cf0 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ecrRefCount(pX);
11d00 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
11d10 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54 63 6c  t_text(pCtx, Tcl
11d20 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
11d30 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53 51  (interp), -1, SQ
11d40 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
11d50 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
11d60 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
11d70 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
11d80 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c  tr(pVal, -1, Tcl
11d90 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
11da0 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20  (interp), .     
11db0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
11dc0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
11dd0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
11de0 65 78 74 31 36 62 65 28 70 43 74 78 2c 20 73 71  ext16be(pCtx, sq
11df0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
11e00 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20 20 20  16be(pVal),.    
11e10 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41    -1, SQLITE_TRA
11e20 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
11e30 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
11e40 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
11e50 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
11e60 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69 74 65  tf16le(.  sqlite
11e70 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
11e80 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
11e90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
11ea0 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e  argv.){.  Tcl_In
11eb0 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
11ec0 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73  Tcl_Obj *pX;.  s
11ed0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
11ee0 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28  al;.  interp = (
11ef0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c  Tcl_Interp *)sql
11f00 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70  ite3_user_data(p
11f10 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c  Ctx);.  pX = Tcl
11f20 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74  _NewStringObj("t
11f30 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d  est_function", -
11f40 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  1);.  Tcl_IncrRe
11f50 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63  fCount(pX);.  Tc
11f60 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11f70 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
11f80 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  X, Tcl_NewString
11f90 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 20  Obj("UTF-16LE", 
11fa0 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
11fb0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11fc0 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20  (interp, pX, .  
11fd0 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
11fe0 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69  gObj((char*)sqli
11ff0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
12000 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20  rgv[0]), -1));. 
12010 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
12020 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20  nterp, pX, 0);. 
12030 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
12040 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20  t(pX);.  pVal = 
12050 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
12060 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  0);.  sqlite3Val
12070 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d  ueSetStr(pVal, -
12080 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  1, Tcl_GetString
12090 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
120a0 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54  .      SQLITE_UT
120b0 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
120c0 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  C);.  sqlite3_re
120d0 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 28  sult_text(pCtx,(
120e0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
120f0 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d  lue_text(pVal),-
12100 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  1,SQLITE_TRANSIE
12110 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  NT);.  sqlite3Va
12120 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d  lueFree(pVal);.}
12130 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
12140 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36  t_function_utf16
12150 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  be(.  sqlite3_co
12160 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
12170 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
12180 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
12190 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
121a0 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
121b0 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  Obj *pX;.  sqlit
121c0 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
121d0 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f    interp = (Tcl_
121e0 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33  Interp *)sqlite3
121f0 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
12200 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ;.  pX = Tcl_New
12210 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
12220 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a  function", -1);.
12230 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
12240 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69  nt(pX);.  Tcl_Li
12250 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12260 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54  nt(interp, pX, T
12270 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12280 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31 29 29  "UTF-16BE", -1))
12290 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
122a0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
122b0 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20  erp, pX, .      
122c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
122d0 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
122e0 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
122f0 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  0]), -1));.  Tcl
12300 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
12310 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  p, pX, 0);.  Tcl
12320 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
12330 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
12340 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
12350 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
12360 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
12370 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
12380 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
12390 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
123a0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
123b0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
123c0 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20 73 71  _text16(pCtx, sq
123d0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
123e0 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20  16le(pVal),.    
123f0 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41    -1, SQLITE_TRA
12400 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
12410 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
12420 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33  be(pCtx, sqlite3
12430 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28  _value_text16le(
12440 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c  pVal),.      -1,
12450 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
12460 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  T);.  sqlite3_re
12470 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28 70 43  sult_text16le(pC
12480 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  tx, sqlite3_valu
12490 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29  e_text16le(pVal)
124a0 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49  ,.      -1, SQLI
124b0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
124c0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
124d0 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69  e(pVal);.}.#endi
124e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
124f0 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74 69 63  _UTF16 */.static
12500 20 69 6e 74 20 74 65 73 74 5f 66 75 6e 63 74 69   int test_functi
12510 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  on(.  void * cli
12520 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
12530 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
12540 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
12550 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
12560 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
12570 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
12580 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
12590 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69 66 28   int val;..  if(
125a0 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20   objc!=5 ) goto 
125b0 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20  bad_args;.  if( 
125c0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
125d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
125e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
125f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12600 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c  RROR;..  if( TCL
12610 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
12620 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
12630 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c  p, objv[2], &val
12640 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12650 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20  RROR;.  if( val 
12660 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
12670 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
12680 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  b, "test_functio
12690 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  n", 1, SQLITE_UT
126a0 46 38 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74  F8, .        int
126b0 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69  erp, test_functi
126c0 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29 3b 0a  on_utf8, 0, 0);.
126d0 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b    }.  if( TCL_OK
126e0 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
126f0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
12700 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
12710 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12720 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a  R;.  if( val ){.
12730 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12740 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
12750 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
12760 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36   1, SQLITE_UTF16
12770 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74  LE, .        int
12780 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69  erp, test_functi
12790 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c 20 30  on_utf16le, 0, 0
127a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c  );.  }.  if( TCL
127b0 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
127c0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
127d0 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c  p, objv[4], &val
127e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
127f0 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20  RROR;.  if( val 
12800 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
12810 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
12820 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  b, "test_functio
12830 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  n", 1, SQLITE_UT
12840 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20  F16BE, .        
12850 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
12860 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c 20 30  ction_utf16be, 0
12870 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
12880 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f  urn TCL_OK;.bad_
12890 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65  args:.  Tcl_Appe
128a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
128b0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
128c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
128d0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
128e0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
128f0 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75  ], 0), " <DB> <u
12900 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c  tf8> <utf16le> <
12910 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 23  utf16be>", 0);.#
12920 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12930 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
12940 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
12960 3a 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65  :         test_e
12970 72 72 73 74 72 20 3c 65 72 72 20 63 6f 64 65 3e  rrstr <err code>
12980 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 61 74  .**.** Test that
12990 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e   the english lan
129a0 67 75 61 67 65 20 73 74 72 69 6e 67 20 65 71 75  guage string equ
129b0 69 76 61 6c 65 6e 74 73 20 66 6f 72 20 73 71 6c  ivalents for sql
129c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 73 0a  ite error codes.
129d0 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20 54 68 65  ** are sane. The
129e0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e   parameter is an
129f0 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65   integer represe
12a00 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 20  nting an sqlite 
12a10 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 54  error code..** T
12a20 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 6c  he result is a l
12a30 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d 65  ist of two eleme
12a40 6e 74 73 2c 20 74 68 65 20 73 74 72 69 6e 67 20  nts, the string 
12a50 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
12a60 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63  f the.** error c
12a70 6f 64 65 20 61 6e 64 20 74 68 65 20 65 6e 67 6c  ode and the engl
12a80 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
12a90 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  lanation..*/.sta
12aa0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72  tic int test_err
12ab0 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  str(.  void * cl
12ac0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
12ad0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
12ae0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
12af0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
12b00 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  v[].){.  char *z
12b10 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Code;.  int i;. 
12b20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a   if( objc!=1 ){.
12b30 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
12b40 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
12b50 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72 20 63 6f  objv, "<error co
12b60 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a 43  de>");.  }..  zC
12b70 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ode = Tcl_GetStr
12b80 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
12b90 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30 30 3b 20  for(i=0; i<200; 
12ba0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d  i++){.    if( 0=
12bb0 3d 73 74 72 63 6d 70 28 74 31 45 72 72 6f 72 4e  =strcmp(t1ErrorN
12bc0 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29 20 29  ame(i), zCode) )
12bd0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63   break;.  }.  Tc
12be0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
12bf0 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
12c00 74 65 33 45 72 72 53 74 72 28 69 29 2c 20 30 29  te3ErrStr(i), 0)
12c10 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
12c20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
12c30 65 3a 20 20 20 20 62 72 65 61 6b 70 6f 69 6e 74  e:    breakpoint
12c40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12c50 69 6e 65 20 65 78 69 73 74 73 20 66 6f 72 20 6f  ine exists for o
12c60 6e 65 20 70 75 72 70 6f 73 65 20 2d 20 74 6f 20  ne purpose - to 
12c70 70 72 6f 76 69 64 65 20 61 20 70 6c 61 63 65 20  provide a place 
12c80 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72 65 61  to put a.** brea
12c90 6b 70 6f 69 6e 74 20 77 69 74 68 20 47 44 42 20  kpoint with GDB 
12ca0 74 68 61 74 20 63 61 6e 20 62 65 20 74 72 69 67  that can be trig
12cb0 67 65 72 65 64 20 75 73 69 6e 67 20 54 43 4c 20  gered using TCL 
12cc0 63 6f 64 65 2e 20 20 54 68 65 20 75 73 65 0a 2a  code.  The use.*
12cd0 2a 20 66 6f 72 20 74 68 69 73 20 69 73 20 77 68  * for this is wh
12ce0 65 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  en a particular 
12cf0 74 65 73 74 20 66 61 69 6c 73 20 6f 6e 20 28 73  test fails on (s
12d00 61 79 29 20 74 68 65 20 31 34 38 35 74 68 20 69  ay) the 1485th i
12d10 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20  teration..** In 
12d20 74 68 65 20 54 43 4c 20 74 65 73 74 20 73 63 72  the TCL test scr
12d30 69 70 74 2c 20 77 65 20 63 61 6e 20 61 64 64 20  ipt, we can add 
12d40 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a  code like this:.
12d50 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24 69  **.**     if {$i
12d60 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b 70 6f 69  ==1485} breakpoi
12d70 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72 75  nt.**.** Then ru
12d80 6e 20 74 65 73 74 66 69 78 74 75 72 65 20 69 6e  n testfixture in
12d90 20 74 68 65 20 64 65 62 75 67 67 65 72 20 61 6e   the debugger an
12da0 64 20 77 61 69 74 20 66 6f 72 20 74 68 65 20 62  d wait for the b
12db0 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20  reakpoint to.** 
12dc0 66 69 72 65 2e 20 20 54 68 65 6e 20 61 64 64 69  fire.  Then addi
12dd0 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69 6e  tional breakpoin
12de0 74 73 20 63 61 6e 20 62 65 20 73 65 74 20 74 6f  ts can be set to
12df0 20 74 72 61 63 65 20 64 6f 77 6e 20 74 68 65 20   trace down the 
12e00 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  bug..*/.static i
12e10 6e 74 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  nt test_breakpoi
12e20 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
12e30 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
12e40 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
12e50 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
12e60 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
12e70 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
12e80 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
12e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12ea0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
12eb0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
12ec0 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
12ed0 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
12ee0 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 72  gument */.){.  r
12ef0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 20  eturn TCL_OK;   
12f00 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
12f10 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ing */.}../*.** 
12f20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
12f30 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 20  _bind_zeroblob  
12f40 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a  STMT IDX N.**.**
12f50 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
12f60 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20  3_bind_zeroblob 
12f70 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
12f80 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
12f90 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44 58  tatement..** IDX
12fa0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
12fb0 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
12fc0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
12fd0 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
12fe0 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
12ff0 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69 6c 6c  N-byte zero-fill
13000 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77  ed BLOB to the w
13010 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
13020 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
13030 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76 6f 69  _zeroblob(.  voi
13040 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
13050 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
13060 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
13070 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
13080 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
13090 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
130a0 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
130b0 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63   int n;.  int rc
130c0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
130d0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
130e0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
130f0 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
13100 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  IDX N");.    ret
13110 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13120 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
13130 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
13140 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
13150 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
13160 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13170 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
13180 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
13190 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
131a0 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
131b0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
131c0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
131d0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
131e0 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &n) ) return TC
131f0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
13200 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
13210 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64  roblob(pStmt, id
13220 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c  x, n);.  if( sql
13230 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
13240 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
13250 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
13260 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13270 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
13290 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
132a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
132b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
132c0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
132d0 6e 64 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20 56  nd_int  STMT N V
132e0 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
132f0 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
13300 5f 69 6e 74 20 69 6e 74 65 72 66 61 63 65 2e 20  _int interface. 
13310 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
13320 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
13330 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
13340 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
13350 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
13360 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
13370 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
13380 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
13390 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20  r VALUE to that 
133a0 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
133b0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
133c0 64 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  d_int(.  void * 
133d0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
133e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
133f0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
13400 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
13410 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
13420 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
13430 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
13440 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63   value;.  int rc
13450 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
13460 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
13470 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13480 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
13490 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
134a0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
134b0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
134c0 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
134d0 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  N VALUE", 0);.  
134e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
134f0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
13500 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
13510 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
13520 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
13530 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
13540 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
13550 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
13560 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
13570 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
13580 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
13590 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
135a0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
135b0 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20  v[3], &value) ) 
135c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
135d0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
135e0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
135f0 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20  , idx, value);. 
13600 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
13610 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
13620 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
13630 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
13640 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
13650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13660 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13670 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
13680 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
13690 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
136a0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
136b0 34 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  4  STMT N VALUE.
136c0 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
136d0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
136e0 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  4 interface.  ST
136f0 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
13700 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
13710 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
13720 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
13730 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
13740 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
13750 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
13760 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56  64-bit integer V
13770 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c  ALUE to that wil
13780 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
13790 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69   int test_bind_i
137a0 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  nt64(.  void * c
137b0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
137c0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
137d0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
137e0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
137f0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
13800 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
13810 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 36 34 20   int idx;.  i64 
13820 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
13830 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
13840 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
13850 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13860 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
13870 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
13880 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
13890 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
138a0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
138b0 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
138c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
138d0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
138e0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
138f0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
13900 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
13910 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
13920 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
13930 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
13940 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
13950 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
13960 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
13970 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ( Tcl_GetWideInt
13980 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
13990 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29  objv[3], &value)
139a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
139b0 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
139c0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
139d0 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
139e0 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
139f0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
13a00 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
13a10 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
13a20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13a30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13a40 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
13a50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
13a60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
13a70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
13a80 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
13a90 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20  _double  STMT N 
13aa0 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74  VALUE.**.** Test
13ab0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
13ac0 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61  d_double interfa
13ad0 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
13ae0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
13af0 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
13b00 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
13b10 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
13b20 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
13b30 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
13b40 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e  inds a 64-bit in
13b50 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
13b60 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
13b70 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
13b80 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20  _bind_double(.  
13b90 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
13ba0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
13bb0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
13bc0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
13bd0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
13be0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
13bf0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
13c00 3b 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65  ;.  double value
13c10 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
13c20 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a  nst char *zVal;.
13c30 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69    int i;.  stati
13c40 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
13c50 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13c60 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e  *zName;     /* N
13c70 61 6d 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  ame of the speci
13c80 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  al floating poin
13c90 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 75  t value */.    u
13ca0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 55 70 70  nsigned int iUpp
13cb0 65 72 3b 20 20 20 2f 2a 20 55 70 70 65 72 20 33  er;   /* Upper 3
13cc0 32 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 75 6e  2 bits */.    un
13cd0 73 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f 77 65  signed int iLowe
13ce0 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20 33 32  r;   /* Lower 32
13cf0 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61 53 70   bits */.  } aSp
13d00 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20  ecialFp[] = {.  
13d10 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20 20 20    {  "NaN",     
13d20 20 30 78 37 66 66 66 66 66 66 66 2c 20 30 78 66   0x7fffffff, 0xf
13d30 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b  fffffff },.    {
13d40 20 20 22 53 4e 61 4e 22 2c 20 20 20 20 20 30 78    "SNaN",     0x
13d50 37 66 66 37 66 66 66 66 2c 20 30 78 66 66 66 66  7ff7ffff, 0xffff
13d60 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22  ffff },.    {  "
13d70 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78 66 66 66  -NaN",     0xfff
13d80 66 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66  fffff, 0xfffffff
13d90 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 53 4e  f },.    {  "-SN
13da0 61 4e 22 2c 20 20 20 20 30 78 66 66 66 37 66 66  aN",    0xfff7ff
13db0 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d  ff, 0xffffffff }
13dc0 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66 22 2c  ,.    {  "+Inf",
13dd0 20 20 20 20 20 30 78 37 66 66 30 30 30 30 30 2c       0x7ff00000,
13de0 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
13df0 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20 20 20     {  "-Inf",   
13e00 20 20 30 78 66 66 66 30 30 30 30 30 2c 20 30 78    0xfff00000, 0x
13e10 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20  00000000 },.    
13e20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20 20 30  {  "Epsilon",  0
13e30 78 30 30 30 30 30 30 30 30 2c 20 30 78 30 30 30  x00000000, 0x000
13e40 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20  00001 },.    {  
13e50 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78 38 30  "-Epsilon", 0x80
13e60 30 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  000000, 0x000000
13e70 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 4e 61  01 },.    {  "Na
13e80 4e 30 22 2c 20 20 20 20 20 30 78 37 66 66 38 30  N0",     0x7ff80
13e90 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20  000, 0x00000000 
13ea0 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 30  },.    {  "-NaN0
13eb0 22 2c 20 20 20 20 30 78 66 66 66 38 30 30 30 30  ",    0xfff80000
13ec0 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a  , 0x00000000 },.
13ed0 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63    };..  if( objc
13ee0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
13ef0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13f00 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
13f10 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
13f20 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
13f30 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
13f40 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
13f50 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b  MT N VALUE", 0);
13f60 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13f70 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
13f80 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
13f90 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
13fa0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
13fb0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
13fc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
13fd0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
13fe0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
13ff0 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
14000 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14010 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65 70 74 20  .  /* Intercept 
14020 74 68 65 20 73 74 72 69 6e 67 20 22 4e 61 4e 22  the string "NaN"
14030 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20   and generate a 
14040 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72 20 69 74  NaN value for it
14050 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  ..  ** All other
14060 20 73 74 72 69 6e 67 73 20 61 72 65 20 70 61 73   strings are pas
14070 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 54  sed through to T
14080 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
14090 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f  Obj()..  ** Tcl_
140a0 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
140b0 28 29 20 73 68 6f 75 6c 64 20 75 6e 64 65 72 73  () should unders
140c0 74 61 6e 64 20 22 4e 61 4e 22 20 62 75 74 20 73  tand "NaN" but s
140d0 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20 20 2a  ome versions.  *
140e0 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67 2e  * contain a bug.
140f0 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20 54  .  */.  zVal = T
14100 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
14110 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[3]);.  for(i=0
14120 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 70 65 63  ; i<sizeof(aSpec
14130 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53  ialFp)/sizeof(aS
14140 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20 69 2b  pecialFp[0]); i+
14150 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
14160 6d 70 28 61 53 70 65 63 69 61 6c 46 70 5b 69 5d  mp(aSpecialFp[i]
14170 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30  .zName, zVal)==0
14180 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14190 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20 20 20  3_uint64 x;.    
141a0 20 20 78 20 3d 20 61 53 70 65 63 69 61 6c 46 70    x = aSpecialFp
141b0 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20 20 20  [i].iUpper;.    
141c0 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20 20 20    x <<= 32;.    
141d0 20 20 78 20 7c 3d 20 61 53 70 65 63 69 61 6c 46    x |= aSpecialF
141e0 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20 20  p[i].iLower;.   
141f0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
14200 66 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b 0a 20  f(value)==8 );. 
14210 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
14220 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20 20 20  eof(x)==8 );.   
14230 20 20 20 6d 65 6d 63 70 79 28 26 76 61 6c 75 65     memcpy(&value
14240 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 20 20  , &x, 8);.      
14250 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
14260 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66  .  if( i>=sizeof
14270 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73 69 7a  (aSpecialFp)/siz
14280 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 5b 30  eof(aSpecialFp[0
14290 5d 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 54  ]) &&.         T
142a0 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
142b0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
142c0 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 7b 0a  [3], &value) ){.
142d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
142e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
142f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
14300 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78 2c  uble(pStmt, idx,
14310 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73   value);.  if( s
14320 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
14330 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
14340 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
14350 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14360 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
14370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14380 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14390 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
143a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
143b0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
143c0 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54 20  bind_null  STMT 
143d0 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  N.**.** Test the
143e0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
143f0 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  ll interface.  S
14400 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
14410 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
14420 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
14430 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
14440 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
14450 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
14460 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
14470 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69 6c   NULL to the wil
14480 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
14490 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 6e   int test_bind_n
144a0 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ull(.  void * cl
144b0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
144c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
144d0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
144e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
144f0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
14500 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
14510 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72  int idx;.  int r
14520 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
14530 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
14540 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
14550 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
14560 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
14570 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
14580 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
14590 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
145a0 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74   N", 0);.    ret
145b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
145c0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
145d0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
145e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
145f0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
14600 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
14610 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
14620 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
14630 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
14640 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
14650 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
14660 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
14670 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20  l(pStmt, idx);. 
14680 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
14690 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
146a0 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
146b0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
146c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
146d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
146e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
146f0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
14700 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
14710 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
14720 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
14730 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42   STMT N STRING B
14740 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
14750 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
14760 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63 65 2e  _text interface.
14770 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
14780 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
14790 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
147a0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
147b0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
147c0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
147d0 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
147e0 73 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  s a UTF-8 string
147f0 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77   STRING to the w
14800 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74  ildcard.  The st
14810 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79  ring is BYTES by
14820 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a  tes.** long..*/.
14830 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
14840 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69  bind_text(.  voi
14850 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
14860 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
14870 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
14880 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
14890 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
148a0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
148b0 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
148c0 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68   int bytes;.  ch
148d0 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ar *value;.  int
148e0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
148f0 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
14900 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
14910 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
14920 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
14930 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
14940 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
14950 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
14960 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53  MT N VALUE BYTES
14970 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
14980 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
14990 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
149a0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
149b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
149c0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
149d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
149e0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
149f0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
14a00 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
14a10 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
14a20 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20  RROR;.  value = 
14a30 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79  (char*)Tcl_GetBy
14a40 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
14a50 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 3b  bjv[3], &bytes);
14a60 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
14a70 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
14a80 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73   objv[4], &bytes
14a90 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
14aa0 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
14ab0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
14ac0 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
14ad0 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45  e, bytes, SQLITE
14ae0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69  _TRANSIENT);.  i
14af0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
14b00 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
14b10 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
14b20 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
14b30 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
14b40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14b50 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14b60 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
14b70 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28  e3TestErrorName(
14b80 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
14b90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14ba0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
14bb0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
14bc0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
14bd0 69 6e 64 5f 74 65 78 74 31 36 20 3f 2d 73 74 61  ind_text16 ?-sta
14be0 74 69 63 3f 20 53 54 4d 54 20 4e 20 53 54 52 49  tic? STMT N STRI
14bf0 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54  NG BYTES.**.** T
14c00 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
14c10 62 69 6e 64 5f 74 65 78 74 31 36 20 69 6e 74 65  bind_text16 inte
14c20 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
14c30 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
14c40 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
14c50 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
14c60 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
14c70 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
14c80 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
14c90 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d 31 36  * binds a UTF-16
14ca0 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74   string STRING t
14cb0 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20  o the wildcard. 
14cc0 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 42   The string is B
14cd0 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f  YTES bytes.** lo
14ce0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
14cf0 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74  t test_bind_text
14d00 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
14d10 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
14d20 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
14d30 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
14d40 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
14d50 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
14d60 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
14d70 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
14d80 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
14d90 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
14da0 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20   char *value;.  
14db0 69 6e 74 20 72 63 3b 0a 0a 20 20 76 6f 69 64 20  int rc;..  void 
14dc0 28 2a 78 44 65 6c 29 28 29 20 3d 20 28 6f 62 6a  (*xDel)() = (obj
14dd0 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54 41 54  c==6?SQLITE_STAT
14de0 49 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  IC:SQLITE_TRANSI
14df0 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  ENT);.  Tcl_Obj 
14e00 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62 6a 76  *oStmt    = objv
14e10 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c 5f  [objc-4];.  Tcl_
14e20 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20 3d 20  Obj *oN       = 
14e30 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20 20  objv[objc-3];.  
14e40 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e 67  Tcl_Obj *oString
14e50 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d    = objv[objc-2]
14e60 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42 79  ;.  Tcl_Obj *oBy
14e70 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a  tes   = objv[obj
14e80 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  c-1];..  if( obj
14e90 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 29  c!=5 && objc!=6)
14ea0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
14eb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
14ec0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
14ed0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
14ee0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
14ef0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
14f00 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
14f10 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29  VALUE BYTES", 0)
14f20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
14f30 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
14f40 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
14f50 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
14f60 74 53 74 72 69 6e 67 28 6f 53 74 6d 74 29 2c 20  tString(oStmt), 
14f70 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
14f80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
14f90 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
14fa0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e 2c 20  Obj(interp, oN, 
14fb0 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
14fc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75  CL_ERROR;.  valu
14fd0 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47  e = (char*)Tcl_G
14fe0 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
14ff0 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29 3b 0a  bj(oString, 0);.
15000 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
15010 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
15020 6f 42 79 74 65 73 2c 20 26 62 79 74 65 73 29 20  oBytes, &bytes) 
15030 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15040 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
15050 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 28  te3_bind_text16(
15060 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f 69  pStmt, idx, (voi
15070 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65 73  d *)value, bytes
15080 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66 28 20 73  , xDel);.  if( s
15090 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
150a0 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
150b0 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
150c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
150d0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
150e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
150f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
15100 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65  nterp, sqlite3Te
15110 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  stErrorName(rc),
15120 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
15130 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
15140 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15150 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
15160 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
15170 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
15180 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
15190 6c 6f 62 20 3f 2d 73 74 61 74 69 63 3f 20 53 54  lob ?-static? ST
151a0 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45 53 0a  MT N DATA BYTES.
151b0 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
151c0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
151d0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
151e0 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
151f0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
15200 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
15210 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
15220 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
15230 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
15240 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 42  and.** binds a B
15250 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63  LOB to the wildc
15260 61 72 64 2e 20 20 54 68 65 20 42 4c 4f 42 20 69  ard.  The BLOB i
15270 73 20 42 59 54 45 53 20 62 79 74 65 73 20 69 6e  s BYTES bytes in
15280 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
15290 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 62   int test_bind_b
152a0 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
152b0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
152c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
152d0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
152e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
152f0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
15300 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
15310 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62  int idx;.  int b
15320 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61  ytes;.  char *va
15330 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  lue;.  int rc;. 
15340 20 73 71 6c 69 74 65 33 5f 64 65 73 74 72 75 63   sqlite3_destruc
15350 74 6f 72 5f 74 79 70 65 20 78 44 65 73 74 72 75  tor_type xDestru
15360 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 54 52  ctor = SQLITE_TR
15370 41 4e 53 49 45 4e 54 3b 0a 0a 20 20 69 66 28 20  ANSIENT;..  if( 
15380 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
15390 3d 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =6 ){.    Tcl_Ap
153a0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
153b0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
153c0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
153d0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
153e0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
153f0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
15400 54 20 4e 20 44 41 54 41 20 42 59 54 45 53 22 2c  T N DATA BYTES",
15410 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
15420 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
15430 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29 7b    if( objc==6 ){
15440 0a 20 20 20 20 78 44 65 73 74 72 75 63 74 6f 72  .    xDestructor
15450 20 3d 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43   = SQLITE_STATIC
15460 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20 20  ;.    objv++;.  
15470 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
15480 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
15490 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
154a0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
154b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
154c0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
154d0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
154e0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
154f0 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
15500 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d  ERROR;.  value =
15510 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15520 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[3]);.  if( T
15530 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
15540 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
15550 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
15560 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
15570 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
15580 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  nd_blob(pStmt, i
15590 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65 73  dx, value, bytes
155a0 2c 20 78 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , xDestructor);.
155b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
155c0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
155d0 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
155e0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
155f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
15600 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15610 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
15620 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
15630 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
15640 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
15650 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
15660 6d 65 74 65 72 5f 63 6f 75 6e 74 20 20 53 54 4d  meter_count  STM
15670 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T.**.** Return t
15680 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 69 6c  he number of wil
15690 64 63 61 72 64 73 20 69 6e 20 74 68 65 20 67 69  dcards in the gi
156a0 76 65 6e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ven statement..*
156b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
156c0 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
156d0 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a  _count(.  void *
156e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
156f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
15700 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
15710 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
15720 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
15730 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
15740 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
15750 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
15760 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
15770 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29  1, objv, "STMT")
15780 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
15790 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
157a0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
157b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
157c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
157d0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
157e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
157f0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
15800 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
15810 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69  ntObj(sqlite3_bi
15820 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
15830 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72  nt(pStmt)));.  r
15840 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
15850 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
15860 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
15870 61 6d 65 74 65 72 5f 6e 61 6d 65 20 20 53 54 4d  ameter_name  STM
15880 54 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  T  N.**.** Retur
15890 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
158a0 65 20 4e 74 68 20 77 69 6c 64 63 61 72 64 2e 20  e Nth wildcard. 
158b0 20 54 68 65 20 66 69 72 73 74 20 77 69 6c 64 63   The first wildc
158c0 61 72 64 20 69 73 20 31 2e 0a 2a 2a 20 41 6e 20  ard is 1..** An 
158d0 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20  empty string is 
158e0 72 65 74 75 72 6e 65 64 20 69 66 20 4e 20 69 73  returned if N is
158f0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 6f 72   out of range or
15900 20 69 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   if the wildcard
15910 0a 2a 2a 20 69 73 20 6e 61 6d 65 6c 65 73 73 2e  .** is nameless.
15920 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
15930 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
15940 65 72 5f 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20  er_name(.  void 
15950 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
15960 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15970 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
15980 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
15990 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
159a0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
159b0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
159c0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
159d0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
159e0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
159f0 76 2c 20 22 53 54 4d 54 20 4e 22 29 3b 0a 20 20  v, "STMT N");.  
15a00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15a10 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
15a20 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
15a30 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
15a40 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
15a50 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
15a60 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
15a70 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
15a80 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
15a90 2c 20 26 69 29 20 29 20 72 65 74 75 72 6e 20 54  , &i) ) return T
15aa0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
15ab0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
15ac0 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e  erp, .     Tcl_N
15ad0 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
15ae0 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
15af0 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  er_name(pStmt,i)
15b00 2c 2d 31 29 0a 20 20 29 3b 0a 20 20 72 65 74 75  ,-1).  );.  retu
15b10 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
15b20 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
15b30 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
15b40 74 65 72 5f 69 6e 64 65 78 20 20 53 54 4d 54 20  ter_index  STMT 
15b50 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75   NAME.**.** Retu
15b60 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
15b70 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 61 6c  the wildcard cal
15b80 6c 65 64 20 4e 41 4d 45 2e 20 20 52 65 74 75 72  led NAME.  Retur
15b90 6e 20 30 20 69 66 20 74 68 65 72 65 20 69 73 0a  n 0 if there is.
15ba0 2a 2a 20 6e 6f 20 73 75 63 68 20 77 69 6c 64 63  ** no such wildc
15bb0 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
15bc0 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72  nt test_bind_par
15bd0 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 0a 20 20  ameter_index(.  
15be0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
15bf0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
15c00 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
15c10 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
15c20 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
15c30 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
15c40 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
15c50 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
15c60 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
15c70 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
15c80 53 54 4d 54 20 4e 41 4d 45 22 29 3b 0a 20 20 20  STMT NAME");.   
15c90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15ca0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
15cb0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
15cc0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
15cd0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
15ce0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
15cf0 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
15d00 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
15d10 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77  p, .     Tcl_New
15d20 49 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20 20 73  IntObj(.       s
15d30 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
15d40 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53 74 6d  meter_index(pStm
15d50 74 2c 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  t,Tcl_GetString(
15d60 6f 62 6a 76 5b 32 5d 29 29 0a 20 20 20 20 20 29  objv[2])).     )
15d70 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  .  );.  return T
15d80 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
15d90 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
15da0 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20  _clear_bindings 
15db0 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  STMT.**.*/.stati
15dc0 63 20 69 6e 74 20 74 65 73 74 5f 63 6c 65 61 72  c int test_clear
15dd0 5f 62 69 6e 64 69 6e 67 73 28 0a 20 20 76 6f 69  _bindings(.  voi
15de0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
15df0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15e00 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
15e10 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
15e20 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
15e30 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
15e40 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
15e50 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
15e60 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
15e70 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
15e80 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
15e90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
15ea0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
15eb0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
15ec0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
15ed0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
15ee0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15ef0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
15f00 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
15f10 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
15f20 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 28  _clear_bindings(
15f30 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75  pStmt)));.  retu
15f40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
15f50 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
15f60 69 74 65 33 5f 73 6c 65 65 70 20 4d 49 4c 4c 49  ite3_sleep MILLI
15f70 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74 61 74 69  SECONDS.*/.stati
15f80 63 20 69 6e 74 20 74 65 73 74 5f 73 6c 65 65 70  c int test_sleep
15f90 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
15fa0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
15fb0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
15fc0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
15fd0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
15fe0 0a 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a 0a 20  .){.  int ms;.. 
15ff0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
16000 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
16010 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
16020 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f  objv, "MILLISECO
16030 4e 44 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72  NDS");.    retur
16040 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16050 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
16060 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
16070 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29 20 29   objv[1], &ms) )
16080 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
16090 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
160a0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
160b0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
160c0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73 6c 65  tObj(sqlite3_sle
160d0 65 70 28 6d 73 29 29 29 3b 0a 20 20 72 65 74 75  ep(ms)));.  retu
160e0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
160f0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
16100 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
16110 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  ode DB.**.** Ret
16120 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72  urn the string r
16130 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
16140 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
16150 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a   sqlite3_* API.*
16160 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e  * error code. e.
16170 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52  g. "SQLITE_ERROR
16180 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
16190 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65   test_ex_errcode
161a0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
161b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
161c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
161d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
161e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
161f0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
16200 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
16210 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
16220 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
16230 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
16240 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
16250 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
16260 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
16270 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c  objv[0]), " DB",
16280 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
16290 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
162a0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
162b0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
162c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
162d0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
162e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
162f0 3d 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  = sqlite3_extend
16300 65 64 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  ed_errcode(db);.
16310 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
16320 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
16330 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
16340 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
16350 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
16360 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
16370 33 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a  3_errcode DB.**.
16380 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74  ** Return the st
16390 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
163a0 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
163b0 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a  recent sqlite3_*
163c0 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   API.** error co
163d0 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45  de. e.g. "SQLITE
163e0 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74  _ERROR"..*/.stat
163f0 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 63  ic int test_errc
16400 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ode(.  void * cl
16410 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
16420 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
16430 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
16440 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
16450 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
16460 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
16470 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
16480 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
16490 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
164a0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
164b0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
164c0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
164d0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
164e0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
164f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16500 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
16510 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
16520 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
16530 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
16540 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16550 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
16560 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f  code(db);.  Tcl_
16570 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16580 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
16590 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
165a0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
165b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
165c0 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67  e:   test_errmsg
165d0 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
165e0 73 20 74 68 65 20 55 54 46 2d 38 20 72 65 70 72  s the UTF-8 repr
165f0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
16600 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
16610 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a  string for the.*
16620 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  * most recent sq
16630 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c  lite3_* API call
16640 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16650 74 65 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76  test_errmsg(.  v
16660 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16670 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16680 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16690 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
166a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
166b0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
166c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
166d0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
166e0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
166f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16700 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
16710 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
16720 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
16730 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
16740 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
16750 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16760 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
16770 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
16780 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
16790 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
167a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
167b0 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
167c0 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20  3_errmsg(db);.  
167d0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
167e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
167f0 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20  StringObj(zErr, 
16800 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  -1));.  return T
16810 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
16820 55 73 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72  Usage:   test_er
16830 72 6d 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20  rmsg16 DB.**.** 
16840 52 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d  Returns the UTF-
16850 31 36 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  16 representatio
16860 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d  n of the error m
16870 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f  essage string fo
16880 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  r the.** most re
16890 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41  cent sqlite3_* A
168a0 50 49 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73  PI call. This is
168b0 20 61 20 62 79 74 65 20 61 72 72 61 79 20 6f 62   a byte array ob
168c0 6a 65 63 74 20 61 74 20 74 68 65 20 54 43 4c 20  ject at the TCL 
168d0 0a 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69  .** level, and i
168e0 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30  t includes the 0
168f0 78 30 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61  x00 0x00 termina
16900 74 6f 72 20 62 79 74 65 73 20 61 74 20 74 68 65  tor bytes at the
16910 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55   end of the.** U
16920 54 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f  TF-16 string..*/
16930 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
16940 5f 65 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69  _errmsg16(.  voi
16950 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
16960 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
16970 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
16980 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
16990 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
169a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
169b0 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
169c0 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   *db;.  const vo
169d0 69 64 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20  id *zErr;.  int 
169e0 62 79 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66  bytes = 0;..  if
169f0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
16a00 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16a10 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
16a20 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
16a30 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
16a40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
16a50 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
16a60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16a70 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
16a80 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
16a90 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
16aa0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
16ab0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
16ac0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72  L_ERROR;..  zErr
16ad0 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   = sqlite3_errms
16ae0 67 31 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a  g16(db);.  if( z
16af0 45 72 72 20 29 7b 0a 20 20 20 20 62 79 74 65 73  Err ){.    bytes
16b00 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 42   = sqlite3Utf16B
16b10 79 74 65 4c 65 6e 28 7a 45 72 72 2c 20 2d 31 29  yteLen(zErr, -1)
16b20 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
16b30 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
16b40 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
16b50 79 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74 65 73  yObj(zErr, bytes
16b60 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ));.#endif /* SQ
16b70 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
16b80 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
16b90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
16ba0 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
16bb0 61 72 65 20 44 42 20 73 71 6c 20 62 79 74 65 73  are DB sql bytes
16bc0 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43   tailvar.**.** C
16bd0 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
16be0 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
16bf0 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
16c00 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
16c10 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
16c20 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
16c30 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
16c40 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
16c50 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
16c60 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
16c70 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
16c80 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
16c90 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
16ca0 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
16cb0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
16cc0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
16cd0 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  pare(.  void * c
16ce0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
16cf0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16d00 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
16d10 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
16d20 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
16d30 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
16d40 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
16d50 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20   bytes;.  const 
16d60 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  char *zTail = 0;
16d70 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
16d80 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
16d90 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69  ar zBuf[50];.  i
16da0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
16db0 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
16dc0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16dd0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
16de0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
16df0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
16e00 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
16e10 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
16e20 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b  es tailvar", 0);
16e30 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
16e40 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
16e50 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
16e60 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
16e70 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
16e80 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
16e90 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
16ea0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
16eb0 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
16ec0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
16ed0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
16ee0 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
16ef0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
16f00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
16f10 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62  pare(db, zSql, b
16f20 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 26 7a  ytes, &pStmt, &z
16f30 54 61 69 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c  Tail);.  if( sql
16f40 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
16f50 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
16f60 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16f70 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20  OR;.  if( zTail 
16f80 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65 73  ){.    if( bytes
16f90 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74  >=0 ){.      byt
16fa0 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 7a 54  es = bytes - (zT
16fb0 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ail-zSql);.    }
16fc0 0a 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28  .    if( strlen(
16fd0 7a 54 61 69 6c 29 3c 62 79 74 65 73 20 29 7b 0a  zTail)<bytes ){.
16fe0 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 73 74        bytes = st
16ff0 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a 20 20 20  rlen(zTail);.   
17000 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65   }.    Tcl_ObjSe
17010 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62  tVar2(interp, ob
17020 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65  jv[4], 0, Tcl_Ne
17030 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c  wStringObj(zTail
17040 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20  , bytes), 0);.  
17050 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
17060 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
17070 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
17080 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
17090 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
170a0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
170b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
170c0 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
170d0 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
170e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
170f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
17100 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
17110 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
17120 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
17130 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
17140 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17150 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17160 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
17170 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
17180 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
17190 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
171a0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20  ite3_prepare_v2 
171b0 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69  DB sql bytes tai
171c0 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  lvar.**.** Compi
171d0 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e  le up to <bytes>
171e0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75   bytes of the su
171f0 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e  pplied SQL strin
17200 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a  g <sql> using.**
17210 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
17220 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d   <DB>. The param
17230 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69  eter <tailval> i
17240 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
17250 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62  global.** variab
17260 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74  le that is set t
17270 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72  o the unused por
17280 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69  tion of <sql> (i
17290 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d  f any). A.** STM
172a0 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75  T handle is retu
172b0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
172c0 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
172d0 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  _v2(.  void * cl
172e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
172f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
17300 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
17310 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
17320 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
17330 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
17340 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
17350 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63  bytes;.  const c
17360 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  har *zTail = 0;.
17370 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
17380 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
17390 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e  r zBuf[50];.  in
173a0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
173b0 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
173c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
173d0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
173e0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
173f0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
17400 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
17410 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
17420 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a  s tailvar", 0);.
17430 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17440 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
17450 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
17460 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
17470 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
17480 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17490 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
174a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
174b0 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c  v[2]);.  if( Tcl
174c0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
174d0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
174e0 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
174f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
17500 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
17510 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
17520 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
17530 26 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73 65 72  &zTail);.  asser
17540 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  t(rc==SQLITE_OK 
17550 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20  || pStmt==0);.  
17560 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
17570 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
17580 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
17590 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
175a0 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 69 66   zTail ){.    if
175b0 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
175c0 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65      bytes = byte
175d0 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29  s - (zTail-zSql)
175e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
175f0 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
17600 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54  p, objv[4], 0, T
17610 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
17620 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30  zTail, bytes), 0
17630 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
17640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17650 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
17660 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  =0 );.    sprint
17670 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  f(zBuf, "(%d) ",
17680 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
17690 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
176a0 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
176b0 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
176c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
176d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
176e0 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
176f0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
17700 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
17710 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
17720 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17730 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70  RROR;.    Tcl_Ap
17740 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17750 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d  p, zBuf, 0);.  }
17760 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
17770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
17780 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
17790 65 5f 74 6b 74 33 31 33 34 20 44 42 0a 2a 2a 0a  e_tkt3134 DB.**.
177a0 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 70 72  ** Generate a pr
177b0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
177c0 20 66 6f 72 20 61 20 7a 65 72 6f 2d 62 79 74 65   for a zero-byte
177d0 20 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 73   string as a tes
177e0 74 0a 2a 2a 20 66 6f 72 20 74 69 63 6b 65 74 20  t.** for ticket 
177f0 23 33 31 33 34 2e 20 20 54 68 65 20 73 74 72 69  #3134.  The stri
17800 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65  ng should be pre
17810 63 65 65 64 65 64 20 62 79 20 61 20 7a 65 72 6f  ceeded by a zero
17820 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   byte..*/.static
17830 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72   int test_prepar
17840 65 5f 74 6b 74 33 31 33 34 28 0a 20 20 76 6f 69  e_tkt3134(.  voi
17850 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
17860 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
17870 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
17880 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
17890 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
178a0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74  qlite3 *db;.  st
178b0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
178c0 7a 53 71 6c 5b 5d 20 3d 20 22 5c 30 30 30 53 45  zSql[] = "\000SE
178d0 4c 45 43 54 20 31 22 3b 0a 20 20 73 71 6c 69 74  LECT 1";.  sqlit
178e0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
178f0 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
17900 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  50];.  int rc;..
17910 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
17920 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17930 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17940 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17950 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
17960 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17970 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
17980 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76   sql bytes tailv
17990 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ar", 0);.    ret
179a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
179b0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
179c0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
179d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
179e0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
179f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17a00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
17a10 65 70 61 72 65 5f 76 32 28 64 62 2c 20 26 7a 53  epare_v2(db, &zS
17a20 71 6c 5b 31 5d 2c 20 30 2c 20 26 70 53 74 6d 74  ql[1], 0, &pStmt
17a30 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 72  , 0);.  assert(r
17a40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
17a50 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69 66 28  pStmt==0);.  if(
17a60 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
17a70 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
17a80 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
17a90 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
17aa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17ab0 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74     assert( pStmt
17ac0 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e  ==0 );.    sprin
17ad0 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22  tf(zBuf, "(%d) "
17ae0 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
17af0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
17b00 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
17b10 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29  3_errmsg(db), 0)
17b20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
17b30 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
17b40 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
17b50 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
17b60 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
17b70 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
17b80 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
17b90 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41  ERROR;.    Tcl_A
17ba0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
17bb0 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
17bc0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
17bd0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
17be0 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
17bf0 72 65 31 36 20 44 42 20 73 71 6c 20 62 79 74 65  re16 DB sql byte
17c00 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20  s tailvar.**.** 
17c10 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62  Compile up to <b
17c20 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74  ytes> bytes of t
17c30 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20  he supplied SQL 
17c40 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69  string <sql> usi
17c50 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  ng.** database h
17c60 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20  andle <DB>. The 
17c70 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76  parameter <tailv
17c80 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  al> is the name 
17c90 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76  of a global.** v
17ca0 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
17cb0 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65  set to the unuse
17cc0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71  d portion of <sq
17cd0 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a  l> (if any). A.*
17ce0 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73  * STMT handle is
17cf0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
17d00 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
17d10 65 70 61 72 65 31 36 28 0a 20 20 76 6f 69 64 20  epare16(.  void 
17d20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
17d30 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17d40 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
17d50 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
17d60 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
17d70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
17d80 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a  TF16.  sqlite3 *
17d90 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db;.  const void
17da0 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20   *zSql;.  const 
17db0 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  void *zTail = 0;
17dc0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69  .  Tcl_Obj *pTai
17dd0 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
17de0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
17df0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30  ;.  char zBuf[50
17e00 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ]; .  int rc;.  
17e10 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20  int bytes;      
17e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17e30 20 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69   integer specifi
17e40 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20  ed as arg 3 */. 
17e50 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20   int objlen;    
17e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17e70 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e  e byte-array len
17e80 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a  gth of arg 2 */.
17e90 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
17ea0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
17eb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
17ec0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
17ed0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
17ee0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
17ef0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
17f00 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
17f10 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  var", 0);.    re
17f20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17f30 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
17f40 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
17f50 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
17f60 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
17f70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17f80 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74    zSql = Tcl_Get
17f90 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
17fa0 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65  (objv[2], &objle
17fb0 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  n);.  if( Tcl_Ge
17fc0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
17fd0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  rp, objv[3], &by
17fe0 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
17ff0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
18000 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
18010 31 36 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74  16(db, zSql, byt
18020 65 73 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54 61  es, &pStmt, &zTa
18030 69 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  il);.  if( sqlit
18040 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
18050 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
18060 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18070 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
18080 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18090 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a  OR;.  }..  if( z
180a0 54 61 69 6c 20 29 7b 0a 20 20 20 20 6f 62 6a 6c  Tail ){.    objl
180b0 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 28  en = objlen - ((
180c0 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a  u8 *)zTail-(u8 *
180d0 29 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  )zSql);.  }else{
180e0 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b  .    objlen = 0;
180f0 0a 20 20 7d 0a 20 20 70 54 61 69 6c 20 3d 20 54  .  }.  pTail = T
18100 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
18110 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20  bj((u8 *)zTail, 
18120 6f 62 6a 6c 65 6e 29 3b 0a 20 20 54 63 6c 5f 49  objlen);.  Tcl_I
18130 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ncrRefCount(pTai
18140 6c 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 53 65 74  l);.  Tcl_ObjSet
18150 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
18160 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20  v[4], 0, pTail, 
18170 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
18180 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 0a  fCount(pTail);..
18190 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
181a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
181b0 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
181c0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
181d0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
181e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
181f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18200 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
18210 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
18220 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
18230 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
18240 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
18250 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
18260 72 65 31 36 5f 76 32 20 44 42 20 73 71 6c 20 62  re16_v2 DB sql b
18270 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a  ytes tailvar.**.
18280 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f  ** Compile up to
18290 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f   <bytes> bytes o
182a0 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53  f the supplied S
182b0 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20  QL string <sql> 
182c0 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  using.** databas
182d0 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54  e handle <DB>. T
182e0 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61  he parameter <ta
182f0 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61  ilval> is the na
18300 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a  me of a global.*
18310 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  * variable that 
18320 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e  is set to the un
18330 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  used portion of 
18340 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20  <sql> (if any). 
18350 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65  A.** STMT handle
18360 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
18370 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
18380 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 0a 20  _prepare16_v2(. 
18390 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
183a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
183b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
183c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
183d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
183e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
183f0 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
18400 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
18410 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20  t void *zSql;.  
18420 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69  const void *zTai
18430 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a  l = 0;.  Tcl_Obj
18440 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73   *pTail = 0;.  s
18450 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
18460 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  mt = 0;.  char z
18470 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20  Buf[50]; .  int 
18480 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  rc;.  int bytes;
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184a0 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73  /* The integer s
184b0 70 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20  pecified as arg 
184c0 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65  3 */.  int objle
184d0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
184e0 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72   /* The byte-arr
184f0 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67  ay length of arg
18500 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a   2 */..  if( obj
18510 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
18520 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
18530 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
18540 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
18550 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
18560 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
18570 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
18580 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a  s tailvar", 0);.
18590 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
185a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
185b0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
185c0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
185d0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
185e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
185f0 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
18600 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
18610 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
18620 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20  &objlen);.  if( 
18630 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
18640 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
18650 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
18660 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
18670 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
18680 72 65 70 61 72 65 31 36 5f 76 32 28 64 62 2c 20  repare16_v2(db, 
18690 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
186a0 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20  tmt, &zTail);.  
186b0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
186c0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
186d0 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
186e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
186f0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
18700 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18710 0a 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b  ..  if( zTail ){
18720 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62  .    objlen = ob
18730 6a 6c 65 6e 20 2d 20 28 28 75 38 20 2a 29 7a 54  jlen - ((u8 *)zT
18740 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b  ail-(u8 *)zSql);
18750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 62  .  }else{.    ob
18760 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  jlen = 0;.  }.  
18770 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42  pTail = Tcl_NewB
18780 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20  yteArrayObj((u8 
18790 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29  *)zTail, objlen)
187a0 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
187b0 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 54  ount(pTail);.  T
187c0 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
187d0 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30  terp, objv[4], 0
187e0 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 54  , pTail, 0);.  T
187f0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
18800 70 54 61 69 6c 29 3b 0a 0a 20 20 69 66 28 20 70  pTail);..  if( p
18810 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
18820 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
18830 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
18840 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
18850 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18860 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  R;.  }.  Tcl_App
18870 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
18880 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64  , zBuf, 0);.#end
18890 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
188a0 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
188b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
188c0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
188d0 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e 61 6d  te3_open filenam
188e0 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 3f  e ?options-list?
188f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18900 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64  est_open(.  void
18910 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18920 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18930 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18940 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18950 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f  T objv[].){.  co
18960 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
18970 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ame;.  sqlite3 *
18980 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
18990 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
189a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
189b0 26 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  & objc!=2 && obj
189c0 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
189d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
189e0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
189f0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
18a00 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
18a10 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
18a20 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70  ), " filename op
18a30 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b  tions-list", 0);
18a40 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18a50 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46  ERROR;.  }..  zF
18a60 69 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e 31  ilename = objc>1
18a70 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   ? Tcl_GetString
18a80 28 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a 20  (objv[1]) : 0;. 
18a90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
18aa0 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64  en(zFilename, &d
18ab0 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c  b);.  .  if( sql
18ac0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
18ad0 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
18ae0 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72  Buf, db) ) retur
18af0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
18b00 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
18b10 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
18b20 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
18b30 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
18b40 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  e: sqlite3_open1
18b50 36 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f  6 filename optio
18b60 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ns.*/.static int
18b70 20 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20   test_open16(.  
18b80 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18b90 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
18ba0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
18bb0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18bc0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18bd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18be0 4d 49 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73  MIT_UTF16.  cons
18bf0 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
18c00 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
18c10 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
18c20 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20  ar zBuf[100];.. 
18c30 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
18c40 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
18c50 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
18c60 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
18c70 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
18c80 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
18c90 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c  (objv[0]), " fil
18ca0 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69  ename options-li
18cb0 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  st", 0);.    ret
18cc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18cd0 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20   }..  zFilename 
18ce0 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
18cf0 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ayFromObj(objv[1
18d00 5d 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  ], 0);.  rc = sq
18d10 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46 69  lite3_open16(zFi
18d20 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20  lename, &db);.  
18d30 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
18d40 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
18d50 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64  (interp, zBuf, d
18d60 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
18d70 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70  ERROR;.  Tcl_App
18d80 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
18d90 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64  , zBuf, 0);.#end
18da0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
18db0 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
18dc0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
18dd0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
18de0 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20 3c  te3_complete16 <
18df0 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a 2a  UTF-16 string>.*
18e00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
18e10 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 61 72   the supplied ar
18e20 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d 70  gument is a comp
18e30 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65  lete SQL stateme
18e40 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f  nt, or zero.** o
18e50 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
18e60 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6d  tic int test_com
18e70 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64 20  plete16(.  void 
18e80 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18e90 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18ea0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18eb0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18ec0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 21   objv[].){.#if !
18ed0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
18ee0 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26 26  MIT_COMPLETE) &&
18ef0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
18f00 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20 63  _OMIT_UTF16).  c
18f10 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66  har *zBuf;..  if
18f20 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
18f30 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
18f40 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
18f50 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c 3e  v, "<utf-16 sql>
18f60 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
18f70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
18f80 20 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29 54   zBuf = (char*)T
18f90 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
18fa0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
18fb0 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  0);.  Tcl_SetObj
18fc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
18fd0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
18fe0 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28  ite3_complete16(
18ff0 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66 20  zBuf)));.#endif 
19000 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
19010 4f 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49 54  OMPLETE && SQLIT
19020 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
19030 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
19040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
19050 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 53 54   sqlite3_step ST
19060 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  MT.**.** Advance
19070 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
19080 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a  o the next row..
19090 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
190a0 73 74 5f 73 74 65 70 28 0a 20 20 76 6f 69 64 20  st_step(.  void 
190b0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
190c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
190d0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
190e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
190f0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
19100 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
19110 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
19120 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
19130 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19140 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
19150 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
19160 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
19170 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19180 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 22  bjv[0]), " STMT"
19190 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
191a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
191b0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
191c0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
191d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
191e0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
191f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19200 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19210 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20  _step(pStmt);.. 
19220 20 2f 2a 20 69 66 28 20 72 63 21 3d 53 51 4c 49   /* if( rc!=SQLI
19230 54 45 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d 53  TE_DONE && rc!=S
19240 51 4c 49 54 45 5f 52 4f 57 20 29 20 72 65 74 75  QLITE_ROW ) retu
19250 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f  rn TCL_ERROR; */
19260 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
19270 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
19280 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
19290 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
192a0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
192b0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
192c0 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d 54  olumn_count STMT
192d0 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74   .**.** Return t
192e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
192f0 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
19300 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65   the sql stateme
19310 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74  nt STMT..*/.stat
19320 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
19330 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  mn_count(.  void
19340 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
19350 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19360 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19370 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19380 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
19390 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
193a0 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
193b0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
193c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
193d0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
193e0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
193f0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
19400 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
19410 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
19420 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
19430 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
19440 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
19450 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19460 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19470 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
19480 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19490 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
194a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
194b0 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
194c0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
194d0 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
194e0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
194f0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
19500 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54  3_column_type ST
19510 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
19520 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
19530 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e 20 63  of the data in c
19540 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f  olumn 'column' o
19550 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
19560 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
19570 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70   test_column_typ
19580 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
19590 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
195a0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
195b0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
195c0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
195d0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
195e0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
195f0 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70 3b  t col;.  int tp;
19600 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
19610 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
19620 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19630 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
19640 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
19650 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
19660 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
19670 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
19680 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
19690 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
196a0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
196b0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
196c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
196d0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
196e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
196f0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
19700 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
19710 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
19720 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19730 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74 65 33  ..  tp = sqlite3
19740 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
19750 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69 74  mt, col);.  swit
19760 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20 63 61  ch( tp ){.    ca
19770 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
19780 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  R: .      Tcl_Se
19790 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
197a0 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f 53  "INTEGER", TCL_S
197b0 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
197c0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
197d0 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20  QLITE_NULL:.    
197e0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
197f0 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c 20  interp, "NULL", 
19800 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
19810 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
19820 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
19830 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  :.      Tcl_SetR
19840 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46  esult(interp, "F
19850 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41 54 49  LOAT", TCL_STATI
19860 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
19870 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
19880 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 54 63  E_TEXT:.      Tc
19890 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
198a0 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43 4c 5f  rp, "TEXT", TCL_
198b0 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
198c0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
198d0 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20  SQLITE_BLOB:.   
198e0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
198f0 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22 2c  (interp, "BLOB",
19900 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20   TCL_STATIC); . 
19910 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19920 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
19930 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20  ssert(0);.  }.. 
19940 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
19950 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
19960 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
19970 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  nt64 STMT column
19980 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
19990 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e  e data in column
199a0 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65   'column' of the
199b0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73   current row cas
199c0 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65 20  t as an.** wide 
199d0 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67 65 72  (64-bit) integer
199e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
199f0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  test_column_int6
19a00 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  4(.  void * clie
19a10 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
19a20 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
19a30 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
19a40 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
19a50 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
19a60 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
19a70 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69 56 61  t col;.  i64 iVa
19a80 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
19a90 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
19aa0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19ab0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
19ac0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
19ad0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
19ae0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
19af0 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
19b00 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
19b10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
19b20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
19b30 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19b40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19b50 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
19b60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19b70 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
19b80 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
19b90 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
19ba0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19bb0 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73 71 6c  R;..  iVal = sql
19bc0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
19bd0 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  4(pStmt, col);. 
19be0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
19bf0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
19c00 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56 61 6c  wWideIntObj(iVal
19c10 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
19c20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
19c30 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
19c40 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20 63 6f  umn_blob STMT co
19c50 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lumn.*/.static i
19c60 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62  nt test_column_b
19c70 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
19c80 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
19c90 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19ca0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19cb0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
19cc0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
19cd0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
19ce0 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74 20  int col;..  int 
19cf0 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  len;.  const voi
19d00 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69 66 28  d *pBlob;..  if(
19d10 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
19d20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19d30 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
19d40 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
19d50 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
19d60 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19d70 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
19d80 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
19d90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19da0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
19db0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
19dc0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
19dd0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
19de0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
19df0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
19e00 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
19e10 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
19e20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
19e30 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 6c 65 6e  CL_ERROR;..  len
19e40 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
19e50 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 63  n_bytes(pStmt, c
19e60 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73  ol);.  pBlob = s
19e70 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
19e80 6f 62 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  ob(pStmt, col);.
19e90 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
19ea0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
19eb0 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 70  ewByteArrayObj(p
19ec0 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20 20 72  Blob, len));.  r
19ed0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
19ee0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
19ef0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
19f00 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ble STMT column.
19f10 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
19f20 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20   data in column 
19f30 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20  'column' of the 
19f40 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74  current row cast
19f50 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a 2a 2f   as a double..*/
19f60 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
19f70 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 0a  _column_double(.
19f80 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
19f90 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
19fa0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
19fb0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
19fc0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
19fd0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
19fe0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
19ff0 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72 56 61  ol;.  double rVa
1a000 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
1a010 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1a020 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a030 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1a040 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1a050 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1a060 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1a070 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1a080 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a090 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1a0a0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1a0b0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1a0c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1a0d0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1a0e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a0f0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1a100 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1a110 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1a120 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a130 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73 71 6c  R;..  rVal = sql
1a140 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
1a150 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  le(pStmt, col);.
1a160 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1a170 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1a180 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56 61 6c  ewDoubleObj(rVal
1a190 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1a1a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1a1b0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64 61 74  age: sqlite3_dat
1a1c0 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a  a_count STMT .**
1a1d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1a1e0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1a1f0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1a200 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53   sql statement S
1a210 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  TMT..*/.static i
1a220 6e 74 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75  nt test_data_cou
1a230 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
1a240 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1a250 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1a260 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1a270 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1a280 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1a290 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
1a2a0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1a2b0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a2c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1a2d0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1a2e0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1a2f0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1a300 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1a310 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1a320 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a330 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1a340 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1a350 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1a360 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1a370 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1a380 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c  CL_ERROR;..  Tcl
1a390 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1a3a0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1a3b0 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61 74 61  Obj(sqlite3_data
1a3c0 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b  _count(pStmt)));
1a3d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1a3e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1a3f0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1a400 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d  _text STMT colum
1a410 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
1a420 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
1a430 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75  cltype STMT colu
1a440 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1a450 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
1a460 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ame STMT column.
1a470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1a480 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a 20 20  st_stmt_utf8(.  
1a490 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1a4a0 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  a,        /* Poi
1a4b0 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41  nter to SQLite A
1a4c0 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  PI function to b
1a4d0 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54 63  e invoke */.  Tc
1a4e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1a4f0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1a500 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1a510 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1a520 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1a530 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e    int col;.  con
1a540 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75 6e 63  st char *(*xFunc
1a550 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
1a560 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63   int);.  const c
1a570 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 78 46  har *zRet;..  xF
1a580 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  unc = (const cha
1a590 72 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73  r *(*)(sqlite3_s
1a5a0 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e  tmt*, int))clien
1a5b0 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a  tData;.  if( obj
1a5c0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1a5d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a5e0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1a5f0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a600 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1a610 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1a620 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1a630 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1a640 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1a650 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1a660 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1a670 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a680 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1a690 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a6a0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1a6b0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1a6c0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
1a6d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a6e0 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d 20 78  RROR;.  zRet = x
1a6f0 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29  Func(pStmt, col)
1a700 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a  ;.  if( zRet ){.
1a710 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1a720 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1a730 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20 7d 0a  *)zRet, 0);.  }.
1a740 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1a750 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
1a760 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  est_global_recov
1a770 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  er(.  void * cli
1a780 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1a790 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1a7a0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1a7b0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1a7c0 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
1a7d0 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41 4c  LITE_OMIT_GLOBAL
1a7e0 52 45 43 4f 56 45 52 0a 23 69 66 6e 64 65 66 20  RECOVER.#ifndef 
1a7f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
1a800 45 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63 3b  ECATED.  int rc;
1a810 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
1a820 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1a830 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1a840 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
1a850 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a860 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
1a870 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
1a880 6f 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65  over();.  Tcl_Se
1a890 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1a8a0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1a8b0 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
1a8c0 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e  TIC);.#endif.#en
1a8d0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
1a8e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1a8f0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1a900 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f  umn_text STMT co
1a910 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
1a920 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1a930 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63  _decltype STMT c
1a940 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
1a950 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1a960 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75  n_name STMT colu
1a970 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  mn.*/.static int
1a980 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
1a990 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1a9a0 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f  tData,     /* Po
1a9b0 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20  inter to SQLite 
1a9c0 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  API function to 
1a9d0 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20  be invoked */.  
1a9e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1a9f0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1aa00 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1aa10 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
1aa20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
1aa30 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73  TF16.  sqlite3_s
1aa40 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1aa50 74 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a  t col;.  Tcl_Obj
1aa60 20 2a 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20   *pRet;.  const 
1aa70 76 6f 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20  void *zName16;. 
1aa80 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78   const void *(*x
1aa90 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
1aaa0 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46  mt*, int);..  xF
1aab0 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69  unc = (const voi
1aac0 64 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73  d *(*)(sqlite3_s
1aad0 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e  tmt*, int))clien
1aae0 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a  tData;.  if( obj
1aaf0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1ab00 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ab10 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1ab20 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1ab30 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1ab40 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1ab50 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1ab60 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1ab70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1ab80 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1ab90 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1aba0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1abb0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1abc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1abd0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1abe0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1abf0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
1ac00 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1ac10 52 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36  RROR;..  zName16
1ac20 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20   = xFunc(pStmt, 
1ac30 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  col);.  if( zNam
1ac40 65 31 36 20 29 7b 0a 20 20 20 20 70 52 65 74 20  e16 ){.    pRet 
1ac50 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
1ac60 61 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 73  ayObj(zName16, s
1ac70 71 6c 69 74 65 33 55 74 66 31 36 42 79 74 65 4c  qlite3Utf16ByteL
1ac80 65 6e 28 7a 4e 61 6d 65 31 36 2c 20 2d 31 29 2b  en(zName16, -1)+
1ac90 32 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  2);.    Tcl_SetO
1aca0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1acb0 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64   pRet);.  }.#end
1acc0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1acd0 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65  T_UTF16 */..  re
1ace0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1acf0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1ad00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20  ite3_column_int 
1ad10 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1ad20 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1ad30 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54  _column_bytes ST
1ad40 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1ad50 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1ad60 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54  olumn_bytes16 ST
1ad70 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a  MT column.**.*/.
1ad80 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1ad90 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64  stmt_int(.  void
1ada0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20   * clientData,  
1adb0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1adc0 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74  SQLite API funct
1add0 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
1ade0 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
1adf0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1ae00 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1ae10 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1ae20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1ae30 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
1ae40 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e  ol;.  int (*xFun
1ae50 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  c)(sqlite3_stmt*
1ae60 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63  , int);..  xFunc
1ae70 20 3d 20 28 69 6e 74 20 28 2a 29 28 73 71 6c 69   = (int (*)(sqli
1ae80 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29  te3_stmt*, int))
1ae90 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66  clientData;.  if
1aea0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1aeb0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1aec0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1aed0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1aee0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1aef0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1af00 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1af10 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1af20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1af30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1af40 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1af50 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1af60 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1af70 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1af80 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1af90 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1afa0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1afb0 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1afc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63  TCL_ERROR;..  Tc
1afd0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1afe0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1aff0 74 4f 62 6a 28 78 46 75 6e 63 28 70 53 74 6d 74  tObj(xFunc(pStmt
1b000 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72 65 74 75  , col)));.  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 20 73 71 6c 69  .** Usage:  sqli
1b030 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 44 42  te_set_magic  DB
1b040 20 20 4d 41 47 49 43 2d 4e 55 4d 42 45 52 0a 2a    MAGIC-NUMBER.*
1b050 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 62 2d  *.** Set the db-
1b060 3e 6d 61 67 69 63 20 76 61 6c 75 65 2e 20 20 54  >magic value.  T
1b070 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
1b080 65 73 74 20 65 72 72 6f 72 20 72 65 63 6f 76 65  est error recove
1b090 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61  ry logic..*/.sta
1b0a0 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 73  tic int sqlite_s
1b0b0 65 74 5f 6d 61 67 69 63 28 0a 20 20 76 6f 69 64  et_magic(.  void
1b0c0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1b0d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1b0e0 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1b0f0 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1b100 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1b110 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
1b120 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1b130 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1b140 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1b150 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1b160 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 22  v[0],.         "
1b170 20 44 42 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a   DB MAGIC", 0);.
1b180 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b190 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1b1a0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1b1b0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1b1c0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1b1d0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72  ERROR;.  if( str
1b1e0 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
1b1f0 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22  LITE_MAGIC_OPEN"
1b200 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
1b210 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1b220 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c  AGIC_OPEN;.  }el
1b230 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
1b240 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
1b250 41 47 49 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30  AGIC_CLOSED")==0
1b260 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
1b270 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
1b280 5f 43 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65  _CLOSED;.  }else
1b290 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
1b2a0 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
1b2b0 49 43 5f 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a  IC_BUSY")==0 ){.
1b2c0 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
1b2d0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
1b2e0 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  Y;.  }else if( s
1b2f0 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
1b300 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
1b310 4f 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  OR")==0 ){.    d
1b320 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
1b330 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20  E_MAGIC_ERROR;. 
1b340 20 7d 65 6c 73 65 20 69 66 28 20 54 63 6c 5f 47   }else if( Tcl_G
1b350 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
1b360 67 76 5b 32 5d 2c 20 26 64 62 2d 3e 6d 61 67 69  gv[2], &db->magi
1b370 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  c) ){.    return
1b380 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1b390 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1b3a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1b3b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72    sqlite3_interr
1b3c0 75 70 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54  upt  DB .**.** T
1b3d0 72 69 67 67 65 72 20 61 6e 20 69 6e 74 65 72 72  rigger an interr
1b3e0 75 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61  upt on DB.*/.sta
1b3f0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 69 6e 74  tic int test_int
1b400 65 72 72 75 70 74 28 0a 20 20 76 6f 69 64 20 2a  errupt(.  void *
1b410 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1b420 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1b430 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1b440 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1b450 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1b460 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
1b470 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1b480 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1b490 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1b4a0 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1b4b0 30 5d 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0], " DB", 0);. 
1b4c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b4d0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1b4e0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1b4f0 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1b500 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b510 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
1b520 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20  interrupt(db);. 
1b530 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1b540 7d 0a 0a 73 74 61 74 69 63 20 75 38 20 2a 73 71  }..static u8 *sq
1b550 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65  lite3_stack_base
1b560 6c 69 6e 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  line = 0;../*.**
1b570 20 46 69 6c 6c 20 74 68 65 20 73 74 61 63 6b 20   Fill the stack 
1b580 77 69 74 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74  with a known bit
1b590 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74  pattern..*/.stat
1b5a0 69 63 20 76 6f 69 64 20 70 72 65 70 53 74 61 63  ic void prepStac
1b5b0 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69  k(void){.  int i
1b5c0 3b 0a 20 20 75 33 32 20 62 69 67 42 75 66 5b 36  ;.  u32 bigBuf[6
1b5d0 35 35 33 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  5536];.  for(i=0
1b5e0 3b 20 69 3c 73 69 7a 65 6f 66 28 62 69 67 42 75  ; i<sizeof(bigBu
1b5f0 66 29 3b 20 69 2b 2b 29 20 62 69 67 42 75 66 5b  f); i++) bigBuf[
1b600 69 5d 20 3d 20 30 78 64 65 61 64 62 65 65 66 3b  i] = 0xdeadbeef;
1b610 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b  .  sqlite3_stack
1b620 5f 62 61 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a  _baseline = (u8*
1b630 29 26 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b  )&bigBuf[65536];
1b640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68  .}../*.** Get th
1b650 65 20 63 75 72 72 65 6e 74 20 73 74 61 63 6b 20  e current stack 
1b660 64 65 70 74 68 2e 20 20 55 73 65 64 20 66 6f 72  depth.  Used for
1b670 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
1b680 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 53  .*/.u64 sqlite3S
1b690 74 61 63 6b 44 65 70 74 68 28 76 6f 69 64 29 7b  tackDepth(void){
1b6a0 0a 20 20 75 38 20 78 3b 0a 20 20 72 65 74 75 72  .  u8 x;.  retur
1b6b0 6e 20 28 75 36 34 29 28 73 71 6c 69 74 65 33 5f  n (u64)(sqlite3_
1b6c0 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d  stack_baseline -
1b6d0 20 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   &x);.}../*.** U
1b6e0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
1b6f0 74 61 63 6b 5f 75 73 65 64 20 44 42 20 53 51 4c  tack_used DB SQL
1b700 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65  .**.** Try to me
1b710 61 73 75 72 65 20 74 68 65 20 61 6d 6f 75 6e 74  asure the amount
1b720 20 6f 66 20 73 74 61 63 6b 20 73 70 61 63 65 20   of stack space 
1b730 75 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  used by a call t
1b740 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a  o sqlite3_exec.*
1b750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1b760 74 5f 73 74 61 63 6b 5f 75 73 65 64 28 0a 20 20  t_stack_used(.  
1b770 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1b780 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1b790 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1b7a0 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1b7b0 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
1b7c0 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *db;.  int i;.  
1b7d0 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1b7e0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1b7f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1b800 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1b810 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1b820 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1b830 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72   SQL", 0);.    r
1b840 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b850 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1b860 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1b870 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1b880 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b890 3b 0a 20 20 70 72 65 70 53 74 61 63 6b 28 29 3b  ;.  prepStack();
1b8a0 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
1b8b0 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32  _exec(db, argv[2
1b8c0 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66  ], 0, 0, 0);.  f
1b8d0 6f 72 28 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30  or(i=65535; i>=0
1b8e0 20 26 26 20 28 28 75 33 32 2a 29 73 71 6c 69 74   && ((u32*)sqlit
1b8f0 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e  e3_stack_baselin
1b900 65 29 5b 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65  e)[-i]==0xdeadbe
1b910 65 66 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c  ef; i--){}.  Tcl
1b920 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1b930 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1b940 4f 62 6a 28 69 2a 34 29 29 3b 0a 20 20 72 65 74  Obj(i*4));.  ret
1b950 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1b960 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1b970 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69  te_delete_functi
1b980 6f 6e 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e  on DB function-n
1b990 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65  ame.**.** Delete
1b9a0 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   the user functi
1b9b0 6f 6e 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d  on 'function-nam
1b9c0 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  e' from database
1b9d0 20 68 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a   handle DB. It.*
1b9e0 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  * is assumed tha
1b9f0 74 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  t the user funct
1ba00 69 6f 6e 20 77 61 73 20 63 72 65 61 74 65 64 20  ion was created 
1ba10 61 73 20 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d  as UTF8, any num
1ba20 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65  ber of.** argume
1ba30 6e 74 73 20 28 74 68 65 20 77 61 79 20 74 68 65  nts (the way the
1ba40 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64   TCL interface d
1ba50 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74  oes it)..*/.stat
1ba60 69 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 66 75  ic int delete_fu
1ba70 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  nction(.  void *
1ba80 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1ba90 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1baa0 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1bab0 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1bac0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1bad0 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1bae0 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1baf0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1bb00 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1bb10 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1bb20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1bb30 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63         " DB func
1bb40 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a  tion-name", 0);.
1bb50 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1bb60 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1bb70 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1bb80 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1bb90 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1bba0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1bbb0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1bbc0 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32  ction(db, argv[2
1bbd0 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ], -1, SQLITE_UT
1bbe0 46 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  F8, 0, 0, 0, 0);
1bbf0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1bc00 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1bc10 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1bc20 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
1bc30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1bc40 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1bc50 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f  sqlite_delete_co
1bc60 6c 6c 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61  llation DB colla
1bc70 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  tion-name.**.** 
1bc80 44 65 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c 61  Delete the colla
1bc90 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 27 63  tion sequence 'c
1bca0 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66  ollation-name' f
1bcb0 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e  rom database han
1bcc0 64 6c 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69  dle .** DB. It i
1bcd0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1bce0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1bcf0 75 65 6e 63 65 20 77 61 73 20 63 72 65 61 74 65  uence was create
1bd00 64 20 61 73 20 55 54 46 38 20 28 74 68 65 20 0a  d as UTF8 (the .
1bd10 2a 2a 20 77 61 79 20 74 68 65 20 54 43 4c 20 69  ** way the TCL i
1bd20 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 69 74  nterface does it
1bd30 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1bd40 20 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f   delete_collatio
1bd50 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
1bd60 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1bd70 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1bd80 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1bd90 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
1bda0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
1bdb0 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
1bdc0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1bdd0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1bde0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1bdf0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1be00 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1be10 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d    " DB function-
1be20 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  name", 0);.    r
1be30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1be40 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1be50 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1be60 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1be70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1be80 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1be90 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
1bea0 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53  n(db, argv[2], S
1beb0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30  QLITE_UTF8, 0, 0
1bec0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
1bed0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1bee0 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
1bef0 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
1bf00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1bf10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1bf20 3a 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  : sqlite3_get_au
1bf30 74 6f 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a  tocommit DB.**.*
1bf40 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1bf50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42   the database DB
1bf60 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
1bf70 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64   auto-commit mod
1bf80 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c  e..** Return fal
1bf90 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  se if not..*/.st
1bfa0 61 74 69 63 20 69 6e 74 20 67 65 74 5f 61 75 74  atic int get_aut
1bfb0 6f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20  ocommit(.  void 
1bfc0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1bfd0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1bfe0 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
1bff0 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
1c000 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
1c010 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1c020 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1c030 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1c040 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1c050 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1c060 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1c070 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
1c080 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
1c090 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1c0a0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1c0b0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
1c0c0 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
1c0d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c0e0 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
1c0f0 20 22 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 67   "%d", sqlite3_g
1c100 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62  et_autocommit(db
1c110 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ));.  Tcl_Append
1c120 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1c130 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
1c140 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1c150 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1c160 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 44  3_busy_timeout D
1c170 42 20 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74  B MS.**.** Set t
1c180 68 65 20 62 75 73 79 20 74 69 6d 65 6f 75 74 2e  he busy timeout.
1c190 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 65    This is more e
1c1a0 61 73 69 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67  asily done using
1c1b0 20 74 68 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20   the timeout.** 
1c1c0 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 54 43  method of the TC
1c1d0 4c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 42 75  L interface.  Bu
1c1e0 74 20 77 65 20 6e 65 65 64 20 61 20 77 61 79 20  t we need a way 
1c1f0 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
1c200 0a 2a 2a 20 77 68 65 72 65 20 69 74 20 72 65 74  .** where it ret
1c210 75 72 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53 55  urns SQLITE_MISU
1c220 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
1c230 74 20 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65  t test_busy_time
1c240 6f 75 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  out(.  void * cl
1c250 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1c260 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1c270 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1c280 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ar **argv.){.  i
1c290 6e 74 20 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c  nt rc, ms;.  sql
1c2a0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1c2b0 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
1c2c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c2d0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1c2e0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1c2f0 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
1c300 20 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30          " DB", 0
1c310 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c320 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1c330 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1c340 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
1c350 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1c360 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1c370 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
1c380 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29  p, argv[2], &ms)
1c390 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c3a0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
1c3b0 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
1c3c0 28 64 62 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f  (db, ms);.  Tcl_
1c3d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c3e0 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74  erp, sqlite3Test
1c3f0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
1c400 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1c410 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1c420 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61 62 6c  ge:  tcl_variabl
1c430 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c 45 4e  e_type VARIABLEN
1c440 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AME.**.** Return
1c450 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1c460 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73   internal repres
1c470 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  entation for the
1c480 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
1c490 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c 65 2e   given variable.
1c4a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1c4b0 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
1c4c0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1c4d0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1c4e0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c4f0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c500 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c510 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  .){.  Tcl_Obj *p
1c520 56 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  Var;.  if( objc!
1c530 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1c540 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1c550 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52  p, 1, objv, "VAR
1c560 49 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74  IABLE");.    ret
1c570 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c580 20 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f   }.  pVar = Tcl_
1c590 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
1c5a0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1c5b0 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c  objv[1]), 0, TCL
1c5c0 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b  _LEAVE_ERR_MSG);
1c5d0 0a 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29  .  if( pVar==0 )
1c5e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c5f0 52 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74  R;.  if( pVar->t
1c600 79 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63  ypePtr ){.    Tc
1c610 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1c620 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
1c630 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79  ringObj(pVar->ty
1c640 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29  pePtr->name, -1)
1c650 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1c660 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1c670 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
1c680 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20  _release_memory 
1c690 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70  ?N?.**.** Attemp
1c6a0 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d  t to release mem
1c6b0 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ory currently he
1c6c0 6c 64 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61  ld but not actua
1c6d0 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a  lly required..**
1c6e0 20 54 68 65 20 69 6e 74 65 67 65 72 20 4e 20 69   The integer N i
1c6f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1c700 62 79 74 65 73 20 77 65 20 61 72 65 20 74 72 79  bytes we are try
1c710 69 6e 67 20 74 6f 20 72 65 6c 65 61 73 65 2e 20  ing to release. 
1c720 20 54 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20   The .** return 
1c730 76 61 6c 75 65 20 69 73 20 74 68 65 20 61 6d 6f  value is the amo
1c740 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63  unt of memory ac
1c750 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e  tually released.
1c760 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1c770 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  est_release_memo
1c780 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ry(.  void * cli
1c790 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1c7a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1c7b0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1c7c0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c7d0 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  [].){.#if define
1c7e0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1c7f0 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
1c800 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  T) && !defined(S
1c810 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
1c820 4f 29 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e  O).  int N;.  in
1c830 74 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a  t amt;.  if( obj
1c840 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20  c!=1 && objc!=2 
1c850 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1c860 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1c870 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b  1, objv, "?N?");
1c880 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1c890 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1c8a0 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
1c8b0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1c8c0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1c8d0 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74  jv[1], &N) ) ret
1c8e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c8f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20   }else{.    N = 
1c900 2d 31 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20  -1;.  }.  amt = 
1c910 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
1c920 6d 65 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c  memory(N);.  Tcl
1c930 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1c940 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1c950 4f 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69  Obj(amt));.#endi
1c960 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
1c970 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1c980 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74  e:  sqlite3_soft
1c990 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a  _heap_limit ?N?.
1c9a0 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 6f 72 20 73  **.** Query or s
1c9b0 65 74 20 74 68 65 20 73 6f 66 74 20 68 65 61 70  et the soft heap
1c9c0 20 6c 69 6d 69 74 20 66 6f 72 20 74 68 65 20 63   limit for the c
1c9d0 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20  urrent thread.  
1c9e0 54 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20  The.** limit is 
1c9f0 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66 20  only changed if 
1ca00 74 68 65 20 4e 20 69 73 20 70 72 65 73 65 6e 74  the N is present
1ca10 2e 20 20 54 68 65 20 70 72 65 76 69 6f 75 73 20  .  The previous 
1ca20 6c 69 6d 69 74 0a 2a 2a 20 69 73 20 72 65 74 75  limit.** is retu
1ca30 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1ca40 69 6e 74 20 74 65 73 74 5f 73 6f 66 74 5f 68 65  int test_soft_he
1ca50 61 70 5f 6c 69 6d 69 74 28 0a 20 20 76 6f 69 64  ap_limit(.  void
1ca60 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1ca70 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1ca80 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1ca90 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1caa0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74  T objv[].){.  st
1cab0 61 74 69 63 20 69 6e 74 20 73 6f 66 74 48 65 61  atic int softHea
1cac0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  pLimit = 0;.  in
1cad0 74 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a  t amt;.  if( obj
1cae0 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20  c!=1 && objc!=2 
1caf0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1cb00 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1cb10 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b  1, objv, "?N?");
1cb20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1cb30 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d 74  ERROR;.  }.  amt
1cb40 20 3d 20 73 6f 66 74 48 65 61 70 4c 69 6d 69 74   = softHeapLimit
1cb50 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  ;.  if( objc==2 
1cb60 29 7b 0a 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20  ){.    int N;.  
1cb70 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1cb80 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1cb90 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72  objv[1], &N) ) r
1cba0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1cbb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6f 66  .    sqlite3_sof
1cbc0 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 4e 29 3b  t_heap_limit(N);
1cbd0 0a 20 20 20 20 73 6f 66 74 48 65 61 70 4c 69 6d  .    softHeapLim
1cbe0 69 74 20 3d 20 4e 3b 0a 20 20 7d 0a 20 20 54 63  it = N;.  }.  Tc
1cbf0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1cc00 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1cc10 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65  tObj(amt));.  re
1cc20 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1cc30 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
1cc40 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
1cc50 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  eanup.**.** Call
1cc60 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72   the sqlite3_thr
1cc70 65 61 64 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e  ead_cleanup API.
1cc80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1cc90 65 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  est_thread_clean
1cca0 75 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  up(.  void * cli
1ccb0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1ccc0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1ccd0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1cce0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1ccf0 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
1cd00 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
1cd10 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 74  ATED.  sqlite3_t
1cd20 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b  hread_cleanup();
1cd30 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1cd40 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1cd50 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
1cd60 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
1cd70 74 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  ts  DB.**.** Ret
1cd80 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e 75  urn a list of nu
1cd90 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
1cda0 74 68 65 20 50 61 67 65 72 52 65 66 63 6f 75 6e  the PagerRefcoun
1cdb0 74 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67  t for all.** pag
1cdc0 65 72 73 20 6f 6e 20 65 61 63 68 20 64 61 74 61  ers on each data
1cdd0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
1cde0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1cdf0 65 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  est_pager_refcou
1ce00 6e 74 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  nts(.  void * cl
1ce10 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1ce20 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1ce30 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1ce40 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1ce50 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1ce60 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   *db;.  int i;. 
1ce70 20 69 6e 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63   int v, *a;.  Tc
1ce80 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
1ce90 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1cea0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1ceb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1cec0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1ced0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
1cee0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1cef0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
1cf00 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29  ], 0), " DB", 0)
1cf10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1cf20 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1cf30 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1cf40 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1cf50 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1cf60 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1cf70 5f 45 52 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c  _ERROR;.  pResul
1cf80 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
1cf90 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
1cfa0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1cfb0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
1cfc0 2e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .pBt==0 ){.     
1cfd0 20 76 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c   v = -1;.    }el
1cfe0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1cff0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1d000 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1d010 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
1d020 53 74 61 74 73 28 73 71 6c 69 74 65 33 42 74 72  Stats(sqlite3Btr
1d030 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
1d040 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 20 20  i].pBt));.      
1d050 76 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  v = a[0];.      
1d060 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1d070 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1d080 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69      }.    Tcl_Li
1d090 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1d0a0 6e 74 28 30 2c 20 70 52 65 73 75 6c 74 2c 20 54  nt(0, pResult, T
1d0b0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29  cl_NewIntObj(v))
1d0c0 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
1d0d0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1d0e0 20 70 52 65 73 75 6c 74 29 3b 0a 20 20 72 65 74   pResult);.  ret
1d0f0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
1d100 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
1d110 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
1d120 74 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c  t.**.** Some TCL
1d130 20 62 75 69 6c 64 73 20 28 65 78 3a 20 63 79 67   builds (ex: cyg
1d140 77 69 6e 29 20 64 6f 20 6e 6f 74 20 73 75 70 70  win) do not supp
1d150 6f 72 74 20 36 34 2d 62 69 74 20 69 6e 74 65 67  ort 64-bit integ
1d160 65 72 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65  ers.  This.** le
1d170 61 64 73 20 74 6f 20 61 20 6e 75 6d 62 65 72 20  ads to a number 
1d180 6f 66 20 74 65 73 74 20 66 61 69 6c 75 72 65 73  of test failures
1d190 2e 20 20 54 68 65 20 70 72 65 73 65 6e 74 20 63  .  The present c
1d1a0 6f 6d 6d 61 6e 64 20 63 68 65 63 6b 73 20 74 68  ommand checks th
1d1b0 65 0a 2a 2a 20 54 43 4c 20 62 75 69 6c 64 20 74  e.** TCL build t
1d1c0 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
1d1d0 20 6e 6f 74 20 69 74 20 73 75 70 70 6f 72 74 73   not it supports
1d1e0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73   64-bit integers
1d1f0 2e 20 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73  .  It.** returns
1d200 20 54 52 55 45 20 69 66 20 69 74 20 64 6f 65 73   TRUE if it does
1d210 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f   and FALSE if no
1d220 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  t..**.** This co
1d230 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
1d240 20 77 61 72 6e 20 75 73 65 72 73 20 74 68 61 74   warn users that
1d250 20 74 68 65 69 72 20 54 43 4c 20 62 75 69 6c 64   their TCL build
1d260 20 69 73 20 64 65 66 65 63 74 69 76 65 0a 2a 2a   is defective.**
1d270 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 65 72   and that the er
1d280 72 6f 72 73 20 74 68 65 79 20 61 72 65 20 73 65  rors they are se
1d290 65 69 6e 67 20 69 6e 20 74 68 65 20 74 65 73 74  eing in the test
1d2a0 20 73 63 72 69 70 74 73 20 6d 69 67 68 74 20 62   scripts might b
1d2b0 65 0a 2a 2a 20 61 20 72 65 73 75 6c 74 20 6f 66  e.** a result of
1d2c0 20 74 68 65 69 72 20 64 65 66 65 63 74 69 76 65   their defective
1d2d0 20 54 43 4c 20 72 61 74 68 65 72 20 74 68 61 6e   TCL rather than
1d2e0 20 70 72 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c   problems in SQL
1d2f0 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ite..*/.static i
1d300 6e 74 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74  nt working_64bit
1d310 5f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  _int(.  ClientDa
1d320 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
1d330 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
1d340 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
1d350 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
1d360 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1d370 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
1d380 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
1d390 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
1d3a0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
1d3b0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
1d3c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1d3d0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
1d3e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1d3f0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
1d400 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1d410 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74    Tcl_Obj *pTest
1d420 4f 62 6a 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69  Obj;.  int worki
1d430 6e 67 20 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74  ng = 0;..  pTest
1d440 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64  Obj = Tcl_NewWid
1d450 65 49 6e 74 4f 62 6a 28 31 30 30 30 30 30 30 2a  eIntObj(1000000*
1d460 28 69 36 34 29 31 32 33 34 35 36 37 38 39 30 29  (i64)1234567890)
1d470 3b 0a 20 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74  ;.  working = st
1d480 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rcmp(Tcl_GetStri
1d490 6e 67 28 70 54 65 73 74 4f 62 6a 29 2c 20 22 31  ng(pTestObj), "1
1d4a0 32 33 34 35 36 37 38 39 30 30 30 30 30 30 30 22  234567890000000"
1d4b0 29 3d 3d 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72  )==0;.  Tcl_Decr
1d4c0 52 65 66 43 6f 75 6e 74 28 70 54 65 73 74 4f 62  RefCount(pTestOb
1d4d0 6a 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  j);.  Tcl_SetObj
1d4e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1d4f0 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
1d500 28 77 6f 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65  (working));.  re
1d510 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d520 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
1d530 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74   vfs_unlink_test
1d540 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
1d550 63 6f 6d 6d 61 6e 64 20 75 6e 72 65 67 69 73 74  command unregist
1d560 65 72 73 20 74 68 65 20 70 72 69 6d 61 72 79 20  ers the primary 
1d570 56 46 53 20 61 6e 64 20 74 68 65 6e 20 72 65 67  VFS and then reg
1d580 69 73 74 65 72 73 0a 2a 2a 20 69 74 20 62 61 63  isters.** it bac
1d590 6b 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 69  k again.  This i
1d5a0 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
1d5b0 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65  he ability to re
1d5c0 67 69 73 74 65 72 20 61 0a 2a 2a 20 56 46 53 20  gister a.** VFS 
1d5d0 77 68 65 6e 20 6e 6f 6e 65 20 61 72 65 20 70 72  when none are pr
1d5e0 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
1d5f0 72 65 64 2c 20 61 6e 64 20 74 68 65 20 61 62 69  red, and the abi
1d600 6c 69 74 79 20 74 6f 20 0a 2a 2a 20 75 6e 72 65  lity to .** unre
1d610 67 69 73 74 65 72 20 74 68 65 20 6f 6e 6c 79 20  gister the only 
1d620 61 76 61 69 6c 61 62 6c 65 20 56 46 53 2e 20 20  available VFS.  
1d630 54 69 63 6b 65 74 20 23 32 37 33 38 0a 2a 2f 0a  Ticket #2738.*/.
1d640 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 75  static int vfs_u
1d650 6e 6c 69 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c  nlink_test(.  Cl
1d660 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1d670 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
1d680 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
1d690 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
1d6a0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1d6b0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1d6c0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1d6d0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1d6e0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1d6f0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
1d700 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1d710 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1d720 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
1d730 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
1d740 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
1d750 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
1d760 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4d   sqlite3_vfs *pM
1d770 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ain;.  sqlite3_v
1d780 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 20  fs *apVfs[20];. 
1d790 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65   sqlite3_vfs one
1d7a0 2c 20 74 77 6f 3b 0a 0a 20 20 73 71 6c 69 74 65  , two;..  sqlite
1d7b0 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
1d7c0 28 30 29 3b 20 20 20 2f 2a 20 55 6e 72 65 67 69  (0);   /* Unregi
1d7d0 73 74 65 72 20 6f 66 20 4e 55 4c 4c 20 69 73 20  ster of NULL is 
1d7e0 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e  harmless */.  on
1d7f0 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65  e.zName = "__one
1d800 22 3b 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d  ";.  two.zName =
1d810 20 22 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20   "__two";..  /* 
1d820 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  Calling sqlite3_
1d830 76 66 73 5f 72 65 67 69 73 74 65 72 20 77 69 74  vfs_register wit
1d840 68 20 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f  h 2nd argument o
1d850 66 20 30 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  f 0 does not.  *
1d860 2a 20 63 68 61 6e 67 65 20 74 68 65 20 64 65 66  * change the def
1d870 61 75 6c 74 20 56 46 53 0a 20 20 2a 2f 0a 20 20  ault VFS.  */.  
1d880 70 4d 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f  pMain = sqlite3_
1d890 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 73  vfs_find(0);.  s
1d8a0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1d8b0 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20  ter(&one, 0);.  
1d8c0 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30  assert( pMain==0
1d8d0 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74   || pMain==sqlit
1d8e0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
1d8f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
1d900 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20 30  register(&two, 0
1d910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  );.  assert( pMa
1d920 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d  in==0 || pMain==
1d930 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1d940 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  (0) );..  /* We 
1d950 63 61 6e 20 66 69 6e 64 20 61 20 56 46 53 20 62  can find a VFS b
1d960 79 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  y its name */.  
1d970 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d980 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
1d990 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73  )==&one );.  ass
1d9a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
1d9b0 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
1d9c0 26 74 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  &two );..  /* Ca
1d9d0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 5f 76 66 73  lling sqlite_vfs
1d9e0 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20 6e  _register with n
1d9f0 6f 6e 2d 7a 65 72 6f 20 73 65 63 6f 6e 64 20 70  on-zero second p
1da00 61 72 61 6d 65 74 65 72 20 63 68 61 6e 67 65 73  arameter changes
1da10 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c   the.  ** defaul
1da20 74 20 56 46 53 2c 20 65 76 65 6e 20 69 66 20 74  t VFS, even if t
1da30 68 65 20 31 73 74 20 70 61 72 61 6d 65 74 65 72  he 1st parameter
1da40 20 69 73 20 61 6e 20 65 78 69 73 74 69 67 20 56   is an existig V
1da50 46 53 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  FS that is.  ** 
1da60 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
1da70 74 65 72 65 64 20 61 73 20 74 68 65 20 6e 6f 6e  tered as the non
1da80 2d 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20  -default..  */. 
1da90 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
1daa0 69 73 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a  ister(&one, 1);.
1dab0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1dac0 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
1dad0 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61  e")==&one );.  a
1dae0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
1daf0 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
1db00 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65  ==&two );.  asse
1db10 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
1db20 66 69 6e 64 28 30 29 3d 3d 26 6f 6e 65 20 29 3b  find(0)==&one );
1db30 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
1db40 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20 31 29  egister(&two, 1)
1db50 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1db60 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
1db70 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  one")==&one );. 
1db80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1db90 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
1dba0 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73  ")==&two );.  as
1dbb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
1dbc0 73 5f 66 69 6e 64 28 30 29 3d 3d 26 74 77 6f 20  s_find(0)==&two 
1dbd0 29 3b 0a 20 20 69 66 28 20 70 4d 61 69 6e 20 29  );.  if( pMain )
1dbe0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
1dbf0 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e  s_register(pMain
1dc00 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
1dc10 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
1dc20 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e  nd("__one")==&on
1dc30 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
1dc40 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1dc50 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f  d("__two")==&two
1dc60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1dc70 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1dc80 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20  (0)==pMain );.  
1dc90 7d 0a 20 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b  }.  .  /* Unlink
1dca0 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
1dcb0 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20  .  Repeat until 
1dcc0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
1dcd0 65 20 56 46 53 65 73 0a 20 20 2a 2a 20 72 65 67  e VFSes.  ** reg
1dce0 69 73 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  istered..  */.  
1dcf0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
1dd00 66 28 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28  f(apVfs)/sizeof(
1dd10 61 70 56 66 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  apVfs[0]); i++){
1dd20 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20  .    apVfs[i] = 
1dd30 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1dd40 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56  (0);.    if( apV
1dd50 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 61  fs[i] ){.      a
1dd60 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d  ssert( apVfs[i]=
1dd70 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
1dd80 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d  d(apVfs[i]->zNam
1dd90 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e) );.      sqli
1dda0 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
1ddb0 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20  er(apVfs[i]);.  
1ddc0 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
1ddd0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1dde0 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29  apVfs[i]->zName)
1ddf0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
1de00 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
1de10 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
1de20 3b 0a 20 20 0a 20 20 2f 2a 20 52 65 67 69 73 74  ;.  .  /* Regist
1de30 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20  er the main VFS 
1de40 61 73 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 28  as non-default (
1de50 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 64 65 66  will be made def
1de60 61 75 6c 74 2c 20 73 69 6e 63 65 0a 20 20 2a 2a  ault, since.  **
1de70 20 69 74 27 6c 6c 20 62 65 20 74 68 65 20 6f 6e   it'll be the on
1de80 6c 79 20 6f 6e 65 20 69 6e 20 65 78 69 73 74 65  ly one in existe
1de90 6e 63 65 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  nce)..  */.  sql
1dea0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1deb0 72 28 70 4d 61 69 6e 2c 20 30 29 3b 0a 20 20 61  r(pMain, 0);.  a
1dec0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
1ded0 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
1dee0 6e 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d  n );.  .  /* Un-
1def0 72 65 67 69 73 74 65 72 20 74 68 65 20 6d 61 69  register the mai
1df00 6e 20 56 46 53 20 61 67 61 69 6e 20 74 6f 20 72  n VFS again to r
1df10 65 73 74 6f 72 65 20 61 6e 20 65 6d 70 74 79 20  estore an empty 
1df20 56 46 53 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71  VFS list */.  sq
1df30 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
1df40 73 74 65 72 28 70 4d 61 69 6e 29 3b 0a 20 20 61  ster(pMain);.  a
1df50 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
1df60 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b  3_vfs_find(0) );
1df70 0a 0a 20 20 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c  ..  /* Relink al
1df80 6c 20 56 46 53 65 73 20 69 6e 20 72 65 76 65 72  l VFSes in rever
1df90 73 65 20 6f 72 64 65 72 2e 20 2a 2f 20 20 0a 20  se order. */  . 
1dfa0 20 66 6f 72 28 69 3d 73 69 7a 65 6f 66 28 61 70   for(i=sizeof(ap
1dfb0 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66  Vfs)/sizeof(apVf
1dfc0 73 5b 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69  s[0])-1; i>=0; i
1dfd0 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 70 56  --){.    if( apV
1dfe0 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73  fs[i] ){.      s
1dff0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1e000 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 31 29  ter(apVfs[i], 1)
1e010 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e020 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65  apVfs[i]==sqlite
1e030 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b  3_vfs_find(0) );
1e040 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
1e050 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33  pVfs[i]==sqlite3
1e060 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b  _vfs_find(apVfs[
1e070 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20  i]->zName) );.  
1e080 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e    }.  }..  /* Un
1e090 72 65 67 69 73 74 65 72 20 6f 75 74 20 73 61 6d  register out sam
1e0a0 70 6c 65 20 56 46 53 65 73 2e 20 2a 2f 0a 20 20  ple VFSes. */.  
1e0b0 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
1e0c0 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20  gister(&one);.  
1e0d0 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
1e0e0 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a 0a 20  gister(&two);.. 
1e0f0 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 69 6e   /* Unregisterin
1e100 67 20 61 20 56 46 53 20 74 68 61 74 20 69 73 20  g a VFS that is 
1e110 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
1e120 67 69 73 74 65 72 65 64 20 69 73 20 68 61 72 6d  gistered is harm
1e130 6c 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  less */.  sqlite
1e140 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
1e150 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65  (&one);.  sqlite
1e160 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
1e170 28 26 74 77 6f 29 3b 0a 20 20 61 73 73 65 72 74  (&two);.  assert
1e180 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
1e190 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29  nd("__one")==0 )
1e1a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1e1b0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
1e1c0 74 77 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  two")==0 );..  /
1e1d0 2a 20 57 65 20 73 68 6f 75 6c 64 20 62 65 20 6c  * We should be l
1e1e0 65 66 74 20 77 69 74 68 20 74 68 65 20 6f 72 69  eft with the ori
1e1f0 67 69 6e 61 6c 20 64 65 66 61 75 6c 74 20 56 46  ginal default VF
1e200 53 20 62 61 63 6b 20 61 73 20 74 68 65 0a 20 20  S back as the.  
1e210 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20  ** original */. 
1e220 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e230 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d  _vfs_find(0)==pM
1e240 61 69 6e 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ain );..  return
1e250 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1e260 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f  * tclcmd:   vfs_
1e270 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 0a 2a 2a  initfail_test.**
1e280 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
1e290 6d 61 6e 64 20 61 74 74 65 6d 70 74 73 20 74 6f  mand attempts to
1e2a0 20 76 66 73 5f 66 69 6e 64 20 61 6e 64 20 76 66   vfs_find and vf
1e2b0 73 5f 72 65 67 69 73 74 65 72 20 77 68 65 6e 20  s_register when 
1e2c0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  the.** sqlite3_i
1e2d0 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 6e 74 65  nitialize() inte
1e2e0 72 66 61 63 65 20 69 73 20 66 61 69 6c 69 6e 67  rface is failing
1e2f0 2e 20 20 41 6c 6c 20 63 61 6c 6c 73 20 73 68 6f  .  All calls sho
1e300 75 6c 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61  uld fail..*/.sta
1e310 74 69 63 20 69 6e 74 20 76 66 73 5f 69 6e 69 74  tic int vfs_init
1e320 66 61 69 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69  fail_test(.  Cli
1e330 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
1e340 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
1e350 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
1e360 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
1e370 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e380 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
1e390 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
1e3a0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
1e3b0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
1e3c0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
1e3d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e3e0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
1e3f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1e400 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
1e410 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
1e420 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
1e430 66 73 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e  fs one;.  one.zN
1e440 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a  ame = "__one";..
1e450 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66    if( sqlite3_vf
1e460 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75  s_find(0) ) retu
1e470 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e480 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
1e490 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20  ster(&one, 0);. 
1e4a0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73   if( sqlite3_vfs
1e4b0 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72  _find(0) ) retur
1e4c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
1e4d0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1e4e0 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20  ter(&one, 1);.  
1e4f0 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  if( sqlite3_vfs_
1e500 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e  find(0) ) return
1e510 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
1e520 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1e530 2f 2a 0a 2a 2a 20 53 61 76 65 64 20 56 46 53 65  /*.** Saved VFSe
1e540 73 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  s.*/.static sqli
1e550 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32  te3_vfs *apVfs[2
1e560 30 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  0];.static int n
1e570 56 66 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Vfs = 0;../*.** 
1e580 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e  tclcmd:   vfs_un
1e590 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a  register_all.**.
1e5a0 2a 2a 20 55 6e 72 65 67 69 73 74 65 72 20 61 6c  ** Unregister al
1e5b0 6c 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74  l VFSes..*/.stat
1e5c0 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 72 65 67  ic int vfs_unreg
1e5d0 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69  ister_all(.  Cli
1e5e0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
1e5f0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
1e600 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
1e610 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
1e620 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e630 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
1e640 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
1e650 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
1e660 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
1e670 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
1e680 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e690 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
1e6a0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1e6b0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
1e6c0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
1e6d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
1e6e0 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
1e6f0 53 69 7a 65 28 61 70 56 66 73 29 3b 20 69 2b 2b  Size(apVfs); i++
1e700 29 7b 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20  ){.    apVfs[i] 
1e710 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
1e720 6e 64 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61  nd(0);.    if( a
1e730 70 56 66 73 5b 69 5d 3d 3d 30 20 29 20 62 72 65  pVfs[i]==0 ) bre
1e740 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ak;.    sqlite3_
1e750 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61  vfs_unregister(a
1e760 70 56 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pVfs[i]);.  }.  
1e770 6e 56 66 73 20 3d 20 69 3b 0a 20 20 72 65 74 75  nVfs = i;.  retu
1e780 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  rn TCL_OK;.}./*.
1e790 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73  ** tclcmd:   vfs
1e7a0 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a  _reregister_all.
1e7b0 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 61 6c  **.** Restore al
1e7c0 6c 20 56 46 53 65 73 20 74 68 61 74 20 77 65 72  l VFSes that wer
1e7d0 65 20 72 65 6d 6f 76 65 64 20 75 73 69 6e 67 20  e removed using 
1e7e0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
1e7f0 6c 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ll.*/.static int
1e800 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f   vfs_reregister_
1e810 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  all(.  ClientDat
1e820 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
1e830 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
1e840 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
1e850 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
1e860 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1e870 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1e880 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1e890 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1e8a0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
1e8b0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
1e8c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1e8d0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
1e8e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1e8f0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
1e900 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
1e910 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1e920 30 3b 20 69 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b  0; i<nVfs; i++){
1e930 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
1e940 5f 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b  _register(apVfs[
1e950 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20  i], i==0);.  }. 
1e960 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1e970 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
1e980 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
1e990 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54  _test DB.**.** T
1e9a0 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
1e9b0 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
1e9c0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
1e9d0 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
1e9e0 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
1e9f0 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
1ea00 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   same..*/.static
1ea10 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
1ea20 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  l_test(.  Client
1ea30 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
1ea40 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
1ea50 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
1ea60 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
1ea70 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ea80 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1ea90 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1eaa0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1eab0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1eac0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
1ead0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1eae0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1eaf0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1eb00 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
1eb10 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
1eb20 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30  {.  int iArg = 0
1eb30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1eb40 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
1eb50 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1eb60 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1eb70 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1eb80 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1eb90 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
1eba0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
1ebb0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
1ebc0 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
1ebd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ebe0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1ebf0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1ec00 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1ec10 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1ec20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ec30 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1ec40 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
1ec50 62 2c 20 30 2c 20 30 2c 20 26 69 41 72 67 29 3b  b, 0, 0, &iArg);
1ec60 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
1ec70 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
1ec80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
1ec90 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22  le_control(db, "
1eca0 6e 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20 53  notadatabase", S
1ecb0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
1ecc0 53 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a 20  STATE, &iArg);. 
1ecd0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1ece0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72  ITE_ERROR );.  r
1ecf0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
1ed00 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61  _control(db, "ma
1ed10 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b  in", -1, &iArg);
1ed20 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
1ed30 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
1ed40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
1ed50 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22  le_control(db, "
1ed60 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69 41 72 67  temp", -1, &iArg
1ed70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
1ed80 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b  =SQLITE_ERROR );
1ed90 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
1eda0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  K;.}.../*.** tcl
1edb0 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
1edc0 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65  rol_lasterrno_te
1edd0 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73  st DB.**.** This
1ede0 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
1edf0 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
1ee00 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
1ee10 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69  face and.** veri
1ee20 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65  fies correct ope
1ee30 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51  ration of the SQ
1ee40 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 20  LITE_LAST_ERRNO 
1ee50 76 65 72 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  verb..*/.static 
1ee60 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
1ee70 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 28  _lasterrno_test(
1ee80 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
1ee90 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
1eea0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
1eeb0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
1eec0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
1eed0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
1eee0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
1eef0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
1ef00 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
1ef10 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ef30 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
1ef40 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
1ef50 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
1ef60 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
1ef70 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
1ef80 20 69 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c   iArg = 0;.  sql
1ef90 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
1efa0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
1efb0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1efc0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1efd0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1efe0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1eff0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
1f000 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
1f010 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22  jv[0], 0), " DB"
1f020 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1f030 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1f040 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1f050 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1f060 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1f070 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1f080 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1f090 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
1f0a0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
1f0b0 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  , SQLITE_LAST_ER
1f0c0 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20 20 69  RNO, &iArg);.  i
1f0d0 66 28 20 72 63 20 29 20 7b 20 54 63 6c 5f 53 65  f( rc ) { Tcl_Se
1f0e0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1f0f0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1f100 28 72 63 29 29 3b 20 72 65 74 75 72 6e 20 54 43  (rc)); return TC
1f110 4c 5f 45 52 52 4f 52 3b 20 7d 0a 20 20 69 66 28  L_ERROR; }.  if(
1f120 20 69 41 72 67 21 3d 30 20 29 20 7b 0a 20 20 20   iArg!=0 ) {.   
1f130 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1f140 74 28 69 6e 74 65 72 70 2c 20 22 55 6e 65 78 70  t(interp, "Unexp
1f150 65 63 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65  ected non-zero e
1f160 72 72 6e 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20  rrno: ",.       
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
1f180 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
1f190 62 6a 28 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  bj(Tcl_NewIntObj
1f1a0 28 69 41 72 67 29 2c 20 30 29 2c 20 22 20 22 2c  (iArg), 0), " ",
1f1b0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1f1c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1f1d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
1f1e0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
1f1f0 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
1f200 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74  l_lockproxy_test
1f210 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54   DB.**.** This T
1f220 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
1f230 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
1f240 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
1f250 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
1f260 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
1f270 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49  tion of the SQLI
1f280 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
1f290 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  FILE and.** SQLI
1f2a0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
1f2b0 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73  FILE verbs..*/.s
1f2c0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63  tatic int file_c
1f2d0 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79  ontrol_lockproxy
1f2e0 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
1f2f0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
1f300 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
1f310 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
1f320 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
1f330 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1f340 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
1f350 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
1f360 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
1f370 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
1f380 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
1f390 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f3a0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
1f3b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1f3c0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
1f3d0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
1f3e0 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b  .  int iArg = 0;
1f3f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1f400 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 69    int rc;.  .  i
1f410 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1f420 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1f430 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1f440 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1f450 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
1f470 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
1f480 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
1f490 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1f4a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f4b0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1f4c0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1f4d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1f4e0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
1f4f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f500 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .  .#if !defined
1f510 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  (SQLITE_ENABLE_L
1f520 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20  OCKING_STYLE).# 
1f530 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 44 41   if defined(__DA
1f540 52 57 49 4e 5f 5f 29 0a 23 20 20 20 20 64 65 66  RWIN__).#    def
1f550 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
1f560 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1f570 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
1f580 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41  efine SQLITE_ENA
1f590 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1f5a0 45 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  E 0.#  endif.#en
1f5b0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1f5c0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1f5d0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1f5e0 5f 44 41 52 57 49 4e 5f 5f 29 0a 20 20 7b 0a 20  _DARWIN__).  {. 
1f5f0 20 20 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61     char *proxyPa
1f600 74 68 20 3d 20 22 74 65 73 74 2e 70 72 6f 78 79  th = "test.proxy
1f610 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 73  ";.    char *tes
1f620 74 50 61 74 68 3b 0a 20 20 20 20 72 63 20 3d 20  tPath;.    rc = 
1f630 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
1f640 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53  trol(db, NULL, S
1f650 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
1f660 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61  OXYFILE, proxyPa
1f670 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  th);.    if( rc 
1f680 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
1f690 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1f6a0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1f6b0 72 63 29 29 3b 20 72 65 74 75 72 6e 20 54 43 4c  rc)); return TCL
1f6c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1f6d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
1f6e0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
1f6f0 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 47 45 54  NULL, SQLITE_GET
1f700 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
1f710 26 74 65 73 74 50 61 74 68 29 3b 0a 20 20 20 20  &testPath);.    
1f720 69 66 28 20 73 74 72 6e 63 6d 70 28 70 72 6f 78  if( strncmp(prox
1f730 79 50 61 74 68 2c 74 65 73 74 50 61 74 68 2c 31  yPath,testPath,1
1f740 31 29 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c  1) ) {.      Tcl
1f750 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1f760 74 65 72 70 2c 20 22 4c 6f 63 6b 20 70 72 6f 78  terp, "Lock prox
1f770 79 20 66 69 6c 65 20 64 69 64 20 6e 6f 74 20 6d  y file did not m
1f780 61 74 63 68 20 74 68 65 20 22 0a 20 20 20 20 20  atch the ".     
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7a0 20 20 20 20 20 20 20 20 20 20 22 70 72 65 76 69            "previ
1f7b0 6f 75 73 6c 79 20 61 73 73 69 67 6e 65 64 20 76  ously assigned v
1f7c0 61 6c 75 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  alue", 0);.     
1f7d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f7e0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
1f7f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
1f800 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1f810 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1f820 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20 20 20 20  Obj(rc));.      
1f830 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1f850 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
1f860 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
1f870 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
1f880 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50  ROXYFILE, proxyP
1f890 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ath);.    if( rc
1f8a0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
1f8b0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1f8c0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1f8d0 28 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74  (rc));.      ret
1f8e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f8f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1f900 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1f910 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c    .}.../*.** tcl
1f920 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 76  cmd:   sqlite3_v
1f930 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20  fs_list.**.**   
1f940 52 65 74 75 72 6e 20 61 20 74 63 6c 20 6c 69 73  Return a tcl lis
1f950 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
1f960 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 72 65   names of all re
1f970 67 69 73 74 65 72 65 64 20 76 66 73 27 73 2e 0a  gistered vfs's..
1f980 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
1f990 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69 65 6e 74  s_list(.  Client
1f9a0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
1f9b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
1f9c0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
1f9d0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
1f9e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1f9f0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1fa00 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1fa10 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1fa20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1fa30 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
1fa40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1fa50 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1fa60 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1fa70 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
1fa80 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
1fa90 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1faa0 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a  *pVfs;.  Tcl_Obj
1fab0 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77   *pRet = Tcl_New
1fac0 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20 6f 62 6a  Obj();.  if( obj
1fad0 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
1fae0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1faf0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
1fb00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1fb10 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
1fb20 6f 72 28 70 56 66 73 3d 73 71 6c 69 74 65 33 5f  or(pVfs=sqlite3_
1fb30 76 66 73 5f 66 69 6e 64 28 30 29 3b 20 70 56 66  vfs_find(0); pVf
1fb40 73 3b 20 70 56 66 73 3d 70 56 66 73 2d 3e 70 4e  s; pVfs=pVfs->pN
1fb50 65 78 74 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69  ext){.    Tcl_Li
1fb60 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1fb70 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
1fb80 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1fb90 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20 2d  j(pVfs->zName, -
1fba0 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  1));.  }.  Tcl_S
1fbb0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1fbc0 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 72 65 74  rp, pRet);.  ret
1fbd0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
1fbe0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
1fbf0 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 44   sqlite3_limit D
1fc00 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  B ID VALUE.**.**
1fc10 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
1fc20 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
1fc30 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65 72 66 61  e3_limit interfa
1fc40 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
1fc50 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
1fc60 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65  tion of the same
1fc70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fc80 74 65 73 74 5f 6c 69 6d 69 74 28 0a 20 20 43 6c  test_limit(.  Cl
1fc90 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1fca0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
1fcb0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
1fcc0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
1fcd0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1fce0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1fcf0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1fd00 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1fd10 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1fd20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
1fd30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1fd40 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1fd50 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
1fd60 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
1fd70 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
1fd80 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
1fd90 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
1fda0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
1fdb0 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
1fdc0 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e   *zName;.     in
1fdd0 74 20 69 64 3b 0a 20 20 7d 20 61 49 64 5b 5d 20  t id;.  } aId[] 
1fde0 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54  = {.    { "SQLIT
1fdf0 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 22 2c  E_LIMIT_LENGTH",
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1fe10 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
1fe20 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H               
1fe30 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
1fe40 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
1fe50 48 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c  H",          SQL
1fe60 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
1fe70 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20 7d  NGTH           }
1fe80 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
1fe90 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 22 2c 20 20  LIMIT_COLUMN",  
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1feb0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20  TE_LIMIT_COLUMN 
1fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1fed0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
1fee0 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 22  IMIT_EXPR_DEPTH"
1fef0 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ,          SQLIT
1ff00 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
1ff10 54 48 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TH           },.
1ff20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
1ff30 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
1ff40 45 43 54 22 2c 20 20 20 20 20 53 51 4c 49 54 45  ECT",     SQLITE
1ff50 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
1ff60 53 45 4c 45 43 54 20 20 20 20 20 20 7d 2c 0a 20  SELECT      },. 
1ff70 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
1ff80 49 54 5f 56 44 42 45 5f 4f 50 22 2c 20 20 20 20  IT_VDBE_OP",    
1ff90 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1ffa0 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20 20  LIMIT_VDBE_OP   
1ffb0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1ffc0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
1ffd0 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 22 2c  T_FUNCTION_ARG",
1ffe0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
1fff0 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
20000 47 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  G         },.   
20010 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
20020 5f 41 54 54 41 43 48 45 44 22 2c 20 20 20 20 20  _ATTACHED",     
20030 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
20040 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20 20 20  MIT_ATTACHED    
20050 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
20060 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
20070 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
20080 47 54 48 22 2c 20 53 51 4c 49 54 45 5f 4c 49 4d  GTH", SQLITE_LIM
20090 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
200a0 4c 45 4e 47 54 48 20 20 7d 2c 0a 20 20 20 20 7b  LENGTH  },.    {
200b0 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56   "SQLITE_LIMIT_V
200c0 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 22 2c  ARIABLE_NUMBER",
200d0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
200e0 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
200f0 52 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 0a 20  R      },.    . 
20100 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20 72 61 6e     /* Out of ran
20110 67 65 20 74 65 73 74 20 63 61 73 65 73 20 2a 2f  ge test cases */
20120 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
20130 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22 2c 20  IMIT_TOOSMALL", 
20140 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 20             -1,  
20150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20160 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
20170 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
20180 4d 49 54 5f 54 4f 4f 42 49 47 22 2c 20 20 20 20  MIT_TOOBIG",    
20190 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
201a0 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
201b0 4e 55 4d 42 45 52 2b 31 20 20 20 20 7d 2c 0a 20  NUMBER+1    },. 
201c0 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64 3b   };.  int i, id;
201d0 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 63 6f  .  int val;.  co
201e0 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 0a  nst char *zId;..
201f0 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
20200 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
20210 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
20220 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
20230 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
20240 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
20250 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
20260 2c 20 30 29 2c 20 22 20 44 42 20 49 44 20 56 41  , 0), " DB ID VA
20270 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LUE", 0);.    re
20280 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20290 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
202a0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
202b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
202c0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
202d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
202e0 20 20 7a 49 64 20 3d 20 54 63 6c 5f 47 65 74 53    zId = Tcl_GetS
202f0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
20300 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
20310 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28  eof(aId)/sizeof(
20320 61 49 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  aId[0]); i++){. 
20330 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 49     if( strcmp(zI
20340 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d 65 29  d, aId[i].zName)
20350 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 64 20  ==0 ){.      id 
20360 3d 20 61 49 64 5b 69 5d 2e 69 64 3b 0a 20 20 20  = aId[i].id;.   
20370 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20380 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a    }.  if( i>=siz
20390 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28  eof(aId)/sizeof(
203a0 61 49 64 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54  aId[0]) ){.    T
203b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
203c0 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e  interp, "unknown
203d0 20 6c 69 6d 69 74 20 74 79 70 65 3a 20 22 2c 20   limit type: ", 
203e0 7a 49 64 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  zId, (char*)0);.
203f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
20400 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
20410 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
20420 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
20430 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
20440 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
20450 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  c = sqlite3_limi
20460 74 28 64 62 2c 20 69 64 2c 20 76 61 6c 29 3b 0a  t(db, id, val);.
20470 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
20480 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
20490 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20  ewIntObj(rc));. 
204a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
204b0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
204c0 64 3a 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74  d:  save_prng_st
204d0 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65 20 74  ate.**.** Save t
204e0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
204f0 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75  pseudo-random nu
20500 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  mber generator..
20510 2a 2a 20 41 74 20 74 68 65 20 73 61 6d 65 20 74  ** At the same t
20520 69 6d 65 2c 20 76 65 72 69 66 79 20 74 68 61 74  ime, verify that
20530 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
20540 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 65 76 65 6e  ntrol works even
20550 20 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64 20   when.** called 
20560 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 72  with an out-of-r
20570 61 6e 67 65 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  ange opcode..*/.
20580 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 5f  static int save_
20590 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c  prng_state(.  Cl
205a0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
205b0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
205c0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
205d0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
205e0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
205f0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
20600 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
20610 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
20620 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
20630 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
20640 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20650 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
20660 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
20670 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
20680 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
20690 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
206a0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
206b0 6e 74 72 6f 6c 28 39 39 39 39 29 3b 0a 20 20 61  ntrol(9999);.  a
206c0 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a  ssert( rc==0 );.
206d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
206e0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 2d 31 29 3b  est_control(-1);
206f0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
20700 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65   );.  sqlite3_te
20710 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
20720 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
20730 53 41 56 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  SAVE);.  return 
20740 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  TCL_OK;.}./*.** 
20750 74 63 6c 63 6d 64 3a 20 20 72 65 73 74 6f 72 65  tclcmd:  restore
20760 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73  _prng_state.*/.s
20770 74 61 74 69 63 20 69 6e 74 20 72 65 73 74 6f 72  tatic int restor
20780 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20  e_prng_state(.  
20790 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
207a0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
207b0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
207c0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
207d0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
207e0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
207f0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
20800 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
20810 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
20820 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
20830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20840 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
20850 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
20860 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
20870 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
20880 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
20890 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
208a0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
208b0 52 4e 47 5f 52 45 53 54 4f 52 45 29 3b 0a 20 20  RNG_RESTORE);.  
208c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
208d0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
208e0 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65  reset_prng_state
208f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
20900 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 28  eset_prng_state(
20910 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
20920 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
20930 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
20940 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
20950 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
20960 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
20970 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
20980 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
20990 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
209a0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
209c0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
209d0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
209e0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
209f0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
20a00 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
20a10 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
20a20 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
20a30 4c 5f 50 52 4e 47 5f 52 45 53 45 54 29 3b 0a 20  L_PRNG_RESET);. 
20a40 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
20a50 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
20a60 20 20 70 63 61 63 68 65 5f 73 74 61 74 73 0a 2a    pcache_stats.*
20a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
20a80 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73 28 0a  t_pcache_stats(.
20a90 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
20aa0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
20ab0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
20ac0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
20ad0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
20ae0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
20af0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
20b00 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
20b10 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
20b20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
20b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20b40 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
20b50 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
20b60 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
20b70 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
20b80 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
20b90 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20 6e 4d 61 78  nMin;.  int nMax
20ba0 3b 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74  ;.  int nCurrent
20bb0 3b 0a 20 20 69 6e 74 20 6e 52 65 63 79 63 6c 61  ;.  int nRecycla
20bc0 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ble;.  Tcl_Obj *
20bd0 70 52 65 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  pRet;..  sqlite3
20be0 50 63 61 63 68 65 53 74 61 74 73 28 26 6e 43 75  PcacheStats(&nCu
20bf0 72 72 65 6e 74 2c 20 26 6e 4d 61 78 2c 20 26 6e  rrent, &nMax, &n
20c00 4d 69 6e 2c 20 26 6e 52 65 63 79 63 6c 61 62 6c  Min, &nRecyclabl
20c10 65 29 3b 0a 0a 20 20 70 52 65 74 20 3d 20 54 63  e);..  pRet = Tc
20c20 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63  l_NewObj();.  Tc
20c30 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
20c40 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
20c50 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
20c60 6e 67 4f 62 6a 28 22 63 75 72 72 65 6e 74 22 2c  ngObj("current",
20c70 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
20c80 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
20c90 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
20ca0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43  Tcl_NewIntObj(nC
20cb0 75 72 72 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f  urrent));.  Tcl_
20cc0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
20cd0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
20ce0 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
20cf0 4f 62 6a 28 22 6d 61 78 22 2c 20 2d 31 29 29 3b  Obj("max", -1));
20d00 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
20d10 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
20d20 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
20d30 77 49 6e 74 4f 62 6a 28 6e 4d 61 78 29 29 3b 0a  wIntObj(nMax));.
20d40 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
20d50 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
20d60 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
20d70 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 22 2c  StringObj("min",
20d80 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
20d90 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
20da0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
20db0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d  Tcl_NewIntObj(nM
20dc0 69 6e 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  in));.  Tcl_List
20dd0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
20de0 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
20df0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
20e00 22 72 65 63 79 63 6c 61 62 6c 65 22 2c 20 2d 31  "recyclable", -1
20e10 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
20e20 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
20e30 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
20e40 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 52 65 63 79  _NewIntObj(nRecy
20e50 63 6c 61 62 6c 65 29 29 3b 0a 0a 20 20 54 63 6c  clable));..  Tcl
20e60 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
20e70 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20  terp, pRet);..  
20e80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
20e90 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  .../*.** Registe
20ea0 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20  r commands with 
20eb0 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  the TCL interpre
20ec0 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69  ter..*/.int Sqli
20ed0 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c  tetest1_Init(Tcl
20ee0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
20ef0 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  {.  extern int s
20f00 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
20f10 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
20f20 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  t sqlite3_interr
20f30 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  upt_count;.  ext
20f40 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
20f50 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b  open_file_count;
20f60 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
20f70 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74  lite3_sort_count
20f80 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
20f90 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
20fa0 69 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ime;.#if SQLITE_
20fb0 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e  OS_UNIX && defin
20fc0 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 0a 20  ed(__DARWIN__). 
20fd0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
20fe0 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b 0a  te3_hostid_num;.
20ff0 23 65 6e 64 69 66 0a 20 20 65 78 74 65 72 6e 20  #endif.  extern 
21000 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 61 78 5f  int sqlite3_max_
21010 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65 78 74 65  blobsize;.  exte
21020 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74  rn int sqlite3Bt
21030 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52 65  reeSharedCacheRe
21040 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20 20 20 20  port(void*,.    
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21070 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70        Tcl_Interp
21080 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f  *,int,Tcl_Obj*CO
21090 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74 69 63 20  NST*);.  static 
210a0 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
210b0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
210c0 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72  Tcl_CmdProc *xPr
210d0 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d  oc;.  } aCmd[] =
210e0 20 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f 65 6e   {.     { "db_en
210f0 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ter",           
21100 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
21110 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65  CmdProc*)db_ente
21120 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
21130 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f 6c 65  },.     { "db_le
21140 61 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ave",           
21150 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
21160 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76  CmdProc*)db_leav
21170 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
21180 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
21190 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c  e3_mprintf_int",
211a0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
211b0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
211c0 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20  _mprintf_int    
211d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
211e0 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34  e3_mprintf_int64
211f0 22 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ",         (Tcl_
21200 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
21210 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20  _mprintf_int64  
21220 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
21230 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c  e3_mprintf_str",
21240 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
21250 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
21260 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20  _mprintf_str    
21270 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
21280 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 22  e3_snprintf_str"
21290 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
212a0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
212b0 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 20 20  _snprintf_str   
212c0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
212d0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
212e0 6c 79 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  ly",       (Tcl_
212f0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
21300 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79  _mprintf_stronly
21310 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
21320 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
21330 65 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  e",        (Tcl_
21340 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
21350 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20  _mprintf_double 
21360 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
21370 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
21380 64 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  d",        (Tcl_
21390 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
213a0 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20  _mprintf_scaled 
213b0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
213c0 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f  e3_mprintf_hexdo
213d0 75 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d  uble",   (Tcl_Cm
213e0 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
213f0 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
21400 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
21410 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
21420 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
21430 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70  CmdProc*)test_mp
21440 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d  rintf_z        }
21450 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
21460 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74  3_mprintf_n_test
21470 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
21480 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72  mdProc*)test_mpr
21490 69 6e 74 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c  intf_n        },
214a0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
214b0 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20  _snprintf_int", 
214c0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
214d0 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72  dProc*)test_snpr
214e0 69 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a  intf_int     },.
214f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
21500 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
21510 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  d",     (Tcl_Cmd
21520 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f  Proc*)test_last_
21530 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20  rowid       },. 
21540 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
21550 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20  xec_printf",    
21560 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
21570 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70  roc*)test_exec_p
21580 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20  rintf      },.  
21590 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
215a0 65 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ec",            
215b0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
215c0 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 20 20 20  oc*)test_exec   
215d0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
215e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
215f0 63 5f 6e 72 22 2c 20 20 20 20 20 20 20 20 20 20  c_nr",          
21600 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
21610 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e 72 20  c*)test_exec_nr 
21620 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e           },.#ifn
21630 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21640 47 45 54 5f 54 41 42 4c 45 0a 20 20 20 20 20 7b  GET_TABLE.     {
21650 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61   "sqlite3_get_ta
21660 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20 20  ble_printf",    
21670 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
21680 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70  test_get_table_p
21690 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66 0a  rintf },.#endif.
216a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
216b0 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20  close",         
216c0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
216d0 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73  Proc*)sqlite_tes
216e0 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20  t_close     },. 
216f0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
21700 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c  reate_function",
21710 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
21720 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65  roc*)test_create
21730 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20  _function  },.  
21740 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72     { "sqlite3_cr
21750 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c  eate_aggregate",
21760 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
21770 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f  oc*)test_create_
21780 61 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20  aggregate },.   
21790 20 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69    { "sqlite_regi
217a0 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69  ster_test_functi
217b0 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f  on", (Tcl_CmdPro
217c0 63 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65 72  c*)test_register
217d0 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20  _func    },.    
217e0 20 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74   { "sqlite_abort
217f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
21800 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
21810 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20  *)sqlite_abort  
21820 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
21830 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c  { "sqlite_bind",
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21850 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
21860 29 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20  )test_bind      
21870 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
21880 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20   "breakpoint",  
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
218b0 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20  test_breakpoint 
218c0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
218d0 22 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20  "sqlite3_key",  
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218f0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
21900 65 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20  est_key         
21910 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
21920 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20  sqlite3_rekey", 
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21940 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
21950 73 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20  st_rekey        
21960 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
21970 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22  qlite_set_magic"
21980 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
21990 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
219a0 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20  ite_set_magic   
219b0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
219c0 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22  lite3_interrupt"
219d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54  ,             (T
219e0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
219f0 5f 69 6e 74 65 72 72 75 70 74 20 20 20 20 20 20  _interrupt      
21a00 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
21a10 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74  ite_delete_funct
21a20 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63  ion",        (Tc
21a30 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74  l_CmdProc*)delet
21a40 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20  e_function      
21a50 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
21a60 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74  te_delete_collat
21a70 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c  ion",       (Tcl
21a80 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65  _CmdProc*)delete
21a90 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20  _collation      
21aa0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
21ab0 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
21ac0 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
21ad0 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74  CmdProc*)get_aut
21ae0 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d  ocommit        }
21af0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
21b00 33 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20 20  3_stack_used",  
21b10 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
21b20 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74 61  mdProc*)test_sta
21b30 63 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d 2c  ck_used       },
21b40 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
21b50 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20  _busy_timeout", 
21b60 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
21b70 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79  dProc*)test_busy
21b80 5f 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a  _timeout     },.
21b90 20 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c       { "printf",
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bb0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
21bc0 50 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74  Proc*)test_print
21bd0 66 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  f           },. 
21be0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 49 6f      { "sqlite3Io
21bf0 54 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20  Trace",         
21c00 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
21c10 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63 65  c*)test_io_trace
21c20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b           },.  };
21c30 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
21c40 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
21c50 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62  ame;.     Tcl_Ob
21c60 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b  jCmdProc *xProc;
21c70 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65  .     void *clie
21c80 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a  ntData;.  } aObj
21c90 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  Cmd[] = {.     {
21ca0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63   "sqlite3_connec
21cb0 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20 20  tion_pointer",  
21cc0 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69    get_sqlite_poi
21cd0 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20  nter, 0 },.     
21ce0 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
21cf0 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
21d00 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74     test_bind_int
21d10 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  ,      0 },.    
21d20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
21d30 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20  _zeroblob",     
21d40 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65      test_bind_ze
21d50 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20 20  roblob, 0 },.   
21d60 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
21d70 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20  d_int64",       
21d80 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69       test_bind_i
21d90 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20  nt64,    0 },.  
21da0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
21db0 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20  nd_double",     
21dc0 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
21dd0 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20  double,   0 },. 
21de0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
21df0 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20  ind_null",      
21e00 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
21e10 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a  _null     ,0 },.
21e20 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
21e30 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20  bind_text",     
21e40 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
21e50 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c  d_text     ,0 },
21e60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
21e70 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20  _bind_text16",  
21e80 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
21e90 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d  nd_text16   ,0 }
21ea0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
21eb0 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20  3_bind_blob",   
21ec0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
21ed0 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20  ind_blob     ,0 
21ee0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
21ef0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
21f00 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f  r_count",  test_
21f10 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
21f20 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  ount, 0},.     {
21f30 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70   "sqlite3_bind_p
21f40 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20  arameter_name", 
21f50 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61    test_bind_para
21f60 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c  meter_name,  0},
21f70 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
21f80 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
21f90 69 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62 69  index",  test_bi
21fa0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
21fb0 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  ex, 0},.     { "
21fc0 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69  sqlite3_clear_bi
21fd0 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20 20  ndings",        
21fe0 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69  test_clear_bindi
21ff0 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  ngs, 0},.     { 
22000 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c  "sqlite3_sleep",
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22020 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20 20   test_sleep,    
22030 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b        0},.     {
22040 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64   "sqlite3_errcod
22050 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
22060 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20    test_errcode  
22070 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
22080 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  { "sqlite3_exten
22090 64 65 64 5f 65 72 72 63 6f 64 65 22 2c 20 20 20  ded_errcode",   
220a0 20 20 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f     test_ex_errco
220b0 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  de    ,0 },.    
220c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d   { "sqlite3_errm
220d0 73 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sg",            
220e0 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20      test_errmsg 
220f0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
22100 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
22110 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20 20 20  msg16",         
22120 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67       test_errmsg
22130 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  16      ,0 },.  
22140 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
22150 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  en",            
22160 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20        test_open 
22170 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
22180 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
22190 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20  pen16",         
221a0 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
221b0 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  16        ,0 },.
221c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
221d0 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20  complete16",    
221e0 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d          test_com
221f0 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c  plete16    ,0 },
22200 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ..     { "sqlite
22210 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20 20  3_prepare",     
22220 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
22230 72 65 70 61 72 65 20 20 20 20 20 20 20 2c 30 20  repare       ,0 
22240 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
22250 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20  e3_prepare16",  
22260 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
22270 70 72 65 70 61 72 65 31 36 20 20 20 20 20 2c 30  prepare16     ,0
22280 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
22290 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22 2c  te3_prepare_v2",
222a0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
222b0 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20 20 2c  _prepare_v2    ,
222c0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
222d0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74  ite3_prepare_tkt
222e0 33 31 33 34 22 2c 20 20 20 20 20 20 20 74 65 73  3134",       tes
222f0 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33  t_prepare_tkt313
22300 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  4, 0},.     { "s
22310 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
22320 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 74  _v2",          t
22330 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32  est_prepare16_v2
22340 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
22350 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
22360 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
22370 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20  test_finalize   
22380 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
22390 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74  "sqlite3_stmt_st
223a0 61 74 75 73 22 2c 20 20 20 20 20 20 20 20 20 20  atus",          
223b0 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75   test_stmt_statu
223c0 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  s   ,0 },.     {
223d0 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74 22   "sqlite3_reset"
223e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
223f0 20 20 74 65 73 74 5f 72 65 73 65 74 20 20 20 20    test_reset    
22400 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
22410 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70 69 72  { "sqlite3_expir
22420 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ed",            
22430 20 20 20 74 65 73 74 5f 65 78 70 69 72 65 64 20     test_expired 
22440 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
22450 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72 61 6e   { "sqlite3_tran
22460 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20  sfer_bindings", 
22470 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73 66 65      test_transfe
22480 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20  r_bind ,0 },.   
22490 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 68 61    { "sqlite3_cha
224a0 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20  nges",          
224b0 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e 67 65       test_change
224c0 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  s       ,0 },.  
224d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
224e0 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
224f0 20 20 20 20 20 20 74 65 73 74 5f 73 74 65 70 20        test_step 
22500 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
22510 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6e      { "sqlite3_n
22520 65 78 74 5f 73 74 6d 74 22 2c 20 20 20 20 20 20  ext_stmt",      
22530 20 20 20 20 20 20 20 74 65 73 74 5f 6e 65 78 74         test_next
22540 5f 73 74 6d 74 20 20 20 20 20 2c 30 20 7d 2c 0a  _stmt     ,0 },.
22550 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
22560 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22  _release_memory"
22570 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 72 65  ,        test_re
22580 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 20  lease_memory,   
22590 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
225a0 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
225b0 6c 69 6d 69 74 22 2c 20 20 20 20 20 20 20 74 65  limit",       te
225c0 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  st_soft_heap_lim
225d0 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  it,    0},.     
225e0 7b 20 22 73 71 6c 69 74 65 33 5f 74 68 72 65 61  { "sqlite3_threa
225f0 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20 20 20 20  d_cleanup",     
22600 20 20 20 74 65 73 74 5f 74 68 72 65 61 64 5f 63     test_thread_c
22610 6c 65 61 6e 75 70 2c 20 20 20 20 20 30 7d 2c 0a  leanup,     0},.
22620 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
22630 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 22  pager_refcounts"
22640 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70 61 67  ,       test_pag
22650 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c 20 20 20  er_refcounts,   
22660 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71   0},..     { "sq
22670 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
22680 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 74 65  sion",        te
22690 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  st_load_extensio
226a0 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  n,     0},.     
226b0 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  { "sqlite3_enabl
226c0 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
226d0 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c  ", test_enable_l
226e0 6f 61 64 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  oad,        0},.
226f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
22700 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
22710 63 6f 64 65 73 22 2c 20 74 65 73 74 5f 65 78 74  codes", test_ext
22720 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
22730 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  es, 0},.     { "
22740 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 22 2c 20  sqlite3_limit", 
22750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22760 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20 20 20 20  test_limit,     
22770 20 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c 0a              0},.
22780 0a 20 20 20 20 20 7b 20 22 73 61 76 65 5f 70 72  .     { "save_pr
22790 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20  ng_state",      
227a0 20 20 20 20 20 20 20 20 20 73 61 76 65 5f 70 72           save_pr
227b0 6e 67 5f 73 74 61 74 65 2c 20 20 20 20 30 20 7d  ng_state,    0 }
227c0 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 74 6f 72  ,.     { "restor
227d0 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20  e_prng_state",  
227e0 20 20 20 20 20 20 20 20 20 20 72 65 73 74 6f 72            restor
227f0 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 30 20  e_prng_state, 0 
22800 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 65 74  },.     { "reset
22810 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20  _prng_state",   
22820 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 74             reset
22830 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 30  _prng_state,   0
22840 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c   },..     /* sql
22850 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20  ite3_column_*() 
22860 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73  API */.     { "s
22870 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
22880 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 74  unt",          t
22890 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  est_column_count
228a0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
228b0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75  sqlite3_data_cou
228c0 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
228d0 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20  test_data_count 
228e0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
228f0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
22900 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20  type",          
22910 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70   test_column_typ
22920 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  e   ,0 },.     {
22930 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
22940 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  _blob",         
22950 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c    test_column_bl
22960 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  ob   ,0 },.     
22970 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
22980 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  n_double",      
22990 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64     test_column_d
229a0 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20  ouble ,0 },.    
229b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
229c0 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20  mn_int64",      
229d0 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
229e0 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20  int64  ,0 },.   
229f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
22a00 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 74 65 73  umn_text",   tes
22a10 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76  t_stmt_utf8,  (v
22a20 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
22a30 75 6d 6e 5f 74 65 78 74 20 7d 2c 0a 20 20 20 20  umn_text },.    
22a40 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
22a50 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73 74  mn_name",   test
22a60 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f  _stmt_utf8,  (vo
22a70 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
22a80 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a 20 20 20 20 20  mn_name },.     
22a90 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
22aa0 6e 5f 69 6e 74 22 2c 20 20 20 20 74 65 73 74 5f  n_int",    test_
22ab0 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69  stmt_int,   (voi
22ac0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
22ad0 6e 5f 69 6e 74 20 20 7d 2c 0a 20 20 20 20 20 7b  n_int  },.     {
22ae0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
22af0 5f 62 79 74 65 73 22 2c 20 20 74 65 73 74 5f 73  _bytes",  test_s
22b00 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64  tmt_int,   (void
22b10 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
22b20 5f 62 79 74 65 73 7d 2c 0a 23 69 66 6e 64 65 66  _bytes},.#ifndef
22b30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
22b40 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73 71  LTYPE.     { "sq
22b50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
22b60 6c 74 79 70 65 22 2c 74 65 73 74 5f 73 74 6d 74  ltype",test_stmt
22b70 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c  _utf8,(void*)sql
22b80 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
22b90 74 79 70 65 7d 2c 0a 23 65 6e 64 69 66 0a 23 69  type},.#endif.#i
22ba0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
22bb0 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
22bc0 54 41 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f  TA.{ "sqlite3_co
22bd0 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
22be0 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  me",test_stmt_ut
22bf0 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  f8,(void*)sqlite
22c00 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
22c10 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69  e_name},.{ "sqli
22c20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
22c30 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74  _name",test_stmt
22c40 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c  _utf8,(void*)sql
22c50 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
22c60 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69  e_name},.{ "sqli
22c70 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69  te3_column_origi
22c80 6e 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d  n_name",test_stm
22c90 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
22ca0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
22cb0 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69  gin_name},.#endi
22cc0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
22cd0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20  E_OMIT_UTF16.   
22ce0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
22cf0 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 74 65  umn_bytes16", te
22d00 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 28 76 6f  st_stmt_int, (vo
22d10 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
22d20 6d 6e 5f 62 79 74 65 73 31 36 20 7d 2c 0a 20 20  mn_bytes16 },.  
22d30 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
22d40 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20 74  lumn_text16",  t
22d50 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
22d60 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
22d70 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a 20  olumn_text16},. 
22d80 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
22d90 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20  olumn_name16",  
22da0 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
22db0 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
22dc0 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c 0a  column_name16},.
22dd0 20 20 20 20 20 7b 20 22 61 64 64 5f 61 6c 69 67       { "add_alig
22de0 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
22df0 74 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69 67  tions", add_alig
22e00 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
22e10 74 69 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d 2c  tions, 0      },
22e20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22e30 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
22e40 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
22e50 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 22  lumn_decltype16"
22e60 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36  ,test_stmt_utf16
22e70 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  ,(void*)sqlite3_
22e80 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31  column_decltype1
22e90 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  6},.#endif.#ifde
22ea0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
22eb0 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
22ec0 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  {"sqlite3_column
22ed0 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36  _database_name16
22ee0 22 2c 0a 20 20 74 65 73 74 5f 73 74 6d 74 5f 75  ",.  test_stmt_u
22ef0 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f  tf16, sqlite3_co
22f00 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
22f10 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33  me16},.{"sqlite3
22f20 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
22f30 6d 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74  me16", test_stmt
22f40 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73  _utf16, (void*)s
22f50 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61  qlite3_column_ta
22f60 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73  ble_name16},.{"s
22f70 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
22f80 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c 20 74 65  igin_name16", te
22f90 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28  st_stmt_utf16, (
22fa0 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
22fb0 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65  lumn_origin_name
22fc0 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64  16},.#endif.#end
22fd0 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
22fe0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
22ff0 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72  ion_v2", test_cr
23000 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
23010 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  2, 0 },.     { "
23020 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
23030 65 63 6f 76 65 72 22 2c 20 20 20 20 20 74 65 73  ecover",     tes
23040 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  t_global_recover
23050 2c 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  , 0   },.     { 
23060 22 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69  "working_64bit_i
23070 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 77 6f  nt",          wo
23080 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 2c  rking_64bit_int,
23090 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
230a0 20 22 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73   "vfs_unlink_tes
230b0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 76  t",            v
230c0 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 2c 20  fs_unlink_test, 
230d0 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20      0   },.     
230e0 7b 20 22 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f  { "vfs_initfail_
230f0 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20  test",          
23100 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73  vfs_initfail_tes
23110 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  t,   0   },.    
23120 20 7b 20 22 76 66 73 5f 75 6e 72 65 67 69 73 74   { "vfs_unregist
23130 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20 20  er_all",        
23140 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f   vfs_unregister_
23150 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  all,  0   },.   
23160 20 20 7b 20 22 76 66 73 5f 72 65 72 65 67 69 73    { "vfs_reregis
23170 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20  ter_all",       
23180 20 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72    vfs_reregister
23190 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20  _all,  0   },.  
231a0 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
231b0 6f 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20  ol_test",       
231c0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
231d0 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20  test,   0   },. 
231e0 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
231f0 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65  rol_lasterrno_te
23200 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  st", file_contro
23210 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74  l_lasterrno_test
23220 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  0   },.     {
23230 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c   "file_control_l
23240 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 22 2c 20  ockproxy_test", 
23250 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63  file_control_loc
23260 6b 70 72 6f 78 79 5f 74 65 73 74 2c 20 20 30 20  kproxy_test,  0 
23270 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
23280 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 22 2c 20  ite3_vfs_list", 
23290 20 20 20 20 20 20 20 20 20 20 76 66 73 5f 6c 69            vfs_li
232a0 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 0a  st,     0   },..
232b0 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
232c0 73 20 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23  s from os.h */.#
232d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
232e0 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20  IT_UTF16.     { 
232f0 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  "add_test_collat
23300 65 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f  e",        test_
23310 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20 20  collate, 0      
23320 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
23330 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  "add_test_collat
23340 65 5f 6e 65 65 64 65 64 22 2c 20 74 65 73 74 5f  e_needed", test_
23350 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20  collate_needed, 
23360 30 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  0     },.     { 
23370 22 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69  "add_test_functi
23380 6f 6e 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  on",       test_
23390 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20 20  function, 0     
233a0 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a        },.#endif.
233b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
233c0 74 65 73 74 5f 65 72 72 73 74 72 22 2c 20 20 20  test_errstr",   
233d0 20 20 74 65 73 74 5f 65 72 72 73 74 72 2c 20 30    test_errstr, 0
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
233f0 20 20 20 20 20 7b 20 22 74 63 6c 5f 76 61 72 69       { "tcl_vari
23400 61 62 6c 65 5f 74 79 70 65 22 2c 20 20 20 20 20  able_type",     
23410 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74    tcl_variable_t
23420 79 70 65 2c 20 30 20 20 20 20 20 20 20 7d 2c 0a  ype, 0       },.
23430 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23440 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
23450 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
23460 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
23470 61 63 68 65 22 2c 20 74 65 73 74 5f 65 6e 61 62  ache", test_enab
23480 6c 65 5f 73 68 61 72 65 64 2c 20 30 20 20 7d 2c  le_shared, 0  },
23490 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
234a0 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72 65  _shared_cache_re
234b0 70 6f 72 74 22 2c 20 73 71 6c 69 74 65 33 42 74  port", sqlite3Bt
234c0 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52 65  reeSharedCacheRe
234d0 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e 64 69 66  port, 0},.#endif
234e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
234f0 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
23500 65 72 22 2c 20 74 65 73 74 5f 6c 69 62 76 65 72  er", test_libver
23510 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30 20 20  sion_number, 0  
23520 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  },.#ifdef SQLITE
23530 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
23540 45 54 41 44 41 54 41 0a 20 20 20 20 20 7b 20 22  ETADATA.     { "
23550 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
23560 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 22 2c 20  lumn_metadata", 
23570 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  test_table_colum
23580 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30 20 20 7d  n_metadata, 0  }
23590 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ,.#endif.#ifndef
235a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
235b0 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73 71  RBLOB.     { "sq
235c0 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 22  lite3_blob_read"
235d0 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 61  ,  test_blob_rea
235e0 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20  d, 0  },.     { 
235f0 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72  "sqlite3_blob_wr
23600 69 74 65 22 2c 20 74 65 73 74 5f 62 6c 6f 62 5f  ite", test_blob_
23610 77 72 69 74 65 2c 20 30 20 20 7d 2c 0a 23 65 6e  write, 0  },.#en
23620 64 69 66 0a 20 20 20 20 20 7b 20 22 70 63 61 63  dif.     { "pcac
23630 68 65 5f 73 74 61 74 73 22 2c 20 20 20 20 20 20  he_stats",      
23640 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61   test_pcache_sta
23650 74 73 2c 20 30 20 20 7d 2c 0a 20 20 7d 3b 0a 20  ts, 0  },.  };. 
23660 20 73 74 61 74 69 63 20 69 6e 74 20 62 69 74 6d   static int bitm
23670 61 73 6b 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f  ask_size = sizeo
23680 66 28 42 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20  f(Bitmask)*8;.  
23690 69 6e 74 20 69 3b 0a 20 20 65 78 74 65 72 6e 20  int i;.  extern 
236a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
236b0 5f 63 6f 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f  _count, sqlite3_
236c0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a  fullsync_count;.
236d0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
236e0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
236f0 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
23700 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63  t sqlite3_like_c
23710 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
23720 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  nt sqlite3_xfero
23730 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  pt_count;.  exte
23740 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
23750 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
23760 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
23770 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
23780 69 74 65 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65  itedb_count;.  e
23790 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
237a0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
237b0 6f 75 6e 74 3b 0a 23 69 66 20 64 65 66 69 6e 65  ount;.#if define
237c0 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20  d(__linux__) && 
237d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
237e0 45 53 54 29 20 26 26 20 53 51 4c 49 54 45 5f 54  EST) && SQLITE_T
237f0 48 52 45 41 44 53 41 46 45 0a 20 20 65 78 74 65  HREADSAFE.  exte
23800 72 6e 20 69 6e 74 20 74 68 72 65 61 64 73 4f 76  rn int threadsOv
23810 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
23820 4c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 23 69  Locks;.#endif.#i
23830 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
23840 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
23850 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b 0a 23 65  ite3_os_type;.#e
23860 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
23870 54 45 5f 44 45 42 55 47 0a 20 20 65 78 74 65 72  TE_DEBUG.  exter
23880 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  n int sqlite3Whe
23890 72 65 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72  reTrace;.  exter
238a0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54  n int sqlite3OST
238b0 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69  race;.  extern i
238c0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
238d0 64 6f 70 54 72 61 63 65 3b 0a 23 65 6e 64 69 66  dopTrace;.#endif
238e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
238f0 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  EST.  extern int
23900 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
23910 69 6e 5f 6f 70 74 3b 0a 20 20 65 78 74 65 72 6e  in_opt;.  extern
23920 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75   char sqlite3_qu
23930 65 72 79 5f 70 6c 61 6e 5b 5d 3b 0a 20 20 73 74  ery_plan[];.  st
23940 61 74 69 63 20 63 68 61 72 20 2a 71 75 65 72 79  atic char *query
23950 5f 70 6c 61 6e 20 3d 20 73 71 6c 69 74 65 33 5f  _plan = sqlite3_
23960 71 75 65 72 79 5f 70 6c 61 6e 3b 0a 23 65 6e 64  query_plan;.#end
23970 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  if..  for(i=0; i
23980 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69  <sizeof(aCmd)/si
23990 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69  zeof(aCmd[0]); i
239a0 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  ++){.    Tcl_Cre
239b0 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
239c0 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65  p, aCmd[i].zName
239d0 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c  , aCmd[i].xProc,
239e0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f   0, 0);.  }.  fo
239f0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
23a00 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28  aObjCmd)/sizeof(
23a10 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b  aObjCmd[0]); i++
23a20 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ){.    Tcl_Creat
23a30 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
23a40 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a  rp, aObjCmd[i].z
23a50 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 61  Name, .        a
23a60 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c  ObjCmd[i].xProc,
23a70 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65   aObjCmd[i].clie
23a80 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a  ntData, 0);.  }.
23a90 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
23aa0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 65  terp, "sqlite_se
23ab0 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  arch_count", .  
23ac0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
23ad0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
23ae0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
23af0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
23b00 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
23b10 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  ort_count", .   
23b20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
23b30 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20 54  e3_sort_count, T
23b40 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
23b50 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
23b60 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61 78  rp, "sqlite3_max
23b70 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a 20 20 20  _blobsize", .   
23b80 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
23b90 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 2c  e3_max_blobsize,
23ba0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
23bb0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
23bc0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 69  terp, "sqlite_li
23bd0 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  ke_count", .    
23be0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
23bf0 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20 54 43  3_like_count, TC
23c00 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
23c10 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
23c20 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65 72  p, "sqlite_inter
23c30 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  rupt_count", .  
23c40 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
23c50 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
23c60 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
23c70 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
23c80 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
23c90 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  e_open_file_coun
23ca0 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
23cb0 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  *)&sqlite3_open_
23cc0 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  file_count, TCL_
23cd0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
23ce0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
23cf0 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74   "sqlite_current
23d00 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 28  _time", .      (
23d10 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 63  char*)&sqlite3_c
23d20 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c  urrent_time, TCL
23d30 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20  _LINK_INT);.#if 
23d40 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26  SQLITE_OS_UNIX &
23d50 26 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57  & defined(__DARW
23d60 49 4e 5f 5f 29 0a 20 20 54 63 6c 5f 4c 69 6e 6b  IN__).  Tcl_Link
23d70 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
23d80 69 74 65 5f 68 6f 73 74 69 64 5f 6e 75 6d 22 2c  ite_hostid_num",
23d90 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
23da0 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
23db0 75 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  um, TCL_LINK_INT
23dc0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f  );.#endif.  Tcl_
23dd0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
23de0 22 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74  "sqlite3_xferopt
23df0 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28  _count",.      (
23e00 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 78  char*)&sqlite3_x
23e10 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20 54 43  feropt_count, TC
23e20 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
23e30 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
23e40 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65  p, "sqlite3_page
23e50 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 22 2c  r_readdb_count",
23e60 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
23e70 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
23e80 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ddb_count, TCL_L
23e90 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
23ea0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
23eb0 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  "sqlite3_pager_w
23ec0 72 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c 0a 20  ritedb_count",. 
23ed0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
23ee0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
23ef0 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  db_count, TCL_LI
23f00 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
23f10 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
23f20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
23f30 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  itej_count",.   
23f40 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
23f50 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
23f60 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
23f70 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  INT);.#ifndef SQ
23f80 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
23f90 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
23fa0 74 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65 64  terp, "unaligned
23fb0 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 22  _string_counter"
23fc0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
23fd0 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67  unaligned_string
23fe0 5f 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c 49  _counter, TCL_LI
23ff0 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a  NK_INT);.#endif.
24000 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69  #if defined(__li
24010 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65  nux__) && define
24020 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26  d(SQLITE_TEST) &
24030 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
24040 41 46 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  AFE.  Tcl_LinkVa
24050 72 28 69 6e 74 65 72 70 2c 20 22 74 68 72 65 61  r(interp, "threa
24060 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
24070 68 65 72 73 4c 6f 63 6b 73 22 2c 0a 20 20 20 20  hersLocks",.    
24080 20 20 28 63 68 61 72 2a 29 26 74 68 72 65 61 64    (char*)&thread
24090 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
240a0 65 72 73 4c 6f 63 6b 73 2c 20 54 43 4c 5f 4c 49  ersLocks, TCL_LI
240b0 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a  NK_INT);.#endif.
240c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
240d0 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f  MIT_UTF16.  Tcl_
240e0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
240f0 22 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65 65  "sqlite_last_nee
24100 64 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 0a  ded_collation",.
24110 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 7a        (char*)&pz
24120 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 2c  NeededCollation,
24130 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47   TCL_LINK_STRING
24140 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f  |TCL_LINK_READ_O
24150 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  NLY);.#endif.#if
24160 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20   SQLITE_OS_WIN. 
24170 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
24180 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f  erp, "sqlite_os_
24190 74 79 70 65 22 2c 0a 20 20 20 20 20 20 28 63 68  type",.      (ch
241a0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f  ar*)&sqlite3_os_
241b0 74 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  type, TCL_LINK_I
241c0 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  NT);.#endif.#ifd
241d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
241e0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
241f0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 71 75 65  erp, "sqlite_que
24200 72 79 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20  ry_plan",.      
24210 28 63 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c  (char*)&query_pl
24220 61 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52  an, TCL_LINK_STR
24230 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41  ING|TCL_LINK_REA
24240 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a  D_ONLY);.#endif.
24250 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
24260 42 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  BUG.  Tcl_LinkVa
24270 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
24280 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 22 2c 0a  e_addop_trace",.
24290 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
242a0 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72  lite3VdbeAddopTr
242b0 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
242c0 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
242d0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
242e0 65 5f 77 68 65 72 65 5f 74 72 61 63 65 22 2c 0a  e_where_trace",.
242f0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
24300 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 2c  lite3WhereTrace,
24310 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
24320 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
24330 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73  terp, "sqlite_os
24340 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28  _trace",.      (
24350 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 4f 53  char*)&sqlite3OS
24360 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  Trace, TCL_LINK_
24370 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  INT);.#endif.#if
24380 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24390 5f 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f 4c 69  _DISKIO.  Tcl_Li
243a0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
243b0 71 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70 5f 63  qlite_opentemp_c
243c0 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
243d0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65  ar*)&sqlite3_ope
243e0 6e 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54 43 4c  ntemp_count, TCL
243f0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64  _LINK_INT);.#end
24400 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  if.  Tcl_LinkVar
24410 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
24420 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
24430 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ue",.      (char
24440 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63  *)&sqlite_static
24450 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c  _bind_value, TCL
24460 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
24470 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
24480 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  erp, "sqlite_sta
24490 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 22 2c  tic_bind_nbyte",
244a0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
244b0 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
244c0 64 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c 49 4e  d_nbyte, TCL_LIN
244d0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
244e0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
244f0 71 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72 65 63  qlite_temp_direc
24500 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63 68  tory",.      (ch
24510 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 74 65 6d  ar*)&sqlite3_tem
24520 70 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c  p_directory, TCL
24530 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
24540 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
24550 65 72 70 2c 20 22 62 69 74 6d 61 73 6b 5f 73 69  erp, "bitmask_si
24560 7a 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ze",.      (char
24570 2a 29 26 62 69 74 6d 61 73 6b 5f 73 69 7a 65 2c  *)&bitmask_size,
24580 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43   TCL_LINK_INT|TC
24590 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59  L_LINK_READ_ONLY
245a0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
245b0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
245c0 5f 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20  _sync_count",.  
245d0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
245e0 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20  te3_sync_count, 
245f0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
24600 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
24610 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 75 6c  erp, "sqlite_ful
24620 6c 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20  lsync_count",.  
24630 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
24640 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
24650 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
24660 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
24670 5f 54 45 53 54 0a 20 20 54 63 6c 5f 4c 69 6e 6b  _TEST.  Tcl_Link
24680 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
24690 69 74 65 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70  ite_enable_in_op
246a0 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
246b0 29 26 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  )&sqlite3_enable
246c0 5f 69 6e 5f 6f 70 74 2c 20 54 43 4c 5f 4c 49 4e  _in_opt, TCL_LIN
246d0 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20  K_INT);.#endif. 
246e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
246f0 7d 0a                                            }.