/ Hex Artifact Content
Login

Artifact a83c097ee1353e8982745ee1b78612fea7425602:


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 32 35 36 20 32 30 30 37 2f 30 36 2f 31   1.256 2007/06/1
0240: 35 20 32 30 3a 32 39 3a 32 30 20 64 72 68 20 45  5 20:29:20 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 22 6f 73 2e 68 22 0a  #include "os.h".
0290: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
02a0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
02b0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  ring.h>../*.** T
02c0: 68 69 73 20 69 73 20 61 20 63 6f 70 79 20 6f 66  his is a copy of
02d0: 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
02e0: 6f 66 20 74 68 65 20 53 71 6c 69 74 65 44 62 20  of the SqliteDb 
02f0: 73 74 72 75 63 74 75 72 65 20 69 6e 20 0a 2a 2a  structure in .**
0300: 20 74 63 6c 73 71 6c 69 74 65 2e 63 2e 20 20 57   tclsqlite.c.  W
0310: 65 20 6e 65 65 64 20 69 74 20 68 65 72 65 20 73  e need it here s
0320: 6f 20 74 68 61 74 20 74 68 65 20 67 65 74 5f 73  o that the get_s
0330: 71 6c 69 74 65 5f 70 6f 69 6e 74 65 72 20 72 6f  qlite_pointer ro
0340: 75 74 69 6e 65 0a 2a 2a 20 63 61 6e 20 65 78 74  utine.** can ext
0350: 72 61 63 74 20 74 68 65 20 73 71 6c 69 74 65 33  ract the sqlite3
0360: 2a 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 61  * pointer from a
0370: 6e 20 65 78 69 73 74 69 6e 67 20 54 63 6c 20 53  n existing Tcl S
0380: 51 4c 69 74 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  QLite.** connect
0390: 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ion..*/.struct S
03a0: 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69  qliteDb {.  sqli
03b0: 74 65 33 20 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 0a  te3 *db;.};../*.
03c0: 2a 2a 20 43 6f 6e 76 65 72 74 20 74 65 78 74 20  ** Convert text 
03d0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
03e0: 20 22 25 70 22 20 63 6f 6e 76 65 72 73 69 6f 6e   "%p" conversion
03f0: 20 66 6f 72 6d 61 74 20 62 61 63 6b 20 69 6e 74   format back int
0400: 6f 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 2e 0a  o.** a pointer..
0410: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
0420: 73 74 48 65 78 54 6f 49 6e 74 28 69 6e 74 20 68  stHexToInt(int h
0430: 29 7b 0a 20 20 69 66 28 20 68 3e 3d 27 30 27 20  ){.  if( h>='0' 
0440: 26 26 20 68 3c 3d 27 39 27 20 29 7b 0a 20 20 20  && h<='9' ){.   
0450: 20 72 65 74 75 72 6e 20 68 20 2d 20 27 30 27 3b   return h - '0';
0460: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3e 3d  .  }else if( h>=
0470: 27 61 27 20 26 26 20 68 3c 3d 27 66 27 20 29 7b  'a' && h<='f' ){
0480: 0a 20 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20  .    return h - 
0490: 27 61 27 20 2b 20 31 30 3b 0a 20 20 7d 65 6c 73  'a' + 10;.  }els
04a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 68  e{.    assert( h
04b0: 3e 3d 27 41 27 20 26 26 20 68 3c 3d 27 46 27 20  >='A' && h<='F' 
04c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 20  );.    return h 
04d0: 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 7d 0a  - 'A' + 10;.  }.
04e0: 7d 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 54  }.void *sqlite3T
04f0: 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74 20 63  extToPtr(const c
0500: 68 61 72 20 2a 7a 29 7b 0a 20 20 76 6f 69 64 20  har *z){.  void 
0510: 2a 70 3b 0a 20 20 75 36 34 20 76 3b 0a 20 20 75  *p;.  u64 v;.  u
0520: 33 32 20 76 32 3b 0a 20 20 69 66 28 20 7a 5b 30  32 v2;.  if( z[0
0530: 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='0' && z[1]==
0540: 27 78 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  'x' ){.    z += 
0550: 32 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 30 3b 0a  2;.  }.  v = 0;.
0560: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
0570: 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20     v = (v<<4) + 
0580: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 2a 7a 29  testHexToInt(*z)
0590: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    z++;.  }. 
05a0: 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d   if( sizeof(p)==
05b0: 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20 20  sizeof(v) ){.   
05c0: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76 2c 20   memcpy(&p, &v, 
05d0: 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65  sizeof(p));.  }e
05e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
05f0: 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65   sizeof(p)==size
0600: 6f 66 28 76 32 29 20 29 3b 0a 20 20 20 20 76 32  of(v2) );.    v2
0610: 20 3d 20 28 75 33 32 29 76 3b 0a 20 20 20 20 6d   = (u32)v;.    m
0620: 65 6d 63 70 79 28 26 70 2c 20 26 76 32 2c 20 73  emcpy(&p, &v2, s
0630: 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 0a 20  izeof(p));.  }. 
0640: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
0650: 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
0660: 6e 64 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  nd that returns 
0670: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0680: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
0690: 65 72 0a 2a 2a 20 66 6f 72 20 61 6e 20 73 71 6c  er.** for an sql
06a0: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ite connection i
06b0: 6e 73 74 61 6e 63 65 2e 20 20 42 61 64 20 74 68  nstance.  Bad th
06c0: 69 6e 67 73 20 68 61 70 70 65 6e 20 69 66 20 74  ings happen if t
06d0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e  he.** input is n
06e0: 6f 74 20 61 6e 20 73 71 6c 69 74 65 20 63 6f 6e  ot an sqlite con
06f0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
0700: 69 63 20 69 6e 74 20 67 65 74 5f 73 71 6c 69 74  ic int get_sqlit
0710: 65 5f 70 6f 69 6e 74 65 72 28 0a 20 20 76 6f 69  e_pointer(.  voi
0720: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
0730: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0740: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
0750: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
0760: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
0770: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0780: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0790: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72   cmdInfo;.  char
07a0: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
07b0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
07c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
07d0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
07e0: 76 2c 20 22 53 51 4c 49 54 45 2d 43 4f 4e 4e 45  v, "SQLITE-CONNE
07f0: 43 54 49 4f 4e 22 29 3b 0a 20 20 20 20 72 65 74  CTION");.    ret
0800: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0810: 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65   }.  if( !Tcl_Ge
0820: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
0830: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
0840: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
0850: 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
0860: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0870: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
0880: 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20  not found: ",.  
0890: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
08a0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
08b0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
08c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
08d0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 73 74 72  ;.  }.  p = (str
08e0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
08f0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
0900: 61 74 61 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ata;.  sprintf(z
0910: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
0920: 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  );.  if( strncmp
0930: 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20 29 7b  (zBuf,"0x",2) ){
0940: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
0950: 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e 64 62  f, "0x%p", p->db
0960: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
0970: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0980: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
0990: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
09a0: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
09b0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
09c0: 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ite3 object..*/.
09d0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 44 62  static int getDb
09e0: 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65  Pointer(Tcl_Inte
09f0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73  rp *interp, cons
0a00: 74 20 63 68 61 72 20 2a 7a 41 2c 20 73 71 6c 69  t char *zA, sqli
0a10: 74 65 33 20 2a 2a 70 70 44 62 29 7b 0a 20 20 73  te3 **ppDb){.  s
0a20: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0a30: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0a40: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 69 66 28 20   cmdInfo;.  if( 
0a50: 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
0a60: 66 6f 28 69 6e 74 65 72 70 2c 20 7a 41 2c 20 26  fo(interp, zA, &
0a70: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
0a80: 70 20 3d 20 28 73 74 72 75 63 74 20 53 71 6c 69  p = (struct Sqli
0a90: 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62  teDb*)cmdInfo.ob
0aa0: 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20  jClientData;.   
0ab0: 20 2a 70 70 44 62 20 3d 20 70 2d 3e 64 62 3b 0a   *ppDb = p->db;.
0ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
0ad0: 44 62 20 3d 20 28 73 71 6c 69 74 65 33 2a 29 73  Db = (sqlite3*)s
0ae0: 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72 28  qlite3TextToPtr(
0af0: 7a 41 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  zA);.  }.  retur
0b00: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 63 6f  n TCL_OK;.}...co
0b10: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0b20: 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 69  3TestErrorName(i
0b30: 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20  nt rc){.  const 
0b40: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
0b50: 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 26 20  .  switch( rc & 
0b60: 30 78 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65  0xff ){.    case
0b70: 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20   SQLITE_OK:     
0b80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0b90: 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20  ITE_OK";        
0ba0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0bb0: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
0bc0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
0bd0: 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20  LITE_ERROR";    
0be0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0bf0: 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20  se SQLITE_PERM: 
0c00: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
0c10: 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20  QLITE_PERM";    
0c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0c30: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
0c40: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
0c50: 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20  SQLITE_ABORT";  
0c60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0c70: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
0c80: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
0c90: 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20  "SQLITE_BUSY";  
0ca0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0cb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43   case SQLITE_LOC
0cc0: 4b 45 44 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  KED:     zName =
0cd0: 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22   "SQLITE_LOCKED"
0ce0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
0cf0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
0d00: 4d 45 4d 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  MEM:      zName 
0d10: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22  = "SQLITE_NOMEM"
0d20: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
0d30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
0d40: 45 41 44 4f 4e 4c 59 3a 20 20 20 7a 4e 61 6d 65  EADONLY:   zName
0d50: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
0d60: 4e 4c 59 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  NLY";    break;.
0d70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0d80: 49 4e 54 45 52 52 55 50 54 3a 20 20 7a 4e 61 6d  INTERRUPT:  zNam
0d90: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45  e = "SQLITE_INTE
0da0: 52 52 55 50 54 22 3b 20 20 20 62 72 65 61 6b 3b  RRUPT";   break;
0db0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0dc0: 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 7a 4e 61  _IOERR:      zNa
0dd0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
0de0: 52 52 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  RR";       break
0df0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0e00: 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 7a 4e  E_CORRUPT:    zN
0e10: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
0e20: 52 52 55 50 54 22 3b 20 20 20 20 20 62 72 65 61  RRUPT";     brea
0e30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0e40: 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 7a  TE_FULL:       z
0e50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
0e60: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
0e70: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0e80: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20  ITE_CANTOPEN:   
0e90: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0ea0: 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 62 72  CANTOPEN";    br
0eb0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0ec0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20  LITE_PROTOCOL:  
0ed0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0ee0: 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 62  _PROTOCOL";    b
0ef0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0f00: 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20  QLITE_EMPTY:    
0f10: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0f20: 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20  E_EMPTY";       
0f30: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0f40: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20  SQLITE_SCHEMA:  
0f50: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0f60: 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20  TE_SCHEMA";     
0f70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0f80: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
0f90: 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  NT: zName = "SQL
0fa0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b  ITE_CONSTRAINT";
0fb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0fc0: 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  e SQLITE_MISMATC
0fd0: 48 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  H:   zName = "SQ
0fe0: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20  LITE_MISMATCH"; 
0ff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1000: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  se SQLITE_MISUSE
1010: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
1020: 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20 20  QLITE_MISUSE";  
1030: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1040: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  ase SQLITE_NOLFS
1050: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
1060: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20  SQLITE_NOLFS";  
1070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1080: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48  case SQLITE_AUTH
1090: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
10a0: 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20 20  "SQLITE_AUTH";  
10b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52   case SQLITE_FOR
10d0: 4d 41 54 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  MAT:     zName =
10e0: 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22   "SQLITE_FORMAT"
10f0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
1100: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41    case SQLITE_RA
1110: 4e 47 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  NGE:      zName 
1120: 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45 22  = "SQLITE_RANGE"
1130: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
1140: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
1150: 4f 57 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  OW:        zName
1160: 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b   = "SQLITE_ROW";
1170: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1180: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1190: 44 4f 4e 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d  DONE:       zNam
11a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45  e = "SQLITE_DONE
11b0: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
11c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
11d0: 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 7a 4e 61  _NOTADB:     zNa
11e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
11f0: 41 44 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b  ADB";      break
1200: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
1220: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 55 6e  ame = "SQLITE_Un
1230: 6b 6e 6f 77 6e 22 3b 20 20 20 20 20 62 72 65 61  known";     brea
1240: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
1250: 7a 4e 61 6d 65 3b 0a 7d 0a 23 64 65 66 69 6e 65  zName;.}.#define
1260: 20 74 31 45 72 72 6f 72 4e 61 6d 65 20 73 71 6c   t1ErrorName sql
1270: 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d  ite3TestErrorNam
1280: 65 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  e../*.** Convert
1290: 20 61 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   an sqlite3_stmt
12a0: 2a 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65  * into an sqlite
12b0: 33 2a 2e 20 20 54 68 69 73 20 64 65 70 65 6e 64  3*.  This depend
12c0: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 66 61 63 74  s on the.** fact
12d0: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
12e0: 33 2a 20 69 73 20 74 68 65 20 66 69 72 73 74 20  3* is the first 
12f0: 66 69 65 6c 64 20 69 6e 20 74 68 65 20 56 64 62  field in the Vdb
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
1310: 23 64 65 66 69 6e 65 20 53 74 6d 74 54 6f 44 62  #define StmtToDb
1320: 28 58 29 20 20 20 73 71 6c 69 74 65 33 5f 64 62  (X)   sqlite3_db
1330: 5f 68 61 6e 64 6c 65 28 58 29 0a 0a 2f 2a 0a 2a  _handle(X)../*.*
1340: 2a 20 43 68 65 63 6b 20 61 20 72 65 74 75 72 6e  * Check a return
1350: 20 76 61 6c 75 65 20 74 6f 20 6d 61 6b 65 20 73   value to make s
1360: 75 72 65 20 69 74 20 61 67 72 65 65 73 20 77 69  ure it agrees wi
1370: 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  th the results.*
1380: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65  * from sqlite3_e
1390: 72 72 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  rrcode..*/.int s
13a0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
13b0: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
13c0: 74 65 72 70 2c 20 73 71 6c 69 74 65 33 20 2a 64  terp, sqlite3 *d
13d0: 62 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 66  b, int rc){.  if
13e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53  ( rc!=SQLITE_MIS
13f0: 55 53 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54  USE && rc!=SQLIT
1400: 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f  E_OK && sqlite3_
1410: 65 72 72 63 6f 64 65 28 64 62 29 21 3d 72 63 20  errcode(db)!=rc 
1420: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
1430: 5b 32 30 30 5d 3b 0a 20 20 20 20 69 6e 74 20 72  [200];.    int r
1440: 32 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  2 = sqlite3_errc
1450: 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 73 70 72  ode(db);.    spr
1460: 69 6e 74 66 28 7a 42 75 66 2c 20 22 65 72 72 6f  intf(zBuf, "erro
1470: 72 20 63 6f 64 65 20 25 73 20 28 25 64 29 20 64  r code %s (%d) d
1480: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 73 71  oes not match sq
1490: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 25 73  lite3_errcode %s
14a0: 20 28 25 64 29 22 2c 0a 20 20 20 20 20 20 20 74   (%d)",.       t
14b0: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
14c0: 72 63 2c 20 74 31 45 72 72 6f 72 4e 61 6d 65 28  rc, t1ErrorName(
14d0: 72 32 29 2c 20 72 32 29 3b 0a 20 20 20 20 54 63  r2), r2);.    Tc
14e0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
14f0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41  terp);.    Tcl_A
1500: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1510: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
1520: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1530: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1540: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70 6f  *.** Decode a po
1550: 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
1560: 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e  te3_stmt object.
1570: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1580: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 0a 20  etStmtPointer(. 
1590: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15a0: 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  erp, .  const ch
15b0: 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20 73 71  ar *zArg,  .  sq
15c0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
15d0: 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74  tmt.){.  *ppStmt
15e0: 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74   = (sqlite3_stmt
15f0: 2a 29 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50  *)sqlite3TextToP
1600: 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74 75  tr(zArg);.  retu
1610: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1620: 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69  .** Decode a poi
1630: 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
1640: 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a  e3_stmt object..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1660: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 0a 20 20  tFilePointer(.  
1670: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1680: 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  rp, .  const cha
1690: 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20 4f 73 46  r *zArg,  .  OsF
16a0: 69 6c 65 20 2a 2a 70 70 46 69 6c 65 0a 29 7b 0a  ile **ppFile.){.
16b0: 20 20 2a 70 70 46 69 6c 65 20 3d 20 28 4f 73 46    *ppFile = (OsF
16c0: 69 6c 65 2a 29 73 71 6c 69 74 65 33 54 65 78 74  ile*)sqlite3Text
16d0: 54 6f 50 74 72 28 7a 41 72 67 29 3b 0a 20 20 72  ToPtr(zArg);.  r
16e0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
16f0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1700: 61 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74  a text represent
1710: 61 74 69 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74  ation of a point
1720: 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  er that can be u
1730: 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20  nderstood.** by 
1740: 74 68 65 20 67 65 74 44 62 50 6f 69 6e 74 65 72  the getDbPointer
1750: 20 61 6e 64 20 67 65 74 56 6d 50 6f 69 6e 74 65   and getVmPointe
1760: 72 20 72 6f 75 74 69 6e 65 73 20 61 62 6f 76 65  r routines above
1770: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62  ..**.** The prob
1780: 6c 65 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20  lem is, on some 
1790: 6d 61 63 68 69 6e 65 73 20 28 53 6f 6c 61 72 69  machines (Solari
17a0: 73 29 20 69 66 20 79 6f 75 20 64 6f 20 61 20 70  s) if you do a p
17b0: 72 69 6e 74 66 20 77 69 74 68 0a 2a 2a 20 22 25  rintf with.** "%
17c0: 70 22 20 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75  p" you cannot tu
17d0: 72 6e 20 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f  rn around and do
17e0: 20 61 20 73 63 61 6e 66 20 77 69 74 68 20 74 68   a scanf with th
17f0: 65 20 73 61 6d 65 20 22 25 70 22 20 61 6e 64 0a  e same "%p" and.
1800: 2a 2a 20 67 65 74 20 79 6f 75 72 20 70 6f 69 6e  ** get your poin
1810: 74 65 72 20 62 61 63 6b 2e 20 20 59 6f 75 20 68  ter back.  You h
1820: 61 76 65 20 74 6f 20 70 72 65 70 65 6e 64 20 61  ave to prepend a
1830: 20 22 30 78 22 20 62 65 66 6f 72 65 20 69 74 20   "0x" before it 
1840: 77 69 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f  will.** work.  O
1850: 72 20 61 74 20 6c 65 61 73 74 20 74 68 61 74 20  r at least that 
1860: 69 73 20 77 68 61 74 20 69 73 20 72 65 70 6f 72  is what is repor
1870: 74 65 64 20 74 6f 20 6d 65 20 28 64 72 68 29 2e  ted to me (drh).
1880: 20 20 42 75 74 20 74 68 69 73 0a 2a 2a 20 62 65    But this.** be
1890: 68 61 76 69 6f 72 20 76 61 72 69 65 73 20 66 72  havior varies fr
18a0: 6f 6d 20 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61  om machine to ma
18b0: 63 68 69 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75  chine.  The solu
18c0: 74 69 6f 6e 20 75 73 65 64 20 68 65 72 20 69 73  tion used her is
18d0: 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20  .** to test the 
18e0: 73 74 72 69 6e 67 20 72 69 67 68 74 20 61 66 74  string right aft
18f0: 65 72 20 69 74 20 69 73 20 67 65 6e 65 72 61 74  er it is generat
1900: 65 64 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ed to see if it 
1910: 63 61 6e 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73  can be.** unders
1920: 74 6f 6f 64 20 62 79 20 73 63 61 6e 66 2c 20 61  tood by scanf, a
1930: 6e 64 20 69 66 20 6e 6f 74 2c 20 74 72 79 20 70  nd if not, try p
1940: 72 65 70 65 6e 64 69 6e 67 20 61 6e 20 22 30 78  repending an "0x
1950: 22 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74  " to see if.** t
1960: 68 61 74 20 68 65 6c 70 73 2e 20 20 49 66 20 6e  hat helps.  If n
1970: 6f 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20  othing works, a 
1980: 66 61 74 61 6c 20 65 72 72 6f 72 20 69 73 20 67  fatal error is g
1990: 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  enerated..*/.int
19a0: 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
19b0: 50 6f 69 6e 74 65 72 53 74 72 28 54 63 6c 5f 49  PointerStr(Tcl_I
19c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63  nterp *interp, c
19d0: 68 61 72 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20  har *zPtr, void 
19e0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  *p){.  sqlite3_s
19f0: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 50 74  nprintf(100, zPt
1a00: 72 2c 20 22 25 70 22 2c 20 70 29 3b 0a 20 20 72  r, "%p", p);.  r
1a10: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1a20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62  ./*.** The callb
1a30: 61 63 6b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ack routine for 
1a40: 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69  sqlite3_exec_pri
1a50: 6e 74 66 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ntf()..*/.static
1a60: 20 69 6e 74 20 65 78 65 63 5f 70 72 69 6e 74 66   int exec_printf
1a70: 5f 63 62 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  _cb(void *pArg, 
1a80: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
1a90: 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61  *argv, char **na
1aa0: 6d 65 29 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69  me){.  Tcl_DStri
1ab0: 6e 67 20 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44  ng *str = (Tcl_D
1ac0: 53 74 72 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20  String*)pArg;.  
1ad0: 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 54 63  int i;..  if( Tc
1ae0: 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28  l_DStringLength(
1af0: 73 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  str)==0 ){.    f
1b00: 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
1b10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
1b20: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
1b30: 6d 65 6e 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69  ment(str, name[i
1b40: 5d 20 3f 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e  ] ? name[i] : "N
1b50: 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ULL");.    }.  }
1b60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
1b70: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  gc; i++){.    Tc
1b80: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
1b90: 6c 65 6d 65 6e 74 28 73 74 72 2c 20 61 72 67 76  lement(str, argv
1ba0: 5b 69 5d 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20  [i] ? argv[i] : 
1bb0: 22 4e 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72  "NULL");.  }.  r
1bc0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1bd0: 2a 20 54 68 65 20 49 2f 4f 20 74 72 61 63 69 6e  * The I/O tracin
1be0: 67 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  g callback..*/.s
1bf0: 74 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72  tatic FILE *iotr
1c00: 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 73 74  ace_file = 0;.st
1c10: 61 74 69 63 20 76 6f 69 64 20 69 6f 5f 74 72 61  atic void io_tra
1c20: 63 65 5f 63 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  ce_callback(cons
1c30: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1c40: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1c50: 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
1c60: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
1c70: 76 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65  vfprintf(iotrace
1c80: 5f 66 69 6c 65 2c 20 7a 46 6f 72 6d 61 74 2c 20  _file, zFormat, 
1c90: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
1ca0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 69 6f 74 72  );.  fflush(iotr
1cb0: 61 63 65 5f 66 69 6c 65 29 3b 0a 7d 0a 0a 2f 2a  ace_file);.}../*
1cc0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 69 6f 5f 74  .** Usage:  io_t
1cd0: 72 61 63 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a  race FILENAME.**
1ce0: 0a 2a 2a 20 54 75 72 6e 20 49 2f 4f 20 74 72 61  .** Turn I/O tra
1cf0: 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  cing on or off. 
1d00: 20 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20   If FILENAME is 
1d10: 6e 6f 74 20 61 6e 20 65 6d 70 74 79 20 73 74 72  not an empty str
1d20: 69 6e 67 2c 0a 2a 2a 20 49 2f 4f 20 74 72 61 63  ing,.** I/O trac
1d30: 69 6e 67 20 62 65 67 69 6e 73 20 67 6f 69 6e 67  ing begins going
1d40: 20 69 6e 74 6f 20 46 49 4c 45 4e 41 4d 45 2e 20   into FILENAME. 
1d50: 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20 61  If FILENAME is a
1d60: 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72 69 6e  n empty.** strin
1d70: 67 2c 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 69  g, I/O tracing i
1d80: 73 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  s turned off..*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1da0: 5f 69 6f 5f 74 72 61 63 65 28 0a 20 20 76 6f 69  _io_trace(.  voi
1db0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
1dc0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1dd0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
1de0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
1df0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
1e00: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
1e10: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
1e20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1e30: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
1e40: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
1e50: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
1e60: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
1e70: 0a 29 7b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  .){.  if( argc!=
1e80: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1e90: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1ea0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1eb0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1ec0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
1ed0: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
1ee0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1ef0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1f00: 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69    if( iotrace_fi
1f10: 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 6f  le ){.    if( io
1f20: 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f  trace_file!=stdo
1f30: 75 74 20 26 26 20 69 6f 74 72 61 63 65 5f 66 69  ut && iotrace_fi
1f40: 6c 65 21 3d 73 74 64 65 72 72 20 29 7b 0a 20 20  le!=stderr ){.  
1f50: 20 20 20 20 66 63 6c 6f 73 65 28 69 6f 74 72 61      fclose(iotra
1f60: 63 65 5f 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  ce_file);.    }.
1f70: 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65      iotrace_file
1f80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
1f90: 33 5f 69 6f 5f 74 72 61 63 65 20 3d 20 30 3b 0a  3_io_trace = 0;.
1fa0: 20 20 7d 0a 20 20 69 66 28 20 61 72 67 76 5b 31    }.  if( argv[1
1fb0: 5d 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20  ][0] ){.    if( 
1fc0: 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22  strcmp(argv[1],"
1fd0: 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20  stdout")==0 ){. 
1fe0: 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c       iotrace_fil
1ff0: 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20  e = stdout;.    
2000: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
2010: 28 61 72 67 76 5b 31 5d 2c 22 73 74 64 65 72 72  (argv[1],"stderr
2020: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
2030: 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 73 74  otrace_file = st
2040: 64 65 72 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  derr;.    }else{
2050: 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66  .      iotrace_f
2060: 69 6c 65 20 3d 20 66 6f 70 65 6e 28 61 72 67 76  ile = fopen(argv
2070: 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 7d  [1], "w");.    }
2080: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  .    sqlite3_io_
2090: 74 72 61 63 65 20 3d 20 69 6f 5f 74 72 61 63 65  trace = io_trace
20a0: 5f 63 61 6c 6c 62 61 63 6b 3b 0a 20 20 7d 0a 20  _callback;.  }. 
20b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20c0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
20d0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  ge:  sqlite3_exe
20e0: 63 5f 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f  c_printf  DB  FO
20f0: 52 4d 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a  RMAT  STRING.**.
2100: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
2110: 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74  lite3_exec_print
2120: 66 28 29 20 69 6e 74 65 72 66 61 63 65 20 75 73  f() interface us
2130: 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ing the open dat
2140: 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68  abase.** DB.  Th
2150: 65 20 53 51 4c 20 69 73 20 74 68 65 20 73 74 72  e SQL is the str
2160: 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65  ing FORMAT.  The
2170: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73   format string s
2180: 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  hould contain.**
2190: 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20   one %s or %q.  
21a0: 53 54 52 49 4e 47 20 69 73 20 74 68 65 20 76 61  STRING is the va
21b0: 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  lue inserted int
21c0: 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73  o %s or %q..*/.s
21d0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
21e0: 78 65 63 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f  xec_printf(.  vo
21f0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2200: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2210: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2220: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2230: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2240: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2250: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2260: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2270: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2280: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2290: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
22a0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
22b0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
22c0: 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  db;.  Tcl_DStrin
22d0: 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b  g str;.  int rc;
22e0: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
22f0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  0;.  char *zSql;
2300: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
2310: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ;.  if( argc!=4 
2320: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2330: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2340: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2350: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
2360: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
2370: 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e   DB FORMAT STRIN
2380: 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  G", 0);.    retu
2390: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23a0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
23b0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
23c0: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
23d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23e0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
23f0: 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d  (&str);.  zSql =
2400: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2410: 28 61 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b 33  (argv[2], argv[3
2420: 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ]);.  rc = sqlit
2430: 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  e3_exec(db, zSql
2440: 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  , exec_printf_cb
2450: 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a  , &str, &zErr);.
2460: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2470: 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66 28  Sql);.  sprintf(
2480: 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b  zBuf, "%d", rc);
2490: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65  .  Tcl_AppendEle
24a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  ment(interp, zBu
24b0: 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  f);.  Tcl_Append
24c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
24d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
24e0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
24f0: 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a  (&str) : zErr);.
2500: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
2510: 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a  e(&str);.  if( z
2520: 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Err ) sqlite3_fr
2530: 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20  ee(zErr);.  if( 
2540: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
2550: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
2560: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
2570: 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
2580: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2590: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
25a0: 5f 65 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a  _exec  DB  SQL.*
25b0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
25c0: 73 71 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74  sqlite3_exec int
25d0: 65 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65  erface using the
25e0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 44   open database D
25f0: 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  B.*/.static int 
2600: 74 65 73 74 5f 65 78 65 63 28 0a 20 20 76 6f 69  test_exec(.  voi
2610: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
2620: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2630: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2640: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2650: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2660: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
2670: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
2680: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2690: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
26a0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
26b0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
26c0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
26d0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
26e0: 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  b;.  Tcl_DString
26f0: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   str;.  int rc;.
2700: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
2710: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
2720: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68    int i, j;.  ch
2730: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69  ar zBuf[30];.  i
2740: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
2750: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2760: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
2770: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
2780: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
2790: 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 53  , .       " DB S
27a0: 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  QL", 0);.    ret
27b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27c0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
27d0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
27e0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
27f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2800: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
2810: 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20  t(&str);.  zSql 
2820: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2830: 66 28 22 25 73 22 2c 20 61 72 67 76 5b 32 5d 29  f("%s", argv[2])
2840: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a  ;.  for(i=j=0; z
2850: 53 71 6c 5b 69 5d 3b 29 7b 0a 20 20 20 20 69 66  Sql[i];){.    if
2860: 28 20 7a 53 71 6c 5b 69 5d 3d 3d 27 25 27 20 29  ( zSql[i]=='%' )
2870: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  {.      zSql[j++
2880: 5d 20 3d 20 28 74 65 73 74 48 65 78 54 6f 49 6e  ] = (testHexToIn
2890: 74 28 7a 53 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29  t(zSql[i+1])<<4)
28a0: 20 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28   + testHexToInt(
28b0: 7a 53 71 6c 5b 69 2b 32 5d 29 3b 0a 20 20 20 20  zSql[i+2]);.    
28c0: 20 20 69 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65    i += 3;.    }e
28d0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  lse{.      zSql[
28e0: 6a 2b 2b 5d 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d  j++] = zSql[i++]
28f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53  ;.    }.  }.  zS
2900: 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 63 20  ql[j] = 0;.  rc 
2910: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
2920: 62 2c 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72  b, zSql, exec_pr
2930: 69 6e 74 66 5f 63 62 2c 20 26 73 74 72 2c 20 26  intf_cb, &str, &
2940: 7a 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  zErr);.  sqlite3
2950: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73  _free(zSql);.  s
2960: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64  printf(zBuf, "%d
2970: 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70  ", rc);.  Tcl_Ap
2980: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2990: 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c  rp, zBuf);.  Tcl
29a0: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
29b0: 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54  nterp, rc==SQLIT
29c0: 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69  E_OK ? Tcl_DStri
29d0: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20  ngValue(&str) : 
29e0: 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74  zErr);.  Tcl_DSt
29f0: 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a  ringFree(&str);.
2a00: 20 20 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c    if( zErr ) sql
2a10: 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
2a20: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
2a30: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
2a40: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
2a50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a60: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2a70: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
2a80: 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 20  sqlite3_exec_nr 
2a90: 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 49   DB  SQL.**.** I
2aa0: 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65  nvoke the sqlite
2ab0: 33 5f 65 78 65 63 20 69 6e 74 65 72 66 61 63 65  3_exec interface
2ac0: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
2ad0: 64 61 74 61 62 61 73 65 20 44 42 2e 20 20 44 69  database DB.  Di
2ae0: 73 63 61 72 64 0a 2a 2a 20 61 6c 6c 20 72 65 73  scard.** all res
2af0: 75 6c 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ults.*/.static i
2b00: 6e 74 20 74 65 73 74 5f 65 78 65 63 5f 6e 72 28  nt test_exec_nr(
2b10: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
2b20: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2b30: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2b40: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2b50: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2b60: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2b70: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
2b80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2b90: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2ba0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
2bb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
2bc0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
2bd0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
2be0: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
2bf0: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
2c00: 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 63 21  = 0;.  if( argc!
2c10: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
2c20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2c30: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
2c40: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
2c50: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
2c60: 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b    " DB SQL", 0);
2c70: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2c80: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2c90: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2ca0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
2cb0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
2cc0: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
2cd0: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2ce0: 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 26  argv[2], 0, 0, &
2cf0: 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c  zErr);.  if( sql
2d00: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
2d10: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
2d20: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2d30: 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
2d40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
2d50: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
2d60: 72 69 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53 45  rintf_z_test  SE
2d70: 50 41 52 41 54 4f 52 20 20 41 52 47 30 20 20 41  PARATOR  ARG0  A
2d80: 52 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65  RG1 ....**.** Te
2d90: 73 74 20 74 68 65 20 25 7a 20 66 6f 72 6d 61 74  st the %z format
2da0: 20 6f 66 20 73 71 6c 69 74 65 4d 50 72 69 6e 74   of sqliteMPrint
2db0: 66 28 29 2e 20 20 55 73 65 20 6d 75 6c 74 69 70  f().  Use multip
2dc0: 6c 65 20 6d 70 72 69 6e 74 66 28 29 20 63 61 6c  le mprintf() cal
2dd0: 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63 61 74  ls to .** concat
2de0: 65 6e 61 74 65 20 61 72 67 30 20 74 68 72 6f 75  enate arg0 throu
2df0: 67 68 20 61 72 67 6e 20 75 73 69 6e 67 20 73 65  gh argn using se
2e00: 70 61 72 61 74 6f 72 20 61 73 20 74 68 65 20 73  parator as the s
2e10: 65 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52 65 74  eparator..** Ret
2e20: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
2e30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
2e40: 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20  st_mprintf_z(.  
2e50: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
2e60: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2e70: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2e80: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2e90: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2ea0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2eb0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
2ec0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ed0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2ee0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
2ef0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
2f00: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
2f10: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
2f20: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e  Result = 0;.  in
2f30: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b  t i;..  for(i=2;
2f40: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
2f50: 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 73 71 6c     zResult = sql
2f60: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 25  ite3MPrintf("%z%
2f70: 73 25 73 22 2c 20 7a 52 65 73 75 6c 74 2c 20 61  s%s", zResult, a
2f80: 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 69 5d 29  rgv[1], argv[i])
2f90: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65  ;.  }.  Tcl_Appe
2fa0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2fb0: 20 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20   zResult, 0);.  
2fc0: 73 71 6c 69 74 65 46 72 65 65 28 7a 52 65 73 75  sqliteFree(zResu
2fd0: 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  lt);.  return TC
2fe0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2ff0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
3000: 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20 53  printf_n_test  S
3010: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73 74  TRING.**.** Test
3020: 20 74 68 65 20 25 6e 20 66 6f 72 6d 61 74 20 6f   the %n format o
3030: 66 20 73 71 6c 69 74 65 4d 50 72 69 6e 74 66 28  f sqliteMPrintf(
3040: 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6c  ).  Return the l
3050: 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20  ength of the.** 
3060: 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2f  input string..*/
3070: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
3080: 5f 6d 70 72 69 6e 74 66 5f 6e 28 0a 20 20 76 6f  _mprintf_n(.  vo
3090: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
30a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
30b0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
30c0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
30d0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
30e0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
30f0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3100: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3110: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3120: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3130: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3140: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3150: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 74  /.){.  char *zSt
3160: 72 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  r;.  int n = 0;.
3170: 20 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33    zStr = sqlite3
3180: 4d 50 72 69 6e 74 66 28 22 25 73 25 6e 22 2c 20  MPrintf("%s%n", 
3190: 61 72 67 76 5b 31 5d 2c 20 26 6e 29 3b 0a 20 20  argv[1], &n);.  
31a0: 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74 72 29  sqliteFree(zStr)
31b0: 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
31c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
31d0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 29 29 3b 0a  _NewIntObj(n));.
31e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
31f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
3200: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3210: 74 66 5f 69 6e 74 20 20 53 49 5a 45 20 46 4f 52  tf_int  SIZE FOR
3220: 4d 41 54 20 20 49 4e 54 0a 2a 2a 0a 2a 2a 20 54  MAT  INT.**.** T
3230: 65 73 74 20 74 68 65 20 6f 66 20 73 71 6c 69 74  est the of sqlit
3240: 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 20 72 6f  e3_snprintf() ro
3250: 75 74 69 6e 65 2e 20 20 53 49 5a 45 20 69 73 20  utine.  SIZE is 
3260: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
3270: 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
3280: 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 65 20   in bytes.  The 
3290: 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 69 73 20  maximum size is 
32a0: 31 30 30 2e 20 20 46 4f 52 4d 41 54 20 69 73 20  100.  FORMAT is 
32b0: 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74 20 73 74  the.** format st
32c0: 72 69 6e 67 2e 20 20 49 4e 54 20 69 73 20 61 20  ring.  INT is a 
32d0: 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 61  single integer a
32e0: 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f  rgument.  The FO
32f0: 52 4d 41 54 0a 2a 2a 20 73 74 72 69 6e 67 20 6d  RMAT.** string m
3300: 75 73 74 20 72 65 71 75 69 72 65 20 6e 6f 20 6d  ust require no m
3310: 6f 72 65 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  ore than this on
3320: 65 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  e integer argume
3330: 6e 74 2e 20 20 49 66 0a 2a 2a 20 59 6f 75 20 70  nt.  If.** You p
3340: 61 73 73 20 69 6e 20 61 20 66 6f 72 6d 61 74 20  ass in a format 
3350: 73 74 72 69 6e 67 20 74 68 61 74 20 72 65 71 75  string that requ
3360: 69 72 65 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ires more than o
3370: 6e 65 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  ne argument,.** 
3380: 62 61 64 20 74 68 69 6e 67 73 20 77 69 6c 6c 20  bad things will 
3390: 68 61 70 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69  happen..*/.stati
33a0: 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 70 72 69  c int test_snpri
33b0: 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20  ntf_int(.  void 
33c0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
33d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
33e0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
33f0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
3400: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
3410: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
3420: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
3430: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
3440: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
3450: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
3460: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
3470: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
3480: 7b 0a 20 20 63 68 61 72 20 7a 53 74 72 5b 31 30  {.  char zStr[10
3490: 30 5d 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 61 74  0];.  int n = at
34a0: 6f 69 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 63  oi(argv[1]);.  c
34b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
34c0: 61 74 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20  at = argv[2];.  
34d0: 69 6e 74 20 61 31 20 3d 20 61 74 6f 69 28 61 72  int a1 = atoi(ar
34e0: 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 6e 3e  gv[3]);.  if( n>
34f0: 73 69 7a 65 6f 66 28 7a 53 74 72 29 20 29 20 6e  sizeof(zStr) ) n
3500: 20 3d 20 73 69 7a 65 6f 66 28 7a 53 74 72 29 3b   = sizeof(zStr);
3510: 0a 20 20 73 74 72 63 70 79 28 7a 53 74 72 2c 20  .  strcpy(zStr, 
3520: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
3530: 70 71 72 73 74 75 76 77 78 79 7a 22 29 3b 0a 20  pqrstuvwxyz");. 
3540: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3550: 66 28 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d  f(n, zStr, zForm
3560: 61 74 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41  at, a1);.  Tcl_A
3570: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3580: 72 70 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20  rp, zStr, 0);.  
3590: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
35a0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
35b0: 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c  sqlite3_get_tabl
35c0: 65 5f 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f  e_printf  DB  FO
35d0: 52 4d 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a  RMAT  STRING.**.
35e0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
35f0: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
3600: 70 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61  printf() interfa
3610: 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65  ce using the ope
3620: 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42  n database.** DB
3630: 2e 20 20 54 68 65 20 53 51 4c 20 69 73 20 74 68  .  The SQL is th
3640: 65 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e  e string FORMAT.
3650: 20 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72    The format str
3660: 69 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61  ing should conta
3670: 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20  in.** one %s or 
3680: 25 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74  %q.  STRING is t
3690: 68 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65  he value inserte
36a0: 64 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e  d into %s or %q.
36b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
36c0: 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  est_get_table_pr
36d0: 69 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  intf(.  void *No
36e0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
36f0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
3700: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
3710: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
3720: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
3730: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3750: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
3760: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
3770: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
3780: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
3790: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
37a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
37b0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
37c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
37d0: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69  r *zErr = 0;.  i
37e0: 6e 74 20 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a 20  nt nRow, nCol;. 
37f0: 20 63 68 61 72 20 2a 2a 61 52 65 73 75 6c 74 3b   char **aResult;
3800: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
3810: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 63 68 61   zBuf[30];.  cha
3820: 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 66 28 20 61  r *zSql;.  if( a
3830: 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  rgc!=4 ){.    Tc
3840: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3850: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3860: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3870: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
3880: 20 20 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41        " DB FORMA
3890: 54 20 53 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20  T STRING", 0);. 
38a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
38b0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
38c0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
38d0: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
38e0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
38f0: 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72  RROR;.  Tcl_DStr
3900: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
3910: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
3920: 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c  mprintf(argv[2],
3930: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d  argv[3]);.  rc =
3940: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62   sqlite3_get_tab
3950: 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52  le(db, zSql, &aR
3960: 65 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e  esult, &nRow, &n
3970: 43 6f 6c 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73  Col, &zErr);.  s
3980: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
3990: 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  );.  sprintf(zBu
39a0: 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20  f, "%d", rc);.  
39b0: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
39c0: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b  t(interp, zBuf);
39d0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
39e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 70 72 69  E_OK ){.    spri
39f0: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
3a00: 6e 52 6f 77 29 3b 0a 20 20 20 20 54 63 6c 5f 41  nRow);.    Tcl_A
3a10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3a20: 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  erp, zBuf);.    
3a30: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
3a40: 64 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 54  d", nCol);.    T
3a50: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
3a60: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
3a70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
3a80: 6e 52 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 20 69 2b  nRow+1)*nCol; i+
3a90: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  +){.      Tcl_Ap
3aa0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3ab0: 72 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f  rp, aResult[i] ?
3ac0: 20 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e   aResult[i] : "N
3ad0: 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ULL");.    }.  }
3ae0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70  else{.    Tcl_Ap
3af0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3b00: 72 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  rp, zErr);.  }. 
3b10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61   sqlite3_free_ta
3b20: 62 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20  ble(aResult);.  
3b30: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
3b40: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
3b50: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
3b60: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
3b70: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
3b80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
3b90: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
3ba0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3bb0: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
3bc0: 72 74 5f 72 6f 77 69 64 20 44 42 0a 2a 2a 0a 2a  rt_rowid DB.**.*
3bd0: 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 69 6e  * Returns the in
3be0: 74 65 67 65 72 20 52 4f 57 49 44 20 6f 66 20 74  teger ROWID of t
3bf0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
3c00: 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  nsert..*/.static
3c10: 20 69 6e 74 20 74 65 73 74 5f 6c 61 73 74 5f 72   int test_last_r
3c20: 6f 77 69 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  owid(.  void *No
3c30: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
3c40: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
3c50: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
3c60: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
3c70: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
3c80: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ca0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
3cb0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
3cc0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
3cd0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
3ce0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
3cf0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
3d00: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a  char zBuf[30];..
3d10: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
3d20: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
3d30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
3d40: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
3d50: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
3d60: 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c 20 30 29  [0], " DB\"", 0)
3d70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3d80: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3d90: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
3da0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
3db0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
3dc0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70 72 69 6e  L_ERROR;.  sprin
3dd0: 74 66 28 7a 42 75 66 2c 20 22 25 6c 6c 64 22 2c  tf(zBuf, "%lld",
3de0: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
3df0: 73 65 72 74 5f 72 6f 77 69 64 28 64 62 29 29 3b  sert_rowid(db));
3e00: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
3e10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
3e20: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 0);.  return S
3e30: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
3e40: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
3e50: 65 33 5f 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a  e3_key DB KEY.**
3e60: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65  .** Set the code
3e70: 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  c key..*/.static
3e80: 20 69 6e 74 20 74 65 73 74 5f 6b 65 79 28 0a 20   int test_key(. 
3e90: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
3ea0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3eb0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
3ec0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
3ed0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
3ee0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
3ef0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
3f00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3f10: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
3f20: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
3f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
3f40: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
3f50: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
3f60: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
3f70: 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74  har *zKey;.  int
3f80: 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61 72 67   nKey;.  if( arg
3f90: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
3fa0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
3fb0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
3fc0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
3fd0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
3fe0: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
3ff0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
4000: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4010: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
4020: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
4030: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
4040: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
4050: 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20  Key = argv[2];. 
4060: 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a   nKey = strlen(z
4070: 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Key);.#ifdef SQL
4080: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
4090: 73 71 6c 69 74 65 33 5f 6b 65 79 28 64 62 2c 20  sqlite3_key(db, 
40a0: 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e  zKey, nKey);.#en
40b0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
40c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
40d0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65  age:  sqlite3_re
40e0: 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a  key DB KEY.**.**
40f0: 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 64 65   Change the code
4100: 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  c key..*/.static
4110: 20 69 6e 74 20 74 65 73 74 5f 72 65 6b 65 79 28   int test_rekey(
4120: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
4130: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
4140: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
4150: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
4160: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
4170: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
4180: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
4190: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
41a0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
41b0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
41c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
41d0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
41e0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
41f0: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
4200: 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69   char *zKey;.  i
4210: 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61  nt nKey;.  if( a
4220: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
4230: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4240: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
4250: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
4260: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
4270: 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c       " FILENAME\
4280: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
4290: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
42a0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
42b0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
42c0: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
42d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
42e0: 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b   zKey = argv[2];
42f0: 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e  .  nKey = strlen
4300: 28 7a 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53  (zKey);.#ifdef S
4310: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
4320: 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28    sqlite3_rekey(
4330: 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b  db, zKey, nKey);
4340: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
4350: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
4360: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
4370: 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a 0a 2a 2a  3_close DB.**.**
4380: 20 43 6c 6f 73 65 73 20 74 68 65 20 64 61 74 61   Closes the data
4390: 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 73  base opened by s
43a0: 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a  qlite3_open..*/.
43b0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
43c0: 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28 0a 20 20  e_test_close(.  
43d0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
43e0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
43f0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
4400: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
4410: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
4420: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
4430: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
4440: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4450: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
4460: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
4470: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
4480: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
4490: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
44a0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
44b0: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
44c0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
44d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
44e0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
44f0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
4500: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49  [0],.       " FI
4510: 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20  LENAME\"", 0);. 
4520: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
4530: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
4540: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
4550: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
4560: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4570: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
4580: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
4590: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
45a0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
45b0: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
45c0: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
45d0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
45e0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
45f0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f  tation of the x_
4600: 63 6f 61 6c 65 73 63 65 28 29 20 66 75 6e 63 74  coalesce() funct
4610: 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ion..** Return t
4620: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
4630: 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d  t non-NULL argum
4640: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
4650: 6f 69 64 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e  oid t1_ifnullFun
4660: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
4670: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
4680: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
4690: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
46a0: 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  v.){.  int i;.  
46b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
46c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
46d0: 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69  QLITE_NULL!=sqli
46e0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
46f0: 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  rgv[i]) ){.     
4700: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
4710: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
4720: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c  v[i]);.      sql
4730: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
4740: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a  (context, (char*
4750: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
4760: 65 78 74 28 61 72 67 76 5b 69 5d 29 2c 0a 20 20  ext(argv[i]),.  
4770: 20 20 20 20 20 20 20 20 6e 2c 20 53 51 4c 49 54          n, SQLIT
4780: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
4790: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
47a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
47b0: 65 73 65 20 61 72 65 20 74 65 73 74 20 66 75 6e  ese are test fun
47c0: 63 74 69 6f 6e 73 2e 20 20 20 20 68 65 78 38 28  ctions.    hex8(
47d0: 29 20 69 6e 74 65 72 70 72 65 74 73 20 69 74 73  ) interprets its
47e0: 20 61 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20   argument as.** 
47f0: 55 54 46 38 20 61 6e 64 20 72 65 74 75 72 6e 73  UTF8 and returns
4800: 20 61 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e   a hex encoding.
4810: 20 20 68 65 78 31 36 6c 65 28 29 20 69 6e 74 65    hex16le() inte
4820: 72 70 72 65 74 73 20 69 74 73 20 61 72 67 75 6d  rprets its argum
4830: 65 6e 74 0a 2a 2a 20 61 73 20 55 54 46 31 36 6c  ent.** as UTF16l
4840: 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  e and returns a 
4850: 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f  hex encoding..*/
4860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 78  .static void hex
4870: 38 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  8Func(sqlite3_co
4880: 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72  ntext *p, int ar
4890: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
48a0: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e  e **argv){.  con
48b0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
48c0: 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *z;.  int i;.  
48d0: 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a  char zBuf[200];.
48e0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
48f0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
4900: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
4910: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 32 20 2d  sizeof(zBuf)/2 -
4920: 20 32 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29   2 && z[i]; i++)
4930: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a  {.    sprintf(&z
4940: 42 75 66 5b 69 2a 32 5d 2c 20 22 25 30 32 78 22  Buf[i*2], "%02x"
4950: 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20  , z[i]&0xff);.  
4960: 7d 0a 20 20 7a 42 75 66 5b 69 2a 32 5d 20 3d 20  }.  zBuf[i*2] = 
4970: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  0;.  sqlite3_res
4980: 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68 61  ult_text(p, (cha
4990: 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c  r*)zBuf, -1, SQL
49a0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
49b0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
49c0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74 61 74  _OMIT_UTF16.stat
49d0: 69 63 20 76 6f 69 64 20 68 65 78 31 36 46 75 6e  ic void hex16Fun
49e0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
49f0: 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63 2c 20  t *p, int argc, 
4a00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4a10: 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75  argv){.  const u
4a20: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e  nsigned short in
4a30: 74 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  t *z;.  int i;. 
4a40: 20 63 68 61 72 20 7a 42 75 66 5b 34 30 30 5d 3b   char zBuf[400];
4a50: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  z = sqlite3_v
4a60: 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76  alue_text16(argv
4a70: 5b 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [0]);.  for(i=0;
4a80: 20 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f   i<sizeof(zBuf)/
4a90: 34 20 2d 20 34 20 26 26 20 7a 5b 69 5d 3b 20 69  4 - 4 && z[i]; i
4aa0: 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  ++){.    sprintf
4ab0: 28 26 7a 42 75 66 5b 69 2a 34 5d 2c 20 22 25 30  (&zBuf[i*4], "%0
4ac0: 34 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b  4x", z[i]&0xff);
4ad0: 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 34 5d  .  }.  zBuf[i*4]
4ae0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
4af0: 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28  result_text(p, (
4b00: 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20  char*)zBuf, -1, 
4b10: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
4b20: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
4b30: 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 69  ** A structure i
4b40: 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 61 63 63  nto which to acc
4b50: 75 6d 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f  umulate text..*/
4b60: 0a 73 74 72 75 63 74 20 64 73 74 72 20 7b 0a 20  .struct dstr {. 
4b70: 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a   int nAlloc;  /*
4b80: 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   Space allocated
4b90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b   */.  int nUsed;
4ba0: 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64     /* Space used
4bb0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
4bc0: 20 20 20 2f 2a 20 54 68 65 20 73 70 61 63 65 20     /* The space 
4bd0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  */.};../*.** App
4be0: 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20 64 73  end text to a ds
4bf0: 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  tr.*/.static voi
4c00: 64 20 64 73 74 72 41 70 70 65 6e 64 28 73 74 72  d dstrAppend(str
4c10: 75 63 74 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e  uct dstr *p, con
4c20: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
4c30: 64 69 76 69 64 65 72 29 7b 0a 20 20 69 6e 74 20  divider){.  int 
4c40: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  n = strlen(z);. 
4c50: 20 69 66 28 20 70 2d 3e 6e 55 73 65 64 20 2b 20   if( p->nUsed + 
4c60: 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f  n + 2 > p->nAllo
4c70: 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  c ){.    char *z
4c80: 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c  New;.    p->nAll
4c90: 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32  oc = p->nAlloc*2
4ca0: 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20 20 20 20   + n + 200;.    
4cb0: 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  zNew = sqliteRea
4cc0: 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41  lloc(p->z, p->nA
4cd0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a  lloc);.    if( z
4ce0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
4cf0: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 29  sqliteFree(p->z)
4d00: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
4d10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
4d20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
4d30: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d      }.    p->z =
4d40: 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28   zNew;.  }.  if(
4d50: 20 64 69 76 69 64 65 72 20 26 26 20 70 2d 3e 6e   divider && p->n
4d60: 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20 70 2d  Used>0 ){.    p-
4d70: 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d  >z[p->nUsed++] =
4d80: 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a 20 20   divider;.  }.  
4d90: 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e  memcpy(&p->z[p->
4da0: 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31 29 3b  nUsed], z, n+1);
4db0: 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e  .  p->nUsed += n
4dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
4dd0: 65 64 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  ed for each call
4de0: 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74 65  back from sqlite
4df0: 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73 74 61  3ExecFunc.*/.sta
4e00: 74 69 63 20 69 6e 74 20 65 78 65 63 46 75 6e 63  tic int execFunc
4e10: 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
4e20: 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20  Data, int argc, 
4e30: 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61  char **argv, cha
4e40: 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  r **NotUsed){.  
4e50: 73 74 72 75 63 74 20 64 73 74 72 20 2a 70 20 3d  struct dstr *p =
4e60: 20 28 73 74 72 75 63 74 20 64 73 74 72 2a 29 70   (struct dstr*)p
4e70: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Data;.  int i;. 
4e80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
4e90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
4ea0: 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  argv[i]==0 ){.  
4eb0: 20 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70      dstrAppend(p
4ec0: 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29 3b 0a  , "NULL", ' ');.
4ed0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4ee0: 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20 61   dstrAppend(p, a
4ef0: 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a 20 20  rgv[i], ' ');.  
4f00: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4f10: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70   0;.}../*.** Imp
4f20: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
4f30: 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  he x_sqlite_exec
4f40: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  () function.  Th
4f50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65  is function take
4f60: 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61 72  s.** a single ar
4f70: 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74 65 6d  gument and attem
4f80: 70 74 73 20 74 6f 20 65 78 65 63 75 74 65 20 74  pts to execute t
4f90: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20  hat argument as 
4fa0: 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 69  SQL code..** Thi
4fb0: 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 6e 64  s is illegal and
4fc0: 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68 65 20   should set the 
4fd0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 66 6c  SQLITE_MISUSE fl
4fe0: 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ag on the databa
4ff0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  se..**.** 2004-J
5000: 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76 65 20  an-07:  We have 
5010: 63 68 61 6e 67 65 64 20 74 68 69 73 20 74 6f 20  changed this to 
5020: 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20 74 6f  make it legal to
5030: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 78   call sqlite3_ex
5040: 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77 69 74  ec().** from wit
5050: 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  hin a function c
5060: 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68  all.  .** .** Th
5070: 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d 75 6c  is routine simul
5080: 61 74 65 73 20 74 68 65 20 65 66 66 65 63 74 20  ates the effect 
5090: 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20 74 68  of having two th
50a0: 72 65 61 64 73 20 61 74 74 65 6d 70 74 20 74 6f  reads attempt to
50b0: 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61 6d 65  .** use the same
50c0: 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
50d0: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73   same time..*/.s
50e0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
50f0: 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20 73 71  e3ExecFunc(.  sq
5100: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5110: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
5120: 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33  rgc,  .  sqlite3
5130: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
5140: 0a 20 20 73 74 72 75 63 74 20 64 73 74 72 20 78  .  struct dstr x
5150: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30  ;.  memset(&x, 0
5160: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
5170: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
5180: 65 63 28 28 73 71 6c 69 74 65 33 2a 29 73 71 6c  ec((sqlite3*)sql
5190: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
51a0: 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20 20 28  ontext),.      (
51b0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
51c0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
51d0: 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46 75 6e  ),.      execFun
51e0: 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20 30  cCallback, &x, 0
51f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
5200: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
5210: 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c 20  , x.z, x.nUsed, 
5220: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
5230: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
5240: 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  x.z);.}../*.** I
5250: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
5260: 20 74 6b 74 32 32 31 33 66 75 6e 63 28 29 2c 20   tkt2213func(), 
5270: 61 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  a scalar functio
5280: 6e 20 74 68 61 74 20 74 61 6b 65 73 20 65 78 61  n that takes exa
5290: 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20 61 72 67 75  ctly.** one argu
52a0: 6d 65 6e 74 2e 20 49 74 20 68 61 73 20 74 77 6f  ment. It has two
52b0: 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 65 61   interesting fea
52c0: 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49  tures:.**.** * I
52d0: 74 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f  t calls sqlite3_
52e0: 76 61 6c 75 65 5f 74 65 78 74 28 29 20 33 20 74  value_text() 3 t
52f0: 69 6d 65 73 20 6f 6e 20 74 68 65 20 61 72 67 75  imes on the argu
5300: 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c  ment sqlite3_val
5310: 75 65 2a 2e 0a 2a 2a 20 20 20 49 66 20 74 68 65  ue*..**   If the
5320: 20 74 68 72 65 65 20 70 6f 69 6e 74 65 72 73 20   three pointers 
5330: 72 65 74 75 72 6e 65 64 20 61 72 65 20 6e 6f 74  returned are not
5340: 20 74 68 65 20 73 61 6d 65 20 61 6e 20 53 51 4c   the same an SQL
5350: 20 65 72 72 6f 72 20 69 73 20 72 61 69 73 65 64   error is raised
5360: 2e 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74 68 65 72 77  ..**.** * Otherw
5370: 69 73 65 20 69 74 20 72 65 74 75 72 6e 73 20 61  ise it returns a
5380: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74 65 78   copy of the tex
5390: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
53a0: 20 6f 66 20 69 74 27 73 20 0a 2a 2a 20 20 20 61   of it's .**   a
53b0: 72 67 75 6d 65 6e 74 20 69 6e 20 73 75 63 68 20  rgument in such 
53c0: 61 20 77 61 79 20 61 73 20 74 68 65 20 56 44 42  a way as the VDB
53d0: 45 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  E representation
53e0: 20 69 73 20 61 20 4d 65 6d 2a 20 63 65 6c 6c 20   is a Mem* cell 
53f0: 0a 2a 2a 20 20 20 77 69 74 68 20 74 68 65 20 4d  .**   with the M
5400: 45 4d 5f 54 65 72 6d 20 66 6c 61 67 20 63 6c 65  EM_Term flag cle
5410: 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65  ar. .**.** Ticke
5420: 74 20 23 32 32 31 33 20 63 61 6e 20 74 68 65 72  t #2213 can ther
5430: 65 66 6f 72 65 20 62 65 20 74 65 73 74 65 64 20  efore be tested 
5440: 62 79 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  by evaluating th
5450: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 53  e following.** S
5460: 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 3a 0a 2a  QL expression:.*
5470: 2a 0a 2a 2a 20 20 20 74 6b 74 32 32 31 33 66 75  *.**   tkt2213fu
5480: 6e 63 28 74 6b 74 32 32 31 33 66 75 6e 63 28 27  nc(tkt2213func('
5490: 61 20 73 74 72 69 6e 67 27 29 29 3b 0a 2a 2f 0a  a string'));.*/.
54a0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 6b 74 32  static void tkt2
54b0: 32 31 33 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  213Function(.  s
54c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
54d0: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
54e0: 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65  argc,  .  sqlite
54f0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5500: 7b 0a 20 20 69 6e 74 20 6e 54 65 78 74 3b 0a 20  {.  int nText;. 
5510: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
5520: 6f 6e 73 74 20 2a 7a 54 65 78 74 31 3b 0a 20 20  onst *zText1;.  
5530: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f  unsigned char co
5540: 6e 73 74 20 2a 7a 54 65 78 74 32 3b 0a 20 20 75  nst *zText2;.  u
5550: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e  nsigned char con
5560: 73 74 20 2a 7a 54 65 78 74 33 3b 0a 0a 20 20 6e  st *zText3;..  n
5570: 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 76  Text = sqlite3_v
5580: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
5590: 30 5d 29 3b 0a 20 20 7a 54 65 78 74 31 20 3d 20  0]);.  zText1 = 
55a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
55b0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  xt(argv[0]);.  z
55c0: 54 65 78 74 32 20 3d 20 73 71 6c 69 74 65 33 5f  Text2 = sqlite3_
55d0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
55e0: 30 5d 29 3b 0a 20 20 7a 54 65 78 74 33 20 3d 20  0]);.  zText3 = 
55f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
5600: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20  xt(argv[0]);..  
5610: 69 66 28 20 7a 54 65 78 74 31 21 3d 7a 54 65 78  if( zText1!=zTex
5620: 74 32 20 7c 7c 20 7a 54 65 78 74 32 21 3d 7a 54  t2 || zText2!=zT
5630: 65 78 74 33 20 29 7b 0a 20 20 20 20 73 71 6c 69  ext3 ){.    sqli
5640: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5650: 28 63 6f 6e 74 65 78 74 2c 20 22 74 6b 74 32 32  (context, "tkt22
5660: 31 33 20 69 73 20 6e 6f 74 20 66 69 78 65 64 22  13 is not fixed"
5670: 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , -1);.  }else{.
5680: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20      char *zCopy 
5690: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
56a0: 33 5f 6d 61 6c 6c 6f 63 28 6e 54 65 78 74 29 3b  3_malloc(nText);
56b0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70  .    memcpy(zCop
56c0: 79 2c 20 7a 54 65 78 74 31 2c 20 6e 54 65 78 74  y, zText1, nText
56d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
56e0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
56f0: 78 74 2c 20 7a 43 6f 70 79 2c 20 6e 54 65 78 74  xt, zCopy, nText
5700: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
5710: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
5720: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20  e following SQL 
5730: 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 34  function takes 4
5740: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65   arguments.  The
5750: 20 32 6e 64 20 61 6e 64 0a 2a 2a 20 34 74 68 20   2nd and.** 4th 
5760: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
5770: 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74   one of these st
5780: 72 69 6e 67 73 3a 20 20 27 74 65 78 74 27 2c 20  rings:  'text', 
5790: 27 74 65 78 74 31 36 27 2c 0a 2a 2a 20 6f 72 20  'text16',.** or 
57a0: 27 62 6c 6f 62 27 20 63 6f 72 72 65 73 70 6f 6e  'blob' correspon
57b0: 64 69 6e 67 20 74 6f 20 41 50 49 20 66 75 6e 63  ding to API func
57c0: 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tions.**.**     
57d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
57e0: 65 78 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ext().**      sq
57f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5800: 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  16().**      sql
5810: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
5820: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72  ).**.** The thir
5830: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
5840: 73 74 72 69 6e 67 2c 20 65 69 74 68 65 72 20 27  string, either '
5850: 62 79 74 65 73 27 20 6f 72 20 27 62 79 74 65 73  bytes' or 'bytes
5860: 31 36 27 20 6f 72 20 27 6e 6f 6f 70 27 2c 0a 2a  16' or 'noop',.*
5870: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
5880: 74 6f 20 41 50 49 73 3a 0a 2a 2a 0a 2a 2a 20 20  to APIs:.**.**  
5890: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
58a0: 65 5f 62 79 74 65 73 28 29 0a 2a 2a 20 20 20 20  e_bytes().**    
58b0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
58c0: 62 79 74 65 73 31 36 28 29 0a 2a 2a 20 20 20 20  bytes16().**    
58d0: 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20 54 68 65    noop.**.** The
58e0: 20 41 50 49 73 20 64 65 73 69 67 6e 61 74 65 64   APIs designated
58f0: 20 62 79 20 74 68 65 20 32 6e 64 20 74 68 72 6f   by the 2nd thro
5900: 75 67 68 20 34 74 68 20 61 72 67 75 6d 65 6e 74  ugh 4th argument
5910: 73 20 61 72 65 20 61 70 70 6c 69 65 64 0a 2a 2a  s are applied.**
5920: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 61 72   to the first ar
5930: 67 75 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 2e  gument in order.
5940: 20 20 49 66 20 74 68 65 20 70 6f 69 6e 74 65 72    If the pointer
5950: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
5960: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 6e 64 20  e.** second and 
5970: 66 6f 75 72 74 68 20 61 72 65 20 64 69 66 66 65  fourth are diffe
5980: 72 65 6e 74 2c 20 74 68 69 73 20 72 6f 75 74 69  rent, this routi
5990: 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 20 20 4f  ne returns 1.  O
59a0: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68 69  therwise,.** thi
59b0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
59c0: 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  s 0..**.** This 
59d0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
59e0: 20 74 6f 20 74 65 73 74 20 74 6f 20 73 65 65 20   to test to see 
59f0: 77 68 65 6e 20 72 65 74 75 72 6e 65 64 20 70 6f  when returned po
5a00: 69 6e 74 65 72 73 20 66 72 6f 6d 0a 2a 2a 20 74  inters from.** t
5a10: 68 65 20 5f 74 65 78 74 28 29 2c 20 5f 74 65 78  he _text(), _tex
5a20: 74 31 36 28 29 20 61 6e 64 20 5f 62 6c 6f 62 28  t16() and _blob(
5a30: 29 20 41 50 49 73 20 62 65 63 6f 6d 65 20 69 6e  ) APIs become in
5a40: 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74  validated..*/.st
5a50: 61 74 69 63 20 76 6f 69 64 20 70 74 72 43 68 6e  atic void ptrChn
5a60: 67 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  gFunction(.  sql
5a70: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
5a80: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72  ntext, .  int ar
5a90: 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f  gc,  .  sqlite3_
5aa0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
5ab0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31    const void *p1
5ac0: 2c 20 2a 70 32 3b 0a 20 20 63 6f 6e 73 74 20 63  , *p2;.  const c
5ad0: 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 66 28  har *zCmd;.  if(
5ae0: 20 61 72 67 63 21 3d 34 20 29 20 72 65 74 75 72   argc!=4 ) retur
5af0: 6e 3b 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e  n;.  zCmd = (con
5b00: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
5b10: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
5b20: 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64  [1]);.  if( zCmd
5b30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5b40: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
5b50: 22 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "text")==0 ){.  
5b60: 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f    p1 = (const vo
5b70: 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  id*)sqlite3_valu
5b80: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5b90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5ba0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c  OMIT_UTF16.  }el
5bb0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  se if( strcmp(zC
5bc0: 6d 64 2c 20 22 74 65 78 74 31 36 22 29 3d 3d 30  md, "text16")==0
5bd0: 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f   ){.    p1 = (co
5be0: 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65  nst void*)sqlite
5bf0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61  3_value_text16(a
5c00: 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a  rgv[0]);.#endif.
5c10: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
5c20: 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29  mp(zCmd, "blob")
5c30: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20  ==0 ){.    p1 = 
5c40: 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c  (const void*)sql
5c50: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
5c60: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73  argv[0]);.  }els
5c70: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  e{.    return;. 
5c80: 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e   }.  zCmd = (con
5c90: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
5ca0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
5cb0: 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64  [2]);.  if( zCmd
5cc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5cd0: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
5ce0: 22 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20  "bytes")==0 ){. 
5cf0: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
5d00: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
5d10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5d20: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c  OMIT_UTF16.  }el
5d30: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  se if( strcmp(zC
5d40: 6d 64 2c 20 22 62 79 74 65 73 31 36 22 29 3d 3d  md, "bytes16")==
5d50: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5d60: 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28 61  _value_bytes16(a
5d70: 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a  rgv[0]);.#endif.
5d80: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
5d90: 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f 6f 70 22 29  mp(zCmd, "noop")
5da0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f  ==0 ){.    /* do
5db0: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65   nothing */.  }e
5dc0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  lse{.    return;
5dd0: 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63  .  }.  zCmd = (c
5de0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
5df0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5e00: 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a 43  gv[3]);.  if( zC
5e10: 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  md==0 ) return;.
5e20: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d    if( strcmp(zCm
5e30: 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a  d,"text")==0 ){.
5e40: 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20      p2 = (const 
5e50: 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61  void*)sqlite3_va
5e60: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
5e70: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
5e80: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d  E_OMIT_UTF16.  }
5e90: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
5ea0: 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29 3d  zCmd, "text16")=
5eb0: 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28  =0 ){.    p2 = (
5ec0: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
5ed0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
5ee0: 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69  (argv[0]);.#endi
5ef0: 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  f.  }else if( st
5f00: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62  rcmp(zCmd, "blob
5f10: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20  ")==0 ){.    p2 
5f20: 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73  = (const void*)s
5f30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
5f40: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65  b(argv[0]);.  }e
5f50: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  lse{.    return;
5f60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
5f70: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
5f80: 74 2c 20 70 31 21 3d 70 32 29 3b 0a 7d 0a 0a 0a  t, p1!=p2);.}...
5f90: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
5fa0: 6c 69 74 65 5f 74 65 73 74 5f 63 72 65 61 74 65  lite_test_create
5fb0: 5f 66 75 6e 63 74 69 6f 6e 20 44 42 0a 2a 2a 0a  _function DB.**.
5fc0: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69  ** Call the sqli
5fd0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
5fe0: 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65 20 67  ion API on the g
5ff0: 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 69 6e  iven database in
6000: 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65   order.** to cre
6010: 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e  ate a function n
6020: 61 6d 65 64 20 22 78 5f 63 6f 61 6c 65 73 63 65  amed "x_coalesce
6030: 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ".  This functio
6040: 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  n does the same 
6050: 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20  thing.** as the 
6060: 22 63 6f 61 6c 65 73 63 65 22 20 66 75 6e 63 74  "coalesce" funct
6070: 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ion.  This funct
6080: 69 6f 6e 20 61 6c 73 6f 20 72 65 67 69 73 74 65  ion also registe
6090: 72 73 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69  rs an SQL functi
60a0: 6f 6e 0a 2a 2a 20 6e 61 6d 65 64 20 22 78 5f 73  on.** named "x_s
60b0: 71 6c 69 74 65 5f 65 78 65 63 22 20 74 68 61 74  qlite_exec" that
60c0: 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33   invokes sqlite3
60d0: 5f 65 78 65 63 28 29 2e 20 20 49 6e 76 6f 6b 69  _exec().  Invoki
60e0: 6e 67 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  ng sqlite3_exec(
60f0: 29 0a 2a 2a 20 69 6e 20 74 68 69 73 20 77 61 79  ).** in this way
6100: 20 69 73 20 69 6c 6c 65 67 61 6c 20 72 65 63 75   is illegal recu
6110: 72 73 69 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64  rsion and should
6120: 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45   raise an SQLITE
6130: 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 2e 0a 2a  _MISUSE error..*
6140: 2a 20 54 68 65 20 65 66 66 65 63 74 20 69 73 20  * The effect is 
6150: 73 69 6d 69 6c 61 72 20 74 6f 20 74 72 79 69 6e  similar to tryin
6160: 67 20 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d  g to use the sam
6170: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
6180: 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77  ction from.** tw
6190: 6f 20 74 68 72 65 61 64 73 20 61 74 20 74 68 65  o threads at the
61a0: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
61b0: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d  * The original m
61c0: 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68  otivation for th
61d0: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74  is routine was t
61e0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c  o be able to cal
61f0: 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  l the.** sqlite3
6200: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
6210: 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
6220: 61 20 71 75 65 72 79 20 69 73 20 69 6e 20 70 72  a query is in pr
6230: 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a  ogress in order.
6240: 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 53  ** to test the S
6250: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74  QLITE_MISUSE det
6260: 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f  ection logic..*/
6270: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
6280: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
6290: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
62a0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
62b0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
62c0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
62d0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
62e0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
62f0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
6300: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6310: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
6320: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
6330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6340: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
6350: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
6360: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
6370: 64 62 3b 0a 20 20 65 78 74 65 72 6e 20 76 6f 69  db;.  extern voi
6380: 64 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73  d Md5_Register(s
6390: 71 6c 69 74 65 33 2a 29 3b 0a 0a 20 20 69 66 28  qlite3*);..  if(
63a0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
63b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
63c0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
63d0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
63e0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
63f0: 20 20 20 20 20 20 20 22 20 44 42 5c 22 22 2c 20         " DB\"", 
6400: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
6410: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
6420: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
6430: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
6440: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
6450: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
6460: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
6470: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78  _function(db, "x
6480: 5f 63 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20  _coalesce", -1, 
6490: 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a  SQLITE_ANY, 0, .
64a0: 20 20 20 20 20 20 20 20 74 31 5f 69 66 6e 75 6c          t1_ifnul
64b0: 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  lFunc, 0, 0);.  
64c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
64d0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
64e0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
64f0: 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 38 22  ction(db, "hex8"
6500: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 1, SQLITE_ANY,
6510: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 68   0, .          h
6520: 65 78 38 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  ex8Func, 0, 0);.
6530: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
6540: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
6550: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6560: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
6570: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6580: 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 31 36  ction(db, "hex16
6590: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59  ", 1, SQLITE_ANY
65a0: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
65b0: 68 65 78 31 36 46 75 6e 63 2c 20 30 2c 20 30 29  hex16Func, 0, 0)
65c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
65d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
65e0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
65f0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6600: 74 69 6f 6e 28 64 62 2c 20 22 74 6b 74 32 32 31  tion(db, "tkt221
6610: 33 66 75 6e 63 22 2c 20 31 2c 20 53 51 4c 49 54  3func", 1, SQLIT
6620: 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20  E_ANY, 0, .     
6630: 20 20 20 20 20 74 6b 74 32 32 31 33 46 75 6e 63       tkt2213Func
6640: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  tion, 0, 0);.  }
6650: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6660: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
6670: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
6680: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 70 6f  function(db, "po
6690: 69 6e 74 65 72 5f 63 68 61 6e 67 65 22 2c 20 34  inter_change", 4
66a0: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
66b0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 43   .          ptrC
66c0: 68 6e 67 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  hngFunction, 0, 
66d0: 30 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  0);.  }..#ifndef
66e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
66f0: 31 36 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20  16.  /* Use the 
6700: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
6710: 75 6e 63 74 69 6f 6e 31 36 28 29 20 41 50 49 20  unction16() API 
6720: 68 65 72 65 2e 20 4d 61 69 6e 6c 79 20 66 6f 72  here. Mainly for
6730: 20 66 75 6e 2c 20 62 75 74 20 61 6c 73 6f 20 0a   fun, but also .
6740: 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20    ** because it 
6750: 69 73 20 6e 6f 74 20 74 65 73 74 65 64 20 61 6e  is not tested an
6760: 79 77 68 65 72 65 20 65 6c 73 65 2e 20 2a 2f 0a  ywhere else. */.
6770: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6780: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
6790: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
67a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45  #ifdef SQLITE_ME
67b0: 4d 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 73  MDEBUG.    if( s
67c0: 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
67d0: 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  il>0 ){.      sq
67e0: 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
67f0: 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  l++;.    }.#endi
6800: 66 20 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71  f .    pVal = sq
6810: 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b  lite3ValueNew();
6820: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
6830: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
6840: 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  , "x_sqlite_exec
6850: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
6860: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
6870: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6880: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
6890: 31 36 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  16(db, .        
68a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
68b0: 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
68c0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
68d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
68e0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c  1, SQLITE_UTF16,
68f0: 20 64 62 2c 20 73 71 6c 69 74 65 33 45 78 65 63   db, sqlite3Exec
6900: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Func, 0, 0);.   
6910: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
6920: 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 23 65 6e  e(pVal);.  }.#en
6930: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
6940: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
6950: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
6960: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6970: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
6980: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
6990: 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
69a0: 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
69b0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
69c0: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70   Routines to imp
69d0: 6c 65 6d 65 6e 74 20 74 68 65 20 78 5f 63 6f 75  lement the x_cou
69e0: 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66  nt() aggregate f
69f0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 78  unction..**.** x
6a00: 5f 63 6f 75 6e 74 28 29 20 63 6f 75 6e 74 73 20  _count() counts 
6a10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  the number of no
6a20: 6e 2d 6e 75 6c 6c 20 61 72 67 75 6d 65 6e 74 73  n-null arguments
6a30: 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65  .  But there are
6a40: 0a 2a 2a 20 73 6f 6d 65 20 74 77 69 73 74 73 20  .** some twists 
6a50: 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
6a60: 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  oses..**.** If t
6a70: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  he argument to x
6a80: 5f 63 6f 75 6e 74 28 29 20 69 73 20 34 30 20 74  _count() is 40 t
6a90: 68 65 6e 20 61 20 55 54 46 2d 38 20 65 72 72 6f  hen a UTF-8 erro
6aa0: 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 2a 2a  r is reported.**
6ab0: 20 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75 6e   on the step fun
6ac0: 63 74 69 6f 6e 2e 20 20 49 66 20 78 5f 63 6f 75  ction.  If x_cou
6ad0: 6e 74 28 34 31 29 20 69 73 20 73 65 65 6e 2c 20  nt(41) is seen, 
6ae0: 74 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65 72  then a UTF-16 er
6af0: 72 6f 72 0a 2a 2a 20 69 73 20 72 65 70 6f 72 74  ror.** is report
6b00: 65 64 20 6f 6e 20 74 68 65 20 73 74 65 70 20 66  ed on the step f
6b10: 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  unction.  If the
6b20: 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20 69 73 20   total count is 
6b30: 34 32 2c 20 74 68 65 6e 0a 2a 2a 20 61 20 55 54  42, then.** a UT
6b40: 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65 70  F-8 error is rep
6b50: 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 66 69 6e  orted on the fin
6b60: 61 6c 69 7a 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  alize function..
6b70: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
6b80: 74 20 74 31 43 6f 75 6e 74 43 74 78 20 74 31 43  t t1CountCtx t1C
6b90: 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74 20  ountCtx;.struct 
6ba0: 74 31 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69  t1CountCtx {.  i
6bb0: 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20  nt n;.};.static 
6bc0: 76 6f 69 64 20 74 31 43 6f 75 6e 74 53 74 65 70  void t1CountStep
6bd0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
6be0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
6bf0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
6c00: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
6c10: 0a 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74 78  .){.  t1CountCtx
6c20: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
6c30: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
6c40: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
6c50: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
6c60: 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c   (argc==0 || SQL
6c70: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
6c80: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
6c90: 76 5b 30 5d 29 20 29 20 26 26 20 70 20 29 7b 0a  v[0]) ) && p ){.
6ca0: 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a      p->n++;.  }.
6cb0: 20 20 69 66 28 20 61 72 67 63 3e 30 20 29 7b 0a    if( argc>0 ){.
6cc0: 20 20 20 20 69 6e 74 20 76 20 3d 20 73 71 6c 69      int v = sqli
6cd0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
6ce0: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[0]);.    if( 
6cf0: 76 3d 3d 34 30 20 29 7b 0a 20 20 20 20 20 20 73  v==40 ){.      s
6d00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
6d10: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 76 61  ror(context, "va
6d20: 6c 75 65 20 6f 66 20 34 30 20 68 61 6e 64 65 64  lue of 40 handed
6d30: 20 74 6f 20 78 5f 63 6f 75 6e 74 22 2c 20 2d 31   to x_count", -1
6d40: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
6d50: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20  E_OMIT_UTF16.   
6d60: 20 7d 65 6c 73 65 20 69 66 28 20 76 3d 3d 34 31   }else if( v==41
6d70: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
6d80: 63 68 61 72 20 7a 55 74 66 31 36 45 72 72 4d 73  char zUtf16ErrMs
6d90: 67 5b 5d 20 3d 20 7b 20 30 2c 20 30 78 36 31 2c  g[] = { 0, 0x61,
6da0: 20 30 2c 20 30 78 36 32 2c 20 30 2c 20 30 78 36   0, 0x62, 0, 0x6
6db0: 33 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20  3, 0, 0, 0};.   
6dc0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6dd0: 74 5f 65 72 72 6f 72 31 36 28 63 6f 6e 74 65 78  t_error16(contex
6de0: 74 2c 20 26 7a 55 74 66 31 36 45 72 72 4d 73 67  t, &zUtf16ErrMsg
6df0: 5b 31 2d 53 51 4c 49 54 45 5f 42 49 47 45 4e 44  [1-SQLITE_BIGEND
6e00: 49 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64 69  IAN], -1);.#endi
6e10: 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 20 20  f.    }.  }.}   
6e20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 43  .static void t1C
6e30: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c  ountFinalize(sql
6e40: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
6e50: 6e 74 65 78 74 29 7b 0a 20 20 74 31 43 6f 75 6e  ntext){.  t1Coun
6e60: 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  tCtx *p;.  p = s
6e70: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
6e80: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
6e90: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
6ea0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66   if( p ){.    if
6eb0: 28 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20 20  ( p->n==42 ){.  
6ec0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6ed0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
6ee0: 2c 20 22 78 5f 63 6f 75 6e 74 20 74 6f 74 61 6c  , "x_count total
6ef0: 73 20 74 6f 20 34 32 22 2c 20 2d 31 29 3b 0a 20  s to 42", -1);. 
6f00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6f10: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
6f20: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20  nt(context, p ? 
6f30: 70 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20 20 20 7d  p->n : 0);.    }
6f40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  .  }.}../*.** Us
6f50: 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 74 65 73  age:  sqlite_tes
6f60: 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  t_create_aggrega
6f70: 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  te DB.**.** Call
6f80: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65   the sqlite3_cre
6f90: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49  ate_function API
6fa0: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61   on the given da
6fb0: 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a  tabase in order.
6fc0: 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61 20 66  ** to create a f
6fd0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78  unction named "x
6fe0: 5f 63 6f 75 6e 74 22 2e 20 20 54 68 69 73 20 66  _count".  This f
6ff0: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
7000: 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20 61   same thing.** a
7010: 73 20 74 68 65 20 22 6d 64 35 73 75 6d 22 20 66  s the "md5sum" f
7020: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
7030: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69  he original moti
7040: 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  vation for this 
7050: 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62  routine was to b
7060: 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e able to call t
7070: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72  he.** sqlite3_cr
7080: 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 66  eate_aggregate f
7090: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20  unction while a 
70a0: 71 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67  query is in prog
70b0: 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  ress in order.**
70c0: 20 74 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c   to test the SQL
70d0: 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63  ITE_MISUSE detec
70e0: 74 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 53 65 65  tion logic.  See
70f0: 20 6d 69 73 75 73 65 2e 74 65 73 74 2e 0a 2a 2a   misuse.test..**
7100: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7110: 20 77 61 73 20 6c 61 74 65 72 20 65 78 74 65 6e   was later exten
7120: 64 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  ded to test the 
7130: 75 73 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 72  use of sqlite3_r
7140: 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 0a 2a 2a  esult_error().**
7150: 20 77 69 74 68 69 6e 20 61 67 67 72 65 67 61 74   within aggregat
7160: 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  e functions..*/.
7170: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
7180: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
7190: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
71a0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
71b0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
71c0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
71d0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
71e0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
71f0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
7200: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7210: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
7220: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
7230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7240: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
7250: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
7260: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
7270: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  rc;.  if( argc!=
7280: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
7290: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
72a0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
72b0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
72c0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
72d0: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
72e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
72f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
7300: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
7310: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
7320: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
7330: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
7340: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7350: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f  function(db, "x_
7360: 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54  count", 0, SQLIT
7370: 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20  E_UTF8, 0, 0,.  
7380: 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65 70 2c      t1CountStep,
7390: 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29  t1CountFinalize)
73a0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
73b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
73c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
73d0: 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e  tion(db, "x_coun
73e0: 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  t", 1, SQLITE_UT
73f0: 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  F8, 0, 0,.      
7400: 20 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31    t1CountStep,t1
7410: 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a  CountFinalize);.
7420: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
7430: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
7440: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
7450: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7460: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
7470: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
7480: 65 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54 0a  e:  printf TEXT.
7490: 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70 75  **.** Send outpu
74a0: 74 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55 73  t to printf.  Us
74b0: 65 20 74 68 69 73 20 72 61 74 68 65 72 20 74 68  e this rather th
74c0: 61 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67 65  an puts to merge
74d0: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
74e0: 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 65  n the correct se
74f0: 71 75 65 6e 63 65 20 77 69 74 68 20 64 65 62 75  quence with debu
7500: 67 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69 6e  gging printfs in
7510: 73 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63 6f  serted into C co
7520: 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65 73  de..** Puts uses
7530: 20 61 20 73 65 70 61 72 61 74 65 20 62 75 66 66   a separate buff
7540: 65 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  er and debugging
7550: 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c 6c   statements will
7560: 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73 65   be out of.** se
7570: 71 75 65 6e 63 65 20 69 66 20 69 74 20 69 73 20  quence if it is 
7580: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
7590: 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 66 28  int test_printf(
75a0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
75b0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
75c0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
75d0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
75e0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
75f0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
7600: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
7610: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7620: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
7630: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
7640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
7650: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
7660: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ent */.){.  if( 
7670: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
7680: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7690: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
76a0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
76b0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
76c0: 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c        " TEXT\"",
76d0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
76e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
76f0: 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20   printf("%s\n", 
7700: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74 75  argv[1]);.  retu
7710: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  rn TCL_OK;.}....
7720: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
7730: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
7740: 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  t FORMAT INTEGER
7750: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
7760: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
7770: 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20 69  ntf with three i
7780: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
7790: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
77a0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
77b0: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
77c0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
77d0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
77e0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
77f0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
7800: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
7810: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
7820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7830: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
7840: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
7850: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
7860: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
7870: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
7880: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68  nt a[3], i;.  ch
7890: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
78a0: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
78b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
78c0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
78d0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
78e0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
78f0: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
7900: 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a  INT INT\"", 0);.
7910: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7920: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
7930: 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a  i=2; i<5; i++){.
7940: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
7950: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
7960: 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72  i], &a[i-2]) ) r
7970: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7980: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
7990: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
79a0: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
79b0: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
79c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
79d0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
79e0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
79f0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
7a00: 2f 2a 0a 2a 2a 20 49 66 20 7a 4e 75 6d 20 72 65  /*.** If zNum re
7a10: 70 72 65 73 65 6e 74 73 20 61 6e 20 69 6e 74 65  presents an inte
7a20: 67 65 72 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ger that will fi
7a30: 74 20 69 6e 20 36 34 2d 62 69 74 73 2c 20 74 68  t in 64-bits, th
7a40: 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 56 61 6c 75  en set.** *pValu
7a50: 65 20 74 6f 20 74 68 61 74 20 69 6e 74 65 67 65  e to that intege
7a60: 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 72 75  r and return tru
7a70: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65  e.  Otherwise re
7a80: 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73  turn false..*/.s
7a90: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
7aa0: 33 47 65 74 49 6e 74 36 34 28 63 6f 6e 73 74 20  3GetInt64(const 
7ab0: 63 68 61 72 20 2a 7a 4e 75 6d 2c 20 69 36 34 20  char *zNum, i64 
7ac0: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 66 28 20  *pValue){.  if( 
7ad0: 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42  sqlite3FitsIn64B
7ae0: 69 74 73 28 7a 4e 75 6d 29 20 29 7b 0a 20 20 20  its(zNum) ){.   
7af0: 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a   sqlite3Atoi64(z
7b00: 4e 75 6d 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  Num, pValue);.  
7b10: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
7b20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
7b30: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
7b40: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
7b50: 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  64 FORMAT INTEGE
7b60: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
7b70: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
7b80: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
7b90: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61  64-bit integer a
7ba0: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
7bb0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
7bc0: 70 72 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20 20  printf_int64(.  
7bd0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
7be0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
7bf0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
7c00: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
7c10: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
7c20: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
7c30: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
7c40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7c50: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
7c60: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
7c70: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
7c80: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
7c90: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
7ca0: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 61    sqlite_int64 a
7cb0: 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  [3];.  char *z;.
7cc0: 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b    if( argc!=5 ){
7cd0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
7ce0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
7cf0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
7d00: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
7d10: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
7d20: 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54  RMAT INT INT INT
7d30: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
7d40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7d50: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
7d60: 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  5; i++){.    if(
7d70: 20 21 73 71 6c 69 74 65 33 47 65 74 49 6e 74 36   !sqlite3GetInt6
7d80: 34 28 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  4(argv[i], &a[i-
7d90: 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  2]) ){.      Tcl
7da0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7db0: 74 65 72 70 2c 20 22 61 72 67 75 6d 65 6e 74 20  terp, "argument 
7dc0: 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 36  is not a valid 6
7dd0: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 22 2c 20  4-bit integer", 
7de0: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
7df0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7e00: 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  }.  }.  z = sqli
7e10: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
7e20: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
7e30: 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70   a[2]);.  Tcl_Ap
7e40: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7e50: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
7e60: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
7e70: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
7e80: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
7e90: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
7ea0: 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  tr FORMAT INTEGE
7eb0: 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47  R INTEGER STRING
7ec0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
7ed0: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
7ee0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
7ef0: 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72  nd one string ar
7f00: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
7f10: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
7f20: 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64  intf_str(.  void
7f30: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
7f40: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7f50: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
7f60: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
7f70: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
7f80: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
7f90: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
7fa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
7fb0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
7fc0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
7fd0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
7fe0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
7ff0: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
8000: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
8010: 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67  f( argc<4 || arg
8020: 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c>5 ){.    Tcl_A
8030: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8040: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
8050: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
8060: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8070: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
8080: 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20  NT ?STRING?\"", 
8090: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
80a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
80b0: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
80c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
80d0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
80e0: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
80f0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
8100: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
8110: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
8120: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
8130: 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67  1], argc>4 ? arg
8140: 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20  v[4] : NULL);.  
8150: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8160: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
8170: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8180: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
8190: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
81a0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ge:  sqlite3_snp
81b0: 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47 45  rintf_str INTEGE
81c0: 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  R FORMAT INTEGER
81d0: 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a   INTEGER STRING.
81e0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
81f0: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
8200: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
8210: 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67  d one string arg
8220: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
8230: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  int sqlite3_snpr
8240: 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64  intf_str(.  void
8250: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
8260: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8270: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
8280: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
8290: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
82a0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
82b0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
82c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
82d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
82e0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
82f0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
8300: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
8310: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
8320: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61  ;.  int n;.  cha
8330: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
8340: 3c 35 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a  <5 || argc>6 ){.
8350: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8360: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
8370: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
8380: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
8390: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 4e 54  0],.       " INT
83a0: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
83b0: 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b  ?STRING?\"", 0);
83c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
83d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
83e0: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
83f0: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29  rp, argv[1], &n)
8400: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
8410: 52 4f 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29  ROR;.  if( n<0 )
8420: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
8430: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8440: 4e 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65  N must be non-ne
8450: 67 61 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20  gative", 0);.   
8460: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8470: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33  R;.  }.  for(i=3
8480: 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<5; i++){.   
8490: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
84a0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c  interp, argv[i],
84b0: 20 26 61 5b 69 2d 33 5d 29 20 29 20 72 65 74 75   &a[i-3]) ) retu
84c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
84d0: 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  }.  z = sqlite3_
84e0: 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20  malloc( n+1 );. 
84f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8500: 66 28 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c  f(n, z, argv[2],
8510: 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67   a[0], a[1], arg
8520: 63 3e 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20  c>4 ? argv[5] : 
8530: 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70  NULL);.  Tcl_App
8540: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8550: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
8560: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
8570: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8580: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8590: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f  lite3_mprintf_do
85a0: 75 62 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54 45  uble FORMAT INTE
85b0: 47 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55 42  GER INTEGER DOUB
85c0: 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  LE.**.** Call mp
85d0: 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69  rintf with two i
85e0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
85f0: 20 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20   and one double 
8600: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  argument.*/.stat
8610: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
8620: 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a 20  printf_double(. 
8630: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
8640: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8650: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8660: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8670: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8680: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8690: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
86a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
86b0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
86c0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
86d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
86e0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
86f0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b  t */.){.  int a[
8700: 33 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20  3], i;.  double 
8710: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  r;.  char *z;.  
8720: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
8730: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8740: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8750: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8760: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8770: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
8780: 41 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42 4c  AT INT INT DOUBL
8790: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
87a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
87b0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
87c0: 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <4; i++){.    if
87d0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
87e0: 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61  erp, argv[i], &a
87f0: 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20  [i-2]) ) return 
8800: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8810: 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
8820: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
8830: 34 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72 6e  4], &r) ) return
8840: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 20   TCL_ERROR;.  z 
8850: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8860: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
8870: 20 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c   a[1], r);.  Tcl
8880: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8890: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
88a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
88b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
88c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
88d0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
88e0: 66 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54 20  f_scaled FORMAT 
88f0: 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a  DOUBLE DOUBLE.**
8900: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
8910: 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64   with a single d
8920: 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ouble argument w
8930: 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64  hich is the prod
8940: 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77  uct of the.** tw
8950: 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65  o arguments give
8960: 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69  n above.  This i
8970: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
8980: 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20  te overflow and 
8990: 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75  underflow.** dou
89a0: 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61  bles to test tha
89b0: 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65  t they are conve
89c0: 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a  rted properly..*
89d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
89e0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
89f0: 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  led(.  void *Not
8a00: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
8a10: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
8a20: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
8a30: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
8a40: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
8a50: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8a70: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
8a80: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
8a90: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
8aa0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
8ab0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
8ac0: 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20  int i;.  double 
8ad0: 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  r[2];.  char *z;
8ae0: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29  .  if( argc!=4 )
8af0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
8b00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8b10: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
8b20: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
8b30: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
8b40: 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55  ORMAT DOUBLE DOU
8b50: 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  BLE\"", 0);.    
8b60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8b70: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
8b80: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
8b90: 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c  if( Tcl_GetDoubl
8ba0: 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  e(interp, argv[i
8bb0: 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72 65  ], &r[i-2]) ) re
8bc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8bd0: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
8be0: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
8bf0: 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a 20  ], r[0]*r[1]);. 
8c00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8c10: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
8c20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
8c30: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
8c40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
8c50: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
8c60: 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46 4f  rintf_stronly FO
8c70: 52 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a  RMAT STRING.**.*
8c80: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
8c90: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75  ith a single dou
8ca0: 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  ble argument whi
8cb0: 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75 63  ch is the produc
8cc0: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20  t of the.** two 
8cd0: 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20  arguments given 
8ce0: 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20  above.  This is 
8cf0: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
8d00: 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e   overflow and un
8d10: 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c  derflow.** doubl
8d20: 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  es to test that 
8d30: 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74  they are convert
8d40: 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ed properly..*/.
8d50: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
8d60: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
8d70: 6c 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ly(.  void *NotU
8d80: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
8d90: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
8da0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
8db0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
8dc0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
8dd0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
8de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8df0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8e00: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
8e10: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
8e20: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
8e30: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
8e40: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
8e50: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
8e60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8e70: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
8e80: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
8e90: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
8ea0: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54 52      " FORMAT STR
8eb0: 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  ING\"", 0);.    
8ec0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8ed0: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
8ee0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
8ef0: 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20  [1], argv[2]);. 
8f00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8f10: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
8f20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
8f30: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
8f40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
8f50: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
8f60: 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 20  rintf_hexdouble 
8f70: 46 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a 2a  FORMAT HEX.**.**
8f80: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
8f90: 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62  th a single doub
8fa0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
8fb0: 68 20 69 73 20 64 65 72 69 76 65 64 20 66 72 6f  h is derived fro
8fc0: 6d 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65 63  m the.** hexadec
8fd0: 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f 66  imal encoding of
8fe0: 20 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65 2e   an IEEE double.
8ff0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
9000: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68  qlite3_mprintf_h
9010: 65 78 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64  exdouble(.  void
9020: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9030: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9040: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9050: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
9060: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
9070: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
9080: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
9090: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
90a0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
90b0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
90c0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
90d0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
90e0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
90f0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73 69  double r;.  unsi
9100: 67 6e 65 64 20 20 78 31 2c 20 78 32 3b 0a 20 20  gned  x1, x2;.  
9110: 6c 6f 6e 67 20 6c 6f 6e 67 20 75 6e 73 69 67 6e  long long unsign
9120: 65 64 20 64 3b 0a 20 20 69 66 28 20 61 72 67 63  ed d;.  if( argc
9130: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
9140: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9150: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9160: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9170: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9180: 20 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49 4e    " FORMAT STRIN
9190: 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  G\"", 0);.    re
91a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
91b0: 20 20 7d 0a 20 20 69 66 28 20 73 73 63 61 6e 66    }.  if( sscanf
91c0: 28 61 72 67 76 5b 32 5d 2c 20 22 25 30 38 78 25  (argv[2], "%08x%
91d0: 30 38 78 22 2c 20 26 78 32 2c 20 26 78 31 29 21  08x", &x2, &x1)!
91e0: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
91f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9200: 70 2c 20 22 32 6e 64 20 61 72 67 75 6d 65 6e 74  p, "2nd argument
9210: 20 73 68 6f 75 6c 64 20 62 65 20 31 36 2d 63 68   should be 16-ch
9220: 61 72 61 63 74 65 72 73 20 6f 66 20 68 65 78 22  aracters of hex"
9230: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
9240: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9250: 20 20 64 20 3d 20 78 32 3b 0a 20 20 64 20 3d 20    d = x2;.  d = 
9260: 28 64 3c 3c 33 32 29 20 2b 20 78 31 3b 0a 20 20  (d<<32) + x1;.  
9270: 6d 65 6d 63 70 79 28 26 72 2c 20 26 64 2c 20 73  memcpy(&r, &d, s
9280: 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 7a 20 3d  izeof(r));.  z =
9290: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
92a0: 28 61 72 67 76 5b 31 5d 2c 20 72 29 3b 0a 20 20  (argv[1], r);.  
92b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
92c0: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
92d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
92e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
92f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
9300: 67 65 3a 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  ge: sqlite_mallo
9310: 63 5f 66 61 69 6c 20 4e 20 20 3f 52 45 50 45 41  c_fail N  ?REPEA
9320: 54 2d 49 4e 54 45 52 56 41 4c 3f 0a 2a 2a 0a 2a  T-INTERVAL?.**.*
9330: 2a 20 52 69 67 20 73 71 6c 69 74 65 4d 61 6c 6c  * Rig sqliteMall
9340: 6f 63 28 29 20 74 6f 20 66 61 69 6c 20 6f 6e 20  oc() to fail on 
9350: 74 68 65 20 4e 2d 74 68 20 63 61 6c 6c 20 61 6e  the N-th call an
9360: 64 20 65 76 65 72 79 20 52 45 50 45 41 54 2d 49  d every REPEAT-I
9370: 4e 54 45 52 56 41 4c 20 63 61 6c 6c 0a 2a 2a 20  NTERVAL call.** 
9380: 61 66 74 65 72 20 74 68 61 74 2e 20 20 49 66 20  after that.  If 
9390: 52 45 50 45 41 54 2d 49 4e 54 45 52 56 41 4c 20  REPEAT-INTERVAL 
93a0: 69 73 20 30 20 6f 72 20 69 73 20 6f 6d 69 74 74  is 0 or is omitt
93b0: 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 61 20  ed, then only a 
93c0: 73 69 6e 67 6c 65 0a 2a 2a 20 6d 61 6c 6c 6f 63  single.** malloc
93d0: 20 77 69 6c 6c 20 66 61 69 6c 2e 20 20 49 66 20   will fail.  If 
93e0: 52 45 50 45 41 54 2d 49 4e 54 45 52 56 41 4c 20  REPEAT-INTERVAL 
93f0: 69 73 20 31 20 74 68 65 6e 20 61 6c 6c 20 6d 61  is 1 then all ma
9400: 6c 6c 6f 63 73 20 61 66 74 65 72 20 74 68 65 0a  llocs after the.
9410: 2a 2a 20 66 69 72 73 74 20 66 61 69 6c 75 72 65  ** first failure
9420: 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
9430: 6f 20 66 61 69 6c 20 6f 6e 20 65 76 65 72 79 20  o fail on every 
9440: 63 61 6c 6c 2e 20 20 49 66 20 52 45 50 45 41 54  call.  If REPEAT
9450: 2d 49 4e 54 45 52 56 41 4c 20 69 73 0a 2a 2a 20  -INTERVAL is.** 
9460: 32 20 74 68 65 6e 20 65 76 65 72 79 20 6f 74 68  2 then every oth
9470: 65 72 20 6d 61 6c 6c 6f 63 20 77 69 6c 6c 20 66  er malloc will f
9480: 61 69 6c 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  ail.  And so for
9490: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 75 72 6e 20 6f  th..**.** Turn o
94a0: 66 66 20 74 68 69 73 20 6d 65 63 68 61 6e 69 73  ff this mechanis
94b0: 6d 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  m and reset the 
94c0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
94d0: 61 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  a()->mallocFaile
94e0: 64 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 69  d .** variable i
94f0: 66 20 4e 3d 3d 30 2e 0a 2a 2f 0a 23 69 66 64 65  f N==0..*/.#ifde
9500: 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55  f SQLITE_MEMDEBU
9510: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  G.static int sql
9520: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 28  ite_malloc_fail(
9530: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
9540: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
9550: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
9560: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
9570: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
9580: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
9590: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
95a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
95b0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
95c0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
95d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
95e0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
95f0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
9600: 6e 3b 0a 20 20 69 6e 74 20 72 65 70 3b 0a 20 20  n;.  int rep;.  
9610: 69 66 28 20 61 72 67 63 21 3d 32 20 26 26 20 61  if( argc!=2 && a
9620: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
9630: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9640: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
9650: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
9660: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20  \"", argv[0], " 
9670: 4e 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  N\"", 0);.    re
9680: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9690: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
96a0: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
96b0: 76 5b 31 5d 2c 20 26 6e 29 20 29 20 72 65 74 75  v[1], &n) ) retu
96c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
96d0: 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20  if( argc==3 ){. 
96e0: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
96f0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
9700: 5d 2c 20 26 72 65 70 29 20 29 20 72 65 74 75 72  ], &rep) ) retur
9710: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9720: 65 6c 73 65 7b 0a 20 20 20 20 72 65 70 20 3d 20  else{.    rep = 
9730: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
9740: 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6e  _iMallocFail = n
9750: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c  ;.  sqlite3_iMal
9760: 6c 6f 63 52 65 73 65 74 20 3d 20 72 65 70 3b 0a  locReset = rep;.
9770: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
9780: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
9790: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 6d   Usage: sqlite_m
97a0: 61 6c 6c 6f 63 5f 73 74 61 74 0a 2a 2a 0a 2a 2a  alloc_stat.**.**
97b0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
97c0: 65 72 20 6f 66 20 70 72 69 6f 72 20 63 61 6c 6c  er of prior call
97d0: 73 20 74 6f 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  s to sqliteMallo
97e0: 63 28 29 20 61 6e 64 20 73 71 6c 69 74 65 46 72  c() and sqliteFr
97f0: 65 65 28 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ee()..*/.#ifdef 
9800: 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a  SQLITE_MEMDEBUG.
9810: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
9820: 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 28 0a 20  e_malloc_stat(. 
9830: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
9840: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9850: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
9860: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
9870: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
9880: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
9890: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
98a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
98b0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
98c0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
98d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
98e0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
98f0: 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  t */.){.  char z
9900: 42 75 66 5b 32 30 30 5d 3b 0a 20 20 73 70 72 69  Buf[200];.  spri
9910: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 20 25 64  ntf(zBuf, "%d %d
9920: 20 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 6e 4d   %d", sqlite3_nM
9930: 61 6c 6c 6f 63 2c 73 71 6c 69 74 65 33 5f 6e 46  alloc,sqlite3_nF
9940: 72 65 65 2c 73 71 6c 69 74 65 33 5f 69 4d 61 6c  ree,sqlite3_iMal
9950: 6c 6f 63 46 61 69 6c 29 3b 0a 20 20 54 63 6c 5f  locFail);.  Tcl_
9960: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9970: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
9980: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9990: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
99a0: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
99b0: 73 20 61 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  s a Tcl command 
99c0: 74 68 61 74 20 6d 61 79 20 62 65 20 69 6e 76 6f  that may be invo
99d0: 6b 65 64 20 75 73 69 6e 67 20 61 6e 79 20 6f 66  ked using any of
99e0: 0a 2a 2a 20 74 68 65 20 66 6f 75 72 20 66 6f 72  .** the four for
99f0: 6d 73 20 65 6e 75 6d 65 72 61 74 65 64 20 62 65  ms enumerated be
9a00: 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  low..**.** sqlit
9a10: 65 5f 6d 61 6c 6c 6f 63 5f 6f 75 74 73 74 61 6e  e_malloc_outstan
9a20: 64 69 6e 67 0a 2a 2a 20 20 20 20 20 52 65 74 75  ding.**     Retu
9a30: 72 6e 20 61 20 73 75 6d 6d 61 72 79 20 6f 66 20  rn a summary of 
9a40: 61 6c 6c 20 75 6e 66 72 65 65 64 20 62 6c 6f 63  all unfreed bloc
9a50: 6b 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c 6c  ks of memory all
9a60: 6f 63 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a  ocated by the.**
9a70: 20 20 20 20 20 63 75 72 72 65 6e 74 20 74 68 72       current thr
9a80: 65 61 64 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ead. See comment
9a90: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
9aa0: 20 73 71 6c 69 74 65 33 4f 75 74 73 74 61 6e 64   sqlite3Outstand
9ab0: 69 6e 67 4d 61 6c 6c 6f 63 73 28 29 20 0a 2a 2a  ingMallocs() .**
9ac0: 20 20 20 20 20 69 6e 20 75 74 69 6c 2e 63 20 66       in util.c f
9ad0: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
9ae0: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
9af0: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 73 71   value..**.** sq
9b00: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 6f 75 74 73  lite_malloc_outs
9b10: 74 61 6e 64 69 6e 67 20 2d 62 79 74 65 73 0a 2a  tanding -bytes.*
9b20: 2a 20 20 20 20 20 52 65 74 75 72 6e 20 74 68 65  *     Return the
9b30: 20 74 6f 74 61 6c 20 61 6d 6f 75 6e 74 20 6f 66   total amount of
9b40: 20 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79 20   unfreed memory 
9b50: 28 69 6e 20 62 79 74 65 73 29 20 61 6c 6c 6f 63  (in bytes) alloc
9b60: 61 74 65 64 20 62 79 20 0a 2a 2a 20 20 20 20 20  ated by .**     
9b70: 74 68 69 73 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  this thread..**.
9b80: 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  ** sqlite_malloc
9b90: 5f 6f 75 74 73 74 61 6e 64 69 6e 67 20 2d 6d 61  _outstanding -ma
9ba0: 78 62 79 74 65 73 0a 2a 2a 20 20 20 20 20 52 65  xbytes.**     Re
9bb0: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
9bc0: 20 61 6d 6f 75 6e 74 20 6f 66 20 64 79 6e 61 6d   amount of dynam
9bd0: 69 63 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  ic memory in use
9be0: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 0a 2a 2a   at one time .**
9bf0: 20 20 20 20 20 62 79 20 74 68 69 73 20 74 68 72       by this thr
9c00: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ead..**.** sqlit
9c10: 65 5f 6d 61 6c 6c 6f 63 5f 6f 75 74 73 74 61 6e  e_malloc_outstan
9c20: 64 69 6e 67 20 2d 63 6c 65 61 72 6d 61 78 62 79  ding -clearmaxby
9c30: 74 65 73 0a 2a 2a 20 20 20 20 20 53 65 74 20 74  tes.**     Set t
9c40: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
9c50: 64 20 62 79 20 5b 73 71 6c 69 74 65 5f 6d 61 6c  d by [sqlite_mal
9c60: 6c 6f 63 5f 6f 75 74 73 74 61 6e 64 69 6e 67 20  loc_outstanding 
9c70: 2d 6d 61 78 62 79 74 65 73 5d 0a 2a 2a 20 20 20  -maxbytes].**   
9c80: 20 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74    to the current
9c90: 20 76 61 6c 75 65 20 6f 66 20 5b 73 71 6c 69 74   value of [sqlit
9ca0: 65 5f 6d 61 6c 6c 6f 63 5f 6f 75 74 73 74 61 6e  e_malloc_outstan
9cb0: 64 69 6e 67 20 2d 62 79 74 65 73 5d 2e 20 0a 2a  ding -bytes]. .*
9cc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
9cd0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 6f 75 74 73 74  ite_malloc_outst
9ce0: 61 6e 64 69 6e 67 28 0a 20 20 43 6c 69 65 6e 74  anding(.  Client
9cf0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
9d00: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9d10: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9d20: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9d30: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9d40: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9d50: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
9d60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9d70: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
9d80: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
9d90: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
9da0: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
9db0: 2f 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e  /.){.  extern in
9dc0: 74 20 73 71 6c 69 74 65 33 4f 75 74 73 74 61 6e  t sqlite3Outstan
9dd0: 64 69 6e 67 4d 61 6c 6c 6f 63 73 28 54 63 6c 5f  dingMallocs(Tcl_
9de0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 3b  Interp *interp);
9df0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
9e00: 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
9e10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 45  efined(SQLITE_ME
9e20: 4d 44 45 42 55 47 29 20 26 26 20 53 51 4c 49 54  MDEBUG) && SQLIT
9e30: 45 5f 4d 45 4d 44 45 42 55 47 3e 31 0a 20 20 69  E_MEMDEBUG>1.  i
9e40: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
9e50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
9e60: 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
9e70: 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 23 69 66  ng(objv[1]);.#if
9e80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9e90: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
9ea0: 45 4e 54 0a 20 20 20 20 54 68 72 65 61 64 44 61  ENT.    ThreadDa
9eb0: 74 61 20 63 6f 6e 73 74 20 2a 70 54 64 20 3d 20  ta const *pTd = 
9ec0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
9ed0: 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 20  aReadOnly();.   
9ee0: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
9ef0: 41 72 67 2c 20 22 2d 62 79 74 65 73 22 29 20 29  Arg, "-bytes") )
9f00: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
9f10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
9f20: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70   Tcl_NewIntObj(p
9f30: 54 64 2d 3e 6e 41 6c 6c 6f 63 29 29 3b 0a 20 20  Td->nAlloc));.  
9f40: 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 73    }else if( 0==s
9f50: 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 63 6c  trcmp(zArg, "-cl
9f60: 65 61 72 6d 61 78 62 79 74 65 73 22 29 20 29 7b  earmaxbytes") ){
9f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6e  .      sqlite3_n
9f80: 4d 61 78 41 6c 6c 6f 63 20 3d 20 70 54 64 2d 3e  MaxAlloc = pTd->
9f90: 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 7d 65 6c 73  nAlloc;.    }els
9fa0: 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  e .#endif.    if
9fb0: 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 41 72 67  ( 0==strcmp(zArg
9fc0: 2c 20 22 2d 6d 61 78 62 79 74 65 73 22 29 20 29  , "-maxbytes") )
9fd0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
9fe0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
9ff0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
a000: 62 6a 28 73 71 6c 69 74 65 33 5f 6e 4d 61 78 41  bj(sqlite3_nMaxA
a010: 6c 6c 6f 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  lloc));.    }els
a020: 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  e{.      Tcl_App
a030: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a040: 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22  , "bad option \"
a050: 22 2c 20 7a 41 72 67 2c 20 0a 20 20 20 20 20 20  ", zArg, .      
a060: 20 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20 2d    "\": must be -
a070: 62 79 74 65 73 2c 20 2d 6d 61 78 62 79 74 65 73  bytes, -maxbytes
a080: 20 6f 72 20 2d 63 6c 65 61 72 6d 61 78 62 79 74   or -clearmaxbyt
a090: 65 73 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  es", 0.      );.
a0a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
a0b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
a0c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
a0d0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a  ;.  }..  if( obj
a0e0: 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
a0f0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
a100: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
a110: 2d 62 79 74 65 73 3f 22 29 3b 0a 20 20 20 20 72  -bytes?");.    r
a120: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a130: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73  .  }..  return s
a140: 71 6c 69 74 65 33 4f 75 74 73 74 61 6e 64 69 6e  qlite3Outstandin
a150: 67 4d 61 6c 6c 6f 63 73 28 69 6e 74 65 72 70 29  gMallocs(interp)
a160: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
a170: 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a   TCL_OK;.#endif.
a180: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
a190: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
a1a0: 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
a1b0: 68 65 20 20 20 20 20 20 42 4f 4f 4c 45 41 4e 0a  he      BOOLEAN.
a1c0: 2a 2a 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  **.*/.#if !defin
a1d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
a1e0: 48 41 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61  HARED_CACHE).sta
a1f0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61  tic int test_ena
a200: 62 6c 65 5f 73 68 61 72 65 64 28 0a 20 20 43 6c  ble_shared(.  Cl
a210: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
a220: 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
a230: 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
a240: 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
a250: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
a260: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
a270: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
a280: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
a290: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
a2a0: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
a2b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a2c0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
a2d0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
a2e0: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
a2f0: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
a300: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
a310: 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20    int enable;.  
a320: 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 0a 20 20  int ret = 0;..  
a330: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
a340: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
a350: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
a360: 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b  bjv, "BOOLEAN");
a370: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a380: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
a390: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
a3a0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
a3b0: 62 6a 76 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29  bjv[1], &enable)
a3c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
a3d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a3e0: 72 65 74 20 3d 20 73 71 6c 69 74 65 33 54 68 72  ret = sqlite3Thr
a3f0: 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
a400: 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61  )->useSharedData
a410: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
a420: 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
a430: 61 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20 20  ache(enable);.  
a440: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a450: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
a460: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
a470: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
a480: 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f 53 54  rStr(rc), TCL_ST
a490: 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72  ATIC);.    retur
a4a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
a4b0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
a4c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
a4d0: 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65  NewBooleanObj(re
a4e0: 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  t));.  return TC
a4f0: 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK;.}.#endif..
a500: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
a510: 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
a520: 72 65 73 75 6c 74 5f 63 6f 64 65 73 20 20 20 44  result_codes   D
a530: 42 20 20 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a  B    BOOLEAN.**.
a540: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
a550: 73 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  st_extended_resu
a560: 6c 74 5f 63 6f 64 65 73 28 0a 20 20 43 6c 69 65  lt_codes(.  Clie
a570: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
a580: 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
a590: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
a5a0: 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
a5b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a5c0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a5d0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a5e0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a5f0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a600: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
a610: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a620: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a630: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
a640: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
a650: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
a660: 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65  .){.  int enable
a670: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
a680: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
a690: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
a6a0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a6b0: 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f  1, objv, "DB BOO
a6c0: 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  LEAN");.    retu
a6d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a6e0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
a6f0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
a700: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
a710: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
a720: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a730: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
a740: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
a750: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 65 6e 61 62  , objv[2], &enab
a760: 6c 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  le) ) return TCL
a770: 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
a780: 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
a790: 74 5f 63 6f 64 65 73 28 64 62 2c 20 65 6e 61 62  t_codes(db, enab
a7a0: 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  le);.  return TC
a7b0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
a7c0: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c 69  sage: sqlite3_li
a7d0: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 0a  bversion_number.
a7e0: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
a7f0: 20 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e   test_libversion
a800: 5f 6e 75 6d 62 65 72 28 0a 20 20 43 6c 69 65 6e  _number(.  Clien
a810: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
a820: 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
a830: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
a840: 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
a850: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
a860: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
a870: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
a880: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
a890: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
a8a0: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
a8b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a8c0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
a8d0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
a8e0: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
a8f0: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
a900: 29 7b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ){.  Tcl_SetObjR
a910: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
a920: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
a930: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
a940: 75 6d 62 65 72 28 29 29 29 3b 0a 20 20 72 65 74  umber()));.  ret
a950: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
a960: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
a970: 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
a980: 5f 6d 65 74 61 64 61 74 61 20 44 42 20 64 62 6e  _metadata DB dbn
a990: 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e  ame tblname coln
a9a0: 61 6d 65 0a 2a 2a 0a 2a 2f 0a 23 69 66 64 65 66  ame.**.*/.#ifdef
a9b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
a9c0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 73  OLUMN_METADATA.s
a9d0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74  tatic int test_t
a9e0: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
a9f0: 64 61 74 61 28 0a 20 20 43 6c 69 65 6e 74 44 61  data(.  ClientDa
aa00: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
aa10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
aa20: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
aa30: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
aa40: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
aa50: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
aa60: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
aa70: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
aa80: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
aa90: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
aaa0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
aab0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
aac0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
aad0: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
aae0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
aaf0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
ab00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
ab10: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
ab20: 7a 54 62 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  zTbl;.  const ch
ab30: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74 20  ar *zCol;.  int 
ab40: 72 63 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rc;.  Tcl_Obj *p
ab50: 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68  Ret;..  const ch
ab60: 61 72 20 2a 7a 44 61 74 61 74 79 70 65 3b 0a 20  ar *zDatatype;. 
ab70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
ab80: 6c 6c 73 65 71 3b 0a 20 20 69 6e 74 20 6e 6f 74  llseq;.  int not
ab90: 6e 75 6c 6c 3b 0a 20 20 69 6e 74 20 70 72 69 6d  null;.  int prim
aba0: 61 72 79 6b 65 79 3b 0a 20 20 69 6e 74 20 61 75  arykey;.  int au
abb0: 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20 20  toincrement;..  
abc0: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
abd0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
abe0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
abf0: 62 6a 76 2c 20 22 44 42 20 64 62 6e 61 6d 65 20  bjv, "DB dbname 
ac00: 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65 22  tblname colname"
ac10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ac20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
ac30: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
ac40: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
ac50: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
ac60: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
ac70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 20 3d  L_ERROR;.  zDb =
ac80: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
ac90: 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 54 62 6c 20  bjv[2]);.  zTbl 
aca0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
acb0: 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7a 43 6f 6c  objv[3]);.  zCol
acc0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
acd0: 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20 20 69 66  (objv[4]);..  if
ace0: 28 20 73 74 72 6c 65 6e 28 7a 44 62 29 3d 3d 30  ( strlen(zDb)==0
acf0: 20 29 20 7a 44 62 20 3d 20 30 3b 0a 0a 20 20 72   ) zDb = 0;..  r
ad00: 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  c = sqlite3_tabl
ad10: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
ad20: 61 28 64 62 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c  a(db, zDb, zTbl,
ad30: 20 7a 43 6f 6c 2c 20 0a 20 20 20 20 20 20 26 7a   zCol, .      &z
ad40: 44 61 74 61 74 79 70 65 2c 20 26 7a 43 6f 6c 6c  Datatype, &zColl
ad50: 73 65 71 2c 20 26 6e 6f 74 6e 75 6c 6c 2c 20 26  seq, &notnull, &
ad60: 70 72 69 6d 61 72 79 6b 65 79 2c 20 26 61 75 74  primarykey, &aut
ad70: 6f 69 6e 63 72 65 6d 65 6e 74 29 3b 0a 0a 20 20  oincrement);..  
ad80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ad90: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
ada0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
adb0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
adc0: 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (db), 0);.    re
add0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ade0: 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54 63    }..  pRet = Tc
adf0: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63  l_NewObj();.  Tc
ae00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
ae10: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
ae20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
ae30: 28 7a 44 61 74 61 74 79 70 65 2c 20 2d 31 29 29  (zDatatype, -1))
ae40: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
ae50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
ae60: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
ae70: 69 6e 67 4f 62 6a 28 7a 43 6f 6c 6c 73 65 71 2c  ingObj(zCollseq,
ae80: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
ae90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
aea0: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
aeb0: 65 77 49 6e 74 4f 62 6a 28 6e 6f 74 6e 75 6c 6c  ewIntObj(notnull
aec0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
aed0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
aee0: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
aef0: 6e 74 4f 62 6a 28 70 72 69 6d 61 72 79 6b 65 79  ntObj(primarykey
af00: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
af10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
af20: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
af30: 6e 74 4f 62 6a 28 61 75 74 6f 69 6e 63 72 65 6d  ntObj(autoincrem
af40: 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74  ent));.  Tcl_Set
af50: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
af60: 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75  , pRet);..  retu
af70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
af80: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
af90: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
afa0: 42 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  B../*.** sqlite3
afb0: 5f 62 6c 6f 62 5f 72 65 61 64 20 20 43 48 41 4e  _blob_read  CHAN
afc0: 4e 45 4c 20 4f 46 46 53 45 54 20 4e 0a 2a 2a 0a  NEL OFFSET N.**.
afd0: 2a 2a 20 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  **   This comman
afe0: 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  d is used to tes
aff0: 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c  t the sqlite3_bl
b000: 6f 62 5f 72 65 61 64 28 29 20 69 6e 20 77 61 79  ob_read() in way
b010: 73 20 74 68 61 74 0a 2a 2a 20 20 20 74 68 65 20  s that.**   the 
b020: 54 63 6c 20 63 68 61 6e 6e 65 6c 20 69 6e 74 65  Tcl channel inte
b030: 72 66 61 63 65 20 64 6f 65 73 20 6e 6f 74 2e 20  rface does not. 
b040: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
b050: 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 20 20 62  nt should.**   b
b060: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  e the name of a 
b070: 76 61 6c 69 64 20 63 68 61 6e 6e 65 6c 20 63 72  valid channel cr
b080: 65 61 74 65 64 20 62 79 20 74 68 65 20 5b 69 6e  eated by the [in
b090: 63 72 62 6c 6f 62 5d 20 6d 65 74 68 6f 64 0a 2a  crblob] method.*
b0a0: 2a 20 20 20 6f 66 20 61 20 64 61 74 61 62 61 73  *   of a databas
b0b0: 65 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 66  e handle. This f
b0c0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71  unction calls sq
b0d0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
b0e0: 29 0a 2a 2a 20 20 20 74 6f 20 72 65 61 64 20 4e  ).**   to read N
b0f0: 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 66 73   bytes from offs
b100: 65 74 20 4f 46 46 53 45 54 20 66 72 6f 6d 20 74  et OFFSET from t
b110: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 53 51  he underlying SQ
b120: 4c 69 74 65 0a 2a 2a 20 20 20 62 6c 6f 62 20 68  Lite.**   blob h
b130: 61 6e 64 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f  andle..**.**   O
b140: 6e 20 73 75 63 63 65 73 73 2c 20 61 20 62 79 74  n success, a byt
b150: 65 2d 61 72 72 61 79 20 6f 62 6a 65 63 74 20 63  e-array object c
b160: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65  ontaining the re
b170: 61 64 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 20  ad data is .**  
b180: 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e 20 66 61   returned. On fa
b190: 69 6c 75 72 65 2c 20 74 68 65 20 69 6e 74 65 72  ilure, the inter
b1a0: 70 72 65 74 65 72 20 72 65 73 75 6c 74 20 69 73  preter result is
b1b0: 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 20   set to the.**  
b1c0: 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
b1d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 74 75  tion of the retu
b1e0: 72 6e 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20  rned error code 
b1f0: 28 69 2e 65 2e 20 22 53 51 4c 49 54 45 5f 4e 4f  (i.e. "SQLITE_NO
b200: 4d 45 4d 22 29 0a 2a 2a 20 20 20 61 6e 64 20 61  MEM").**   and a
b210: 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 20 69   Tcl exception i
b220: 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61  s thrown..*/.sta
b230: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f  tic int test_blo
b240: 62 5f 72 65 61 64 28 0a 20 20 43 6c 69 65 6e 74  b_read(.  Client
b250: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
b260: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
b270: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
b280: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
b290: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
b2a0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
b2b0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
b2c0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
b2d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b2e0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
b2f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
b300: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
b310: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
b320: 0a 29 7b 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65  .){.  Tcl_Channe
b330: 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20 43 6c 69  l channel;.  Cli
b340: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
b350: 44 61 74 61 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Data;.  sqlite3_
b360: 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69  blob *pBlob;.  i
b370: 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 69 6e  nt notUsed;.  in
b380: 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
b390: 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e  Offset;.  unsign
b3a0: 65 64 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20  ed char *zBuf;. 
b3b0: 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 69 66   int rc;.  .  if
b3c0: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
b3d0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
b3e0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
b3f0: 76 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53  v, "CHANNEL OFFS
b400: 45 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  ET N");.    retu
b410: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b420: 7d 0a 0a 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54  }..  channel = T
b430: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
b440: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
b450: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 6e  ing(objv[1]), &n
b460: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 21  otUsed);.  if( !
b470: 63 68 61 6e 6e 65 6c 0a 20 20 20 7c 7c 20 54 43  channel.   || TC
b480: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
b490: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b4a0: 6f 62 6a 76 5b 32 5d 2c 20 26 69 4f 66 66 73 65  objv[2], &iOffse
b4b0: 74 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21  t).   || TCL_OK!
b4c0: 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
b4d0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
b4e0: 33 5d 2c 20 26 6e 42 79 74 65 29 0a 20 20 20 7c  3], &nByte).   |
b4f0: 7c 20 6e 42 79 74 65 3c 30 20 7c 7c 20 69 4f 66  | nByte<0 || iOf
b500: 66 73 65 74 3c 30 0a 20 20 29 7b 20 0a 20 20 20  fset<0.  ){ .   
b510: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b520: 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 73 74 61 6e  R;.  }..  instan
b530: 63 65 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74  ceData = Tcl_Get
b540: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
b550: 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20  ata(channel);.  
b560: 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69 74  pBlob = *((sqlit
b570: 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74 61  e3_blob **)insta
b580: 6e 63 65 44 61 74 61 29 3b 0a 0a 20 20 7a 42 75  nceData);..  zBu
b590: 66 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  f = (unsigned ch
b5a0: 61 72 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e  ar *)Tcl_Alloc(n
b5b0: 42 79 74 65 29 3b 0a 20 20 72 63 20 3d 20 73 71  Byte);.  rc = sq
b5c0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
b5d0: 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42 79  pBlob, zBuf, nBy
b5e0: 74 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  te, iOffset);.  
b5f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b600: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
b610: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
b620: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
b630: 61 79 4f 62 6a 28 7a 42 75 66 2c 20 6e 42 79 74  ayObj(zBuf, nByt
b640: 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
b650: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
b660: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
b670: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72  sqlite3TestError
b680: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f  Name(rc), TCL_VO
b690: 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 20 20 54  LATILE);.  }.  T
b6a0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  cl_Free((char *)
b6b0: 7a 42 75 66 29 3b 0a 0a 20 20 72 65 74 75 72 6e  zBuf);..  return
b6c0: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
b6d0: 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45  ? TCL_OK : TCL_E
b6e0: 52 52 4f 52 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  RROR);.}../*.** 
b6f0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
b700: 74 65 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  te CHANNEL OFFSE
b710: 54 20 44 41 54 41 0a 2a 2a 0a 2a 2a 20 20 20 54  T DATA.**.**   T
b720: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
b730: 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  sed to test the 
b740: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
b750: 74 65 28 29 20 69 6e 20 77 61 79 73 20 74 68 61  te() in ways tha
b760: 74 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20 63  t.**   the Tcl c
b770: 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63 65  hannel interface
b780: 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20 66   does not. The f
b790: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68  irst argument sh
b7a0: 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68 65  ould.**   be the
b7b0: 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64   name of a valid
b7c0: 20 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65 64   channel created
b7d0: 20 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c 6f   by the [incrblo
b7e0: 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 6f  b] method.**   o
b7f0: 66 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e  f a database han
b800: 64 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  dle. This functi
b810: 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33  on calls sqlite3
b820: 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29 0a 2a 2a  _blob_write().**
b830: 20 20 20 74 6f 20 77 72 69 74 65 20 74 68 65 20     to write the 
b840: 44 41 54 41 20 62 79 74 65 2d 61 72 72 61 79 20  DATA byte-array 
b850: 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  to the underlyin
b860: 67 20 53 51 4c 69 74 65 20 62 6c 6f 62 20 68 61  g SQLite blob ha
b870: 6e 64 6c 65 2e 0a 2a 2a 20 20 20 61 74 20 6f 66  ndle..**   at of
b880: 66 73 65 74 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a  fset OFFSET..**.
b890: 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73 2c  **   On success,
b8a0: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
b8b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e   is returned. On
b8c0: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 69 6e   failure, the in
b8d0: 74 65 72 70 72 65 74 65 72 0a 2a 2a 20 20 20 72  terpreter.**   r
b8e0: 65 73 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20  esult is set to 
b8f0: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
b900: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ntation of the r
b910: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 63 6f  eturned error co
b920: 64 65 20 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 22  de .**   (i.e. "
b930: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 20 61  SQLITE_NOMEM") a
b940: 6e 64 20 61 20 54 63 6c 20 65 78 63 65 70 74 69  nd a Tcl excepti
b950: 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f  on is thrown..*/
b960: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
b970: 5f 62 6c 6f 62 5f 77 72 69 74 65 28 0a 20 20 43  _blob_write(.  C
b980: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
b990: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
b9a0: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
b9b0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
b9c0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
b9d0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
b9e0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
b9f0: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
ba00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ba10: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
ba20: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
ba30: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
ba40: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
ba50: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43  ts */.){.  Tcl_C
ba60: 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a  hannel channel;.
ba70: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
ba80: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 73 71 6c  tanceData;.  sql
ba90: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
baa0: 3b 0a 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b  ;.  int notUsed;
bab0: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
bac0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 75 6e 73    int rc;..  uns
bad0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66  igned char *zBuf
bae0: 3b 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20  ;.  int nBuf;.  
baf0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
bb00: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
bb10: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
bb20: 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c  , objv, "CHANNEL
bb30: 20 4f 46 46 53 45 54 20 44 41 54 41 22 29 3b 0a   OFFSET DATA");.
bb40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
bb50: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 63 68 61  RROR;.  }..  cha
bb60: 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68  nnel = Tcl_GetCh
bb70: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
bb80: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
bb90: 5b 31 5d 29 2c 20 26 6e 6f 74 55 73 65 64 29 3b  [1]), &notUsed);
bba0: 0a 20 20 69 66 28 20 21 63 68 61 6e 6e 65 6c 0a  .  if( !channel.
bbb0: 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63     || TCL_OK!=Tc
bbc0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
bbd0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
bbe0: 20 26 69 4f 66 66 73 65 74 29 0a 20 20 20 7c 7c   &iOffset).   ||
bbf0: 20 69 4f 66 66 73 65 74 3c 30 0a 20 20 29 7b 20   iOffset<0.  ){ 
bc00: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
bc10: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ERROR;.  }..  in
bc20: 73 74 61 6e 63 65 44 61 74 61 20 3d 20 54 63 6c  stanceData = Tcl
bc30: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
bc40: 6e 63 65 44 61 74 61 28 63 68 61 6e 6e 65 6c 29  nceData(channel)
bc50: 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 2a 28 28 73  ;.  pBlob = *((s
bc60: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69  qlite3_blob **)i
bc70: 6e 73 74 61 6e 63 65 44 61 74 61 29 3b 0a 0a 20  nstanceData);.. 
bc80: 20 7a 42 75 66 20 3d 20 54 63 6c 5f 47 65 74 42   zBuf = Tcl_GetB
bc90: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
bca0: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 75 66 29 3b  objv[3], &nBuf);
bcb0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
bcc0: 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62  blob_write(pBlob
bcd0: 2c 20 7a 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , zBuf, nBuf, iO
bce0: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
bcf0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bd00: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
bd10: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
bd20: 29 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f  )sqlite3TestErro
bd30: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56  rName(rc), TCL_V
bd40: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a 20  OLATILE);.  }.. 
bd50: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
bd60: 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20  ITE_OK ? TCL_OK 
bd70: 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a  : TCL_ERROR);.}.
bd80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73  #endif../*.** Us
bd90: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 72 65  age: sqlite3_cre
bda0: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
bdb0: 20 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20   DB-HANDLE NAME 
bdc0: 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f  CMP-PROC DEL-PRO
bdd0: 43 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 54  C.**.**   This T
bde0: 63 6c 20 70 72 6f 63 20 69 73 20 75 73 65 64 20  cl proc is used 
bdf0: 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20  for testing the 
be00: 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a 2a 2a 20  experimental.** 
be10: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
be20: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 29 20  _collation_v2() 
be30: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
be40: 72 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69  ruct TestCollati
be50: 6f 6e 58 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  onX {.  Tcl_Inte
be60: 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
be70: 6c 5f 4f 62 6a 20 2a 70 43 6d 70 3b 0a 20 20 54  l_Obj *pCmp;.  T
be80: 63 6c 5f 4f 62 6a 20 2a 70 44 65 6c 3b 0a 7d 3b  cl_Obj *pDel;.};
be90: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
bea0: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 54  TestCollationX T
beb0: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 3b 0a 73  estCollationX;.s
bec0: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 43  tatic void testC
bed0: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65  reateCollationDe
bee0: 6c 28 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20  l(void *pCtx){. 
bef0: 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20   TestCollationX 
bf00: 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74  *p = (TestCollat
bf10: 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 0a 20 20  ionX *)pCtx;..  
bf20: 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  int rc = Tcl_Eva
bf30: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
bf40: 2c 20 70 2d 3e 70 44 65 6c 2c 20 54 43 4c 5f 45  , p->pDel, TCL_E
bf50: 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45  VAL_DIRECT|TCL_E
bf60: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 69  VAL_GLOBAL);.  i
bf70: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b  f( rc!=TCL_OK ){
bf80: 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f  .    Tcl_Backgro
bf90: 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65  undError(p->inte
bfa0: 72 70 29 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f  rp);.  }..  Tcl_
bfb0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
bfc0: 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 44 65 63  pCmp);.  Tcl_Dec
bfd0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65  rRefCount(p->pDe
bfe0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  l);.  sqlite3_fr
bff0: 65 65 28 28 76 6f 69 64 20 2a 29 70 29 3b 0a 7d  ee((void *)p);.}
c000: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
c010: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
c020: 6d 70 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  mp(.  void *pCtx
c030: 2c 0a 20 20 69 6e 74 20 6e 4c 65 66 74 2c 0a 20  ,.  int nLeft,. 
c040: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4c 65   const void *zLe
c050: 66 74 2c 0a 20 20 69 6e 74 20 6e 52 69 67 68 74  ft,.  int nRight
c060: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
c070: 7a 52 69 67 68 74 0a 29 7b 0a 20 20 54 65 73 74  zRight.){.  Test
c080: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20  CollationX *p = 
c090: 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20  (TestCollationX 
c0a0: 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62  *)pCtx;.  Tcl_Ob
c0b0: 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c  j *pScript = Tcl
c0c0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d  _DuplicateObj(p-
c0d0: 3e 70 43 6d 70 29 3b 0a 20 20 69 6e 74 20 69 52  >pCmp);.  int iR
c0e0: 65 73 20 3d 20 30 3b 0a 0a 20 20 54 63 6c 5f 49  es = 0;..  Tcl_I
c0f0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
c100: 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ipt);.  Tcl_List
c110: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
c120: 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c  (0, pScript, Tcl
c130: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
c140: 68 61 72 20 2a 29 7a 4c 65 66 74 2c 20 6e 4c 65  har *)zLeft, nLe
c150: 66 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ft));.  Tcl_List
c160: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
c170: 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c  (0, pScript, Tcl
c180: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
c190: 68 61 72 20 2a 29 7a 52 69 67 68 74 2c 6e 52 69  har *)zRight,nRi
c1a0: 67 68 74 29 29 3b 0a 0a 20 20 69 66 28 20 54 43  ght));..  if( TC
c1b0: 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62  L_OK!=Tcl_EvalOb
c1c0: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
c1d0: 53 63 72 69 70 74 2c 20 54 43 4c 5f 45 56 41 4c  Script, TCL_EVAL
c1e0: 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c  _DIRECT|TCL_EVAL
c1f0: 5f 47 4c 4f 42 41 4c 29 0a 20 20 20 7c 7c 20 54  _GLOBAL).   || T
c200: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
c210: 74 46 72 6f 6d 4f 62 6a 28 70 2d 3e 69 6e 74 65  tFromObj(p->inte
c220: 72 70 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  rp, Tcl_GetObjRe
c230: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
c240: 20 26 69 52 65 73 29 0a 20 20 29 7b 0a 20 20 20   &iRes).  ){.   
c250: 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45   Tcl_BackgroundE
c260: 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b  rror(p->interp);
c270: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52  .  }.  Tcl_DecrR
c280: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
c290: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73  ;..  return iRes
c2a0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ;.}.static int t
c2b0: 65 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  est_create_colla
c2c0: 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e  tion_v2(.  Clien
c2d0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
c2e0: 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f  , /* Not used */
c2f0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
c300: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
c310: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
c320: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
c330: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
c340: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
c350: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c360: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
c370: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
c380: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
c390: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
c3a0: 2f 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61  /.){.  TestColla
c3b0: 74 69 6f 6e 58 20 2a 70 3b 0a 20 20 73 71 6c 69  tionX *p;.  sqli
c3c0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
c3d0: 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  objc!=5 ){.    T
c3e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
c3f0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
c400: 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45   "DB-HANDLE NAME
c410: 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52   CMP-PROC DEL-PR
c420: 4f 43 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OC");.    return
c430: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
c440: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
c450: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
c460: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
c470: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
c480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70   TCL_ERROR;..  p
c490: 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f   = (TestCollatio
c4a0: 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  nX *)sqlite3_mal
c4b0: 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65 73 74 43  loc(sizeof(TestC
c4c0: 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20 70  ollationX));.  p
c4d0: 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d  ->pCmp = objv[3]
c4e0: 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f 62  ;.  p->pDel = ob
c4f0: 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65  jv[4];.  p->inte
c500: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 54  rp = interp;.  T
c510: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c520: 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f  p->pCmp);.  Tcl_
c530: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  IncrRefCount(p->
c540: 70 44 65 6c 29 3b 0a 0a 20 20 73 71 6c 69 74 65  pDel);..  sqlite
c550: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
c560: 6f 6e 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47 65  on_v2(db, Tcl_Ge
c570: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
c580: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a  , SQLITE_UTF8, .
c590: 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c        (void *)p,
c5a0: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
c5b0: 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65  tionCmp, testCre
c5c0: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a  ateCollationDel.
c5d0: 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43    );.  return TC
c5e0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
c5f0: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c 6f  sage: sqlite3_lo
c600: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d  ad_extension DB-
c610: 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f  HANDLE FILE ?PRO
c620: 43 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  C?.*/.static int
c630: 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e   test_load_exten
c640: 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61  sion(.  ClientDa
c650: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
c660: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
c670: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c680: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
c690: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
c6a0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
c6b0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
c6c0: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
c6d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c6e0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
c6f0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
c700: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
c710: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
c720: 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  {.  Tcl_CmdInfo 
c730: 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  cmdInfo;.  sqlit
c740: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
c750: 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  ;.  char *zDb;. 
c760: 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
c770: 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20 30 3b  char *zProc = 0;
c780: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
c790: 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
c7a0: 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  4 && objc!=3 ){.
c7b0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
c7c0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
c7d0: 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45  objv, "DB-HANDLE
c7e0: 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29 3b 0a   FILE ?PROC?");.
c7f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c800: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
c810: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
c820: 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46 69 6c  objv[1]);.  zFil
c830: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
c840: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
c850: 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20  ( objc==4 ){.   
c860: 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47 65 74   zProc = Tcl_Get
c870: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
c880: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74 72 61  .  }..  /* Extra
c890: 63 74 20 74 68 65 20 43 20 64 61 74 61 62 61 73  ct the C databas
c8a0: 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68  e handle from th
c8b0: 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61  e Tcl command na
c8c0: 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c  me */.  if( !Tcl
c8d0: 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28  _GetCommandInfo(
c8e0: 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d  interp, zDb, &cm
c8f0: 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
c900: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
c910: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
c920: 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44  not found: ", zD
c930: 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  b, (char*)0);.  
c940: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c950: 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28  OR;.  }.  db = (
c960: 28 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62  (struct SqliteDb
c970: 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69  *)cmdInfo.objCli
c980: 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20  entData)->db;.  
c990: 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f  assert(db);..  /
c9a0: 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e 64 65 72  * Call the under
c9b0: 6c 79 69 6e 67 20 43 20 66 75 6e 63 74 69 6f 6e  lying C function
c9c0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
c9d0: 63 75 72 73 2c 20 73 65 74 20 72 63 20 74 6f 20  curs, set rc to 
c9e0: 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f 52 20  .  ** TCL_ERROR 
c9f0: 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65 72 72  and load any err
ca00: 6f 72 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 74  or string into t
ca10: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20  he interpreter. 
ca20: 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72 72 6f  If no .  ** erro
ca30: 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63  r occurs, set rc
ca40: 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20 2a 2f   to TCL_OK..  */
ca50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
ca60: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
ca70: 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  ON.  rc = SQLITE
ca80: 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72 20 3d  _ERROR;.  zErr =
ca90: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
caa0: 28 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d 69  ("this build omi
cab0: 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f  ts sqlite3_load_
cac0: 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 23  extension()");.#
cad0: 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69  else.  rc = sqli
cae0: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
caf0: 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50  on(db, zFile, zP
cb00: 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23 65 6e  roc, &zErr);.#en
cb10: 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
cb20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
cb30: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
cb40: 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45 72 72  erp, zErr ? zErr
cb50: 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c 41 54   : "", TCL_VOLAT
cb60: 49 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  ILE);.    rc = T
cb70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  CL_ERROR;.  }els
cb80: 65 7b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  e{.    rc = TCL_
cb90: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
cba0: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 0a 20  3_free(zErr);.. 
cbb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cbc0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
cbd0: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
cbe0: 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e  extension DB-HAN
cbf0: 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61  DLE ONOFF.*/.sta
cc00: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61  tic int test_ena
cc10: 62 6c 65 5f 6c 6f 61 64 28 0a 20 20 43 6c 69 65  ble_load(.  Clie
cc20: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
cc30: 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a  a, /* Not used *
cc40: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
cc50: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
cc60: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
cc70: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
cc80: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
cc90: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
cca0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ccb0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
ccc0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
ccd0: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
cce0: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
ccf0: 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49  */.){.  Tcl_CmdI
cd00: 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73  nfo cmdInfo;.  s
cd10: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68  qlite3 *db;.  ch
cd20: 61 72 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 6f  ar *zDb;.  int o
cd30: 6e 6f 66 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  noff;..  if( obj
cd40: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
cd50: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
cd60: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
cd70: 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 22 29  B-HANDLE ONOFF")
cd80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
cd90: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
cda0: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
cdb0: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f  g(objv[1]);..  /
cdc0: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 43 20  * Extract the C 
cdd0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
cde0: 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d  from the Tcl com
cdf0: 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  mand name */.  i
ce00: 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  f( !Tcl_GetComma
ce10: 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a  ndInfo(interp, z
ce20: 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  Db, &cmdInfo) ){
ce30: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
ce40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
ce50: 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64  ommand not found
ce60: 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a  : ", zDb, (char*
ce70: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
ce80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
ce90: 20 64 62 20 3d 20 28 28 73 74 72 75 63 74 20 53   db = ((struct S
cea0: 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f  qliteDb*)cmdInfo
ceb0: 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d  .objClientData)-
cec0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62  >db;.  assert(db
ced0: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  );..  /* Get the
cee0: 20 6f 6e 6f 66 66 20 70 61 72 61 6d 65 74 65 72   onoff parameter
cef0: 20 2a 2f 0a 20 20 69 66 28 20 54 63 6c 5f 47 65   */.  if( Tcl_Ge
cf00: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
cf10: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
cf20: 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20   &onoff) ){.    
cf30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cf40: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
cf50: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
cf60: 58 54 45 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f 41  XTENSION.  Tcl_A
cf70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
cf80: 72 70 2c 20 22 74 68 69 73 20 62 75 69 6c 64 20  rp, "this build 
cf90: 6f 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f  omits sqlite3_lo
cfa0: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29  ad_extension()")
cfb0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
cfc0: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 71  RROR;.#else.  sq
cfd0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61  lite3_enable_loa
cfe0: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20  d_extension(db, 
cff0: 6f 6e 6f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e  onoff);.  return
d000: 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a   TCL_OK;.#endif.
d010: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
d020: 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a   sqlite_abort.**
d030: 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
d040: 20 70 72 6f 63 65 73 73 20 69 6d 6d 65 64 69 61   process immedia
d050: 74 65 6c 79 2e 20 20 54 68 69 73 20 69 73 20 6e  tely.  This is n
d060: 6f 74 20 61 20 63 6c 65 61 6e 20 73 68 75 74 64  ot a clean shutd
d070: 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d  own..** This com
d080: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20  mand is used to 
d090: 74 65 73 74 20 74 68 65 20 72 65 63 6f 76 65 72  test the recover
d0a0: 61 62 69 6c 69 74 79 20 6f 66 20 61 20 64 61 74  ability of a dat
d0b0: 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20  abase in.** the 
d0c0: 65 76 65 6e 74 20 6f 66 20 61 20 70 72 6f 67 72  event of a progr
d0d0: 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61  am crash..*/.sta
d0e0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 61  tic int sqlite_a
d0f0: 62 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  bort(.  void *No
d100: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
d110: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
d120: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
d130: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
d140: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
d150: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d170: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
d180: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
d190: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
d1a0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
d1b0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
d1c0: 20 61 73 73 65 72 74 28 20 69 6e 74 65 72 70 3d   assert( interp=
d1d0: 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68 69 73 20  =0 );   /* This 
d1e0: 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c  will always fail
d1f0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
d200: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
d210: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
d220: 69 6e 65 20 69 73 20 61 20 75 73 65 72 2d 64 65  ine is a user-de
d230: 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69  fined SQL functi
d240: 6f 6e 20 77 68 6f 73 65 20 70 75 72 70 6f 73 65  on whose purpose
d250: 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73 74 20 74  .** is to test t
d260: 68 65 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65  he sqlite_set_re
d270: 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73  sult() API..*/.s
d280: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 46  tatic void testF
d290: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
d2a0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
d2b0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
d2c0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
d2d0: 20 77 68 69 6c 65 28 20 61 72 67 63 3e 3d 32 20   while( argc>=2 
d2e0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
d2f0: 72 20 2a 7a 41 72 67 30 20 3d 20 28 63 68 61 72  r *zArg0 = (char
d300: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
d310: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
d320: 20 20 20 69 66 28 20 7a 41 72 67 30 20 29 7b 0a     if( zArg0 ){.
d330: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
d340: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
d350: 30 2c 20 22 69 6e 74 22 29 20 29 7b 0a 20 20 20  0, "int") ){.   
d360: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
d370: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
d380: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
d390: 6e 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20  nt(argv[1]));.  
d3a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
d3b0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72  lite3StrICmp(zAr
d3c0: 67 30 2c 22 69 6e 74 36 34 22 29 3d 3d 30 20 29  g0,"int64")==0 )
d3d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d3e0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
d3f0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
d400: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
d410: 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [1]));.      }el
d420: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
d430: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 73 74 72  rICmp(zArg0,"str
d440: 69 6e 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ing")==0 ){.    
d450: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
d460: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
d470: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
d480: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
d490: 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20  1]), -1,.       
d4a0: 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e       SQLITE_TRAN
d4b0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65  SIENT);.      }e
d4c0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
d4d0: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f  trICmp(zArg0,"do
d4e0: 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  uble")==0 ){.   
d4f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
d500: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
d510: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
d520: 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d  e_double(argv[1]
d530: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
d540: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
d550: 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29  mp(zArg0,"null")
d560: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
d570: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
d580: 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ll(context);.   
d590: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
d5a0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
d5b0: 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b  0,"value")==0 ){
d5c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d5d0: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f  _result_value(co
d5e0: 6e 74 65 78 74 2c 20 61 72 67 76 5b 73 71 6c 69  ntext, argv[sqli
d5f0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
d600: 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20  gv[1])]);.      
d610: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 67  }else{.        g
d620: 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
d630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d640: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72  {.      goto err
d650: 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  or_out;.    }.  
d660: 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20    argc -= 2;.   
d670: 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a   argv += 2;.  }.
d680: 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72    return;..error
d690: 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f  _out:.  sqlite3_
d6a0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
d6b0: 74 65 78 74 2c 22 66 69 72 73 74 20 61 72 67 75  text,"first argu
d6c0: 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 6f  ment should be o
d6d0: 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20 20 22  ne of: ".      "
d6e0: 69 6e 74 20 69 6e 74 36 34 20 73 74 72 69 6e 67  int int64 string
d6f0: 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c   double null val
d700: 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a  ue", -1);.}../*.
d710: 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
d720: 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74  te_register_test
d730: 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e  _function  DB  N
d740: 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74  AME.**.** Regist
d750: 65 72 20 74 68 65 20 74 65 73 74 20 53 51 4c 20  er the test SQL 
d760: 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  function on the 
d770: 64 61 74 61 62 61 73 65 20 44 42 20 75 6e 64 65  database DB unde
d780: 72 20 74 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e  r the name NAME.
d790: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
d7a0: 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e  est_register_fun
d7b0: 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  c(.  void *NotUs
d7c0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
d7d0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
d7e0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
d7f0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
d800: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
d810: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
d820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d830: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
d840: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
d850: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
d860: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
d870: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
d880: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
d890: 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21   rc;.  if( argc!
d8a0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
d8b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d8c0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
d8d0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
d8e0: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
d8f0: 20 20 22 20 44 42 20 46 55 4e 43 54 49 4f 4e 2d    " DB FUNCTION-
d900: 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  NAME", 0);.    r
d910: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d920: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
d930: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
d940: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
d950: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d960: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
d970: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
d980: 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31  (db, argv[2], -1
d990: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
d9a0: 2c 20 0a 20 20 20 20 20 20 74 65 73 74 46 75 6e  , .      testFun
d9b0: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  c, 0, 0);.  if( 
d9c0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  rc!=0 ){.    Tcl
d9d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d9e0: 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72  terp, sqlite3Err
d9f0: 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  Str(rc), 0);.   
da00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
da10: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  R;.  }.  if( sql
da20: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
da30: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
da40: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
da50: 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
da60: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
da70: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 66 69  age:  sqlite3_fi
da80: 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20 0a 2a 2a  nalize  STMT .**
da90: 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20 73  .** Finalize a s
daa0: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e  tatement handle.
dab0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
dac0: 65 73 74 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20  est_finalize(.  
dad0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
dae0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
daf0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
db00: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
db10: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
db20: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
db30: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
db40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
db50: 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
db60: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
db70: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
db80: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
db90: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
dba0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
dbb0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
dbc0: 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54  jv[0], 0), " <ST
dbd0: 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  MT>", 0);.    re
dbe0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
dbf0: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
dc00: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
dc10: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
dc20: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
dc30: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
dc40: 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 70 53 74  RROR;..  if( pSt
dc50: 6d 74 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 53  mt ){.    db = S
dc60: 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 3b 0a  tmtToDb(pStmt);.
dc70: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
dc80: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
dc90: 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  t);.  Tcl_SetRes
dca0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
dcb0: 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
dcc0: 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
dcd0: 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 73 71  ;.  if( db && sq
dce0: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
dcf0: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
dd00: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
dd10: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
dd20: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
dd30: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72  sage:  sqlite3_r
dd40: 65 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a  eset  STMT .**.*
dd50: 2a 20 52 65 73 65 74 20 61 20 73 74 61 74 65 6d  * Reset a statem
dd60: 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ent handle..*/.s
dd70: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72  tatic int test_r
dd80: 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  eset(.  void * c
dd90: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
dda0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
ddb0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
ddc0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
ddd0: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
dde0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
ddf0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
de00: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
de10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
de20: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
de30: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
de40: 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
de50: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
de60: 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
de70: 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20  " <STMT>", 0);. 
de80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
de90: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
dea0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
deb0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
dec0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
ded0: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
dee0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
def0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
df00: 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70  (pStmt);.  if( p
df10: 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 54  Stmt && sqlite3T
df20: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
df30: 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
df40: 74 29 2c 20 72 63 29 20 29 7b 0a 20 20 20 20 72  t), rc) ){.    r
df50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
df60: 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65  .  }.  Tcl_SetRe
df70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
df80: 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
df90: 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
dfa0: 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 72 63 20 29  );./*.  if( rc )
dfb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
dfc0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a 20  _ERROR;.  }.*/. 
dfd0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
dfe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
dff0: 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64   sqlite3_expired
e000: 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74   STMT .**.** Ret
e010: 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 72 65  urn TRUE if a re
e020: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
e030: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
e040: 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a 2f 0a  recommended..*/.
e050: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
e060: 65 78 70 69 72 65 64 28 0a 20 20 76 6f 69 64 20  expired(.  void 
e070: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
e080: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
e090: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
e0a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
e0b0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
e0c0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
e0d0: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
e0e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
e0f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e100: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
e110: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
e120: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
e130: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
e140: 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e  0], 0), " <STMT>
e150: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
e160: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
e170: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
e180: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
e190: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e1a0: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
e1b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e1c0: 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
e1d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
e1e0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 73  _NewBooleanObj(s
e1f0: 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28 70  qlite3_expired(p
e200: 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
e210: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
e220: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
e230: 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64  e3_transfer_bind
e240: 69 6e 67 73 20 46 52 4f 4d 53 54 4d 54 20 54 4f  ings FROMSTMT TO
e250: 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  STMT.**.** Trans
e260: 66 65 72 20 61 6c 6c 20 62 69 6e 64 69 6e 67 73  fer all bindings
e270: 20 66 72 6f 6d 20 46 52 4f 4d 53 54 4d 54 20 6f   from FROMSTMT o
e280: 76 65 72 20 74 6f 20 54 4f 53 54 4d 54 0a 2a 2f  ver to TOSTMT.*/
e290: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
e2a0: 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 28 0a  _transfer_bind(.
e2b0: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
e2c0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
e2d0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
e2e0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
e2f0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
e300: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
e310: 20 2a 70 53 74 6d 74 31 2c 20 2a 70 53 74 6d 74   *pStmt1, *pStmt
e320: 32 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  2;.  if( objc!=3
e330: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
e340: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e350: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
e360: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
e370: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
e380: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
e390: 5b 30 5d 2c 20 30 29 2c 20 22 20 46 52 4f 4d 2d  [0], 0), " FROM-
e3a0: 53 54 4d 54 20 54 4f 2d 53 54 4d 54 22 2c 20 30  STMT TO-STMT", 0
e3b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
e3c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
e3d0: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
e3e0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
e3f0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
e400: 2c 20 26 70 53 74 6d 74 31 29 29 20 72 65 74 75  , &pStmt1)) retu
e410: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e420: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
e430: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
e440: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
e450: 29 2c 20 26 70 53 74 6d 74 32 29 29 20 72 65 74  ), &pStmt2)) ret
e460: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e470: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
e480: 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  t(interp, .     
e490: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
e4a0: 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62  lite3_transfer_b
e4b0: 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 31 2c 70  indings(pStmt1,p
e4c0: 53 74 6d 74 32 29 29 29 3b 0a 20 20 72 65 74 75  Stmt2)));.  retu
e4d0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
e4e0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
e4f0: 74 65 33 5f 63 68 61 6e 67 65 73 20 44 42 0a 2a  te3_changes DB.*
e500: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
e510: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65  number of change
e520: 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  s made to the da
e530: 74 61 62 61 73 65 20 62 79 20 74 68 65 20 6c 61  tabase by the la
e540: 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75 74  st SQL.** execut
e550: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
e560: 6e 74 20 74 65 73 74 5f 63 68 61 6e 67 65 73 28  nt test_changes(
e570: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
e580: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
e590: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
e5a0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
e5b0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
e5c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
e5d0: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
e5e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
e5f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e600: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
e610: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
e620: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
e630: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
e640: 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
e650: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e660: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
e670: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
e680: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
e690: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
e6a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e6b0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
e6c0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
e6d0: 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  IntObj(sqlite3_c
e6e0: 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a 20 20  hanges(db)));.  
e6f0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
e700: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
e710: 74 68 65 20 22 73 74 61 74 69 63 5f 62 69 6e 64  the "static_bind
e720: 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76 61 72  _value" that var
e730: 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75 6e 64  iables are bound
e740: 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20   to when.** the 
e750: 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20 73  FLAG option of s
e760: 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73 20 22  qlite3_bind is "
e770: 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74 69  static".*/.stati
e780: 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 73  c char *sqlite_s
e790: 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
e7a0: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74   = 0;.static int
e7b0: 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62   sqlite_static_b
e7c0: 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b 0a 0a  ind_nbyte = 0;..
e7d0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
e7e0: 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20 20  lite3_bind  VM  
e7f0: 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41 47  IDX  VALUE  FLAG
e800: 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68 65  S.**.** Sets the
e810: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49 44   value of the ID
e820: 58 2d 74 68 20 6f 63 63 75 72 61 6e 63 65 20 6f  X-th occurance o
e830: 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f 72 69  f "?" in the ori
e840: 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74 72  ginal SQL.** str
e850: 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73 20 74  ing.  VALUE is t
e860: 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20 20 49  he new value.  I
e870: 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22 20  f FLAGS=="null" 
e880: 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a 2a  then VALUE is.**
e890: 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74 68 65   ignored and the
e8a0: 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f   value is set to
e8b0: 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47 53   NULL.  If FLAGS
e8c0: 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65 6e 0a  =="static" then.
e8d0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  ** the value is 
e8e0: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
e8f0: 20 6f 66 20 61 20 73 74 61 74 69 63 20 76 61 72   of a static var
e900: 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 22  iable named.** "
e910: 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
e920: 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66 20 46  nd_value".  If F
e930: 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74  LAGS=="normal" t
e940: 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66  hen a copy.** of
e950: 20 74 68 65 20 56 41 4c 55 45 20 69 73 20 6d 61   the VALUE is ma
e960: 64 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  de.  If FLAGS=="
e970: 62 6c 6f 62 31 30 22 20 74 68 65 6e 20 61 20 56  blob10" then a V
e980: 41 4c 55 45 20 69 73 20 69 67 6e 6f 72 65 64 0a  ALUE is ignored.
e990: 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79 74 65 20  ** an a 10-byte 
e9a0: 62 6c 6f 62 20 22 61 62 63 5c 30 30 30 78 79 7a  blob "abc\000xyz
e9b0: 5c 30 30 30 70 71 22 20 69 73 20 69 6e 73 65 72  \000pq" is inser
e9c0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
e9d0: 6e 74 20 74 65 73 74 5f 62 69 6e 64 28 0a 20 20  nt test_bind(.  
e9e0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
e9f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
ea00: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
ea10: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
ea20: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
ea30: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
ea40: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
ea50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ea60: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
ea70: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
ea80: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
ea90: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
eaa0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
eab0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
eac0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
ead0: 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  x;.  if( argc!=5
eae0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
eaf0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
eb00: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
eb10: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
eb20: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
eb30: 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45 20 28  " VM IDX VALUE (
eb40: 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d  null|static|norm
eb50: 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  al)\"", 0);.    
eb60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
eb70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
eb80: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
eb90: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70 53 74  p, argv[1], &pSt
eba0: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
ebb0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
ebc0: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
ebd0: 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78 29 20   argv[2], &idx) 
ebe0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
ebf0: 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  OR;.  if( strcmp
ec00: 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29  (argv[4],"null")
ec10: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
ec20: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
ec30: 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20  l(pStmt, idx);. 
ec40: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
ec50: 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69  p(argv[4],"stati
ec60: 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  c")==0 ){.    rc
ec70: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
ec80: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
ec90: 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62   sqlite_static_b
eca0: 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30  ind_value, -1, 0
ecb0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
ecc0: 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73  trcmp(argv[4],"s
ecd0: 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29 3d 3d  tatic-nbytes")==
ece0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
ecf0: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
ed00: 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69  pStmt, idx, sqli
ed10: 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
ed20: 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20  alue,.          
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
ed50: 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
ed60: 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c  nbyte, 0);.  }el
ed70: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
ed80: 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d  gv[4],"normal")=
ed90: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
eda0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
edb0: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61 72 67  (pStmt, idx, arg
edc0: 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  v[3], -1, SQLITE
edd0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
ede0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
edf0: 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31 30 22  argv[4],"blob10"
ee00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
ee10: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
ee20: 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 22  xt(pStmt, idx, "
ee30: 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71  abc\000xyz\000pq
ee40: 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f 53 54  ", 10, SQLITE_ST
ee50: 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ATIC);.  }else{.
ee60: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
ee70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 34 74  sult(interp, "4t
ee80: 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  h argument shoul
ee90: 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 22  d be ".        "
eea0: 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73 74  \"null\" or \"st
eeb0: 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d  atic\" or \"norm
eec0: 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  al\"", 0);.    r
eed0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
eee0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
eef0: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
ef00: 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
ef10: 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
ef20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ef30: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63   if( rc ){.    c
ef40: 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
ef50: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
ef60: 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20  "(%d) ", rc);.  
ef70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ef80: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
ef90: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
efa0: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
efb0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
efc0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
efd0: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
efe0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
eff0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64  /*.** Usage: add
f000: 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 64  _test_collate <d
f010: 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75  b ptr> <utf8> <u
f020: 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65  tf16le> <utf16be
f030: 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  >.**.** This fun
f040: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
f050: 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
f060: 65 20 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f  e selects the co
f070: 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a  rrect collation.
f080: 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61 6c 6c  ** sequence call
f090: 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70  back when multip
f0a0: 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72  le versions (for
f0b0: 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20   different text 
f0c0: 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72  encodings).** ar
f0d0: 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  e available..**.
f0e0: 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
f0f0: 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
f100: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
f110: 73 65 71 75 65 6e 63 65 20 22 74 65 73 74 5f 63  sequence "test_c
f120: 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74 68 20  ollate".** with 
f130: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
f140: 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f 6e 64  <db>. The second
f150: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
f160: 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65  e a list of thre
f170: 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  e.** boolean val
f180: 75 65 73 2e 20 49 66 20 74 68 65 20 66 69 72 73  ues. If the firs
f190: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
f1a0: 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73  a version of tes
f1b0: 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a 20  t_collate is.** 
f1c0: 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55  registered for U
f1d0: 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73 65 63  TF-8, if the sec
f1e0: 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61 20 76  ond is true, a v
f1f0: 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74  ersion is regist
f200: 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54 46 2d  ered for.** UTF-
f210: 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74 68 69  16le, if the thi
f220: 72 64 20 69 73 20 74 72 75 65 2c 20 61 20 55 54  rd is true, a UT
f230: 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20 69  F-16be version i
f240: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20  s available..** 
f250: 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e  Previous version
f260: 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74  s of test_collat
f270: 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a  e are deleted..*
f280: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
f290: 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65 73 74  on sequence test
f2a0: 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d 70 6c  _collate is impl
f2b0: 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c 69  emented by calli
f2c0: 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  ng the.** follow
f2d0: 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a  ing TCL script:.
f2e0: 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 63 6f  **.**   "test_co
f2f0: 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c 68 73  llate <enc> <lhs
f300: 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54  > <rhs>".**.** T
f310: 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c 72 68  he <lhs> and <rh
f320: 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f 20 76  s> are the two v
f330: 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f 6d 70  alues being comp
f340: 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20 69 6e  ared, encoded in
f350: 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c   UTF-8..** The <
f360: 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72 20 69  enc> parameter i
f370: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f  s the encoding o
f380: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
f390: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
f3a0: 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 65 64   SQLite selected
f3b0: 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20 54 43   to call. The TC
f3c0: 4c 20 74 65 73 74 20 73 63 72 69 70 74 20 69 6d  L test script im
f3d0: 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20  plements the.** 
f3e0: 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 20 70  "test_collate" p
f3f0: 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  roc..**.** Note 
f400: 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c 20 6f  that this will o
f410: 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20 6f 6e  nly work with on
f420: 65 20 69 6e 74 65 70 72 65 74 65 72 20 61 74 20  e intepreter at 
f430: 61 20 74 69 6d 65 2c 20 61 73 20 74 68 65 0a 2a  a time, as the.*
f440: 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e 74 65 72  * interp pointer
f450: 20 74 6f 20 75 73 65 20 77 68 65 6e 20 65 76 61   to use when eva
f460: 6c 75 61 74 69 6e 67 20 74 68 65 20 54 43 4c 20  luating the TCL 
f470: 73 63 72 69 70 74 20 69 73 20 73 74 6f 72 65 64  script is stored
f480: 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f 6c 6c   in.** pTestColl
f490: 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74  ateInterp..*/.st
f4a0: 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72 70 2a  atic Tcl_Interp*
f4b0: 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
f4c0: 65 72 70 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  erp;.static int 
f4d0: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
f4e0: 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  c(.  void *pCtx,
f4f0: 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73   .  int nA, cons
f500: 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e  t void *zA,.  in
f510: 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64  t nB, const void
f520: 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e   *zB.){.  Tcl_In
f530: 74 65 72 70 20 2a 69 20 3d 20 70 54 65 73 74 43  terp *i = pTestC
f540: 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 20 20  ollateInterp;.  
f550: 69 6e 74 20 65 6e 63 69 6e 20 3d 20 28 69 6e 74  int encin = (int
f560: 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 72 65 73  )pCtx;.  int res
f570: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71  ;.  int n;..  sq
f580: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
f590: 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  l;.  Tcl_Obj *pX
f5a0: 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  ;..  pX = Tcl_Ne
f5b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
f5c0: 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a  _collate", -1);.
f5d0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
f5e0: 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63  nt(pX);..  switc
f5f0: 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20  h( encin ){.    
f600: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38  case SQLITE_UTF8
f610: 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
f620: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f630: 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
f640: 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d  ingObj("UTF-8",-
f650: 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  1));.      break
f660: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
f670: 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20  E_UTF16LE:.     
f680: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f690: 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54  ndElement(i,pX,T
f6a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f6b0: 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b  "UTF-16LE",-1));
f6c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f6d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
f6e0: 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c  F16BE:.      Tcl
f6f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
f700: 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
f710: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
f720: 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20  -16BE",-1));.   
f730: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
f740: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
f750: 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 70  ert(0);.  }..  p
f760: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
f770: 75 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74  ueNew();.  sqlit
f780: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
f790: 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69  al, nA, zA, enci
f7a0: 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
f7b0: 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
f7c0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
f7d0: 6c 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  l);.  Tcl_ListOb
f7e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f7f0: 2c 70 58 2c 0a 20 20 20 20 20 20 54 63 6c 5f 4e  ,pX,.      Tcl_N
f800: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
f810: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
f820: 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b  _text(pVal),n));
f830: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
f840: 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c 20  etStr(pVal, nB, 
f850: 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54  zB, encin, SQLIT
f860: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 6e 20 3d  E_STATIC);.  n =
f870: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
f880: 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 54 63  ytes(pVal);.  Tc
f890: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f8a0: 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20 20  lement(i,pX,.   
f8b0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
f8c0: 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74  Obj((char*)sqlit
f8d0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
f8e0: 61 6c 29 2c 6e 29 29 3b 0a 20 20 73 71 6c 69 74  al),n));.  sqlit
f8f0: 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
f900: 29 3b 0a 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  );..  Tcl_EvalOb
f910: 6a 45 78 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20  jEx(i, pX, 0);. 
f920: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
f930: 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74  t(pX);.  Tcl_Get
f940: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63  IntFromObj(i, Tc
f950: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
f960: 29 2c 20 26 72 65 73 29 3b 0a 20 20 72 65 74 75  ), &res);.  retu
f970: 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63  rn res;.}.static
f980: 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74   int test_collat
f990: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
f9a0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
f9b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
f9c0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
f9d0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
f9e0: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
f9f0: 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20  db;.  int val;. 
fa00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
fa10: 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVal;.  int rc;.
fa20: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
fa30: 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a   goto bad_args;.
fa40: 20 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e    pTestCollateIn
fa50: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
fa60: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
fa70: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
fa80: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
fa90: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
faa0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66  TCL_ERROR;..  if
fab0: 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
fac0: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
fad0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
fae0: 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
faf0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
fb00: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
fb10: 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
fb20: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53  test_collate", S
fb30: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
fb40: 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53         (void *)S
fb50: 51 4c 49 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f  QLITE_UTF8, val?
fb60: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
fb70: 63 3a 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  c:0);.  if( rc==
fb80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
fb90: 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
fba0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
fbb0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
fbc0: 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  3], &val) ) retu
fbd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fbe0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
fbf0: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
fc00: 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74  db, "test_collat
fc10: 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  e", SQLITE_UTF16
fc20: 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  LE, .           
fc30: 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f   (void *)SQLITE_
fc40: 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74 65 73  UTF16LE, val?tes
fc50: 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30  t_collate_func:0
fc60: 29 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f  );.    if( TCL_O
fc70: 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
fc80: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
fc90: 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20   objv[4], &val) 
fca0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
fcb0: 4f 52 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  OR;..#ifdef SQLI
fcc0: 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20 20  TE_MEMDEBUG.    
fcd0: 69 66 28 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c  if( sqlite3_iMal
fce0: 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a 20 20 20  locFail>0 ){.   
fcf0: 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c     sqlite3_iMall
fd00: 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a  ocFail++;.    }.
fd10: 23 65 6e 64 69 66 0a 20 20 20 20 70 56 61 6c 20  #endif.    pVal 
fd20: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
fd30: 77 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  w();.    sqlite3
fd40: 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
fd50: 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f 6c 6c  , -1, "test_coll
fd60: 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ate", SQLITE_UTF
fd70: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
fd80: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
fd90: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
fda0: 74 69 6f 6e 31 36 28 64 62 2c 20 0a 20 20 20 20  tion16(db, .    
fdb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
fdc0: 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
fdd0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
fde0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
fdf0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f  , .          (vo
fe00: 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31  id *)SQLITE_UTF1
fe10: 36 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f  6BE, val?test_co
fe20: 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20  llate_func:0);. 
fe30: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
fe40: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20  ree(pVal);.  }. 
fe50: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
fe60: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
fe70: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
fe80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a 20   TCL_ERROR;.  . 
fe90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fea0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
feb0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
fec0: 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  p, sqlite3TestEr
fed0: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
fee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
fef0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
ff00: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64  urn TCL_OK;..bad
ff10: 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70  _args:.  Tcl_App
ff20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ff30: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
ff40: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
ff50: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
ff60: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
ff70: 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c  0], 0), " <DB> <
ff80: 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20  utf8> <utf16le> 
ff90: 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a  <utf16be>", 0);.
ffa0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ffb0: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  OR;.}../*.** Whe
ffc0: 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  n the collation 
ffd0: 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 20  needed callback 
ffe0: 69 73 20 69 6e 76 6f 6b 65 64 2c 20 72 65 63 6f  is invoked, reco
fff0: 72 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 0a  rd the name of .
10000 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
10010 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
10020 69 6f 6e 20 68 65 72 65 2e 20 20 54 68 65 20 72  ion here.  The r
10030 65 63 6f 72 64 65 64 20 6e 61 6d 65 20 69 73 20  ecorded name is 
10040 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f 20 61 20 54  linked.** to a T
10050 43 4c 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20  CL variable and 
10060 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
10070 65 20 74 68 61 74 20 74 68 65 20 72 65 71 75 65  e that the reque
10080 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a  sted collation.*
10090 2a 20 6e 61 6d 65 20 69 73 20 63 6f 72 72 65 63  * name is correc
100a0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  t..*/.static cha
100b0 72 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69  r zNeededCollati
100c0 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61 74 69 63 20  on[200];.static 
100d0 63 68 61 72 20 2a 70 7a 4e 65 65 64 65 64 43 6f  char *pzNeededCo
100e0 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e 65 65 64 65  llation = zNeede
100f0 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a  dCollation;.../*
10100 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20  .** Called when 
10110 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
10120 65 6e 63 65 20 69 73 20 6e 65 65 64 65 64 2e 20  ence is needed. 
10130 20 52 65 67 69 73 74 65 72 65 64 20 75 73 69 6e   Registered usin
10140 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  g.** sqlite3_col
10150 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28  lation_needed16(
10160 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
10170 64 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  d test_collate_n
10180 65 65 64 65 64 5f 63 62 28 0a 20 20 76 6f 69 64  eeded_cb(.  void
10190 20 2a 70 43 74 78 2c 20 0a 20 20 73 71 6c 69 74   *pCtx, .  sqlit
101a0 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 54  e3 *db,.  int eT
101b0 65 78 74 52 65 70 2c 0a 20 20 63 6f 6e 73 74 20  extRep,.  const 
101c0 76 6f 69 64 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20  void *pName.){. 
101d0 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 64   int enc = ENC(d
101e0 62 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  b);.  int i;.  c
101f0 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20  har *z;.  for(z 
10200 3d 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2c 20  = (char*)pName, 
10210 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b  i=0; *z || z[1];
10220 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
10230 7a 20 29 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  z ) zNeededColla
10240 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a  tion[i++] = *z;.
10250 20 20 7d 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c    }.  zNeededCol
10260 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20  lation[i] = 0;. 
10270 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
10280 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 20 20 20  collation(.     
10290 20 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61   db, "test_colla
102a0 74 65 22 2c 20 45 4e 43 28 64 62 29 2c 20 28 76  te", ENC(db), (v
102b0 6f 69 64 20 2a 29 65 6e 63 2c 20 74 65 73 74 5f  oid *)enc, test_
102c0 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d  collate_func);.}
102d0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  ../*.** Usage: a
102e0 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  dd_test_collate_
102f0 6e 65 65 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61  needed DB.*/.sta
10300 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
10310 6c 61 74 65 5f 6e 65 65 64 65 64 28 0a 20 20 76  late_needed(.  v
10320 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
10330 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
10340 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
10350 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
10360 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
10370 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
10380 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
10390 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20 62 61  bjc!=2 ) goto ba
103a0 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65  d_args;.  if( ge
103b0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
103c0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
103d0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
103e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
103f0 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
10400 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
10410 64 65 64 31 36 28 64 62 2c 20 30 2c 20 74 65 73  ded16(db, 0, tes
10420 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64  t_collate_needed
10430 5f 63 62 29 3b 0a 20 20 7a 4e 65 65 64 65 64 43  _cb);.  zNeededC
10440 6f 6c 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b  ollation[0] = 0;
10450 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
10460 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
10470 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
10480 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10490 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a  return TCL_OK;..
104a0 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f  bad_args:.  Tcl_
104b0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
104c0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
104d0 42 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  B");.  return TC
104e0 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  L_ERROR;.}../*.*
104f0 2a 20 74 63 6c 63 6d 64 3a 20 20 20 61 64 64 5f  * tclcmd:   add_
10500 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63  alignment_test_c
10510 6f 6c 6c 61 74 69 6f 6e 73 20 20 44 42 0a 2a 2a  ollations  DB.**
10520 0a 2a 2a 20 41 64 64 20 74 77 6f 20 6e 65 77 20  .** Add two new 
10530 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
10540 63 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ces to the datab
10550 61 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20  ase DB.**.**    
10560 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 0a 2a   utf16_aligned.*
10570 2a 20 20 20 20 20 75 74 66 31 36 5f 75 6e 61 6c  *     utf16_unal
10580 69 67 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68  igned.**.** Both
10590 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
105a0 6e 63 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  nces use the sam
105b0 65 20 73 6f 72 74 20 6f 72 64 65 72 20 61 73 20  e sort order as 
105c0 42 49 4e 41 52 59 2e 0a 2a 2a 20 54 68 65 20 6f  BINARY..** The o
105d0 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20 69  nly difference i
105e0 73 20 74 68 61 74 20 74 68 65 20 75 74 66 31 36  s that the utf16
105f0 5f 61 6c 69 67 6e 65 64 20 63 6f 6c 6c 61 74 69  _aligned collati
10600 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 69  ng.** sequence i
10610 73 20 64 65 63 6c 61 72 65 64 20 77 69 74 68 20  s declared with 
10620 74 68 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36  the SQLITE_UTF16
10630 5f 41 4c 49 47 4e 45 44 20 66 6c 61 67 2e 0a 2a  _ALIGNED flag..*
10640 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67  * Both collating
10650 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 63 72 65   functions incre
10660 6d 65 6e 74 20 74 68 65 20 75 6e 61 6c 69 67 6e  ment the unalign
10670 65 64 20 75 74 66 31 36 20 63 6f 75 6e 74 65 72  ed utf16 counter
10680 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 74 68 65  .** whenever the
10690 79 20 73 65 65 20 61 20 73 74 72 69 6e 67 20 74  y see a string t
106a0 68 61 74 20 62 65 67 69 6e 73 20 6f 6e 20 61 6e  hat begins on an
106b0 20 6f 64 64 20 62 79 74 65 20 62 6f 75 6e 64 61   odd byte bounda
106c0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
106d0 74 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69  t unaligned_stri
106e0 6e 67 5f 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a  ng_counter = 0;.
106f0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 69 67 6e  static int align
10700 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a 20 20  mentCollFunc(.  
10710 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
10720 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
10730 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20  t void *pKey1,. 
10740 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
10750 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
10760 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20  .  int rc, n;.  
10770 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20  n = nKey1<nKey2 
10780 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b  ? nKey1 : nKey2;
10790 0a 20 20 69 66 28 20 6e 4b 65 79 31 3e 30 20 26  .  if( nKey1>0 &
107a0 26 20 31 3d 3d 28 31 26 28 69 6e 74 29 70 4b 65  & 1==(1&(int)pKe
107b0 79 31 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f  y1) ) unaligned_
107c0 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b  string_counter++
107d0 3b 0a 20 20 69 66 28 20 6e 4b 65 79 32 3e 30 20  ;.  if( nKey2>0 
107e0 26 26 20 31 3d 3d 28 31 26 28 69 6e 74 29 70 4b  && 1==(1&(int)pK
107f0 65 79 32 29 20 29 20 75 6e 61 6c 69 67 6e 65 64  ey2) ) unaligned
10800 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b  _string_counter+
10810 2b 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70  +;.  rc = memcmp
10820 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e  (pKey1, pKey2, n
10830 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
10840 7b 0a 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31  {.    rc = nKey1
10850 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20   - nKey2;.  }.  
10860 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
10870 74 69 63 20 69 6e 74 20 61 64 64 5f 61 6c 69 67  tic int add_alig
10880 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
10890 74 69 6f 6e 73 28 0a 20 20 76 6f 69 64 20 2a 20  tions(.  void * 
108a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
108b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
108c0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
108d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
108e0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
108f0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62  e3 *db;.  if( ob
10900 6a 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc>=2 ){.    if(
10910 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
10920 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
10930 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
10940 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
10950 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
10960 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
10970 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 75  ion(db, "utf16_u
10980 6e 61 6c 69 67 6e 65 64 22 2c 0a 20 20 20 20 20  naligned",.     
10990 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c     SQLITE_UTF16,
109a0 20 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69   .        0, ali
109b0 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b  gnmentCollFunc);
109c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
109d0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
109e0 2c 20 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64  , "utf16_aligned
109f0 22 2c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  ",.        SQLIT
10a00 45 5f 55 54 46 31 36 20 7c 20 53 51 4c 49 54 45  E_UTF16 | SQLITE
10a10 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20  _UTF16_ALIGNED, 
10a20 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67  .        0, alig
10a30 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a  nmentCollFunc);.
10a40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10a50 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
10a60 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
10a70 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20  ITE_OMIT_UTF16) 
10a80 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  */../*.** Usage:
10a90 20 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69   add_test_functi
10aa0 6f 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66  on <db ptr> <utf
10ab0 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74  8> <utf16le> <ut
10ac0 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69  f16be>.**.** Thi
10ad0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
10ae0 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  ed to test that 
10af0 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74  SQLite selects t
10b00 68 65 20 63 6f 72 72 65 63 74 20 75 73 65 72 0a  he correct user.
10b10 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ** function call
10b20 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70  back when multip
10b30 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72  le versions (for
10b40 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20   different text 
10b50 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72  encodings).** ar
10b60 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  e available..**.
10b70 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
10b80 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
10b90 73 20 75 70 20 74 6f 20 74 68 72 65 65 20 76 65  s up to three ve
10ba0 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75 73  rsions of the us
10bb0 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22  er function.** "
10bc0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77  test_function" w
10bd0 69 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e  ith database han
10be0 64 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74 68  dle <db>.  If th
10bf0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
10c00 74 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68  t is.** true, th
10c10 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  en a version of 
10c20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73  test_function is
10c30 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
10c40 55 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a  UTF-8, if the.**
10c50 20 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20   third is true, 
10c60 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67  a version is reg
10c70 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d  istered for UTF-
10c80 31 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f 75  16le, if the fou
10c90 72 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20  rth is.** true, 
10ca0 61 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69  a UTF-16be versi
10cb0 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  on is available.
10cc0 20 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69    Previous versi
10cd0 6f 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66  ons of.** test_f
10ce0 75 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c 65  unction are dele
10cf0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75  ted..**.** The u
10d00 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ser function is 
10d10 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63  implemented by c
10d20 61 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  alling the follo
10d30 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a  wing TCL script:
10d40 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66  .**.**   "test_f
10d50 75 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61  unction <enc> <a
10d60 72 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65  rg>".**.** Where
10d70 20 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66   <enc> is one of
10d80 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45   UTF-8, UTF-16LE
10d90 20 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e 64   or UTF16BE, and
10da0 20 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a   <arg> is the.**
10db0 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
10dc0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 53   passed to the S
10dd0 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  QL function. The
10de0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
10df0 62 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73 63  by.** the TCL sc
10e00 72 69 70 74 20 69 73 20 75 73 65 64 20 61 73 20  ript is used as 
10e10 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
10e20 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63   of the SQL func
10e30 74 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70  tion. It.** is p
10e40 61 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65 20  assed to SQLite 
10e50 75 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20 66  using UTF-16BE f
10e60 6f 72 20 61 20 55 54 46 2d 38 20 74 65 73 74 5f  or a UTF-8 test_
10e70 66 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d  function(), UTF-
10e80 38 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d 31  8.** for a UTF-1
10e90 36 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  6LE test_functio
10ea0 6e 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c  n(), and UTF-16L
10eb0 45 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65  E for an impleme
10ec0 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  ntation that.** 
10ed0 70 72 65 66 65 72 73 20 55 54 46 2d 31 36 42 45  prefers UTF-16BE
10ee0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
10ef0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73  ITE_OMIT_UTF16.s
10f00 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
10f10 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20  function_utf8(. 
10f20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
10f30 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
10f40 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
10f50 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
10f60 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10f70 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
10f80 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
10f90 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
10fa0 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
10fb0 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
10fc0 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
10fd0 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
10fe0 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
10ff0 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
11000 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
11010 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
11020 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11030 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
11040 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
11050 38 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  8", -1));.  Tcl_
11060 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11070 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
11080 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53   .      Tcl_NewS
11090 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
110a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
110b0 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29  xt(argv[0]), -1)
110c0 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
110d0 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30  Ex(interp, pX, 0
110e0 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
110f0 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c  Count(pX);.  sql
11100 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
11110 28 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74  (pCtx, Tcl_GetSt
11120 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
11130 70 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  p), -1, SQLITE_T
11140 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61  RANSIENT);.  pVa
11150 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
11160 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  New();.  sqlite3
11170 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
11180 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
11190 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
111a0 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
111b0 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
111c0 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
111d0 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65  _result_text16be
111e0 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
111f0 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70 56  alue_text16be(pV
11200 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
11210 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
11220 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
11230 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74  Free(pVal);.}.st
11240 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66  atic void test_f
11250 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28  unction_utf16le(
11260 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
11270 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
11280 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
11290 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
112a0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
112b0 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
112c0 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *pX;.  sqlite3_
112d0 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
112e0 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74  nterp = (Tcl_Int
112f0 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73  erp *)sqlite3_us
11300 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
11310 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72   pX = Tcl_NewStr
11320 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e  ingObj("test_fun
11330 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54  ction", -1);.  T
11340 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
11350 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pX);.  Tcl_ListO
11360 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11370 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f  interp, pX, Tcl_
11380 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
11390 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20  F-16LE", -1));. 
113a0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
113b0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
113c0 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
113d0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
113e0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
113f0 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
11400 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
11410 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
11420 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pX, 0);.  Tcl_De
11430 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
11440 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
11450 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20 73 71  ValueNew();.  sq
11460 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
11470 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47  (pVal, -1, Tcl_G
11480 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
11490 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53  nterp), .      S
114a0 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
114b0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
114c0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
114d0 74 28 70 43 74 78 2c 28 63 68 61 72 2a 29 73 71  t(pCtx,(char*)sq
114e0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
114f0 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54 45  (pVal),-1,SQLITE
11500 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
11510 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
11520 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20  pVal);.}.static 
11530 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69  void test_functi
11540 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73 71  on_utf16be(.  sq
11550 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
11560 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
11570 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
11580 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63  e **argv.){.  Tc
11590 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
115a0 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
115b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
115c0 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70   *pVal;.  interp
115d0 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a   = (Tcl_Interp *
115e0 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
115f0 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d  ta(pCtx);.  pX =
11600 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11610 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  j("test_function
11620 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
11630 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
11640 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
11650 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11660 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74  p, pX, Tcl_NewSt
11670 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42  ringObj("UTF-16B
11680 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  E", -1));.  Tcl_
11690 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
116a0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
116b0 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53   .      Tcl_NewS
116c0 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
116d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
116e0 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29  xt(argv[0]), -1)
116f0 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
11700 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30  Ex(interp, pX, 0
11710 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
11720 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61  Count(pX);.  pVa
11730 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
11740 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  New();.  sqlite3
11750 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
11760 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
11770 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
11780 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
11790 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
117a0 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
117b0 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65  _result_text16le
117c0 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
117d0 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56  alue_text16le(pV
117e0 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
117f0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
11800 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
11810 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65  Free(pVal);.}.#e
11820 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11830 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61  MIT_UTF16 */.sta
11840 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66 75 6e  tic int test_fun
11850 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20  ction(.  void * 
11860 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
11870 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
11880 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
11890 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
118a0 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
118b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
118c0 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  16.  sqlite3 *db
118d0 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20  ;.  int val;..  
118e0 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f  if( objc!=5 ) go
118f0 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69  to bad_args;.  i
11900 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
11910 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
11920 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
11930 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
11940 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
11950 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
11960 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
11970 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
11980 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
11990 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76  L_ERROR;.  if( v
119a0 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
119b0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
119c0 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63  n(db, "test_func
119d0 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45  tion", 1, SQLITE
119e0 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20  _UTF8, .        
119f0 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
11a00 63 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30  ction_utf8, 0, 0
11a10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c  );.  }.  if( TCL
11a20 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
11a30 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
11a40 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
11a50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11a60 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20  RROR;.  if( val 
11a70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
11a80 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
11a90 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  b, "test_functio
11aa0 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  n", 1, SQLITE_UT
11ab0 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  F16LE, .        
11ac0 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
11ad0 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30  ction_utf16le, 0
11ae0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
11af0 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
11b00 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
11b10 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
11b20 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
11b30 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76  L_ERROR;.  if( v
11b40 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
11b50 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11b60 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63  n(db, "test_func
11b70 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45  tion", 1, SQLITE
11b80 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20  _UTF16BE, .     
11b90 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f     interp, test_
11ba0 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65  function_utf16be
11bb0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
11bc0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62  return TCL_OK;.b
11bd0 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41  ad_args:.  Tcl_A
11be0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11bf0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
11c00 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
11c10 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  ,.      Tcl_GetS
11c20 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
11c30 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e  v[0], 0), " <DB>
11c40 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
11c50 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29  > <utf16be>", 0)
11c60 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
11c70 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
11c80 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
11c90 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  ROR;.}../*.** Us
11ca0 61 67 65 3a 20 20 20 20 20 20 20 20 20 74 65 73  age:         tes
11cb0 74 5f 65 72 72 73 74 72 20 3c 65 72 72 20 63 6f  t_errstr <err co
11cc0 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  de>.**.** Test t
11cd0 68 61 74 20 74 68 65 20 65 6e 67 6c 69 73 68 20  hat the english 
11ce0 6c 61 6e 67 75 61 67 65 20 73 74 72 69 6e 67 20  language string 
11cf0 65 71 75 69 76 61 6c 65 6e 74 73 20 66 6f 72 20  equivalents for 
11d00 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
11d10 65 73 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20  es.** are sane. 
11d20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  The parameter is
11d30 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72   an integer repr
11d40 65 73 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69  esenting an sqli
11d50 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
11d60 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  * The result is 
11d70 61 20 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c  a list of two el
11d80 65 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 72 69  ements, the stri
11d90 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
11da0 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f  n of the.** erro
11db0 72 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 65  r code and the e
11dc0 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
11dd0 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  explanation..*/.
11de0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
11df0 65 72 72 73 74 72 28 0a 20 20 76 6f 69 64 20 2a  errstr(.  void *
11e00 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
11e10 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11e20 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
11e30 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
11e40 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72  objv[].){.  char
11e50 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69   *zCode;.  int i
11e60 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
11e70 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
11e80 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11e90 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72  1, objv, "<error
11ea0 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20   code>");.  }.. 
11eb0 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74   zCode = Tcl_Get
11ec0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
11ed0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30  .  for(i=0; i<20
11ee0 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; i++){.    if(
11ef0 20 30 3d 3d 73 74 72 63 6d 70 28 74 31 45 72 72   0==strcmp(t1Err
11f00 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65  orName(i), zCode
11f10 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ) ) break;.  }. 
11f20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
11f30 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
11f40 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 29 2c  qlite3ErrStr(i),
11f50 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
11f60 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
11f70 73 61 67 65 3a 20 20 20 20 62 72 65 61 6b 70 6f  sage:    breakpo
11f80 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  int.**.** This r
11f90 6f 75 74 69 6e 65 20 65 78 69 73 74 73 20 66 6f  outine exists fo
11fa0 72 20 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d 20  r one purpose - 
11fb0 74 6f 20 70 72 6f 76 69 64 65 20 61 20 70 6c 61  to provide a pla
11fc0 63 65 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62  ce to put a.** b
11fd0 72 65 61 6b 70 6f 69 6e 74 20 77 69 74 68 20 47  reakpoint with G
11fe0 44 42 20 74 68 61 74 20 63 61 6e 20 62 65 20 74  DB that can be t
11ff0 72 69 67 67 65 72 65 64 20 75 73 69 6e 67 20 54  riggered using T
12000 43 4c 20 63 6f 64 65 2e 20 20 54 68 65 20 75 73  CL code.  The us
12010 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 69 73  e.** for this is
12020 20 77 68 65 6e 20 61 20 70 61 72 74 69 63 75 6c   when a particul
12030 61 72 20 74 65 73 74 20 66 61 69 6c 73 20 6f 6e  ar test fails on
12040 20 28 73 61 79 29 20 74 68 65 20 31 34 38 35 74   (say) the 1485t
12050 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  h iteration..** 
12060 49 6e 20 74 68 65 20 54 43 4c 20 74 65 73 74 20  In the TCL test 
12070 73 63 72 69 70 74 2c 20 77 65 20 63 61 6e 20 61  script, we can a
12080 64 64 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69  dd code like thi
12090 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20  s:.**.**     if 
120a0 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b  {$i==1485} break
120b0 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  point.**.** Then
120c0 20 72 75 6e 20 74 65 73 74 66 69 78 74 75 72 65   run testfixture
120d0 20 69 6e 20 74 68 65 20 64 65 62 75 67 67 65 72   in the debugger
120e0 20 61 6e 64 20 77 61 69 74 20 66 6f 72 20 74 68   and wait for th
120f0 65 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a  e breakpoint to.
12100 2a 2a 20 66 69 72 65 2e 20 20 54 68 65 6e 20 61  ** fire.  Then a
12110 64 64 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70  dditional breakp
12120 6f 69 6e 74 73 20 63 61 6e 20 62 65 20 73 65 74  oints can be set
12130 20 74 6f 20 74 72 61 63 65 20 64 6f 77 6e 20 74   to trace down t
12140 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69  he bug..*/.stati
12150 63 20 69 6e 74 20 74 65 73 74 5f 62 72 65 61 6b  c int test_break
12160 70 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e  point(.  void *N
12170 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
12180 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
12190 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
121a0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
121b0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
121c0 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
121d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121e0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
121f0 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
12200 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
12210 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
12220 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
12230 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
12240 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
12250 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  othing */.}../*.
12260 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
12270 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
12280 62 20 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a  b  STMT IDX N.**
12290 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
122a0 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
122b0 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  ob interface.  S
122c0 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
122d0 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
122e0 49 44 58 20 69 73 20 74 68 65 20 69 6e 64 65 78  IDX is the index
122f0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
12300 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
12310 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
12320 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
12330 20 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66   a N-byte zero-f
12340 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68  illed BLOB to th
12350 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  e wildcard..*/.s
12360 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
12370 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20  ind_zeroblob(.  
12380 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
12390 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
123a0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
123b0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
123c0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
123d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
123e0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
123f0 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
12400 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
12410 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
12420 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12430 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
12440 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
12450 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
12460 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
12470 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
12480 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b  MT N VALUE", 0);
12490 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
124a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
124b0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
124c0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
124d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
124e0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
124f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
12500 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
12510 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
12520 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
12530 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12540 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
12550 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
12560 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72  objv[3], &n) ) r
12570 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12580 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
12590 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 70  _bind_zeroblob(p
125a0 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20  Stmt, idx, n);. 
125b0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
125c0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
125d0 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
125e0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
125f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
12600 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12610 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12620 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
12630 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
12640 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
12650 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20  lite3_bind_int  
12660 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a  STMT N VALUE.**.
12670 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
12680 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74  te3_bind_int int
12690 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
126a0 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
126b0 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
126c0 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
126d0 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
126e0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
126f0 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
12700 2a 2a 20 62 69 6e 64 73 20 61 20 33 32 2d 62 69  ** binds a 32-bi
12710 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20  t integer VALUE 
12720 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64  to that wildcard
12730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12740 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a 20  test_bind_int(. 
12750 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
12760 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
12770 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
12780 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
12790 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
127a0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
127b0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
127c0 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a  x;.  int value;.
127d0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
127e0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
127f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
12800 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
12810 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
12820 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
12830 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
12840 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
12850 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22   " STMT N VALUE"
12860 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
12870 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
12880 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
12890 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
128a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
128b0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
128c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
128d0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
128e0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
128f0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29  , objv[2], &idx)
12900 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12910 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
12920 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
12930 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
12940 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54  alue) ) return T
12950 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
12960 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  = sqlite3_bind_i
12970 6e 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  nt(pStmt, idx, v
12980 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  alue);.  if( sql
12990 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
129a0 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
129b0 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
129c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
129d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
129e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
129f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12a00 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
12a10 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
12a20 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
12a30 69 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d 54 20  ind_int64  STMT 
12a40 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65  N VALUE.**.** Te
12a50 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
12a60 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65 72 66  ind_int64 interf
12a70 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
12a80 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
12a90 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
12aa0 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
12ab0 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
12ac0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
12ad0 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
12ae0 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69  binds a 64-bit i
12af0 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20  nteger VALUE to 
12b00 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a  that wildcard..*
12b10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
12b20 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20  t_bind_int64(.  
12b30 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
12b40 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
12b50 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
12b60 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
12b70 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
12b80 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
12b90 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
12ba0 3b 0a 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20  ;.  i64 value;. 
12bb0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
12bc0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
12bd0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12be0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
12bf0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
12c00 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
12c10 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
12c20 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
12c30 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c  " STMT N VALUE",
12c40 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
12c50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
12c60 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
12c70 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
12c80 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12c90 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
12ca0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12cb0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
12cc0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
12cd0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
12ce0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12cf0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
12d00 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
12d10 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
12d20 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72   &value) ) retur
12d30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
12d40 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
12d50 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69  d_int64(pStmt, i
12d60 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66  dx, value);.  if
12d70 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
12d80 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
12d90 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
12da0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12db0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
12dc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12dd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12de0 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
12df0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
12e00 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
12e10 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20  te3_bind_double 
12e20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a   STMT N VALUE.**
12e30 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
12e40 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
12e50 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
12e60 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
12e70 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
12e80 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
12e90 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
12ea0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
12eb0 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
12ec0 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36  and.** binds a 6
12ed0 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41  4-bit integer VA
12ee0 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64  LUE to that wild
12ef0 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
12f00 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f  int test_bind_do
12f10 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  uble(.  void * c
12f20 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
12f30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
12f40 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
12f50 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
12f60 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
12f70 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
12f80 20 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75 62   int idx;.  doub
12f90 6c 65 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  le value;.  int 
12fa0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
12fb0 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
12fc0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12fd0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
12fe0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
12ff0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
13000 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
13010 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
13020 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a  T N VALUE", 0);.
13030 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13040 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
13050 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
13060 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
13070 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
13080 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
13090 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
130a0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
130b0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
130c0 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
130d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
130e0 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
130f0 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
13100 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75  , objv[3], &valu
13110 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
13120 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
13130 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
13140 6c 65 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  le(pStmt, idx, v
13150 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  alue);.  if( sql
13160 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
13170 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
13180 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
13190 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
131a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
131b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
131c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
131d0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
131e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
131f0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
13200 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54 20 4e 0a  nd_null  STMT N.
13210 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
13220 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
13230 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
13240 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
13250 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
13260 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
13270 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
13280 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
13290 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
132a0 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e  and.** binds a N
132b0 55 4c 4c 20 74 6f 20 74 68 65 20 77 69 6c 64 63  ULL to the wildc
132c0 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
132d0 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c  nt test_bind_nul
132e0 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  l(.  void * clie
132f0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
13300 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
13310 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
13320 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
13330 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
13340 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
13350 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72 63 3b  t idx;.  int rc;
13360 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
13370 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
13380 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13390 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
133a0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
133b0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
133c0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
133d0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
133e0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
133f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
13400 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
13410 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
13420 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
13430 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
13440 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13450 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
13460 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
13470 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
13480 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13490 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
134a0 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
134b0 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69  pStmt, idx);.  i
134c0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
134d0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
134e0 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
134f0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
13500 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
13510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13520 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13530 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
13540 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
13550 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
13560 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 20 53  te3_bind_text  S
13570 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54  TMT N STRING BYT
13580 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ES.**.** Test th
13590 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  e sqlite3_bind_t
135a0 65 78 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ext interface.  
135b0 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
135c0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
135d0 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
135e0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
135f0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
13600 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
13610 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
13620 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 53  a UTF-8 string S
13630 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c  TRING to the wil
13640 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72 69  dcard.  The stri
13650 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74 65  ng is BYTES byte
13660 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74  s.** long..*/.st
13670 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
13680 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69 64 20  nd_text(.  void 
13690 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
136a0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
136b0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
136c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
136d0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
136e0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
136f0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
13700 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72  nt bytes;.  char
13710 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72   *value;.  int r
13720 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
13730 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
13740 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13750 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
13760 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
13770 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
13780 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
13790 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
137a0 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c   N VALUE BYTES",
137b0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
137c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
137d0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
137e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
137f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13800 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
13810 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13820 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
13830 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
13840 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
13850 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13860 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63  OR;.  value = Tc
13870 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
13880 5b 33 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [3]);.  if( Tcl_
13890 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
138a0 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
138b0 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
138c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
138d0 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
138e0 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
138f0 20 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 53   value, bytes, S
13900 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
13910 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
13920 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
13930 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
13940 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
13950 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
13960 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13970 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
13980 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13990 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72  sqlite3TestError
139a0 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
139b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
139c0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
139d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
139e0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
139f0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20  te3_bind_text16 
13a00 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e  ?-static? STMT N
13a10 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a   STRING BYTES.**
13a20 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
13a30 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
13a40 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
13a50 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
13a60 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
13a70 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
13a80 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
13a90 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
13aa0 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
13ab0 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55  and.** binds a U
13ac0 54 46 2d 31 36 20 73 74 72 69 6e 67 20 53 54 52  TF-16 string STR
13ad0 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63  ING to the wildc
13ae0 61 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67  ard.  The string
13af0 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a   is BYTES bytes.
13b00 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ** long..*/.stat
13b10 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
13b20 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69 64 20  _text16(.  void 
13b30 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
13b40 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13b50 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
13b60 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
13b70 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
13b80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
13b90 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73  TF16.  sqlite3_s
13ba0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
13bb0 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74  t idx;.  int byt
13bc0 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75  es;.  char *valu
13bd0 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
13be0 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 29 20 3d  void (*xDel)() =
13bf0 20 28 6f 62 6a 63 3d 3d 36 3f 53 51 4c 49 54 45   (objc==6?SQLITE
13c00 5f 53 54 41 54 49 43 3a 53 51 4c 49 54 45 5f 54  _STATIC:SQLITE_T
13c10 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 54 63 6c  RANSIENT);.  Tcl
13c20 5f 4f 62 6a 20 2a 6f 53 74 6d 74 20 20 20 20 3d  _Obj *oStmt    =
13c30 20 6f 62 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20   objv[objc-4];. 
13c40 20 54 63 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20   Tcl_Obj *oN    
13c50 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33     = objv[objc-3
13c60 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53  ];.  Tcl_Obj *oS
13c70 74 72 69 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f 62  tring  = objv[ob
13c80 6a 63 2d 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a  jc-2];.  Tcl_Obj
13c90 20 2a 6f 42 79 74 65 73 20 20 20 3d 20 6f 62 6a   *oBytes   = obj
13ca0 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66  v[objc-1];..  if
13cb0 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
13cc0 63 21 3d 36 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c!=6){.    Tcl_A
13cd0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13ce0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
13cf0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
13d00 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
13d10 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
13d20 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
13d30 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53  MT N VALUE BYTES
13d40 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
13d50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
13d60 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
13d70 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
13d80 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 53 74  cl_GetString(oSt
13d90 6d 74 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  mt), &pStmt) ) r
13da0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13db0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
13dc0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
13dd0 20 6f 4e 2c 20 26 69 64 78 29 20 29 20 72 65 74   oN, &idx) ) ret
13de0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13df0 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29   value = (char*)
13e00 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
13e10 46 72 6f 6d 4f 62 6a 28 6f 53 74 72 69 6e 67 2c  FromObj(oString,
13e20 20 30 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47   0);.  if( Tcl_G
13e30 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
13e40 65 72 70 2c 20 6f 42 79 74 65 73 2c 20 26 62 79  erp, oBytes, &by
13e50 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
13e60 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
13e70 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
13e80 78 74 31 36 28 70 53 74 6d 74 2c 20 69 64 78 2c  xt16(pStmt, idx,
13e90 20 28 76 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20   (void *)value, 
13ea0 62 79 74 65 73 2c 20 78 44 65 6c 29 3b 0a 20 20  bytes, xDel);.  
13eb0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
13ec0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
13ed0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
13ee0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
13ef0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
13f00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13f10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13f20 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  ROR;.  }..#endif
13f30 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
13f40 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
13f50 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
13f60 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
13f70 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d  te3_bind_blob ?-
13f80 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 44  static? STMT N D
13f90 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20  ATA BYTES.**.** 
13fa0 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
13fb0 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72  _bind_blob inter
13fc0 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
13fd0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
13fe0 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
13ff0 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
14000 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
14010 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
14020 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
14030 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f   binds a BLOB to
14040 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20   the wildcard.  
14050 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59 54 45  The BLOB is BYTE
14060 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  S bytes in size.
14070 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
14080 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20  est_bind_blob(. 
14090 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
140a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
140b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
140c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
140d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
140e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
140f0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
14100 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  x;.  int bytes;.
14110 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20    char *value;. 
14120 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
14130 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79  e3_destructor_ty
14140 70 65 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d  pe xDestructor =
14150 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
14160 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  T;..  if( objc!=
14170 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a  5 && objc!=6 ){.
14180 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
14190 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
141a0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
141b0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
141c0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
141d0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
141e0 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41   0), " STMT N DA
141f0 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  TA BYTES", 0);. 
14200 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14210 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
14220 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78  objc==6 ){.    x
14230 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c  Destructor = SQL
14240 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20  ITE_STATIC;.    
14250 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69  objv++;.  }..  i
14260 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
14270 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
14280 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
14290 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
142a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
142b0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
142c0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
142d0 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
142e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
142f0 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47  .  value = Tcl_G
14300 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
14310 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
14320 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
14330 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
14340 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
14350 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
14360 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
14370 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  b(pStmt, idx, va
14380 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 73  lue, bytes, xDes
14390 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28 20  tructor);.  if( 
143a0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
143b0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
143c0 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
143d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
143e0 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
143f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
14400 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14410 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
14420 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
14430 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
14440 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
14450 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a  count  STMT.**.*
14460 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
14470 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64 73  ber of wildcards
14480 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74   in the given st
14490 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
144a0 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
144b0 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
144c0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
144d0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
144e0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
144f0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
14500 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
14510 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
14520 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
14530 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
14540 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
14550 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
14560 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
14570 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14580 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
14590 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
145a0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
145b0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
145c0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
145d0 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
145e0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
145f0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
14600 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
14610 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
14620 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
14630 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
14640 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
14650 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
14660 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a  _name  STMT  N.*
14670 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
14680 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20  name of the Nth 
14690 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66  wildcard.  The f
146a0 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69 73  irst wildcard is
146b0 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20   1..** An empty 
146c0 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
146d0 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ed if N is out o
146e0 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68  f range or if th
146f0 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73  e wildcard.** is
14700 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74   nameless..*/.st
14710 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
14720 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
14730 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
14740 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
14750 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
14760 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
14770 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
14780 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
14790 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
147a0 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  t i;..  if( objc
147b0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
147c0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
147d0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
147e0 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  MT N");.    retu
147f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14800 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
14810 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
14820 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
14830 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
14840 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14850 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
14860 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
14870 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20  p, objv[2], &i) 
14880 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
14890 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
148a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
148b0 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
148c0 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69  ngObj(sqlite3_bi
148d0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
148e0 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20  e(pStmt,i),-1). 
148f0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   );.  return TCL
14900 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
14910 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
14920 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
14930 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a  dex  STMT  NAME.
14940 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
14950 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77 69   index of the wi
14960 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e 41  ldcard called NA
14970 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ME.  Return 0 if
14980 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
14990 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a  such wildcard..*
149a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
149b0 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
149c0 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20 2a  _index(.  void *
149d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
149e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
149f0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
14a00 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
14a10 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
14a20 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
14a30 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
14a40 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
14a50 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
14a60 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e  1, objv, "STMT N
14a70 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
14a80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
14a90 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
14aa0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
14ab0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
14ac0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
14ad0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14ae0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
14af0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
14b00 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a     Tcl_NewIntObj
14b10 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  (.       sqlite3
14b20 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
14b30 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f  index(pStmt,Tcl_
14b40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
14b50 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a  ])).     ).  );.
14b60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
14b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
14b80 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72     sqlite3_clear
14b90 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a 2a  _bindings STMT.*
14ba0 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
14bb0 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69  test_clear_bindi
14bc0 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ngs(.  void * cl
14bd0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
14be0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
14bf0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
14c00 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
14c10 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
14c20 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
14c30 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
14c40 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
14c50 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
14c60 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
14c70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14c80 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
14c90 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
14ca0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
14cb0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
14cc0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
14cd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
14ce0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
14cf0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
14d00 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61 72  bj(sqlite3_clear
14d10 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 29  _bindings(pStmt)
14d20 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
14d30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
14d40 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 73  age:   sqlite3_s
14d50 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e 44  leep MILLISECOND
14d60 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  S.*/.static int 
14d70 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20 76 6f  test_sleep(.  vo
14d80 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
14d90 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
14da0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
14db0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
14dc0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
14dd0 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20 6f  int ms;..  if( o
14de0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
14df0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
14e00 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
14e10 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
14e20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14e30 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
14e40 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
14e50 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
14e60 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20 20  1], &ms) ){.    
14e70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14e80 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
14e90 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
14ea0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
14eb0 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d 73 29  qlite3_sleep(ms)
14ec0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
14ed0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
14ee0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72  age: sqlite3_err
14ef0 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  code DB.**.** Re
14f00 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20  turn the string 
14f10 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
14f20 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
14f30 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a  t sqlite3_* API.
14f40 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65  ** error code. e
14f50 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  .g. "SQLITE_ERRO
14f60 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  R"..*/.static in
14f70 74 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a  t test_errcode(.
14f80 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
14f90 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
14fa0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
14fb0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
14fc0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
14fd0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
14fe0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
14ff0 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69  r zBuf[30];..  i
15000 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
15010 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
15020 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
15030 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
15040 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
15050 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15060 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
15070 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
15080 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
15090 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
150a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
150b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
150c0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
150d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
150e0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
150f0 28 64 62 29 3b 0a 20 20 69 66 28 20 28 72 63 26  (db);.  if( (rc&
15100 30 78 66 66 29 3d 3d 72 63 20 29 7b 0a 20 20 20  0xff)==rc ){.   
15110 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20   zBuf[0] = 0;.  
15120 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e  }else{.    sprin
15130 74 66 28 7a 42 75 66 2c 22 2b 25 64 22 2c 20 72  tf(zBuf,"+%d", r
15140 63 3e 3e 38 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  c>>8);.  }.  Tcl
15150 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15160 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
15170 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 7a  ErrorName(rc), z
15180 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
15190 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
151a0 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65 73 74  ** Usage:   test
151b0 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a  _errmsg DB.**.**
151c0 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54 46   Returns the UTF
151d0 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  -8 representatio
151e0 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d  n of the error m
151f0 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f  essage string fo
15200 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  r the.** most re
15210 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41  cent sqlite3_* A
15220 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  PI call..*/.stat
15230 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d  ic int test_errm
15240 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  sg(.  void * cli
15250 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
15260 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
15270 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
15280 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
15290 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
152a0 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
152b0 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20  r *zErr;..  if( 
152c0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
152d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
152e0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
152f0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
15300 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
15310 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
15320 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
15330 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
15340 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
15350 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
15360 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
15370 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
15380 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
15390 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d  ERROR;..  zErr =
153a0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
153b0 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  db);.  Tcl_SetOb
153c0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
153d0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
153e0 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72  (zErr, -1));.  r
153f0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
15400 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
15410 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44 42  test_errmsg16 DB
15420 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  .**.** Returns t
15430 68 65 20 55 54 46 2d 31 36 20 72 65 70 72 65 73  he UTF-16 repres
15440 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
15450 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
15460 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ring for the.** 
15470 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
15480 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20  te3_* API call. 
15490 54 68 69 73 20 69 73 20 61 20 62 79 74 65 20 61  This is a byte a
154a0 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20 74  rray object at t
154b0 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c  he TCL .** level
154c0 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64 65  , and it include
154d0 73 20 74 68 65 20 30 78 30 30 20 30 78 30 30 20  s the 0x00 0x00 
154e0 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73  terminator bytes
154f0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
15500 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74 72  he.** UTF-16 str
15510 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
15520 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36  nt test_errmsg16
15530 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
15540 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
15550 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
15560 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
15570 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
15580 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
15590 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
155a0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
155b0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b  onst void *zErr;
155c0 0a 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 30  .  int bytes = 0
155d0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
155e0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
155f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
15600 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
15610 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
15620 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
15630 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
15640 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
15650 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15660 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
15670 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
15680 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
15690 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
156a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
156b0 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
156c0 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a  3_errmsg16(db);.
156d0 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
156e0 20 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65    bytes = sqlite
156f0 33 55 74 66 31 36 42 79 74 65 4c 65 6e 28 7a 45  3Utf16ByteLen(zE
15700 72 72 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 54  rr, -1);.  }.  T
15710 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
15720 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
15730 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72  yteArrayObj(zErr
15740 2c 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69  , bytes));.#endi
15750 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
15760 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
15770 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
15780 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
15790 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71  e3_prepare DB sq
157a0 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a  l bytes tailvar.
157b0 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
157c0 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
157d0 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
157e0 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
157f0 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
15800 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
15810 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
15820 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
15830 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
15840 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
15850 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
15860 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
15870 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
15880 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
15890 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
158a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
158b0 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20 20 76  est_prepare(.  v
158c0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
158d0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
158e0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
158f0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15900 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15910 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
15920 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
15930 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
15940 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
15950 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  il = 0;.  sqlite
15960 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
15970 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
15980 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
15990 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
159a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
159b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
159c0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
159d0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
159e0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
159f0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
15a00 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
15a10 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 0);.    retu
15a20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15a30 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
15a40 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
15a50 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
15a60 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
15a70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15a80 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
15a90 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
15aa0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
15ab0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
15ac0 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
15ad0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15ae0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
15af0 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20  te3_prepare(db, 
15b00 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
15b10 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20  tmt, &zTail);.  
15b20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
15b30 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
15b40 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
15b50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
15b60 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 69 66   zTail ){.    if
15b70 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
15b80 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65      bytes = byte
15b90 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29  s - (zTail-zSql)
15ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
15bb0 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
15bc0 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54  p, objv[4], 0, T
15bd0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
15be0 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30  zTail, bytes), 0
15bf0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
15c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15c10 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
15c20 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  =0 );.    sprint
15c30 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  f(zBuf, "(%d) ",
15c40 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
15c50 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15c60 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
15c70 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
15c80 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
15c90 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
15ca0 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
15cb0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
15cc0 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
15cd0 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
15ce0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15cf0 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70  RROR;.    Tcl_Ap
15d00 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15d10 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d  p, zBuf, 0);.  }
15d20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
15d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
15d40 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
15d50 65 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65  e_v2 DB sql byte
15d60 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20  s tailvar.**.** 
15d70 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62  Compile up to <b
15d80 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74  ytes> bytes of t
15d90 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20  he supplied SQL 
15da0 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69  string <sql> usi
15db0 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  ng.** database h
15dc0 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20  andle <DB>. The 
15dd0 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76  parameter <tailv
15de0 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  al> is the name 
15df0 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76  of a global.** v
15e00 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
15e10 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65  set to the unuse
15e20 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71  d portion of <sq
15e30 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a  l> (if any). A.*
15e40 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73  * STMT handle is
15e50 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
15e60 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
15e70 65 70 61 72 65 5f 76 32 28 0a 20 20 76 6f 69 64  epare_v2(.  void
15e80 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
15e90 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15ea0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
15eb0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
15ec0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
15ed0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
15ee0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
15ef0 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f   int bytes;.  co
15f00 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20  nst char *zTail 
15f10 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
15f20 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
15f30 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
15f40 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
15f50 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
15f60 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
15f70 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
15f80 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
15f90 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
15fa0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15fb0 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
15fc0 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c   bytes tailvar",
15fd0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
15fe0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
15ff0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
16000 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
16010 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
16020 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
16030 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
16040 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
16050 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
16060 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
16070 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16080 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
16090 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
160a0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
160b0 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
160c0 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
160d0 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20  tmt, &zTail);.  
160e0 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54  assert(rc==SQLIT
160f0 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30  E_OK || pStmt==0
16100 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
16110 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
16120 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
16130 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16140 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
16150 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20     if( bytes>=0 
16160 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d  ){.      bytes =
16170 20 62 79 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d   bytes - (zTail-
16180 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
16190 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
161a0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
161b0 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   0, Tcl_NewStrin
161c0 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65  gObj(zTail, byte
161d0 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  s), 0);.  }.  if
161e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
161f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16200 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
16210 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25  printf(zBuf, "(%
16220 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
16230 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16240 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
16250 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
16260 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
16270 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
16280 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
16290 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
162a0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
162b0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
162c0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
162d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
162e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
162f0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
16300 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
16310 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
16320 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
16330 72 65 70 61 72 65 31 36 20 44 42 20 73 71 6c 20  repare16 DB sql 
16340 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a  bytes tailvar.**
16350 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74  .** Compile up t
16360 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20  o <bytes> bytes 
16370 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
16380 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e  SQL string <sql>
16390 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61   using.** databa
163a0 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20  se handle <DB>. 
163b0 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74  The parameter <t
163c0 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e  ailval> is the n
163d0 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a  ame of a global.
163e0 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  ** variable that
163f0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75   is set to the u
16400 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  nused portion of
16410 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e   <sql> (if any).
16420 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c   A.** STMT handl
16430 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
16440 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
16450 74 5f 70 72 65 70 61 72 65 31 36 28 0a 20 20 76  t_prepare16(.  v
16460 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16470 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16480 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16490 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
164a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
164b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
164c0 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
164d0 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
164e0 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f  void *zSql;.  co
164f0 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20  nst void *zTail 
16500 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  = 0;.  Tcl_Obj *
16510 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  pTail = 0;.  sql
16520 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
16530 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
16540 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63  f[50]; .  int rc
16550 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20  ;.  int bytes;  
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16570 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70 65   The integer spe
16580 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33 20  cified as arg 3 
16590 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b  */.  int objlen;
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
165b0 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61 79  * The byte-array
165c0 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32   length of arg 2
165d0 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
165e0 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
165f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
16600 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
16610 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
16620 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
16630 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
16640 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
16650 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20  tailvar", 0);.  
16660 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
16670 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
16680 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
16690 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
166a0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
166b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
166c0 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = Tcl
166d0 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
166e0 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f  mObj(objv[2], &o
166f0 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63  bjlen);.  if( Tc
16700 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
16710 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
16720 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
16730 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
16740 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
16750 70 61 72 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c  pare16(db, zSql,
16760 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
16770 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28 20 73  &zTail);.  if( s
16780 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
16790 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
167a0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
167b0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29  RROR;.  if( rc )
167c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
167d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
167e0 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20  f( zTail ){.    
167f0 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20  objlen = objlen 
16800 2d 20 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28  - ((u8 *)zTail-(
16810 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 7d 65  u8 *)zSql);.  }e
16820 6c 73 65 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20  lse{.    objlen 
16830 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 69 6c  = 0;.  }.  pTail
16840 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
16850 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61  rayObj((u8 *)zTa
16860 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 54  il, objlen);.  T
16870 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
16880 70 54 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 4f 62  pTail);.  Tcl_Ob
16890 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
168a0 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61   objv[4], 0, pTa
168b0 69 6c 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  il, 0);.  Tcl_De
168c0 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c  crRefCount(pTail
168d0 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20  );..  if( pStmt 
168e0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
168f0 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
16900 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
16910 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
16920 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16930 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
16940 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
16950 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  f, 0);.#endif /*
16960 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
16970 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
16980 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
16990 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
169a0 72 65 70 61 72 65 31 36 5f 76 32 20 44 42 20 73  repare16_v2 DB s
169b0 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
169c0 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
169d0 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
169e0 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
169f0 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
16a00 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
16a10 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
16a20 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
16a30 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
16a40 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
16a50 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
16a60 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
16a70 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
16a80 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
16a90 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
16aa0 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
16ab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16ac0 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76  test_prepare16_v
16ad0 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  2(.  void * clie
16ae0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
16af0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
16b00 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
16b10 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
16b20 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
16b30 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
16b40 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
16b50 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c  const void *zSql
16b60 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
16b70 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c  zTail = 0;.  Tcl
16b80 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b  _Obj *pTail = 0;
16b90 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
16ba0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
16bb0 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20  ar zBuf[50]; .  
16bc0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79  int rc;.  int by
16bd0 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  tes;            
16be0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
16bf0 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20  er specified as 
16c00 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f  arg 3 */.  int o
16c10 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  bjlen;          
16c20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
16c30 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66  -array length of
16c40 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28   arg 2 */..  if(
16c50 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
16c60 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
16c70 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
16c80 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
16c90 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
16ca0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
16cb0 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
16cc0 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
16cd0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
16ce0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
16cf0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
16d00 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
16d10 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
16d20 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
16d30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
16d40 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
16d50 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
16d60 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20  2], &objlen);.  
16d70 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
16d80 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16d90 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
16da0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16db0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
16dc0 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28  e3_prepare16_v2(
16dd0 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c  db, zSql, bytes,
16de0 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29   &pStmt, &zTail)
16df0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
16e00 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
16e10 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
16e20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16e30 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
16e40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16e50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61 69  .  }..  if( zTai
16e60 6c 20 29 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20  l ){.    objlen 
16e70 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20  = objlen - ((u8 
16e80 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53  *)zTail-(u8 *)zS
16e90 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ql);.  }else{.  
16ea0 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20    objlen = 0;.  
16eb0 7d 0a 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f  }.  pTail = Tcl_
16ec0 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
16ed0 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a  (u8 *)zTail, obj
16ee0 6c 65 6e 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  len);.  Tcl_Incr
16ef0 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
16f00 0a 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72  .  Tcl_ObjSetVar
16f10 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
16f20 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b  ], 0, pTail, 0);
16f30 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
16f40 75 6e 74 28 70 54 61 69 6c 29 3b 0a 0a 20 20 69  unt(pTail);..  i
16f50 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
16f60 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
16f70 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
16f80 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
16f90 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
16fa0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
16fb0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16fc0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
16fd0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16fe0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
16ff0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
17000 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
17010 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69 6c  sqlite3_open fil
17020 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c  ename ?options-l
17030 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist?.*/.static i
17040 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20 20  nt test_open(.  
17050 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
17060 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
17070 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
17080 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
17090 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
170a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
170b0 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  ilename;.  sqlit
170c0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
170d0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
170e0 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
170f0 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b  =3 && objc!=2 ){
17100 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17110 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17120 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17130 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
17140 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17150 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69  g(objv[0]), " fi
17160 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c  lename options-l
17170 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ist", 0);.    re
17180 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17190 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65    }..  zFilename
171a0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
171b0 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 72 63 20  (objv[1]);.  rc 
171c0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
171d0 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a  Filename, &db);.
171e0 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33    .  if( sqlite3
171f0 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
17200 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
17210 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   db) ) return TC
17220 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41  L_ERROR;.  Tcl_A
17230 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
17240 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
17250 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
17260 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
17270 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20 66 69  qlite3_open16 fi
17280 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a  lename options.*
17290 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
172a0 74 5f 6f 70 65 6e 31 36 28 0a 20 20 76 6f 69 64  t_open16(.  void
172b0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
172c0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
172d0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
172e0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
172f0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
17300 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17310 55 54 46 31 36 0a 20 20 63 6f 6e 73 74 20 76 6f  UTF16.  const vo
17320 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  id *zFilename;. 
17330 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
17340 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
17350 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  Buf[100];..  if(
17360 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
17370 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17380 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
17390 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
173a0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
173b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
173c0 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d  v[0]), " filenam
173d0 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c  e options-list",
173e0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
173f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
17400 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63    zFilename = Tc
17410 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
17420 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
17430 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
17440 33 5f 6f 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61  3_open16(zFilena
17450 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69  me, &db);.  .  i
17460 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
17470 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
17480 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29  erp, zBuf, db) )
17490 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
174a0 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  R;.  Tcl_AppendR
174b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
174c0 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  uf, 0);.#endif /
174d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
174e0 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
174f0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
17500 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
17510 63 6f 6d 70 6c 65 74 65 31 36 20 3c 55 54 46 2d  complete16 <UTF-
17520 31 36 20 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a  16 string>.**.**
17530 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
17540 20 73 75 70 70 6c 69 65 64 20 61 72 67 75 6d 65   supplied argume
17550 6e 74 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65  nt is a complete
17560 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20   SQL statement, 
17570 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  or zero.** other
17580 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
17590 69 6e 74 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74  int test_complet
175a0 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  e16(.  void * cl
175b0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
175c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
175d0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
175e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
175f0 76 5b 5d 0a 29 7b 0a 23 69 66 20 21 64 65 66 69  v[].){.#if !defi
17600 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
17610 43 4f 4d 50 4c 45 54 45 29 20 26 26 20 21 64 65  COMPLETE) && !de
17620 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
17630 54 5f 55 54 46 31 36 29 0a 20 20 63 68 61 72 20  T_UTF16).  char 
17640 2a 7a 42 75 66 3b 0a 0a 20 20 69 66 28 20 6f 62  *zBuf;..  if( ob
17650 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
17660 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
17670 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
17680 3c 75 74 66 2d 31 36 20 73 71 6c 3e 22 29 3b 0a  <utf-16 sql>");.
17690 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
176a0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75  RROR;.  }..  zBu
176b0 66 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47  f = (char*)Tcl_G
176c0 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
176d0 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
176e0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
176f0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
17700 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
17710 5f 63 6f 6d 70 6c 65 74 65 31 36 28 7a 42 75 66  _complete16(zBuf
17720 29 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  )));.#endif /* S
17730 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c  QLITE_OMIT_COMPL
17740 45 54 45 20 26 26 20 53 51 4c 49 54 45 5f 4f 4d  ETE && SQLITE_OM
17750 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
17760 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
17770 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
17780 69 74 65 33 5f 73 74 65 70 20 53 54 4d 54 0a 2a  ite3_step STMT.*
17790 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
177a0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
177b0 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73  e next row..*/.s
177c0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
177d0 74 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tep(.  void * cl
177e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
177f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
17800 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
17810 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
17820 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
17830 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
17840 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
17850 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
17860 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
17870 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
17880 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
17890 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
178a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
178b0 30 5d 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29  0]), " STMT", 0)
178c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
178d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
178e0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
178f0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
17900 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
17910 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
17920 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17930 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
17940 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20  p(pStmt);..  /* 
17950 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  if( rc!=SQLITE_D
17960 4f 4e 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ONE && rc!=SQLIT
17970 45 5f 52 4f 57 20 29 20 72 65 74 75 72 6e 20 54  E_ROW ) return T
17980 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f 0a 20 20 54  CL_ERROR; */.  T
17990 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
179a0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
179b0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
179c0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
179d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
179e0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
179f0 6e 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a  n_count STMT .**
17a00 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
17a10 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
17a20 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
17a30 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53   sql statement S
17a40 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  TMT..*/.static i
17a50 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63  nt test_column_c
17a60 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  ount(.  void * c
17a70 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
17a80 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17a90 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
17aa0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
17ab0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
17ac0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
17ad0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
17ae0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17af0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17b00 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17b10 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
17b20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17b30 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
17b40 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
17b50 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17b60 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
17b70 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
17b80 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
17b90 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
17ba0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
17bb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54   TCL_ERROR;..  T
17bc0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
17bd0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
17be0 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ntObj(sqlite3_co
17bf0 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
17c00 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
17c10 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
17c20 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
17c30 6c 75 6d 6e 5f 74 79 70 65 20 53 54 4d 54 20 63  lumn_type STMT c
17c40 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  olumn.**.** Retu
17c50 72 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20 74  rn the type of t
17c60 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d  he data in colum
17c70 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68  n 'column' of th
17c80 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a  e current row..*
17c90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
17ca0 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a 20  t_column_type(. 
17cb0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
17cc0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
17cd0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
17ce0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
17cf0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
17d00 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
17d10 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
17d20 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a 0a 20 20  l;.  int tp;..  
17d30 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
17d40 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
17d50 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
17d60 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
17d70 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
17d80 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
17d90 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
17da0 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
17db0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17dc0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
17dd0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
17de0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
17df0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
17e00 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
17e10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
17e20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
17e30 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
17e40 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
17e50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
17e60 74 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tp = sqlite3_col
17e70 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
17e80 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63 68 28 20  col);.  switch( 
17e90 74 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  tp ){.    case S
17ea0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 0a  QLITE_INTEGER: .
17eb0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
17ec0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 4e 54  ult(interp, "INT
17ed0 45 47 45 52 22 2c 20 54 43 4c 5f 53 54 41 54 49  EGER", TCL_STATI
17ee0 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
17ef0 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
17f00 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 54 63  E_NULL:.      Tc
17f10 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
17f20 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f  rp, "NULL", TCL_
17f30 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
17f40 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
17f50 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20  SQLITE_FLOAT:.  
17f60 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
17f70 74 28 69 6e 74 65 72 70 2c 20 22 46 4c 4f 41 54  t(interp, "FLOAT
17f80 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
17f90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17fa0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
17fb0 58 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  XT:.      Tcl_Se
17fc0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
17fd0 22 54 45 58 54 22 2c 20 54 43 4c 5f 53 54 41 54  "TEXT", TCL_STAT
17fe0 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
17ff0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
18000 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 54  TE_BLOB:.      T
18010 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
18020 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20 54 43 4c  erp, "BLOB", TCL
18030 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
18040 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
18050 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
18060 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  t(0);.  }..  ret
18070 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
18080 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
18090 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
180a0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
180b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
180c0 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f  ta in column 'co
180d0 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72  lumn' of the cur
180e0 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73  rent row cast as
180f0 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28 36 34 2d   an.** wide (64-
18100 62 69 74 29 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  bit) integer..*/
18110 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
18120 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20  _column_int64(. 
18130 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
18140 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
18150 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
18160 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
18170 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
18180 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
18190 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
181a0 6c 3b 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a  l;.  i64 iVal;..
181b0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
181c0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
181d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
181e0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
181f0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
18200 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
18210 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
18220 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
18230 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18240 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
18250 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
18260 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
18270 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
18280 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
18290 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
182a0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
182b0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
182c0 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
182d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
182e0 20 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    iVal = sqlite3
182f0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
18300 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c  tmt, col);.  Tcl
18310 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
18320 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
18330 65 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a  eIntObj(iVal));.
18340 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
18350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
18360 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
18370 62 6c 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  blob STMT column
18380 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18390 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  est_column_blob(
183a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
183b0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
183c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
183d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
183e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
183f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
18400 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
18410 63 6f 6c 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b  col;..  int len;
18420 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
18430 42 6c 6f 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Blob;..  if( obj
18440 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
18450 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
18460 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
18470 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
18480 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
18490 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
184a0 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
184b0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
184c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
184d0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
184e0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
184f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18500 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
18510 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18520 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
18530 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
18540 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
18550 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18560 52 52 4f 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73  RROR;..  len = s
18570 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
18580 74 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  tes(pStmt, col);
18590 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  pBlob = sqlit
185a0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
185b0 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63  Stmt, col);.  Tc
185c0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
185d0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79  nterp, Tcl_NewBy
185e0 74 65 41 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62  teArrayObj(pBlob
185f0 2c 20 6c 65 6e 29 29 3b 0a 20 20 72 65 74 75 72  , len));.  retur
18600 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
18610 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
18620 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20  3_column_double 
18630 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
18640 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
18650 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c  a in column 'col
18660 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72  umn' of the curr
18670 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73 20  ent row cast as 
18680 61 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61  a double..*/.sta
18690 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
186a0 75 6d 6e 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f  umn_double(.  vo
186b0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
186c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
186d0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
186e0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
186f0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
18700 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
18710 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
18720 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 0a    double rVal;..
18730 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
18740 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
18750 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
18760 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
18770 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
18780 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
18790 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
187a0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
187b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
187c0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
187d0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
187e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
187f0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
18800 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
18810 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
18820 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
18830 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
18840 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
18850 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
18860 20 20 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    rVal = sqlite3
18870 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
18880 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63  Stmt, col);.  Tc
18890 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
188a0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 44 6f  nterp, Tcl_NewDo
188b0 75 62 6c 65 4f 62 6a 28 72 56 61 6c 29 29 3b 0a  ubleObj(rVal));.
188c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
188d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
188e0 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f   sqlite3_data_co
188f0 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  unt STMT .**.** 
18900 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18910 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74  r of columns ret
18920 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c  urned by the sql
18930 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e   statement STMT.
18940 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18950 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 28 0a  est_data_count(.
18960 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
18970 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
18980 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18990 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
189a0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
189b0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
189c0 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
189d0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
189e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
189f0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
18a00 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
18a10 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
18a20 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
18a30 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
18a40 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
18a50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18a60 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
18a70 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
18a80 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
18a90 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
18aa0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18ab0 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74  RROR;..  Tcl_Set
18ac0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
18ad0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
18ae0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75  sqlite3_data_cou
18af0 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72  nt(pStmt)));.  r
18b00 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18b10 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
18b20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
18b30 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  t STMT column.**
18b40 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
18b50 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
18b60 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  pe STMT column.*
18b70 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
18b80 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20  te3_column_name 
18b90 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
18ba0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
18bb0 74 6d 74 5f 75 74 66 38 28 0a 20 20 76 6f 69 64  tmt_utf8(.  void
18bc0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20   * clientData,  
18bd0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
18be0 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66   to SQLite API f
18bf0 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  unction to be in
18c00 76 6f 6b 65 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  voke */.  Tcl_In
18c10 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
18c20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
18c30 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
18c40 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
18c50 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
18c60 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63  t col;.  const c
18c70 68 61 72 20 2a 28 2a 78 46 75 6e 63 29 28 73 71  har *(*xFunc)(sq
18c80 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
18c90 29 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  ) = clientData;.
18ca0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
18cb0 65 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  et;..  if( objc!
18cc0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
18cd0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
18ce0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
18cf0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
18d00 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
18d10 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
18d20 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
18d30 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
18d40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
18d50 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
18d60 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
18d70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18d80 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
18d90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18da0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
18db0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
18dc0 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
18dd0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18de0 4f 52 3b 0a 20 20 7a 52 65 74 20 3d 20 78 46 75  OR;.  zRet = xFu
18df0 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  nc(pStmt, col);.
18e00 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20    if( zRet ){.  
18e10 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
18e20 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
18e30 7a 52 65 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zRet, 0);.  }.  
18e40 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
18e50 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ..static int tes
18e60 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  t_global_recover
18e70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
18e80 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
18e90 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
18ea0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
18eb0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
18ec0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
18ed0 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41 4c 52 45  TE_OMIT_GLOBALRE
18ee0 43 4f 56 45 52 0a 20 20 69 6e 74 20 72 63 3b 0a  COVER.  int rc;.
18ef0 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
18f00 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
18f10 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
18f20 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
18f30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18f40 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
18f50 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
18f60 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65 74  ver();.  Tcl_Set
18f70 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
18f80 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
18f90 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
18fa0 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  IC);.#endif.  re
18fb0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
18fc0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
18fd0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
18fe0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
18ff0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
19000 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
19010 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
19020 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
19030 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53  e3_column_name S
19040 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74  TMT column.*/.st
19050 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
19060 6d 74 5f 75 74 66 31 36 28 0a 20 20 76 6f 69 64  mt_utf16(.  void
19070 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20   * clientData,  
19080 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
19090 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63   SQLite API func
190a0 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
190b0 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
190c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
190d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
190e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
190f0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
19100 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
19110 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
19120 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
19130 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
19140 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
19150 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76  ame16;.  const v
19160 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71  oid *(*xFunc)(sq
19170 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
19180 29 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  ) = clientData;.
19190 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
191a0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
191b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
191c0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
191d0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
191e0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
191f0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
19200 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
19210 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19220 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
19230 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
19240 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
19250 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
19260 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
19270 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
19280 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
19290 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
192a0 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
192b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
192c0 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75  .  zName16 = xFu
192d0 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  nc(pStmt, col);.
192e0 20 20 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b    if( zName16 ){
192f0 0a 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f  .    pRet = Tcl_
19300 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
19310 7a 4e 61 6d 65 31 36 2c 20 73 71 6c 69 74 65 33  zName16, sqlite3
19320 55 74 66 31 36 42 79 74 65 4c 65 6e 28 7a 4e 61  Utf16ByteLen(zNa
19330 6d 65 31 36 2c 20 2d 31 29 2b 32 29 3b 0a 20 20  me16, -1)+2);.  
19340 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
19350 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
19360 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
19370 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
19380 36 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54  6 */..  return T
19390 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
193a0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
193b0 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63  olumn_int STMT c
193c0 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
193d0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
193e0 6e 5f 62 79 74 65 73 20 53 54 4d 54 20 63 6f 6c  n_bytes STMT col
193f0 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
19400 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
19410 62 79 74 65 73 31 36 20 53 54 4d 54 20 63 6f 6c  bytes16 STMT col
19420 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  umn.**.*/.static
19430 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 69   int test_stmt_i
19440 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
19450 65 6e 74 44 61 74 61 2c 20 20 20 20 2f 2a 20 50  entData,    /* P
19460 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65  ointer to SQLite
19470 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f   API function to
19480 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20   be invoked */. 
19490 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
194a0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
194b0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
194c0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
194d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
194e0 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
194f0 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  int (*xFunc)(sql
19500 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
19510 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a   = clientData;..
19520 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
19530 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
19540 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
19550 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
19560 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
19570 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
19580 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
19590 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
195a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
195b0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
195c0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
195d0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
195e0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
195f0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
19600 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
19610 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
19620 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
19630 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
19640 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
19650 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
19660 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
19670 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70  ewIntObj(xFunc(p
19680 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20  Stmt, col)));.  
19690 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
196a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
196b0 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 2f 2a 0a  _OMIT_DISKIO./*.
196c0 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
196d0 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
196e0 65 20 3c 66 69 6c 65 6e 61 6d 65 3e 0a 2a 2f 0a  e <filename>.*/.
196f0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
19700 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
19710 64 57 72 69 74 65 28 0a 20 20 76 6f 69 64 20 2a  dWrite(.  void *
19720 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
19730 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19740 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
19750 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
19760 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69  objv[].){.  OsFi
19770 6c 65 20 2a 70 46 69 6c 65 3b 0a 20 20 69 6e 74  le *pFile;.  int
19780 20 72 63 3b 0a 20 20 69 6e 74 20 64 75 6d 6d 79   rc;.  int dummy
19790 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
197a0 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
197b0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
197c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
197d0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
197e0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
197f0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
19800 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
19810 20 22 20 66 69 6c 65 6e 61 6d 65 22 2c 20 30 29   " filename", 0)
19820 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
19830 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
19840 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
19850 6e 52 65 61 64 57 72 69 74 65 28 54 63 6c 5f 47  nReadWrite(Tcl_G
19860 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
19870 29 2c 20 26 70 46 69 6c 65 2c 20 26 64 75 6d 6d  ), &pFile, &dumm
19880 79 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  y);.  if( rc!=SQ
19890 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
198a0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
198b0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
198c0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
198d0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
198e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
198f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 65  .  }.  sqlite3Te
19900 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
19910 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
19920 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 53 65 74  File);.  Tcl_Set
19930 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
19940 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
19950 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
19960 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
19970 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 3c 66 69  lite3OsClose <fi
19980 6c 65 20 68 61 6e 64 6c 65 3e 0a 2a 2f 0a 73 74  le handle>.*/.st
19990 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71  atic int test_sq
199a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 0a 20 20  lite3OsClose(.  
199b0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
199c0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
199d0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
199e0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
199f0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
19a00 20 20 4f 73 46 69 6c 65 20 2a 70 46 69 6c 65 3b    OsFile *pFile;
19a10 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
19a20 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
19a30 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19a40 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
19a50 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
19a60 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
19a70 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19a80 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 68 61  jv[0]), " fileha
19a90 6e 64 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  ndle", 0);.    r
19aa0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19ab0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 46  .  }..  if( getF
19ac0 69 6c 65 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  ilePointer(inter
19ad0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
19ae0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 46 69 6c  (objv[1]), &pFil
19af0 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
19b00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19b10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19b20 43 6c 6f 73 65 28 26 70 46 69 6c 65 29 3b 0a 20  Close(&pFile);. 
19b30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19b40 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
19b50 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
19b60 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
19b70 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
19b80 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
19b90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19ba0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
19bb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
19bc0 20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 20    sqlite3OsLock 
19bd0 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e 20 3c 6c  <file handle> <l
19be0 6f 63 6b 74 79 70 65 3e 0a 2a 2f 0a 73 74 61 74  ocktype>.*/.stat
19bf0 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69  ic int test_sqli
19c00 74 65 33 4f 73 4c 6f 63 6b 28 0a 20 20 76 6f 69  te3OsLock(.  voi
19c10 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
19c20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
19c30 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
19c40 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
19c50 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 4f  ST objv[].){.  O
19c60 73 46 69 6c 65 20 2a 20 70 46 69 6c 65 3b 0a 20  sFile * pFile;. 
19c70 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
19c80 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
19c90 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19ca0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
19cb0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
19cc0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 54   \"", .        T
19cd0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19ce0 76 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20  v[0]), .        
19cf0 22 20 66 69 6c 65 68 61 6e 64 6c 65 20 28 53 48  " filehandle (SH
19d00 41 52 45 44 7c 52 45 53 45 52 56 45 44 7c 50 45  ARED|RESERVED|PE
19d10 4e 44 49 4e 47 7c 45 58 43 4c 55 53 49 56 45 29  NDING|EXCLUSIVE)
19d20 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
19d30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19d40 0a 0a 20 20 69 66 28 20 67 65 74 46 69 6c 65 50  ..  if( getFileP
19d50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
19d60 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19d70 76 5b 31 5d 29 2c 20 26 70 46 69 6c 65 29 20 29  v[1]), &pFile) )
19d80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
19d90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
19da0 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 53 48  f( 0==strcmp("SH
19db0 41 52 45 44 22 2c 20 54 63 6c 5f 47 65 74 53 74  ARED", Tcl_GetSt
19dc0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29  ring(objv[2])) )
19dd0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
19de0 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  e3OsLock(pFile, 
19df0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
19e00 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d  }.  else if( 0==
19e10 73 74 72 63 6d 70 28 22 52 45 53 45 52 56 45 44  strcmp("RESERVED
19e20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
19e30 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20  (objv[2])) ){.  
19e40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19e50 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 52 45 53 45  Lock(pFile, RESE
19e60 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  RVED_LOCK);.  }.
19e70 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 74    else if( 0==st
19e80 72 63 6d 70 28 22 50 45 4e 44 49 4e 47 22 2c 20  rcmp("PENDING", 
19e90 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19ea0 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72  jv[2])) ){.    r
19eb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
19ec0 6b 28 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  k(pFile, PENDING
19ed0 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c  _LOCK);.  }.  el
19ee0 73 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70  se if( 0==strcmp
19ef0 28 22 45 58 43 4c 55 53 49 56 45 22 2c 20 54 63  ("EXCLUSIVE", Tc
19f00 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19f10 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20  [2])) ){.    rc 
19f20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
19f30 70 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45  pFile, EXCLUSIVE
19f40 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 65 6c 73 65 7b  _LOCK);.  }else{
19f50 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
19f60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
19f70 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
19f80 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
19f90 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
19fa0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 0a 20 20  ng(objv[0]), .  
19fb0 20 20 20 20 20 20 22 20 66 69 6c 65 68 61 6e 64        " filehand
19fc0 6c 65 20 28 53 48 41 52 45 44 7c 52 45 53 45 52  le (SHARED|RESER
19fd0 56 45 44 7c 50 45 4e 44 49 4e 47 7c 45 58 43 4c  VED|PENDING|EXCL
19fe0 55 53 49 56 45 29 22 2c 20 30 29 3b 0a 20 20 20  USIVE)", 0);.   
19ff0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a000 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  R;.  }..  if( rc
1a010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a020 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1a030 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1a040 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1a050 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
1a060 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a070 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
1a080 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1a090 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
1a0a0 65 33 4f 73 55 6e 6c 6f 63 6b 20 3c 66 69 6c 65  e3OsUnlock <file
1a0b0 20 68 61 6e 64 6c 65 3e 0a 2a 2f 0a 73 74 61 74   handle>.*/.stat
1a0c0 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69  ic int test_sqli
1a0d0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 0a 20 20 76  te3OsUnlock(.  v
1a0e0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1a0f0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1a100 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1a110 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1a120 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1a130 20 4f 73 46 69 6c 65 20 2a 20 70 46 69 6c 65 3b   OsFile * pFile;
1a140 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
1a150 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1a160 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a170 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1a180 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1a190 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1a1a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1a1b0 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 68 61  jv[0]), " fileha
1a1c0 6e 64 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  ndle", 0);.    r
1a1d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a1e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 46  .  }..  if( getF
1a1f0 69 6c 65 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  ilePointer(inter
1a200 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1a210 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 46 69 6c  (objv[1]), &pFil
1a220 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
1a230 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a240 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a250 55 6e 6c 6f 63 6b 28 70 46 69 6c 65 2c 20 4e 4f  Unlock(pFile, NO
1a260 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
1a270 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a280 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1a290 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1a2a0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1a2b0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
1a2c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a2d0 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
1a2e0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1a2f0 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
1a300 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
1a310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1a320 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 54 65 6d  est_sqlite3OsTem
1a330 70 46 69 6c 65 4e 61 6d 65 28 0a 20 20 76 6f 69  pFileName(.  voi
1a340 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1a350 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1a360 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1a370 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1a380 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
1a390 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c 49 54 45  har zFile[SQLITE
1a3a0 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
1a3b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
1a3c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70   = sqlite3OsTemp
1a3d0 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b  FileName(zFile);
1a3e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a3f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
1a400 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1a410 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
1a420 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
1a430 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
1a440 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a450 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
1a460 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 46 69  sult(interp, zFi
1a470 6c 65 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  le, 0);.  return
1a480 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
1a490 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  f../*.** Usage: 
1a4a0 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69   sqlite_set_magi
1a4b0 63 20 20 44 42 20 20 4d 41 47 49 43 2d 4e 55 4d  c  DB  MAGIC-NUM
1a4c0 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  BER.**.** Set th
1a4d0 65 20 64 62 2d 3e 6d 61 67 69 63 20 76 61 6c 75  e db->magic valu
1a4e0 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
1a4f0 20 74 6f 20 74 65 73 74 20 65 72 72 6f 72 20 72   to test error r
1a500 65 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0a 2a  ecovery logic..*
1a510 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
1a520 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 28 0a 20  ite_set_magic(. 
1a530 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1a540 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1a550 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1a560 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
1a570 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
1a580 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1a590 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1a5a0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a5b0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1a5c0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1a5d0 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
1a5e0 20 20 20 20 22 20 44 42 20 4d 41 47 49 43 22 2c      " DB MAGIC",
1a5f0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a600 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1a610 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1a620 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1a630 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1a640 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1a650 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d  ( strcmp(argv[2]
1a660 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  , "SQLITE_MAGIC_
1a670 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  OPEN")==0 ){.   
1a680 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
1a690 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
1a6a0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1a6b0 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
1a6c0 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
1a6d0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
1a6e0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
1a6f0 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
1a700 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1a710 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54  (argv[2], "SQLIT
1a720 45 5f 4d 41 47 49 43 5f 42 55 53 59 22 29 3d 3d  E_MAGIC_BUSY")==
1a730 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
1a740 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
1a750 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 20  C_BUSY;.  }else 
1a760 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
1a770 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
1a780 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20 29 7b 0a  C_ERROR")==0 ){.
1a790 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
1a7a0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
1a7b0 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OR;.  }else if( 
1a7c0 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
1a7d0 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 64 62 2d  p, argv[2], &db-
1a7e0 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20 20 20 72  >magic) ){.    r
1a7f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a800 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1a810 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1a820 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 69  sage:  sqlite3_i
1a830 6e 74 65 72 72 75 70 74 20 20 44 42 20 0a 2a 2a  nterrupt  DB .**
1a840 0a 2a 2a 20 54 72 69 67 67 65 72 20 61 6e 20 69  .** Trigger an i
1a850 6e 74 65 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a  nterrupt on DB.*
1a860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1a870 74 5f 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76  t_interrupt(.  v
1a880 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1a890 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1a8a0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1a8b0 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1a8c0 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  v.){.  sqlite3 *
1a8d0 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
1a8e0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1a8f0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a900 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1a910 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1a920 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20  argv[0], " DB", 
1a930 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a940 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a950 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1a960 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
1a970 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1a980 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
1a990 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64  ite3_interrupt(d
1a9a0 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  b);.  return TCL
1a9b0 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  _OK;.}..static u
1a9c0 38 20 2a 73 71 6c 69 74 65 33 5f 73 74 61 63 6b  8 *sqlite3_stack
1a9d0 5f 62 61 73 65 6c 69 6e 65 20 3d 20 30 3b 0a 0a  _baseline = 0;..
1a9e0 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 73  /*.** Fill the s
1a9f0 74 61 63 6b 20 77 69 74 68 20 61 20 6b 6e 6f 77  tack with a know
1aa00 6e 20 62 69 74 70 61 74 74 65 72 6e 2e 0a 2a 2f  n bitpattern..*/
1aa10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 65  .static void pre
1aa20 70 53 74 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20  pStack(void){.  
1aa30 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 62 69 67  int i;.  u32 big
1aa40 42 75 66 5b 36 35 35 33 36 5d 3b 0a 20 20 66 6f  Buf[65536];.  fo
1aa50 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
1aa60 62 69 67 42 75 66 29 3b 20 69 2b 2b 29 20 62 69  bigBuf); i++) bi
1aa70 67 42 75 66 5b 69 5d 20 3d 20 30 78 64 65 61 64  gBuf[i] = 0xdead
1aa80 62 65 65 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  beef;.  sqlite3_
1aa90 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d  stack_baseline =
1aaa0 20 28 75 38 2a 29 26 62 69 67 42 75 66 5b 36 35   (u8*)&bigBuf[65
1aab0 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  536];.}../*.** G
1aac0 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  et the current s
1aad0 74 61 63 6b 20 64 65 70 74 68 2e 20 20 55 73 65  tack depth.  Use
1aae0 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
1aaf0 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c  only..*/.u64 sql
1ab00 69 74 65 33 53 74 61 63 6b 44 65 70 74 68 28 76  ite3StackDepth(v
1ab10 6f 69 64 29 7b 0a 20 20 75 38 20 78 3b 0a 20 20  oid){.  u8 x;.  
1ab20 72 65 74 75 72 6e 20 28 75 36 34 29 28 73 71 6c  return (u64)(sql
1ab30 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c  ite3_stack_basel
1ab40 69 6e 65 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a  ine - &x);.}../*
1ab50 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1ab60 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 20 44  te3_stack_used D
1ab70 42 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20  B SQL.**.** Try 
1ab80 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20 61  to measure the a
1ab90 6d 6f 75 6e 74 20 6f 66 20 73 74 61 63 6b 20 73  mount of stack s
1aba0 70 61 63 65 20 75 73 65 64 20 62 79 20 61 20 63  pace used by a c
1abb0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
1abc0 78 65 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  xec.*/.static in
1abd0 74 20 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65  t test_stack_use
1abe0 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
1abf0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1ac00 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1ac10 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1ac20 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
1ac30 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
1ac40 69 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  i;.  if( argc!=3
1ac50 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1ac60 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1ac70 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1ac80 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1ac90 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1aca0 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a   " DB SQL", 0);.
1acb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1acc0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1acd0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1ace0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1acf0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1ad00 45 52 52 4f 52 3b 0a 20 20 70 72 65 70 53 74 61  ERROR;.  prepSta
1ad10 63 6b 28 29 3b 0a 20 20 28 76 6f 69 64 29 73 71  ck();.  (void)sq
1ad20 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61  lite3_exec(db, a
1ad30 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 30 29  rgv[2], 0, 0, 0)
1ad40 3b 0a 20 20 66 6f 72 28 69 3d 36 35 35 33 35 3b  ;.  for(i=65535;
1ad50 20 69 3e 3d 30 20 26 26 20 28 28 75 33 32 2a 29   i>=0 && ((u32*)
1ad60 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
1ad70 73 65 6c 69 6e 65 29 5b 2d 69 5d 3d 3d 30 78 64  seline)[-i]==0xd
1ad80 65 61 64 62 65 65 66 3b 20 69 2d 2d 29 7b 7d 0a  eadbeef; i--){}.
1ad90 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1ada0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1adb0 65 77 49 6e 74 4f 62 6a 28 69 2a 34 29 29 3b 0a  ewIntObj(i*4));.
1adc0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1add0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1ade0 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66   sqlite_delete_f
1adf0 75 6e 63 74 69 6f 6e 20 44 42 20 66 75 6e 63 74  unction DB funct
1ae00 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44  ion-name.**.** D
1ae10 65 6c 65 74 65 20 74 68 65 20 75 73 65 72 20 66  elete the user f
1ae20 75 6e 63 74 69 6f 6e 20 27 66 75 6e 63 74 69 6f  unction 'functio
1ae30 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74  n-name' from dat
1ae40 61 62 61 73 65 20 68 61 6e 64 6c 65 20 44 42 2e  abase handle DB.
1ae50 20 49 74 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65   It.** is assume
1ae60 64 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20  d that the user 
1ae70 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 72 65  function was cre
1ae80 61 74 65 64 20 61 73 20 55 54 46 38 2c 20 61 6e  ated as UTF8, an
1ae90 79 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61  y number of.** a
1aea0 72 67 75 6d 65 6e 74 73 20 28 74 68 65 20 77 61  rguments (the wa
1aeb0 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66  y the TCL interf
1aec0 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f  ace does it)..*/
1aed0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65  .static int dele
1aee0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  te_function(.  v
1aef0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1af00 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1af10 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1af20 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1af30 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  v.){.  int rc;. 
1af40 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1af50 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1af60 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1af70 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1af80 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1af90 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1afa0 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1afb0 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c   function-name",
1afc0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1afd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1afe0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1aff0 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1b000 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1b010 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1b020 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1b030 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  e_function(db, a
1b040 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[2], -1, SQLI
1b050 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 30  TE_UTF8, 0, 0, 0
1b060 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  , 0);.  Tcl_SetR
1b070 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1b080 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
1b090 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
1b0a0 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
1b0b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1b0c0 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65  age: sqlite_dele
1b0d0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44 42 20  te_collation DB 
1b0e0 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a  collation-name.*
1b0f0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
1b100 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1b110 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61  ce 'collation-na
1b120 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73  me' from databas
1b130 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e  e handle .** DB.
1b140 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
1b150 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  hat the collatio
1b160 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73 20 63  n sequence was c
1b170 72 65 61 74 65 64 20 61 73 20 55 54 46 38 20 28  reated as UTF8 (
1b180 74 68 65 20 0a 2a 2a 20 77 61 79 20 74 68 65 20  the .** way the 
1b190 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f  TCL interface do
1b1a0 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69  es it)..*/.stati
1b1b0 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 63 6f 6c  c int delete_col
1b1c0 6c 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  lation(.  void *
1b1d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1b1e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1b1f0 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1b200 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1b210 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1b220 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1b230 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1b240 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1b250 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1b260 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1b270 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1b280 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63         " DB func
1b290 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a  tion-name", 0);.
1b2a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b2b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1b2c0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1b2d0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1b2e0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1b2f0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1b300 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
1b310 6c 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b  lation(db, argv[
1b320 32 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  2], SQLITE_UTF8,
1b330 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65   0, 0);.  Tcl_Se
1b340 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1b350 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1b360 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
1b370 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
1b380 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1b390 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 67  Usage: sqlite3_g
1b3a0 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42  et_autocommit DB
1b3b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1b3c0 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ue if the databa
1b3d0 73 65 20 44 42 20 69 73 20 63 75 72 72 65 6e 74  se DB is current
1b3e0 6c 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69  ly in auto-commi
1b3f0 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72  t mode..** Retur
1b400 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  n false if not..
1b410 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1b420 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20  t_autocommit(.  
1b430 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1b440 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1b450 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1b460 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1b470 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42 75  gv.){.  char zBu
1b480 66 5b 33 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  f[30];.  sqlite3
1b490 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1b4a0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1b4b0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1b4c0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1b4d0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1b4e0 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1b4f0 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20      " DB", 0);. 
1b500 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b510 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1b520 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1b530 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1b540 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b550 52 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28  RROR;.  sprintf(
1b560 7a 42 75 66 2c 20 22 25 64 22 2c 20 73 71 6c 69  zBuf, "%d", sqli
1b570 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
1b580 69 74 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41  it(db));.  Tcl_A
1b590 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1b5a0 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
1b5b0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1b5c0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1b5d0 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
1b5e0 6f 75 74 20 44 42 20 4d 53 0a 2a 2a 0a 2a 2a 20  out DB MS.**.** 
1b5f0 53 65 74 20 74 68 65 20 62 75 73 79 20 74 69 6d  Set the busy tim
1b600 65 6f 75 74 2e 20 20 54 68 69 73 20 69 73 20 6d  eout.  This is m
1b610 6f 72 65 20 65 61 73 69 6c 79 20 64 6f 6e 65 20  ore easily done 
1b620 75 73 69 6e 67 20 74 68 65 20 74 69 6d 65 6f 75  using the timeou
1b630 74 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  t.** method of t
1b640 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65  he TCL interface
1b650 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 61  .  But we need a
1b660 20 77 61 79 20 74 6f 20 74 65 73 74 20 74 68 65   way to test the
1b670 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20 69   case.** where i
1b680 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1b690 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73 74 61 74  _MISUSE..*/.stat
1b6a0 69 63 20 69 6e 74 20 74 65 73 74 5f 62 75 73 79  ic int test_busy
1b6b0 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76 6f 69 64  _timeout(.  void
1b6c0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1b6d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1b6e0 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1b6f0 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1b700 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d 73 3b 0a  {.  int rc, ms;.
1b710 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1b720 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
1b730 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1b740 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1b750 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1b760 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1b770 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
1b780 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
1b790 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b7a0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1b7b0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1b7c0 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1b7d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b7e0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
1b7f0 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
1b800 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54   &ms) ) return T
1b810 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1b820 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
1b830 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29 3b 0a 20  meout(db, ms);. 
1b840 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1b850 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
1b860 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72  3TestErrorName(r
1b870 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
1b880 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1b890 2a 20 55 73 61 67 65 3a 20 20 74 63 6c 5f 76 61  * Usage:  tcl_va
1b8a0 72 69 61 62 6c 65 5f 74 79 70 65 20 56 41 52 49  riable_type VARI
1b8b0 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  ABLENAME.**.** R
1b8c0 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
1b8d0 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72  f the internal r
1b8e0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f  epresentation fo
1b8f0 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  r the.** value o
1b900 66 20 74 68 65 20 67 69 76 65 6e 20 76 61 72 69  f the given vari
1b910 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1b920 69 6e 74 20 74 63 6c 5f 76 61 72 69 61 62 6c 65  int tcl_variable
1b930 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20  _type(.  void * 
1b940 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1b950 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b960 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1b970 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1b980 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f  bjv[].){.  Tcl_O
1b990 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69 66 28 20  bj *pVar;.  if( 
1b9a0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1b9b0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1b9c0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1b9d0 20 22 56 41 52 49 41 42 4c 45 22 29 3b 0a 20 20   "VARIABLE");.  
1b9e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b9f0 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20 3d  OR;.  }.  pVar =
1ba00 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69   Tcl_GetVar2Ex(i
1ba10 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1ba20 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 30  ring(objv[1]), 0
1ba30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f  , TCL_LEAVE_ERR_
1ba40 4d 53 47 29 3b 0a 20 20 69 66 28 20 70 56 61 72  MSG);.  if( pVar
1ba50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
1ba60 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70 56  _ERROR;.  if( pV
1ba70 61 72 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a 20  ar->typePtr ){. 
1ba80 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
1ba90 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1baa0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 61  NewStringObj(pVa
1bab0 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
1bac0 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65  , -1));.  }.  re
1bad0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1bae0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1baf0 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
1bb00 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41  mory ?N?.**.** A
1bb10 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73  ttempt to releas
1bb20 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74  e memory current
1bb30 6c 79 20 68 65 6c 64 20 62 75 74 20 6e 6f 74 20  ly held but not 
1bb40 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65  actually require
1bb50 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65  d..** The intege
1bb60 72 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  r N is the numbe
1bb70 72 20 6f 66 20 62 79 74 65 73 20 77 65 20 61 72  r of bytes we ar
1bb80 65 20 74 72 79 69 6e 67 20 74 6f 20 72 65 6c 65  e trying to rele
1bb90 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65  ase.  The .** re
1bba0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
1bbb0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f  e amount of memo
1bbc0 72 79 20 61 63 74 75 61 6c 6c 79 20 72 65 6c 65  ry actually rele
1bbd0 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ased..*/.static 
1bbe0 69 6e 74 20 74 65 73 74 5f 72 65 6c 65 61 73 65  int test_release
1bbf0 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20  _memory(.  void 
1bc00 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1bc10 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1bc20 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1bc30 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1bc40 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64   objv[].){.#if d
1bc50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1bc60 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
1bc70 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69  GEMENT) && !defi
1bc80 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1bc90 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74 20 4e 3b  DISKIO).  int N;
1bca0 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66  .  int amt;.  if
1bcb0 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a  ( objc!=1 && obj
1bcc0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1bcd0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1bce0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
1bcf0 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  N?");.    return
1bd00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1bd10 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
1bd20 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
1bd30 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1bd40 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20  p, objv[1], &N) 
1bd50 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1bd60 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
1bd70 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 61   N = -1;.  }.  a
1bd80 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6c  mt = sqlite3_rel
1bd90 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a  ease_memory(N);.
1bda0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1bdb0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1bdc0 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a  ewIntObj(amt));.
1bdd0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1bde0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1bdf0 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
1be00 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
1be10 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79   ?N?.**.** Query
1be20 20 6f 72 20 73 65 74 20 74 68 65 20 73 6f 66 74   or set the soft
1be30 20 68 65 61 70 20 6c 69 6d 69 74 20 66 6f 72 20   heap limit for 
1be40 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
1be50 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c 69 6d 69  ad.  The.** limi
1be60 74 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  t is only change
1be70 64 20 69 66 20 74 68 65 20 4e 20 69 73 20 70 72  d if the N is pr
1be80 65 73 65 6e 74 2e 20 20 54 68 65 20 70 72 65 76  esent.  The prev
1be90 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a 20 69 73  ious limit.** is
1bea0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1beb0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6f  atic int test_so
1bec0 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a 20  ft_heap_limit(. 
1bed0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1bee0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1bef0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1bf00 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1bf10 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1bf20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1bf30 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
1bf40 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20 26 26  Y_MANAGEMENT) &&
1bf50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1bf60 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
1bf70 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f  int amt;.  if( o
1bf80 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d  bjc!=1 && objc!=
1bf90 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1bfa0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1bfb0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22  , 1, objv, "?N?"
1bfc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1bfd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  L_ERROR;.  }.  a
1bfe0 6d 74 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  mt = sqlite3Thre
1bff0 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
1c000 2d 3e 6e 53 6f 66 74 48 65 61 70 4c 69 6d 69 74  ->nSoftHeapLimit
1c010 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  ;.  if( objc==2 
1c020 29 7b 0a 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20  ){.    int N;.  
1c030 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1c040 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1c050 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72  objv[1], &N) ) r
1c060 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c070 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6f 66  .    sqlite3_sof
1c080 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 4e 29 3b  t_heap_limit(N);
1c090 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
1c0a0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1c0b0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6d  Tcl_NewIntObj(am
1c0c0 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  t));.#endif.  re
1c0d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c0e0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
1c0f0 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 74 73 64  qlite3_clear_tsd
1c100 5f 6d 65 6d 64 65 62 75 67 0a 2a 2a 0a 2a 2a 20  _memdebug.**.** 
1c110 43 6c 65 61 72 20 61 6c 6c 20 6f 66 20 74 68 65  Clear all of the
1c120 20 4d 45 4d 44 45 42 55 47 20 69 6e 66 6f 72 6d   MEMDEBUG inform
1c130 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 74 68 72  ation out of thr
1c140 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
1c150 61 2e 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  a..** This will 
1c160 61 6c 6c 6f 77 20 69 74 20 74 6f 20 62 65 20 64  allow it to be d
1c170 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 73  eallocated..*/.s
1c180 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1c190 6c 65 61 72 5f 74 73 64 5f 6d 65 6d 64 65 62 75  lear_tsd_memdebu
1c1a0 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  g(.  void * clie
1c1b0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1c1c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1c1d0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1c1e0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1c1f0 5d 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43  ].){.  return TC
1c200 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1c210 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1c220 74 73 64 5f 72 65 6c 65 61 73 65 0a 2a 2a 0a 2a  tsd_release.**.*
1c230 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 52 65  * Call sqlite3Re
1c240 6c 65 61 73 65 54 68 72 65 61 64 44 61 74 61 2e  leaseThreadData.
1c250 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1c260 65 73 74 5f 74 73 64 5f 72 65 6c 65 61 73 65 28  est_tsd_release(
1c270 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c280 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1c290 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1c2a0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1c2b0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1c2c0 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
1c2d0 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 29 0a  QLITE_MEMDEBUG).
1c2e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1c2f0 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 23 65  ThreadData();.#e
1c300 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
1c310 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1c320 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1c330 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 0a 2a  thread_cleanup.*
1c340 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
1c350 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
1c360 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a 73 74 61  anup API..*/.sta
1c370 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 68 72  tic int test_thr
1c380 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a 20 20 76  ead_cleanup(.  v
1c390 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1c3a0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1c3b0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1c3c0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1c3d0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1c3e0 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
1c3f0 63 6c 65 61 6e 75 70 28 29 3b 0a 20 20 72 65 74  cleanup();.  ret
1c400 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
1c410 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
1c420 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66  qlite3_pager_ref
1c430 63 6f 75 6e 74 73 20 20 44 42 0a 2a 2a 0a 2a 2a  counts  DB.**.**
1c440 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f   Return a list o
1c450 66 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20  f numbers which 
1c460 61 72 65 20 74 68 65 20 50 61 67 65 72 52 65 66  are the PagerRef
1c470 63 6f 75 6e 74 20 66 6f 72 20 61 6c 6c 0a 2a 2a  count for all.**
1c480 20 70 61 67 65 72 73 20 6f 6e 20 65 61 63 68 20   pagers on each 
1c490 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1c4a0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1c4b0 6e 74 20 74 65 73 74 5f 70 61 67 65 72 5f 72 65  nt test_pager_re
1c4c0 66 63 6f 75 6e 74 73 28 0a 20 20 76 6f 69 64 20  fcounts(.  void 
1c4d0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1c4e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1c4f0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1c500 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1c510 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1c520 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
1c530 69 3b 0a 20 20 69 6e 74 20 76 2c 20 2a 61 3b 0a  i;.  int v, *a;.
1c540 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
1c550 6c 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  lt;..  if( objc!
1c560 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1c570 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c580 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1c590 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1c5a0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
1c5b0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
1c5c0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22  jv[0], 0), " DB"
1c5d0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c5e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c5f0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1c600 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1c610 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1c620 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1c630 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 52   TCL_ERROR;.  pR
1c640 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  esult = Tcl_NewO
1c650 62 6a 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  bj();.  for(i=0;
1c660 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1c670 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44  {.    if( db->aD
1c680 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 7b 0a 20  b[i].pBt==0 ){. 
1c690 20 20 20 20 20 76 20 3d 20 2d 31 3b 0a 20 20 20       v = -1;.   
1c6a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 20   }else{.      a 
1c6b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
1c6c0 61 74 73 28 73 71 6c 69 74 65 33 42 74 72 65 65  ats(sqlite3Btree
1c6d0 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d  Pager(db->aDb[i]
1c6e0 2e 70 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20  .pBt));.      v 
1c6f0 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20 20  = a[0];.    }.  
1c700 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1c710 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
1c720 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65 77 49 6e  esult, Tcl_NewIn
1c730 74 4f 62 6a 28 76 29 29 3b 0a 20 20 7d 0a 20 20  tObj(v));.  }.  
1c740 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1c750 28 69 6e 74 65 72 70 2c 20 70 52 65 73 75 6c 74  (interp, pResult
1c760 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1c770 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  OK;.}.../*.** tc
1c780 6c 63 6d 64 3a 20 20 20 77 6f 72 6b 69 6e 67 5f  lcmd:   working_
1c790 36 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a 20  64bit_int.**.** 
1c7a0 53 6f 6d 65 20 54 43 4c 20 62 75 69 6c 64 73 20  Some TCL builds 
1c7b0 28 65 78 3a 20 63 79 67 77 69 6e 29 20 64 6f 20  (ex: cygwin) do 
1c7c0 6e 6f 74 20 73 75 70 70 6f 72 74 20 36 34 2d 62  not support 64-b
1c7d0 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68  it integers.  Th
1c7e0 69 73 0a 2a 2a 20 6c 65 61 64 73 20 74 6f 20 61  is.** leads to a
1c7f0 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 73 74 20   number of test 
1c800 66 61 69 6c 75 72 65 73 2e 20 20 54 68 65 20 70  failures.  The p
1c810 72 65 73 65 6e 74 20 63 6f 6d 6d 61 6e 64 20 63  resent command c
1c820 68 65 63 6b 73 20 74 68 65 0a 2a 2a 20 54 43 4c  hecks the.** TCL
1c830 20 62 75 69 6c 64 20 74 6f 20 73 65 65 20 77 68   build to see wh
1c840 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20  ether or not it 
1c850 73 75 70 70 6f 72 74 73 20 36 34 2d 62 69 74 20  supports 64-bit 
1c860 69 6e 74 65 67 65 72 73 2e 20 20 49 74 0a 2a 2a  integers.  It.**
1c870 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 69 66   returns TRUE if
1c880 20 69 74 20 64 6f 65 73 20 61 6e 64 20 46 41 4c   it does and FAL
1c890 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  SE if not..**.**
1c8a0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73   This command is
1c8b0 20 75 73 65 64 20 74 6f 20 77 61 72 6e 20 75 73   used to warn us
1c8c0 65 72 73 20 74 68 61 74 20 74 68 65 69 72 20 54  ers that their T
1c8d0 43 4c 20 62 75 69 6c 64 20 69 73 20 64 65 66 65  CL build is defe
1c8e0 63 74 69 76 65 0a 2a 2a 20 61 6e 64 20 74 68 61  ctive.** and tha
1c8f0 74 20 74 68 65 20 65 72 72 6f 72 73 20 74 68 65  t the errors the
1c900 79 20 61 72 65 20 73 65 65 69 6e 67 20 69 6e 20  y are seeing in 
1c910 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73  the test scripts
1c920 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 72   might be.** a r
1c930 65 73 75 6c 74 20 6f 66 20 74 68 65 69 72 20 64  esult of their d
1c940 65 66 65 63 74 69 76 65 20 54 43 4c 20 72 61 74  efective TCL rat
1c950 68 65 72 20 74 68 61 6e 20 70 72 6f 62 6c 65 6d  her than problem
1c960 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  s in SQLite..*/.
1c970 73 74 61 74 69 63 20 69 6e 74 20 77 6f 72 6b 69  static int worki
1c980 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28 0a 20 20  ng_64bit_int(.  
1c990 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
1c9a0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
1c9b0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
1c9c0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
1c9d0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
1c9e0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
1c9f0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
1ca00 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
1ca10 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
1ca20 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
1ca30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1ca40 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
1ca50 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
1ca60 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
1ca70 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
1ca80 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62  s */.){.  Tcl_Ob
1ca90 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a 20 20 69  j *pTestObj;.  i
1caa0 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20 30 3b 0a  nt working = 0;.
1cab0 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d 20 54 63  .  pTestObj = Tc
1cac0 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
1cad0 31 30 30 30 30 30 30 2a 28 69 36 34 29 31 32 33  1000000*(i64)123
1cae0 34 35 36 37 38 39 30 29 3b 0a 20 20 77 6f 72 6b  4567890);.  work
1caf0 69 6e 67 20 3d 20 73 74 72 63 6d 70 28 54 63 6c  ing = strcmp(Tcl
1cb00 5f 47 65 74 53 74 72 69 6e 67 28 70 54 65 73 74  _GetString(pTest
1cb10 4f 62 6a 29 2c 20 22 31 32 33 34 35 36 37 38 39  Obj), "123456789
1cb20 30 30 30 30 30 30 30 22 29 3d 3d 30 3b 0a 20 20  0000000")==0;.  
1cb30 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
1cb40 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20 20 54 63  (pTestObj);.  Tc
1cb50 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1cb60 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
1cb70 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b 69 6e 67  oleanObj(working
1cb80 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1cb90 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  _OK;.}.../*.** R
1cba0 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73  egister commands
1cbb0 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e   with the TCL in
1cbc0 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e  terpreter..*/.in
1cbd0 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e  t Sqlitetest1_In
1cbe0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
1cbf0 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e  nterp){.  extern
1cc00 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
1cc10 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  rch_count;.  ext
1cc20 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1cc30 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b  interrupt_count;
1cc40 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
1cc50 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f  lite3_open_file_
1cc60 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
1cc70 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74  int sqlite3_sort
1cc80 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
1cc90 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72   int sqlite3_cur
1cca0 72 65 6e 74 5f 74 69 6d 65 3b 0a 20 20 65 78 74  rent_time;.  ext
1ccb0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1ccc0 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20  max_blobsize;.  
1ccd0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1cce0 65 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63  e3BtreeSharedCac
1ccf0 68 65 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a  heReport(void*,.
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
1cd30 74 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62  terp*,int,Tcl_Ob
1cd40 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61  j*CONST*);.  sta
1cd50 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
1cd60 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
1cd70 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20      Tcl_CmdProc 
1cd80 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64  *xProc;.  } aCmd
1cd90 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73  [] = {.     { "s
1cda0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
1cdb0 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  nt",           (
1cdc0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1cdd0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
1cde0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1cdf0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
1ce00 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 28  nt64",         (
1ce10 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1ce20 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
1ce30 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  64  },.     { "s
1ce40 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
1ce50 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  tr",           (
1ce60 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1ce70 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
1ce80 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1ce90 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
1cea0 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  str",          (
1ceb0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1cec0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74  ite3_snprintf_st
1ced0 72 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  r   },.     { "s
1cee0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
1cef0 74 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28  tronly",       (
1cf00 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1cf10 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
1cf20 6f 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73  only},.     { "s
1cf30 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
1cf40 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28  ouble",        (
1cf50 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1cf60 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
1cf70 62 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ble },.     { "s
1cf80 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
1cf90 63 61 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28  caled",        (
1cfa0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1cfb0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
1cfc0 6c 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  led },.     { "s
1cfd0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68  qlite3_mprintf_h
1cfe0 65 78 64 6f 75 62 6c 65 22 2c 20 20 20 28 54 63  exdouble",   (Tc
1cff0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
1d000 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f  e3_mprintf_hexdo
1d010 75 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73  uble},.     { "s
1d020 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a  qlite3_mprintf_z
1d030 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28  _test",        (
1d040 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
1d050 74 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20  t_mprintf_z     
1d060 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1d070 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f  lite3_mprintf_n_
1d080 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54  test",        (T
1d090 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
1d0a0 5f 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20 20 20  _mprintf_n      
1d0b0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1d0c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e  ite3_snprintf_in
1d0d0 74 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  t",          (Tc
1d0e0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
1d0f0 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20  snprintf_int    
1d100 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1d110 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
1d120 72 6f 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c  rowid",     (Tcl
1d130 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c  _CmdProc*)test_l
1d140 61 73 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20  ast_rowid       
1d150 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1d160 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c  e3_exec_printf",
1d170 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
1d180 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78  CmdProc*)test_ex
1d190 65 63 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d  ec_printf      }
1d1a0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1d1b0 33 5f 65 78 65 63 22 2c 20 20 20 20 20 20 20 20  3_exec",        
1d1c0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
1d1d0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
1d1e0 63 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  c             },
1d1f0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1d200 5f 65 78 65 63 5f 6e 72 22 2c 20 20 20 20 20 20  _exec_nr",      
1d210 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
1d220 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
1d230 5f 6e 72 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  _nr          },.
1d240 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1d250 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
1d260 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ",      (Tcl_Cmd
1d270 50 72 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f 74  Proc*)test_get_t
1d280 61 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 20  able_printf },. 
1d290 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
1d2a0 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20  lose",          
1d2b0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1d2c0 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74  roc*)sqlite_test
1d2d0 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20  _close     },.  
1d2e0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72     { "sqlite3_cr
1d2f0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  eate_function", 
1d300 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
1d310 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f  oc*)test_create_
1d320 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20  function  },.   
1d330 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
1d340 61 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20  ate_aggregate", 
1d350 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
1d360 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61  c*)test_create_a
1d370 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20  ggregate },.    
1d380 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73   { "sqlite_regis
1d390 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  ter_test_functio
1d3a0 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  n", (Tcl_CmdProc
1d3b0 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  *)test_register_
1d3c0 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20  func    },.     
1d3d0 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22  { "sqlite_abort"
1d3e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d3f0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
1d400 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20  )sqlite_abort   
1d410 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 64 65 66         },.#ifdef
1d420 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
1d430 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
1d440 6d 61 6c 6c 6f 63 5f 66 61 69 6c 22 2c 20 20 20  malloc_fail",   
1d450 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
1d460 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 6d 61  dProc*)sqlite_ma
1d470 6c 6c 6f 63 5f 66 61 69 6c 20 20 20 20 7d 2c 0a  lloc_fail    },.
1d480 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 6d       { "sqlite_m
1d490 61 6c 6c 6f 63 5f 73 74 61 74 22 2c 20 20 20 20  alloc_stat",    
1d4a0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1d4b0 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 6d 61 6c  Proc*)sqlite_mal
1d4c0 6c 6f 63 5f 73 74 61 74 20 20 20 20 7d 2c 0a 23  loc_stat    },.#
1d4d0 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
1d4e0 6c 69 74 65 5f 62 69 6e 64 22 2c 20 20 20 20 20  lite_bind",     
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
1d500 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
1d510 5f 62 69 6e 64 20 20 20 20 20 20 20 20 20 20 20  _bind           
1d520 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 72 65    },.     { "bre
1d530 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20 20 20  akpoint",       
1d540 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
1d550 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
1d560 62 72 65 61 6b 70 6f 69 6e 74 20 20 20 20 20 20  breakpoint      
1d570 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1d580 74 65 33 5f 6b 65 79 22 2c 20 20 20 20 20 20 20  te3_key",       
1d590 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
1d5a0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6b  _CmdProc*)test_k
1d5b0 65 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ey              
1d5c0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1d5d0 65 33 5f 72 65 6b 65 79 22 2c 20 20 20 20 20 20  e3_rekey",      
1d5e0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
1d5f0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65  CmdProc*)test_re
1d600 6b 65 79 20 20 20 20 20 20 20 20 20 20 20 20 7d  key            }
1d610 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1d620 5f 73 65 74 5f 6d 61 67 69 63 22 2c 20 20 20 20  _set_magic",    
1d630 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
1d640 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 73  mdProc*)sqlite_s
1d650 65 74 5f 6d 61 67 69 63 20 20 20 20 20 20 7d 2c  et_magic      },
1d660 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1d670 5f 69 6e 74 65 72 72 75 70 74 22 2c 20 20 20 20  _interrupt",    
1d680 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
1d690 64 50 72 6f 63 2a 29 74 65 73 74 5f 69 6e 74 65  dProc*)test_inte
1d6a0 72 72 75 70 74 20 20 20 20 20 20 20 20 7d 2c 0a  rrupt        },.
1d6b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64       { "sqlite_d
1d6c0 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c  elete_function",
1d6d0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1d6e0 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 66 75 6e  Proc*)delete_fun
1d6f0 63 74 69 6f 6e 20 20 20 20 20 20 20 7d 2c 0a 20  ction       },. 
1d700 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65      { "sqlite_de
1d710 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c  lete_collation",
1d720 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1d730 72 6f 63 2a 29 64 65 6c 65 74 65 5f 63 6f 6c 6c  roc*)delete_coll
1d740 61 74 69 6f 6e 20 20 20 20 20 20 7d 2c 0a 20 20  ation      },.  
1d750 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65     { "sqlite3_ge
1d760 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 22 2c 20 20  t_autocommit",  
1d770 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
1d780 6f 63 2a 29 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  oc*)get_autocomm
1d790 69 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  it        },.   
1d7a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 61    { "sqlite3_sta
1d7b0 63 6b 5f 75 73 65 64 22 2c 20 20 20 20 20 20 20  ck_used",       
1d7c0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
1d7d0 63 2a 29 74 65 73 74 5f 73 74 61 63 6b 5f 75 73  c*)test_stack_us
1d7e0 65 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ed       },.    
1d7f0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 75 73 79   { "sqlite3_busy
1d800 5f 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20  _timeout",      
1d810 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1d820 2a 29 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65  *)test_busy_time
1d830 6f 75 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  out     },.     
1d840 7b 20 22 70 72 69 6e 74 66 22 2c 20 20 20 20 20  { "printf",     
1d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d860 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
1d870 29 74 65 73 74 5f 70 72 69 6e 74 66 20 20 20 20  )test_printf    
1d880 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
1d890 20 22 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72 61   "sqlite3_io_tra
1d8a0 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ce",            
1d8b0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1d8c0 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 20 20 20  test_io_trace   
1d8d0 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20        },.  };.  
1d8e0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a  static struct {.
1d8f0 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
1d900 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d  ;.     Tcl_ObjCm
1d910 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20  dProc *xProc;.  
1d920 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44     void *clientD
1d930 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64  ata;.  } aObjCmd
1d940 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73  [] = {.     { "s
1d950 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f  qlite3_connectio
1d960 6e 5f 70 6f 69 6e 74 65 72 22 2c 20 20 20 20 67  n_pointer",    g
1d970 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74 65  et_sqlite_pointe
1d980 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  r, 0 },.     { "
1d990 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1d9a0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
1d9b0 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c 20 20  test_bind_int,  
1d9c0 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
1d9d0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65  "sqlite3_bind_ze
1d9e0 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  roblob",        
1d9f0 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
1da00 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  lob, 0 },.     {
1da10 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69   "sqlite3_bind_i
1da20 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
1da30 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36    test_bind_int6
1da40 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20  4,    0 },.     
1da50 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
1da60 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20  double",        
1da70 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75     test_bind_dou
1da80 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20  ble,   0 },.    
1da90 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
1daa0 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20 20 20  _null",         
1dab0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75      test_bind_nu
1dac0 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  ll     ,0 },.   
1dad0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
1dae0 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20 20 20  d_text",        
1daf0 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74       test_bind_t
1db00 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ext     ,0 },.  
1db10 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
1db20 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20 20 20  nd_text16",     
1db30 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
1db40 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c 0a 20  text16   ,0 },. 
1db50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
1db60 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20  ind_blob",      
1db70 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
1db80 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d 2c 0a  _blob     ,0 },.
1db90 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1dba0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
1dbb0 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62 69 6e  ount",  test_bin
1dbc0 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
1dbd0 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  t, 0},.     { "s
1dbe0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
1dbf0 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20 20 74  meter_name",   t
1dc00 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
1dc10 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20 20  er_name,  0},.  
1dc20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
1dc30 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
1dc40 65 78 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f  ex",  test_bind_
1dc50 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 2c  parameter_index,
1dc60 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
1dc70 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69  ite3_clear_bindi
1dc80 6e 67 73 22 2c 20 20 20 20 20 20 20 20 74 65 73  ngs",        tes
1dc90 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  t_clear_bindings
1dca0 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  , 0},.     { "sq
1dcb0 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c 20 20 20  lite3_sleep",   
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1dcd0 73 74 5f 73 6c 65 65 70 2c 20 20 20 20 20 20 20  st_sleep,       
1dce0 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
1dcf0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c  qlite3_errcode",
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1dd10 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20  est_errcode     
1dd20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
1dd30 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 22 2c  sqlite3_errmsg",
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 74 65 73 74 5f 65 72 72 6d 73 67 20 20 20 20 20  test_errmsg     
1dd60 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
1dd70 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31  "sqlite3_errmsg1
1dd80 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
1dd90 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 20   test_errmsg16  
1dda0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
1ddb0 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22 2c   "sqlite3_open",
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 74 65 73 74 5f 6f 70 65 6e 20 20 20 20 20    test_open     
1dde0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
1ddf0 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  { "sqlite3_open1
1de00 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
1de10 20 20 20 74 65 73 74 5f 6f 70 65 6e 31 36 20 20     test_open16  
1de20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
1de30 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6d 70   { "sqlite3_comp
1de40 6c 65 74 65 31 36 22 2c 20 20 20 20 20 20 20 20  lete16",        
1de50 20 20 20 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74      test_complet
1de60 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20  e16    ,0 },..  
1de70 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72     { "sqlite3_pr
1de80 65 70 61 72 65 22 2c 20 20 20 20 20 20 20 20 20  epare",         
1de90 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61        test_prepa
1dea0 72 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  re       ,0 },. 
1deb0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70      { "sqlite3_p
1dec0 72 65 70 61 72 65 31 36 22 2c 20 20 20 20 20 20  repare16",      
1ded0 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70         test_prep
1dee0 61 72 65 31 36 20 20 20 20 20 2c 30 20 7d 2c 0a  are16     ,0 },.
1def0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1df00 70 72 65 70 61 72 65 5f 76 32 22 2c 20 20 20 20  prepare_v2",    
1df10 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65          test_pre
1df20 70 61 72 65 5f 76 32 20 20 20 20 2c 30 20 7d 2c  pare_v2    ,0 },
1df30 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1df40 5f 70 72 65 70 61 72 65 31 36 5f 76 32 22 2c 20  _prepare16_v2", 
1df50 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
1df60 65 70 61 72 65 31 36 5f 76 32 20 20 2c 30 20 7d  epare16_v2  ,0 }
1df70 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1df80 33 5f 66 69 6e 61 6c 69 7a 65 22 2c 20 20 20 20  3_finalize",    
1df90 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 66            test_f
1dfa0 69 6e 61 6c 69 7a 65 20 20 20 20 20 20 2c 30 20  inalize      ,0 
1dfb0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1dfc0 65 33 5f 72 65 73 65 74 22 2c 20 20 20 20 20 20  e3_reset",      
1dfd0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
1dfe0 72 65 73 65 74 20 20 20 20 20 20 20 20 20 2c 30  reset         ,0
1dff0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1e000 74 65 33 5f 65 78 70 69 72 65 64 22 2c 20 20 20  te3_expired",   
1e010 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1e020 5f 65 78 70 69 72 65 64 20 20 20 20 20 20 20 2c  _expired       ,
1e030 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
1e040 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69  ite3_transfer_bi
1e050 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 74 65 73  ndings",     tes
1e060 74 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 20  t_transfer_bind 
1e070 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
1e080 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 22 2c 20  lite3_changes", 
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1e0a0 73 74 5f 63 68 61 6e 67 65 73 20 20 20 20 20 20  st_changes      
1e0b0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
1e0c0 71 6c 69 74 65 33 5f 73 74 65 70 22 2c 20 20 20  qlite3_step",   
1e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1e0e0 65 73 74 5f 73 74 65 70 20 20 20 20 20 20 20 20  est_step        
1e0f0 20 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20    ,0 },..     { 
1e100 22 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65  "sqlite3_release
1e110 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20 20 20  _memory",       
1e120 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65   test_release_me
1e130 6d 6f 72 79 2c 20 20 20 20 20 30 7d 2c 0a 20 20  mory,     0},.  
1e140 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6f     { "sqlite3_so
1e150 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 22 2c 20  ft_heap_limit", 
1e160 20 20 20 20 20 20 74 65 73 74 5f 73 6f 66 74 5f        test_soft_
1e170 68 65 61 70 5f 6c 69 6d 69 74 2c 20 20 20 20 30  heap_limit,    0
1e180 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1e190 65 33 5f 63 6c 65 61 72 5f 74 73 64 5f 6d 65 6d  e3_clear_tsd_mem
1e1a0 64 65 62 75 67 22 2c 20 20 20 20 74 65 73 74 5f  debug",    test_
1e1b0 63 6c 65 61 72 5f 74 73 64 5f 6d 65 6d 64 65 62  clear_tsd_memdeb
1e1c0 75 67 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  ug, 0},.     { "
1e1d0 73 71 6c 69 74 65 33 5f 74 73 64 5f 72 65 6c 65  sqlite3_tsd_rele
1e1e0 61 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ase",           
1e1f0 74 65 73 74 5f 74 73 64 5f 72 65 6c 65 61 73 65  test_tsd_release
1e200 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
1e210 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68 72    { "sqlite3_thr
1e220 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20 20  ead_cleanup",   
1e230 20 20 20 20 20 74 65 73 74 5f 74 68 72 65 61 64       test_thread
1e240 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30 7d  _cleanup,     0}
1e250 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1e260 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  3_pager_refcount
1e270 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70  s",       test_p
1e280 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c 20  ager_refcounts, 
1e290 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22     0},..     { "
1e2a0 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
1e2b0 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  ension",        
1e2c0 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  test_load_extens
1e2d0 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20  ion,     0},.   
1e2e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61    { "sqlite3_ena
1e2f0 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
1e300 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65  on", test_enable
1e310 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30 7d  _load,        0}
1e320 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1e330 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
1e340 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f 65  t_codes", test_e
1e350 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
1e360 6f 64 65 73 2c 20 30 7d 2c 0a 0a 20 20 20 20 20  odes, 0},..     
1e370 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  /* sqlite3_colum
1e380 6e 5f 2a 28 29 20 41 50 49 20 2a 2f 0a 20 20 20  n_*() API */.   
1e390 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
1e3a0 75 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20  umn_count",     
1e3b0 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
1e3c0 5f 63 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a 20 20  _count  ,0 },.  
1e3d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 61     { "sqlite3_da
1e3e0 74 61 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20  ta_count",      
1e3f0 20 20 20 20 20 20 74 65 73 74 5f 64 61 74 61 5f        test_data_
1e400 63 6f 75 6e 74 20 20 20 20 2c 30 20 7d 2c 0a 20  count    ,0 },. 
1e410 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
1e420 6f 6c 75 6d 6e 5f 74 79 70 65 22 2c 20 20 20 20  olumn_type",    
1e430 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
1e440 6d 6e 5f 74 79 70 65 20 20 20 2c 30 20 7d 2c 0a  mn_type   ,0 },.
1e450 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1e460 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20  column_blob",   
1e470 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
1e480 75 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30 20 7d 2c  umn_blob   ,0 },
1e490 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1e4a0 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c  _column_double",
1e4b0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
1e4c0 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30 20 7d  lumn_double ,0 }
1e4d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1e4e0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c  3_column_int64",
1e4f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
1e500 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 20 2c 30 20  olumn_int64  ,0 
1e510 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1e520 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c  e3_column_text",
1e530 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74         test_stmt
1e540 5f 75 74 66 38 2c 20 20 73 71 6c 69 74 65 33 5f  _utf8,  sqlite3_
1e550 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 20 20 20 20  column_text     
1e560 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1e570 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
1e580 79 70 65 22 2c 20 20 20 74 65 73 74 5f 73 74 6d  ype",   test_stm
1e590 74 5f 75 74 66 38 2c 20 20 73 71 6c 69 74 65 33  t_utf8,  sqlite3
1e5a0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
1e5b0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1e5c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
1e5d0 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73 74  ",       test_st
1e5e0 6d 74 5f 75 74 66 38 2c 20 20 73 71 6c 69 74 65  mt_utf8,  sqlite
1e5f0 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 20 20  3_column_name   
1e600 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1e610 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1e620 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 73  ",        test_s
1e630 74 6d 74 5f 69 6e 74 2c 20 20 20 73 71 6c 69 74  tmt_int,   sqlit
1e640 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20 20  e3_column_int   
1e650 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1e660 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1e670 74 65 73 22 2c 20 20 20 20 20 20 74 65 73 74 5f  tes",      test_
1e680 73 74 6d 74 5f 69 6e 74 2c 20 20 20 73 71 6c 69  stmt_int,   sqli
1e690 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
1e6a0 20 20 20 20 20 7d 2c 0a 23 69 66 64 65 66 20 53       },.#ifdef S
1e6b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
1e6c0 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 20 22  UMN_METADATA.{ "
1e6d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1e6e0 61 74 61 62 61 73 65 5f 6e 61 6d 65 22 2c 20 74  atabase_name", t
1e6f0 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 73  est_stmt_utf8, s
1e700 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
1e710 74 61 62 61 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20  tabase_name},.{ 
1e720 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
1e730 74 61 62 6c 65 5f 6e 61 6d 65 22 2c 20 74 65 73  table_name", tes
1e740 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 73 71 6c  t_stmt_utf8, sql
1e750 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
1e760 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69  e_name},.{ "sqli
1e770 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69  te3_column_origi
1e780 6e 5f 6e 61 6d 65 22 2c 20 74 65 73 74 5f 73 74  n_name", test_st
1e790 6d 74 5f 75 74 66 38 2c 20 73 71 6c 69 74 65 33  mt_utf8, sqlite3
1e7a0 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
1e7b0 61 6d 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69  ame},.#endif..#i
1e7c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e7d0 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22  T_UTF16.     { "
1e7e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1e7f0 79 74 65 73 31 36 22 2c 20 20 20 20 74 65 73 74  ytes16",    test
1e800 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 73 71 6c  _stmt_int,   sql
1e810 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
1e820 73 31 36 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  s16   },.     { 
1e830 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
1e840 74 65 78 74 31 36 22 2c 20 20 20 20 20 74 65 73  text16",     tes
1e850 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 73 71  t_stmt_utf16, sq
1e860 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1e870 74 31 36 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  t16    },.     {
1e880 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
1e890 5f 64 65 63 6c 74 79 70 65 31 36 22 2c 20 74 65  _decltype16", te
1e8a0 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 73  st_stmt_utf16, s
1e8b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
1e8c0 63 6c 74 79 70 65 31 36 7d 2c 0a 20 20 20 20 20  cltype16},.     
1e8d0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
1e8e0 6e 5f 6e 61 6d 65 31 36 22 2c 20 20 20 20 20 74  n_name16",     t
1e8f0 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
1e900 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
1e910 61 6d 65 31 36 20 20 20 20 7d 2c 0a 20 20 20 20  ame16    },.    
1e920 20 7b 20 22 61 64 64 5f 61 6c 69 67 6e 6d 65 6e   { "add_alignmen
1e930 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
1e940 73 22 2c 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e  s", add_alignmen
1e950 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
1e960 73 2c 20 30 20 20 20 20 20 20 7d 2c 0a 23 69 66  s, 0      },.#if
1e970 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1e980 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
1e990 41 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75  A.{"sqlite3_colu
1e9a0 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65  mn_database_name
1e9b0 31 36 22 2c 0a 20 20 74 65 73 74 5f 73 74 6d 74  16",.  test_stmt
1e9c0 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f  _utf16, sqlite3_
1e9d0 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f  column_database_
1e9e0 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74  name16},.{"sqlit
1e9f0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
1ea00 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73 74  name16", test_st
1ea10 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65  mt_utf16, sqlite
1ea20 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e  3_column_table_n
1ea30 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65  ame16},.{"sqlite
1ea40 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
1ea50 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73 74  name16", test_st
1ea60 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65  mt_utf16, sqlite
1ea70 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
1ea80 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a  name16},.#endif.
1ea90 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
1eaa0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
1eab0 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73  llation_v2", tes
1eac0 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  t_create_collati
1ead0 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20  on_v2, 0 },.    
1eae0 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f 62   { "sqlite3_glob
1eaf0 61 6c 5f 72 65 63 6f 76 65 72 22 2c 20 20 20 20  al_recover",    
1eb00 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63   test_global_rec
1eb10 6f 76 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20 20  over, 0   },.   
1eb20 20 20 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34 62    { "working_64b
1eb30 69 74 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  it_int",        
1eb40 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f    working_64bit_
1eb50 69 6e 74 2c 20 20 20 30 20 20 20 7d 2c 0a 0a 20  int,   0   },.. 
1eb60 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73      /* Functions
1eb70 20 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69   from os.h */.#i
1eb80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1eb90 54 5f 44 49 53 4b 49 4f 0a 20 20 20 20 20 7b 20  T_DISKIO.     { 
1eba0 22 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65  "sqlite3OsOpenRe
1ebb0 61 64 57 72 69 74 65 22 2c 74 65 73 74 5f 73 71  adWrite",test_sq
1ebc0 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
1ebd0 72 69 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20  rite, 0 },.     
1ebe0 7b 20 22 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  { "sqlite3OsClos
1ebf0 65 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f  e",        test_
1ec00 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 2c 20  sqlite3OsClose, 
1ec10 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
1ec20 69 74 65 33 4f 73 4c 6f 63 6b 22 2c 20 20 20 20  ite3OsLock",    
1ec30 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65       test_sqlite
1ec40 33 4f 73 4c 6f 63 6b 2c 20 30 20 7d 2c 0a 20 20  3OsLock, 0 },.  
1ec50 20 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73 54     { "sqlite3OsT
1ec60 65 6d 70 46 69 6c 65 4e 61 6d 65 22 2c 20 74 65  empFileName", te
1ec70 73 74 5f 73 71 6c 69 74 65 33 4f 73 54 65 6d 70  st_sqlite3OsTemp
1ec80 46 69 6c 65 4e 61 6d 65 2c 20 30 20 7d 2c 0a 20  FileName, 0 },. 
1ec90 20 20 0a 20 20 20 20 20 2f 2a 20 43 75 73 74 6f    .     /* Custo
1eca0 6d 20 74 65 73 74 20 69 6e 74 65 72 66 61 63 65  m test interface
1ecb0 73 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c  s */.     { "sql
1ecc0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 22 2c 20 20  ite3OsUnlock",  
1ecd0 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69         test_sqli
1ece0 74 65 33 4f 73 55 6e 6c 6f 63 6b 2c 20 30 20 20  te3OsUnlock, 0  
1ecf0 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e    },.#endif.#ifn
1ed00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ed10 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22 61 64  UTF16.     { "ad
1ed20 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c  d_test_collate",
1ed30 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
1ed40 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 20  late, 0         
1ed50 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64     },.     { "ad
1ed60 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  d_test_collate_n
1ed70 65 65 64 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c  eeded", test_col
1ed80 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20 30 20 20  late_needed, 0  
1ed90 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64     },.     { "ad
1eda0 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  d_test_function"
1edb0 2c 20 20 20 20 20 20 20 74 65 73 74 5f 66 75 6e  ,       test_fun
1edc0 63 74 69 6f 6e 2c 20 30 20 20 20 20 20 20 20 20  ction, 0        
1edd0 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66     },.#endif.#if
1ede0 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45  def SQLITE_MEMDE
1edf0 42 55 47 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  BUG.     { "sqli
1ee00 74 65 5f 6d 61 6c 6c 6f 63 5f 6f 75 74 73 74 61  te_malloc_outsta
1ee10 6e 64 69 6e 67 22 2c 20 73 71 6c 69 74 65 5f 6d  nding", sqlite_m
1ee20 61 6c 6c 6f 63 5f 6f 75 74 73 74 61 6e 64 69 6e  alloc_outstandin
1ee30 67 2c 20 30 7d 2c 0a 23 65 6e 64 69 66 0a 20 20  g, 0},.#endif.  
1ee40 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 65     { "sqlite3_te
1ee50 73 74 5f 65 72 72 73 74 72 22 2c 20 20 20 20 20  st_errstr",     
1ee60 74 65 73 74 5f 65 72 72 73 74 72 2c 20 30 20 20  test_errstr, 0  
1ee70 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1ee80 20 20 20 7b 20 22 74 63 6c 5f 76 61 72 69 61 62     { "tcl_variab
1ee90 6c 65 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20  le_type",       
1eea0 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70  tcl_variable_typ
1eeb0 65 2c 20 30 20 20 20 20 20 20 20 7d 2c 0a 23 69  e, 0       },.#i
1eec0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1eed0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1eee0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
1eef0 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
1ef00 68 65 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65  he", test_enable
1ef10 5f 73 68 61 72 65 64 2c 20 30 20 20 7d 2c 0a 20  _shared, 0  },. 
1ef20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
1ef30 68 61 72 65 64 5f 63 61 63 68 65 5f 72 65 70 6f  hared_cache_repo
1ef40 72 74 22 2c 20 73 71 6c 69 74 65 33 42 74 72 65  rt", sqlite3Btre
1ef50 65 53 68 61 72 65 64 43 61 63 68 65 52 65 70 6f  eSharedCacheRepo
1ef60 72 74 2c 20 30 7d 2c 0a 23 65 6e 64 69 66 0a 20  rt, 0},.#endif. 
1ef70 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c      { "sqlite3_l
1ef80 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
1ef90 22 2c 20 74 65 73 74 5f 6c 69 62 76 65 72 73 69  ", test_libversi
1efa0 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30 20 20 7d 2c  on_number, 0  },
1efb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1efc0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
1efd0 41 44 41 54 41 0a 20 20 20 20 20 7b 20 22 73 71  ADATA.     { "sq
1efe0 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
1eff0 6d 6e 5f 6d 65 74 61 64 61 74 61 22 2c 20 74 65  mn_metadata", te
1f000 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  st_table_column_
1f010 6d 65 74 61 64 61 74 61 2c 20 30 20 20 7d 2c 0a  metadata, 0  },.
1f020 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
1f030 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1f040 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  LOB.     { "sqli
1f050 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 22 2c 20  te3_blob_read", 
1f060 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64 2c   test_blob_read,
1f070 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   0  },.     { "s
1f080 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
1f090 65 22 2c 20 74 65 73 74 5f 62 6c 6f 62 5f 77 72  e", test_blob_wr
1f0a0 69 74 65 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69  ite, 0  },.#endi
1f0b0 66 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  f.  };.  static 
1f0c0 69 6e 74 20 62 69 74 6d 61 73 6b 5f 73 69 7a 65  int bitmask_size
1f0d0 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73   = sizeof(Bitmas
1f0e0 6b 29 2a 38 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  k)*8;.  int i;. 
1f0f0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
1f100 74 65 33 5f 6f 73 5f 74 72 61 63 65 3b 0a 20 20  te3_os_trace;.  
1f110 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1f120 65 33 5f 77 68 65 72 65 5f 74 72 61 63 65 3b 0a  e3_where_trace;.
1f130 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
1f140 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c  ite3_sync_count,
1f150 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
1f160 63 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  c_count;.  exter
1f170 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  n int sqlite3_op
1f180 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20  entemp_count;.  
1f190 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1f1a0 65 33 5f 6d 65 6d 55 73 65 64 3b 0a 20 20 65 78  e3_memUsed;.  ex
1f1b0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
1f1c0 5f 6d 65 6d 4d 61 78 3b 0a 20 20 65 78 74 65 72  _memMax;.  exter
1f1d0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69  n int sqlite3_li
1f1e0 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  ke_count;.  exte
1f1f0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  rn int sqlite3_t
1f200 73 64 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  sd_count;.  exte
1f210 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 78  rn int sqlite3_x
1f220 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a 20 20  feropt_count;.  
1f230 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1f240 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
1f250 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
1f260 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
1f270 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 3b  r_writedb_count;
1f280 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
1f290 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
1f2a0 65 6a 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  ej_count;.  exte
1f2b0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
1f2c0 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
1f2d0 74 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 20 26  t;.#if OS_UNIX &
1f2e0 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
1f2f0 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
1f300 64 28 54 48 52 45 41 44 53 41 46 45 29 20 26 26  d(THREADSAFE) &&
1f310 20 54 48 52 45 41 44 53 41 46 45 0a 20 20 65 78   THREADSAFE.  ex
1f320 74 65 72 6e 20 69 6e 74 20 74 68 72 65 61 64 73  tern int threads
1f330 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
1f340 72 73 4c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a  rsLocks;.#endif.
1f350 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 65 78 74  #if OS_WIN.  ext
1f360 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1f370 6f 73 5f 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a  os_type;.#endif.
1f380 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1f390 42 55 47 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  BUG.  extern int
1f3a0 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61 64   sqlite3_vdbe_ad
1f3b0 64 6f 70 5f 74 72 61 63 65 3b 0a 23 65 6e 64 69  dop_trace;.#endi
1f3c0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1f3d0 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 63 68  TEST.  extern ch
1f3e0 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  ar sqlite3_query
1f3f0 5f 70 6c 61 6e 5b 5d 3b 0a 20 20 73 74 61 74 69  _plan[];.  stati
1f400 63 20 63 68 61 72 20 2a 71 75 65 72 79 5f 70 6c  c char *query_pl
1f410 61 6e 20 3d 20 73 71 6c 69 74 65 33 5f 71 75 65  an = sqlite3_que
1f420 72 79 5f 70 6c 61 6e 3b 0a 23 65 6e 64 69 66 0a  ry_plan;.#endif.
1f430 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
1f440 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f  zeof(aCmd)/sizeo
1f450 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29  f(aCmd[0]); i++)
1f460 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
1f470 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1f480 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61  aCmd[i].zName, a
1f490 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c  Cmd[i].xProc, 0,
1f4a0 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69   0);.  }.  for(i
1f4b0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62  =0; i<sizeof(aOb
1f4c0 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62  jCmd)/sizeof(aOb
1f4d0 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  jCmd[0]); i++){.
1f4e0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
1f4f0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
1f500 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d   aObjCmd[i].zNam
1f510 65 2c 20 0a 20 20 20 20 20 20 20 20 61 4f 62 6a  e, .        aObj
1f520 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f  Cmd[i].xProc, aO
1f530 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44  bjCmd[i].clientD
1f540 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54  ata, 0);.  }.  T
1f550 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
1f560 70 2c 20 22 73 71 6c 69 74 65 5f 73 65 61 72 63  p, "sqlite_searc
1f570 68 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20  h_count", .     
1f580 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
1f590 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20 54  _search_count, T
1f5a0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
1f5b0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
1f5c0 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 6f 72 74  rp, "sqlite_sort
1f5d0 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20  _count", .      
1f5e0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
1f5f0 73 6f 72 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  sort_count, TCL_
1f600 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
1f610 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
1f620 20 22 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c   "sqlite3_max_bl
1f630 6f 62 73 69 7a 65 22 2c 20 0a 20 20 20 20 20 20  obsize", .      
1f640 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
1f650 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 2c 20 54 43  max_blobsize, TC
1f660 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
1f670 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
1f680 70 2c 20 22 73 71 6c 69 74 65 5f 6c 69 6b 65 5f  p, "sqlite_like_
1f690 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
1f6a0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6c  char*)&sqlite3_l
1f6b0 69 6b 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ike_count, TCL_L
1f6c0 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
1f6d0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
1f6e0 22 73 71 6c 69 74 65 5f 69 6e 74 65 72 72 75 70  "sqlite_interrup
1f6f0 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20  t_count", .     
1f700 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
1f710 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
1f720 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
1f730 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
1f740 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
1f750 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 22 2c  pen_file_count",
1f760 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
1f770 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c  sqlite3_open_fil
1f780 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  e_count, TCL_LIN
1f790 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
1f7a0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
1f7b0 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69  qlite_current_ti
1f7c0 6d 65 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  me", .      (cha
1f7d0 72 2a 29 26 73 71 6c 69 74 65 33 5f 63 75 72 72  r*)&sqlite3_curr
1f7e0 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c 5f 4c 49  ent_time, TCL_LI
1f7f0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
1f800 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
1f810 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63 65 22  sqlite_os_trace"
1f820 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
1f830 73 71 6c 69 74 65 33 5f 6f 73 5f 74 72 61 63 65  sqlite3_os_trace
1f840 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
1f850 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
1f860 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
1f870 74 73 64 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  tsd_count",.    
1f880 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
1f890 33 5f 74 73 64 5f 63 6f 75 6e 74 2c 20 54 43 4c  3_tsd_count, TCL
1f8a0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
1f8b0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
1f8c0 2c 20 22 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  , "sqlite3_xfero
1f8d0 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  pt_count",.     
1f8e0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
1f8f0 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20  _xferopt_count, 
1f900 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
1f910 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1f920 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
1f930 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1f940 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
1f950 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  &sqlite3_pager_r
1f960 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c  eaddb_count, TCL
1f970 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
1f980 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
1f990 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  , "sqlite3_pager
1f9a0 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c  _writedb_count",
1f9b0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
1f9c0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
1f9d0 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  tedb_count, TCL_
1f9e0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
1f9f0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
1fa00 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
1fa10 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20  writej_count",. 
1fa20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
1fa30 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
1fa40 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  j_count, TCL_LIN
1fa50 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
1fa60 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
1fa70 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
1fa80 72 65 65 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  ree_count",.    
1fa90 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
1faa0 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
1fab0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
1fac0 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  NT);.#ifndef SQL
1fad0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1fae0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1faf0 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65 64 5f  erp, "unaligned_
1fb00 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 22 2c  string_counter",
1fb10 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 75  .      (char*)&u
1fb20 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
1fb30 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c 49 4e  counter, TCL_LIN
1fb40 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23  K_INT);.#endif.#
1fb50 69 66 20 4f 53 5f 55 4e 49 58 20 26 26 20 64 65  if OS_UNIX && de
1fb60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1fb70 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 48  T) && defined(TH
1fb80 52 45 41 44 53 41 46 45 29 20 26 26 20 54 48 52  READSAFE) && THR
1fb90 45 41 44 53 41 46 45 0a 20 20 54 63 6c 5f 4c 69  EADSAFE.  Tcl_Li
1fba0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 74  nkVar(interp, "t
1fbb0 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
1fbc0 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 22 2c 0a  chOthersLocks",.
1fbd0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 74 68        (char*)&th
1fbe0 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
1fbf0 68 4f 74 68 65 72 73 4c 6f 63 6b 73 2c 20 54 43  hOthersLocks, TC
1fc00 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e  L_LINK_INT);.#en
1fc10 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
1fc20 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1fc30 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
1fc40 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 61 73 74  rp, "sqlite_last
1fc50 5f 6e 65 65 64 65 64 5f 63 6f 6c 6c 61 74 69 6f  _needed_collatio
1fc60 6e 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  n",.      (char*
1fc70 29 26 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74  )&pzNeededCollat
1fc80 69 6f 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54  ion, TCL_LINK_ST
1fc90 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45  RING|TCL_LINK_RE
1fca0 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  AD_ONLY);.#endif
1fcb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
1fcc0 45 4d 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20  EMDEBUG.  {.    
1fcd0 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71 6c  extern char *sql
1fce0 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 69 64 3b 0a  ite3_malloc_id;.
1fcf0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
1fd00 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 66 61 69  qlite3_mallocfai
1fd10 6c 5f 74 72 61 63 65 3b 0a 20 20 20 20 54 63 6c  l_trace;.    Tcl
1fd20 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
1fd30 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f   "sqlite_malloc_
1fd40 69 64 22 2c 0a 20 20 20 20 20 20 20 20 28 63 68  id",.        (ch
1fd50 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6d 61 6c  ar*)&sqlite3_mal
1fd60 6c 6f 63 5f 69 64 2c 20 54 43 4c 5f 4c 49 4e 4b  loc_id, TCL_LINK
1fd70 5f 53 54 52 49 4e 47 29 3b 0a 20 20 20 20 54 63  _STRING);.    Tc
1fd80 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
1fd90 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  , "sqlite3_mallo
1fda0 63 66 61 69 6c 5f 74 72 61 63 65 22 2c 0a 20 20  cfail_trace",.  
1fdb0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
1fdc0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 66 61 69 6c  lite3_mallocfail
1fdd0 5f 74 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b  _trace, TCL_LINK
1fde0 5f 49 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  _INT);.  }.#endi
1fdf0 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 54  f.#if OS_WIN.  T
1fe00 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
1fe10 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 79  p, "sqlite_os_ty
1fe20 70 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  pe",.      (char
1fe30 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  *)&sqlite3_os_ty
1fe40 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  pe, TCL_LINK_INT
1fe50 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
1fe60 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 54   SQLITE_TEST.  T
1fe70 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
1fe80 70 2c 20 22 73 71 6c 69 74 65 5f 71 75 65 72 79  p, "sqlite_query
1fe90 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20 28 63  _plan",.      (c
1fea0 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c 61 6e  har*)&query_plan
1feb0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
1fec0 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f  G|TCL_LINK_READ_
1fed0 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ONLY);.#endif.#i
1fee0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1fef0 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  G.  Tcl_LinkVar(
1ff00 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
1ff10 61 64 64 6f 70 5f 74 72 61 63 65 22 2c 0a 20 20  addop_trace",.  
1ff20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
1ff30 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74  te3_vdbe_addop_t
1ff40 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
1ff50 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
1ff60 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
1ff70 74 65 5f 77 68 65 72 65 5f 74 72 61 63 65 22 2c  te_where_trace",
1ff80 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
1ff90 71 6c 69 74 65 33 5f 77 68 65 72 65 5f 74 72 61  qlite3_where_tra
1ffa0 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ce, TCL_LINK_INT
1ffb0 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
1ffc0 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
1ffd0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
1ffe0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6d  nterp, "sqlite_m
1fff0 65 6d 75 73 65 64 22 2c 0a 20 20 20 20 20 20 28  emused",.      (
20000 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6d  char*)&sqlite3_m
20010 65 6d 55 73 65 64 2c 20 54 43 4c 5f 4c 49 4e 4b  emUsed, TCL_LINK
20020 5f 49 4e 54 20 7c 20 54 43 4c 5f 4c 49 4e 4b 5f  _INT | TCL_LINK_
20030 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63  READ_ONLY);.  Tc
20040 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
20050 2c 20 22 73 71 6c 69 74 65 5f 6d 65 6d 6d 61 78  , "sqlite_memmax
20060 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
20070 26 73 71 6c 69 74 65 33 5f 6d 65 6d 4d 61 78 2c  &sqlite3_memMax,
20080 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 20 7c 20   TCL_LINK_INT | 
20090 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e  TCL_LINK_READ_ON
200a0 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LY);.#endif.#ifn
200b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
200c0 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f 4c 69 6e  DISKIO.  Tcl_Lin
200d0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
200e0 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  lite_opentemp_co
200f0 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
20100 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e  r*)&sqlite3_open
20110 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  temp_count, TCL_
20120 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
20130 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  f.  Tcl_LinkVar(
20140 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
20150 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
20160 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
20170 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  )&sqlite_static_
20180 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c 5f  bind_value, TCL_
20190 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20  LINK_STRING);.  
201a0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
201b0 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  rp, "sqlite_stat
201c0 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 22 2c 0a  ic_bind_nbyte",.
201d0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
201e0 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
201f0 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c 49 4e 4b  _nbyte, TCL_LINK
20200 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
20210 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
20220 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72 65 63 74  lite_temp_direct
20230 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ory",.      (cha
20240 72 2a 29 26 73 71 6c 69 74 65 33 5f 74 65 6d 70  r*)&sqlite3_temp
20250 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f  _directory, TCL_
20260 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20  LINK_STRING);.  
20270 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
20280 72 70 2c 20 22 62 69 74 6d 61 73 6b 5f 73 69 7a  rp, "bitmask_siz
20290 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
202a0 29 26 62 69 74 6d 61 73 6b 5f 73 69 7a 65 2c 20  )&bitmask_size, 
202b0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c  TCL_LINK_INT|TCL
202c0 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29  _LINK_READ_ONLY)
202d0 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20  ;.#if OS_UNIX.  
202e0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
202f0 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 79 6e 63  rp, "sqlite_sync
20300 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28  _count",.      (
20310 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73  char*)&sqlite3_s
20320 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ync_count, TCL_L
20330 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
20340 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
20350 22 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63  "sqlite_fullsync
20360 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28  _count",.      (
20370 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66  char*)&sqlite3_f
20380 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54  ullsync_count, T
20390 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
203a0 6e 64 69 66 20 2f 2a 20 4f 53 5f 55 4e 49 58 20  ndif /* OS_UNIX 
203b0 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  */..  return TCL
203c0 5f 4f 4b 3b 0a 7d 0a                             _OK;.}.