/ Hex Artifact Content
Login

Artifact 16938b7e76469abf957745743dd0287d5dee476d:


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 32 20 32 30 30 37 2f 30 35 2f 30   1.252 2007/05/0
0240: 38 20 32 30 3a 33 37 3a 33 39 20 64 72 68 20 45  8 20:37:39 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 7a 42 75 66 5b 33 30  ;.  char zBuf[30
2720: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  ];.  if( argc!=3
2730: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2740: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2750: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2760: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2770: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2780: 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20  " DB SQL", 0);. 
2790: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
27a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
27b0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
27c0: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
27d0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
27e0: 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72  RROR;.  Tcl_DStr
27f0: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
2800: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2810: 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  ec(db, argv[2], 
2820: 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20  exec_printf_cb, 
2830: 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20  &str, &zErr);.  
2840: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
2850: 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41  d", rc);.  Tcl_A
2860: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2870: 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  erp, zBuf);.  Tc
2880: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
2890: 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49  interp, rc==SQLI
28a0: 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72  TE_OK ? Tcl_DStr
28b0: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a  ingValue(&str) :
28c0: 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53   zErr);.  Tcl_DS
28d0: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
28e0: 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73 71  .  if( zErr ) sq
28f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
2900: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
2910: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
2920: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
2930: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2940: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2950: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
2960: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72   sqlite3_exec_nr
2970: 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a 20    DB  SQL.**.** 
2980: 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74  Invoke the sqlit
2990: 65 33 5f 65 78 65 63 20 69 6e 74 65 72 66 61 63  e3_exec interfac
29a0: 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e  e using the open
29b0: 20 64 61 74 61 62 61 73 65 20 44 42 2e 20 20 44   database DB.  D
29c0: 69 73 63 61 72 64 0a 2a 2a 20 61 6c 6c 20 72 65  iscard.** all re
29d0: 73 75 6c 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  sults.*/.static 
29e0: 69 6e 74 20 74 65 73 74 5f 65 78 65 63 5f 6e 72  int test_exec_nr
29f0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
2a00: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
2a10: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2a20: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2a30: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2a40: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2a50: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
2a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a70: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2a80: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2aa0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
2ab0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
2ac0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
2ad0: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
2ae0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 63   = 0;.  if( argc
2af0: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
2b00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2b10: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2b20: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2b30: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
2b40: 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29     " DB SQL", 0)
2b50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2b60: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2b70: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2b80: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
2b90: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2ba0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
2bb0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
2bc0: 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20   argv[2], 0, 0, 
2bd0: 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  &zErr);.  if( sq
2be0: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
2bf0: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
2c00: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2c10: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
2c20: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2c30: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
2c40: 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53  printf_z_test  S
2c50: 45 50 41 52 41 54 4f 52 20 20 41 52 47 30 20 20  EPARATOR  ARG0  
2c60: 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  ARG1 ....**.** T
2c70: 65 73 74 20 74 68 65 20 25 7a 20 66 6f 72 6d 61  est the %z forma
2c80: 74 20 6f 66 20 73 71 6c 69 74 65 4d 50 72 69 6e  t of sqliteMPrin
2c90: 74 66 28 29 2e 20 20 55 73 65 20 6d 75 6c 74 69  tf().  Use multi
2ca0: 70 6c 65 20 6d 70 72 69 6e 74 66 28 29 20 63 61  ple mprintf() ca
2cb0: 6c 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63 61  lls to .** conca
2cc0: 74 65 6e 61 74 65 20 61 72 67 30 20 74 68 72 6f  tenate arg0 thro
2cd0: 75 67 68 20 61 72 67 6e 20 75 73 69 6e 67 20 73  ugh argn using s
2ce0: 65 70 61 72 61 74 6f 72 20 61 73 20 74 68 65 20  eparator as the 
2cf0: 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52 65  separator..** Re
2d00: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
2d10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2d20: 65 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20  est_mprintf_z(. 
2d30: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
2d40: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2d50: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2d60: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2d70: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2d80: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2d90: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
2da0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2db0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2dc0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
2dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
2de0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
2df0: 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  t */.){.  char *
2e00: 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69  zResult = 0;.  i
2e10: 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32  nt i;..  for(i=2
2e20: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
2e30: 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 73 71      zResult = sq
2e40: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a  lite3MPrintf("%z
2e50: 25 73 25 73 22 2c 20 7a 52 65 73 75 6c 74 2c 20  %s%s", zResult, 
2e60: 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 69 5d  argv[1], argv[i]
2e70: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
2e80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2e90: 2c 20 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20  , zResult, 0);. 
2ea0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52 65 73   sqliteFree(zRes
2eb0: 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ult);.  return T
2ec0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2ed0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
2ee0: 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20  mprintf_n_test  
2ef0: 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73  STRING.**.** Tes
2f00: 74 20 74 68 65 20 25 6e 20 66 6f 72 6d 61 74 20  t the %n format 
2f10: 6f 66 20 73 71 6c 69 74 65 4d 50 72 69 6e 74 66  of sqliteMPrintf
2f20: 28 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ().  Return the 
2f30: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 2a 2a  length of the.**
2f40: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a   input string..*
2f50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
2f60: 74 5f 6d 70 72 69 6e 74 66 5f 6e 28 0a 20 20 76  t_mprintf_n(.  v
2f70: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2f80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2f90: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2fa0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2fb0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2fc0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2fd0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2fe0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ff0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
3000: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
3010: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
3020: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
3030: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53  */.){.  char *zS
3040: 74 72 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  tr;.  int n = 0;
3050: 0a 20 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65  .  zStr = sqlite
3060: 33 4d 50 72 69 6e 74 66 28 22 25 73 25 6e 22 2c  3MPrintf("%s%n",
3070: 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 3b 0a 20   argv[1], &n);. 
3080: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74 72   sqliteFree(zStr
3090: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
30a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
30b0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 29 29 3b  l_NewIntObj(n));
30c0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
30d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
30e0: 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  :  sqlite3_snpri
30f0: 6e 74 66 5f 69 6e 74 20 20 53 49 5a 45 20 46 4f  ntf_int  SIZE FO
3100: 52 4d 41 54 20 20 49 4e 54 0a 2a 2a 0a 2a 2a 20  RMAT  INT.**.** 
3110: 54 65 73 74 20 74 68 65 20 6f 66 20 73 71 6c 69  Test the of sqli
3120: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 20 72  te3_snprintf() r
3130: 6f 75 74 69 6e 65 2e 20 20 53 49 5a 45 20 69 73  outine.  SIZE is
3140: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
3150: 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65  .** output buffe
3160: 72 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 65  r in bytes.  The
3170: 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 69 73   maximum size is
3180: 20 31 30 30 2e 20 20 46 4f 52 4d 41 54 20 69 73   100.  FORMAT is
3190: 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74 20 73   the.** format s
31a0: 74 72 69 6e 67 2e 20 20 49 4e 54 20 69 73 20 61  tring.  INT is a
31b0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
31c0: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
31d0: 4f 52 4d 41 54 0a 2a 2a 20 73 74 72 69 6e 67 20  ORMAT.** string 
31e0: 6d 75 73 74 20 72 65 71 75 69 72 65 20 6e 6f 20  must require no 
31f0: 6d 6f 72 65 20 74 68 61 6e 20 74 68 69 73 20 6f  more than this o
3200: 6e 65 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  ne integer argum
3210: 65 6e 74 2e 20 20 49 66 0a 2a 2a 20 59 6f 75 20  ent.  If.** You 
3220: 70 61 73 73 20 69 6e 20 61 20 66 6f 72 6d 61 74  pass in a format
3230: 20 73 74 72 69 6e 67 20 74 68 61 74 20 72 65 71   string that req
3240: 75 69 72 65 73 20 6d 6f 72 65 20 74 68 61 6e 20  uires more than 
3250: 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  one argument,.**
3260: 20 62 61 64 20 74 68 69 6e 67 73 20 77 69 6c 6c   bad things will
3270: 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74   happen..*/.stat
3280: 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 70 72  ic int test_snpr
3290: 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69 64  intf_int(.  void
32a0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
32b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
32c0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
32d0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
32e0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
32f0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
3300: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
3310: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
3320: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
3330: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
3340: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
3350: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
3360: 29 7b 0a 20 20 63 68 61 72 20 7a 53 74 72 5b 31  ){.  char zStr[1
3370: 30 30 5d 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 61  00];.  int n = a
3380: 74 6f 69 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  toi(argv[1]);.  
3390: 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a 53 74  if( n>sizeof(zSt
33a0: 72 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f 66 28  r) ) n = sizeof(
33b0: 7a 53 74 72 29 3b 0a 20 20 63 6f 6e 73 74 20 63  zStr);.  const c
33c0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 61  har *zFormat = a
33d0: 72 67 76 5b 32 5d 3b 0a 20 20 69 6e 74 20 61 31  rgv[2];.  int a1
33e0: 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 33 5d 29   = atoi(argv[3])
33f0: 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 72 2c  ;.  strcpy(zStr,
3400: 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
3410: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 29 3b 0a  opqrstuvwxyz");.
3420: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3430: 74 66 28 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72  tf(n, zStr, zFor
3440: 6d 61 74 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f  mat, a1);.  Tcl_
3450: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
3460: 65 72 70 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20  erp, zStr, 0);. 
3470: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
3480: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
3490: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62   sqlite3_get_tab
34a0: 6c 65 5f 70 72 69 6e 74 66 20 20 44 42 20 20 46  le_printf  DB  F
34b0: 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a  ORMAT  STRING.**
34c0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
34d0: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
34e0: 5f 70 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66  _printf() interf
34f0: 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70  ace using the op
3500: 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44  en database.** D
3510: 42 2e 20 20 54 68 65 20 53 51 4c 20 69 73 20 74  B.  The SQL is t
3520: 68 65 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54  he string FORMAT
3530: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74  .  The format st
3540: 72 69 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74  ring should cont
3550: 61 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72  ain.** one %s or
3560: 20 25 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20   %q.  STRING is 
3570: 74 68 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74  the value insert
3580: 65 64 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71  ed into %s or %q
3590: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35a0: 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70  test_get_table_p
35b0: 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e  rintf(.  void *N
35c0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
35d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
35e0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
35f0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
3600: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
3610: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3630: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
3640: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
3650: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
3660: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3670: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3680: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
3690: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
36a0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
36b0: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
36c0: 69 6e 74 20 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a  int nRow, nCol;.
36d0: 20 20 63 68 61 72 20 2a 2a 61 52 65 73 75 6c 74    char **aResult
36e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
36f0: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 63 68  r zBuf[30];.  ch
3700: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 66 28 20  ar *zSql;.  if( 
3710: 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  argc!=4 ){.    T
3720: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
3730: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
3740: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
3750: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
3760: 20 20 20 20 20 20 20 22 20 44 42 20 46 4f 52 4d         " DB FORM
3770: 41 54 20 53 54 52 49 4e 47 22 2c 20 30 29 3b 0a  AT STRING", 0);.
3780: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3790: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
37a0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
37b0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
37c0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
37d0: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74  ERROR;.  Tcl_DSt
37e0: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
37f0: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
3800: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 32 5d  _mprintf(argv[2]
3810: 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20  ,argv[3]);.  rc 
3820: 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61  = sqlite3_get_ta
3830: 62 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61  ble(db, zSql, &a
3840: 52 65 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 26  Result, &nRow, &
3850: 6e 43 6f 6c 2c 20 26 7a 45 72 72 29 3b 0a 20 20  nCol, &zErr);.  
3860: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
3870: 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  l);.  sprintf(zB
3880: 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20  uf, "%d", rc);. 
3890: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
38a0: 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29  nt(interp, zBuf)
38b0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
38c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 70 72  TE_OK ){.    spr
38d0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
38e0: 20 6e 52 6f 77 29 3b 0a 20 20 20 20 54 63 6c 5f   nRow);.    Tcl_
38f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3900: 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20  terp, zBuf);.   
3910: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
3920: 25 64 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  %d", nCol);.    
3930: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
3940: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b  t(interp, zBuf);
3950: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3960: 28 6e 52 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 20 69  (nRow+1)*nCol; i
3970: 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ++){.      Tcl_A
3980: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3990: 65 72 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20  erp, aResult[i] 
39a0: 3f 20 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22  ? aResult[i] : "
39b0: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20  NULL");.    }.  
39c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41  }else{.    Tcl_A
39d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
39e0: 65 72 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a  erp, zErr);.  }.
39f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74    sqlite3_free_t
3a00: 61 62 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20  able(aResult);. 
3a10: 20 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69   if( zErr ) sqli
3a20: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
3a30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
3a40: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
3a50: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
3a60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
3a70: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3a80: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
3a90: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
3aa0: 65 72 74 5f 72 6f 77 69 64 20 44 42 0a 2a 2a 0a  ert_rowid DB.**.
3ab0: 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 69  ** Returns the i
3ac0: 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f 66 20  nteger ROWID of 
3ad0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
3ae0: 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74 61 74 69  insert..*/.stati
3af0: 63 20 69 6e 74 20 74 65 73 74 5f 6c 61 73 74 5f  c int test_last_
3b00: 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20 2a 4e  rowid(.  void *N
3b10: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
3b20: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
3b30: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
3b40: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
3b50: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
3b60: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b80: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
3b90: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
3ba0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
3bb0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3bc0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3bd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
3be0: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
3bf0: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
3c00: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
3c10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
3c20: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
3c30: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
3c40: 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c 20 30  v[0], " DB\"", 0
3c50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
3c60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
3c70: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
3c80: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
3c90: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
3ca0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70 72 69  CL_ERROR;.  spri
3cb0: 6e 74 66 28 7a 42 75 66 2c 20 22 25 6c 6c 64 22  ntf(zBuf, "%lld"
3cc0: 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  , sqlite3_last_i
3cd0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62 29 29  nsert_rowid(db))
3ce0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
3cf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
3d00: 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
3d10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
3d20: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3d30: 74 65 33 5f 6b 65 79 20 44 42 20 4b 45 59 0a 2a  te3_key DB KEY.*
3d40: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
3d50: 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69  ec key..*/.stati
3d60: 63 20 69 6e 74 20 74 65 73 74 5f 6b 65 79 28 0a  c int test_key(.
3d70: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
3d80: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3d90: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
3da0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
3db0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
3dc0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
3dd0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
3de0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3df0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
3e00: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
3e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
3e20: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
3e30: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
3e40: 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
3e50: 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e  char *zKey;.  in
3e60: 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61 72  t nKey;.  if( ar
3e70: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
3e80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
3e90: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
3ea0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
3eb0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
3ec0: 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
3ed0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
3ee0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
3ef0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
3f00: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
3f10: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
3f20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3f30: 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  zKey = argv[2];.
3f40: 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28    nKey = strlen(
3f50: 7a 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51  zKey);.#ifdef SQ
3f60: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
3f70: 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 64 62 2c   sqlite3_key(db,
3f80: 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65   zKey, nKey);.#e
3f90: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
3fa0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3fb0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72  sage:  sqlite3_r
3fc0: 65 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a  ekey DB KEY.**.*
3fd0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 64  * Change the cod
3fe0: 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69  ec key..*/.stati
3ff0: 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6b 65 79  c int test_rekey
4000: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4010: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
4020: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
4030: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4040: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4050: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
4060: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
4070: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4080: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4090: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
40b0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
40c0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
40d0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
40e0: 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20  t char *zKey;.  
40f0: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20  int nKey;.  if( 
4100: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
4110: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4120: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
4130: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
4140: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
4150: 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45        " FILENAME
4160: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
4170: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4180: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
4190: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
41a0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
41b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
41c0: 20 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d    zKey = argv[2]
41d0: 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65  ;.  nKey = strle
41e0: 6e 28 7a 4b 65 79 29 3b 0a 23 69 66 64 65 66 20  n(zKey);.#ifdef 
41f0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
4200: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79  .  sqlite3_rekey
4210: 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29  (db, zKey, nKey)
4220: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
4230: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4240: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
4250: 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a 0a 2a  e3_close DB.**.*
4260: 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64 61 74  * Closes the dat
4270: 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
4280: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a 2a 2f  sqlite3_open..*/
4290: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
42a0: 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28 0a 20  te_test_close(. 
42b0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
42c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
42d0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
42e0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
42f0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4300: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4310: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4320: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4330: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4340: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
4350: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
4360: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4370: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
4380: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
4390: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
43a0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
43b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
43c0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
43d0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
43e0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
43f0: 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
4400: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4410: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4420: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
4430: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
4440: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
4450: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
4460: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
4470: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
4480: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
4490: 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
44a0: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
44b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
44c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
44d0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78  ntation of the x
44e0: 5f 63 6f 61 6c 65 73 63 65 28 29 20 66 75 6e 63  _coalesce() func
44f0: 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  tion..** Return 
4500: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
4510: 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75  nt non-NULL argu
4520: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
4530: 76 6f 69 64 20 74 31 5f 69 66 6e 75 6c 6c 46 75  void t1_ifnullFu
4540: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
4550: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
4560: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
4570: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
4580: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  gv.){.  int i;. 
4590: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
45a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
45b0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
45c0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
45d0: 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20  argv[i]) ){.    
45e0: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
45f0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
4600: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 71  gv[i]);.      sq
4610: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4620: 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  t(context, (char
4630: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
4640: 74 65 78 74 28 61 72 67 76 5b 69 5d 29 2c 0a 20  text(argv[i]),. 
4650: 20 20 20 20 20 20 20 20 20 6e 2c 20 53 51 4c 49           n, SQLI
4660: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
4670: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4680: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
4690: 68 65 73 65 20 61 72 65 20 74 65 73 74 20 66 75  hese are test fu
46a0: 6e 63 74 69 6f 6e 73 2e 20 20 20 20 68 65 78 38  nctions.    hex8
46b0: 28 29 20 69 6e 74 65 72 70 72 65 74 73 20 69 74  () interprets it
46c0: 73 20 61 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a  s argument as.**
46d0: 20 55 54 46 38 20 61 6e 64 20 72 65 74 75 72 6e   UTF8 and return
46e0: 73 20 61 20 68 65 78 20 65 6e 63 6f 64 69 6e 67  s a hex encoding
46f0: 2e 20 20 68 65 78 31 36 6c 65 28 29 20 69 6e 74  .  hex16le() int
4700: 65 72 70 72 65 74 73 20 69 74 73 20 61 72 67 75  erprets its argu
4710: 6d 65 6e 74 0a 2a 2a 20 61 73 20 55 54 46 31 36  ment.** as UTF16
4720: 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  le and returns a
4730: 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a   hex encoding..*
4740: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
4750: 78 38 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  x8Func(sqlite3_c
4760: 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 61  ontext *p, int a
4770: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
4780: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f  ue **argv){.  co
4790: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
47a0: 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  r *z;.  int i;. 
47b0: 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
47c0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  z = sqlite3_v
47d0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
47e0: 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
47f0: 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 32 20  <sizeof(zBuf)/2 
4800: 2d 20 32 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b  - 2 && z[i]; i++
4810: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26  ){.    sprintf(&
4820: 7a 42 75 66 5b 69 2a 32 5d 2c 20 22 25 30 32 78  zBuf[i*2], "%02x
4830: 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20  ", z[i]&0xff);. 
4840: 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32 5d 20 3d   }.  zBuf[i*2] =
4850: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
4860: 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68  sult_text(p, (ch
4870: 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51  ar*)zBuf, -1, SQ
4880: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
4890: 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  .}.#ifndef SQLIT
48a0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74 61  E_OMIT_UTF16.sta
48b0: 74 69 63 20 76 6f 69 64 20 68 65 78 31 36 46 75  tic void hex16Fu
48c0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
48d0: 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63 2c  xt *p, int argc,
48e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
48f0: 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20  *argv){.  const 
4900: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69  unsigned short i
4910: 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a  nt *z;.  int i;.
4920: 20 20 63 68 61 72 20 7a 42 75 66 5b 34 30 30 5d    char zBuf[400]
4930: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
4940: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67  value_text16(arg
4950: 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[0]);.  for(i=0
4960: 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29  ; i<sizeof(zBuf)
4970: 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69 5d 3b 20  /4 - 4 && z[i]; 
4980: 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  i++){.    sprint
4990: 66 28 26 7a 42 75 66 5b 69 2a 34 5d 2c 20 22 25  f(&zBuf[i*4], "%
49a0: 30 34 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29  04x", z[i]&0xff)
49b0: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 34  ;.  }.  zBuf[i*4
49c0: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
49d0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20  _result_text(p, 
49e0: 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c  (char*)zBuf, -1,
49f0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
4a00: 54 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  T);.}.#endif../*
4a10: 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20  .** A structure 
4a20: 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 61 63  into which to ac
4a30: 63 75 6d 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a  cumulate text..*
4a40: 2f 0a 73 74 72 75 63 74 20 64 73 74 72 20 7b 0a  /.struct dstr {.
4a50: 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f    int nAlloc;  /
4a60: 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
4a70: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64  d */.  int nUsed
4a80: 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73 65  ;   /* Space use
4a90: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  d */.  char *z; 
4aa0: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 63 65      /* The space
4ab0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70   */.};../*.** Ap
4ac0: 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20 64  pend text to a d
4ad0: 73 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  str.*/.static vo
4ae0: 69 64 20 64 73 74 72 41 70 70 65 6e 64 28 73 74  id dstrAppend(st
4af0: 72 75 63 74 20 64 73 74 72 20 2a 70 2c 20 63 6f  ruct dstr *p, co
4b00: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
4b10: 20 64 69 76 69 64 65 72 29 7b 0a 20 20 69 6e 74   divider){.  int
4b20: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a   n = strlen(z);.
4b30: 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64 20 2b    if( p->nUsed +
4b40: 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c   n + 2 > p->nAll
4b50: 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  oc ){.    char *
4b60: 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c  zNew;.    p->nAl
4b70: 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a  loc = p->nAlloc*
4b80: 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20 20 20  2 + n + 200;.   
4b90: 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65   zNew = sqliteRe
4ba0: 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e  alloc(p->z, p->n
4bb0: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20  Alloc);.    if( 
4bc0: 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zNew==0 ){.     
4bd0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a   sqliteFree(p->z
4be0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
4bf0: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
4c00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
4c10: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 20  .    }.    p->z 
4c20: 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66  = zNew;.  }.  if
4c30: 28 20 64 69 76 69 64 65 72 20 26 26 20 70 2d 3e  ( divider && p->
4c40: 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20 70  nUsed>0 ){.    p
4c50: 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20  ->z[p->nUsed++] 
4c60: 3d 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a 20  = divider;.  }. 
4c70: 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d   memcpy(&p->z[p-
4c80: 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31 29  >nUsed], z, n+1)
4c90: 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20  ;.  p->nUsed += 
4ca0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  n;.}../*.** Invo
4cb0: 6b 65 64 20 66 6f 72 20 65 61 63 68 20 63 61 6c  ked for each cal
4cc0: 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74  lback from sqlit
4cd0: 65 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73 74  e3ExecFunc.*/.st
4ce0: 61 74 69 63 20 69 6e 74 20 65 78 65 63 46 75 6e  atic int execFun
4cf0: 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  cCallback(void *
4d00: 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c  pData, int argc,
4d10: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
4d20: 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ar **NotUsed){. 
4d30: 20 73 74 72 75 63 74 20 64 73 74 72 20 2a 70 20   struct dstr *p 
4d40: 3d 20 28 73 74 72 75 63 74 20 64 73 74 72 2a 29  = (struct dstr*)
4d50: 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a  pData;.  int i;.
4d60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
4d70: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
4d80: 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20   argv[i]==0 ){. 
4d90: 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64 28       dstrAppend(
4da0: 70 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29 3b  p, "NULL", ' ');
4db0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4dc0: 20 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20    dstrAppend(p, 
4dd0: 61 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a 20  argv[i], ' ');. 
4de0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4df0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  n 0;.}../*.** Im
4e00: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
4e10: 74 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78 65  the x_sqlite_exe
4e20: 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  c() function.  T
4e30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  his function tak
4e40: 65 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61  es.** a single a
4e50: 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74 65  rgument and atte
4e60: 6d 70 74 73 20 74 6f 20 65 78 65 63 75 74 65 20  mpts to execute 
4e70: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61 73  that argument as
4e80: 20 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54 68   SQL code..** Th
4e90: 69 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 6e  is is illegal an
4ea0: 64 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68 65  d should set the
4eb0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 66   SQLITE_MISUSE f
4ec0: 6c 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61 62  lag on the datab
4ed0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d  ase..**.** 2004-
4ee0: 4a 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76 65  Jan-07:  We have
4ef0: 20 63 68 61 6e 67 65 64 20 74 68 69 73 20 74 6f   changed this to
4f00: 20 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20 74   make it legal t
4f10: 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65  o call sqlite3_e
4f20: 78 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77 69  xec().** from wi
4f30: 74 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20  thin a function 
4f40: 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54  call.  .** .** T
4f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d 75  his routine simu
4f60: 6c 61 74 65 73 20 74 68 65 20 65 66 66 65 63 74  lates the effect
4f70: 20 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20 74   of having two t
4f80: 68 72 65 61 64 73 20 61 74 74 65 6d 70 74 20 74  hreads attempt t
4f90: 6f 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61 6d  o.** use the sam
4fa0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
4fb0: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a  e same time..*/.
4fc0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
4fd0: 74 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20 73  te3ExecFunc(.  s
4fe0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
4ff0: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
5000: 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65  argc,  .  sqlite
5010: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5020: 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72 20  {.  struct dstr 
5030: 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20  x;.  memset(&x, 
5040: 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  0, sizeof(x));. 
5050: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
5060: 78 65 63 28 28 73 71 6c 69 74 65 33 2a 29 73 71  xec((sqlite3*)sq
5070: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
5080: 63 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20 20  context),.      
5090: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
50a0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
50b0: 5d 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46 75  ]),.      execFu
50c0: 6e 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20  ncCallback, &x, 
50d0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  0);.  sqlite3_re
50e0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
50f0: 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c  t, x.z, x.nUsed,
5100: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
5110: 54 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  T);.  sqliteFree
5120: 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (x.z);.}../*.** 
5130: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
5140: 66 20 74 6b 74 32 32 31 33 66 75 6e 63 28 29 2c  f tkt2213func(),
5150: 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69   a scalar functi
5160: 6f 6e 20 74 68 61 74 20 74 61 6b 65 73 20 65 78  on that takes ex
5170: 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20 61 72 67  actly.** one arg
5180: 75 6d 65 6e 74 2e 20 49 74 20 68 61 73 20 74 77  ument. It has tw
5190: 6f 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 65  o interesting fe
51a0: 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20  atures:.**.** * 
51b0: 49 74 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33  It calls sqlite3
51c0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 20 33 20  _value_text() 3 
51d0: 74 69 6d 65 73 20 6f 6e 20 74 68 65 20 61 72 67  times on the arg
51e0: 75 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 76 61  ument sqlite3_va
51f0: 6c 75 65 2a 2e 0a 2a 2a 20 20 20 49 66 20 74 68  lue*..**   If th
5200: 65 20 74 68 72 65 65 20 70 6f 69 6e 74 65 72 73  e three pointers
5210: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6e 6f   returned are no
5220: 74 20 74 68 65 20 73 61 6d 65 20 61 6e 20 53 51  t the same an SQ
5230: 4c 20 65 72 72 6f 72 20 69 73 20 72 61 69 73 65  L error is raise
5240: 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74 68 65 72  d..**.** * Other
5250: 77 69 73 65 20 69 74 20 72 65 74 75 72 6e 73 20  wise it returns 
5260: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74 65  a copy of the te
5270: 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
5280: 6e 20 6f 66 20 69 74 27 73 20 0a 2a 2a 20 20 20  n of it's .**   
5290: 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 75 63 68  argument in such
52a0: 20 61 20 77 61 79 20 61 73 20 74 68 65 20 56 44   a way as the VD
52b0: 42 45 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  BE representatio
52c0: 6e 20 69 73 20 61 20 4d 65 6d 2a 20 63 65 6c 6c  n is a Mem* cell
52d0: 20 0a 2a 2a 20 20 20 77 69 74 68 20 74 68 65 20   .**   with the 
52e0: 4d 45 4d 5f 54 65 72 6d 20 66 6c 61 67 20 63 6c  MEM_Term flag cl
52f0: 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 69 63 6b  ear. .**.** Tick
5300: 65 74 20 23 32 32 31 33 20 63 61 6e 20 74 68 65  et #2213 can the
5310: 72 65 66 6f 72 65 20 62 65 20 74 65 73 74 65 64  refore be tested
5320: 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67 20 74   by evaluating t
5330: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
5340: 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 3a 0a  SQL expression:.
5350: 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32 32 31 33 66  **.**   tkt2213f
5360: 75 6e 63 28 74 6b 74 32 32 31 33 66 75 6e 63 28  unc(tkt2213func(
5370: 27 61 20 73 74 72 69 6e 67 27 29 29 3b 0a 2a 2f  'a string'));.*/
5380: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6b 74  .static void tkt
5390: 32 32 31 33 46 75 6e 63 74 69 6f 6e 28 0a 20 20  2213Function(.  
53a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
53b0: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
53c0: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
53d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
53e0: 29 7b 0a 20 20 69 6e 74 20 6e 54 65 78 74 3b 0a  ){.  int nText;.
53f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5400: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 31 3b 0a 20  const *zText1;. 
5410: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
5420: 6f 6e 73 74 20 2a 7a 54 65 78 74 32 3b 0a 20 20  onst *zText2;.  
5430: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f  unsigned char co
5440: 6e 73 74 20 2a 7a 54 65 78 74 33 3b 0a 0a 20 20  nst *zText3;..  
5450: 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f  nText = sqlite3_
5460: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
5470: 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 31 20 3d  [0]);.  zText1 =
5480: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5490: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
54a0: 7a 54 65 78 74 32 20 3d 20 73 71 6c 69 74 65 33  zText2 = sqlite3
54b0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
54c0: 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 33 20 3d  [0]);.  zText3 =
54d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
54e0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20  ext(argv[0]);.. 
54f0: 20 69 66 28 20 7a 54 65 78 74 31 21 3d 7a 54 65   if( zText1!=zTe
5500: 78 74 32 20 7c 7c 20 7a 54 65 78 74 32 21 3d 7a  xt2 || zText2!=z
5510: 54 65 78 74 33 20 29 7b 0a 20 20 20 20 73 71 6c  Text3 ){.    sql
5520: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5530: 72 28 63 6f 6e 74 65 78 74 2c 20 22 74 6b 74 32  r(context, "tkt2
5540: 32 31 33 20 69 73 20 6e 6f 74 20 66 69 78 65 64  213 is not fixed
5550: 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ", -1);.  }else{
5560: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79  .    char *zCopy
5570: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
5580: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 65 78 74 29  e3_malloc(nText)
5590: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f  ;.    memcpy(zCo
55a0: 70 79 2c 20 7a 54 65 78 74 31 2c 20 6e 54 65 78  py, zText1, nTex
55b0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
55c0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
55d0: 65 78 74 2c 20 7a 43 6f 70 79 2c 20 6e 54 65 78  ext, zCopy, nTex
55e0: 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  t, sqlite3_free)
55f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
5600: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
5610: 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20   function takes 
5620: 34 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  4 arguments.  Th
5630: 65 20 32 6e 64 20 61 6e 64 0a 2a 2a 20 34 74 68  e 2nd and.** 4th
5640: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
5650: 65 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73  e one of these s
5660: 74 72 69 6e 67 73 3a 20 20 27 74 65 78 74 27 2c  trings:  'text',
5670: 20 27 74 65 78 74 31 36 27 2c 0a 2a 2a 20 6f 72   'text16',.** or
5680: 20 27 62 6c 6f 62 27 20 63 6f 72 72 65 73 70 6f   'blob' correspo
5690: 6e 64 69 6e 67 20 74 6f 20 41 50 49 20 66 75 6e  nding to API fun
56a0: 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 20 20 20  ctions.**.**    
56b0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
56c0: 74 65 78 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  text().**      s
56d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
56e0: 74 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  t16().**      sq
56f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
5700: 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69  ().**.** The thi
5710: 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  rd argument is a
5720: 20 73 74 72 69 6e 67 2c 20 65 69 74 68 65 72 20   string, either 
5730: 27 62 79 74 65 73 27 20 6f 72 20 27 62 79 74 65  'bytes' or 'byte
5740: 73 31 36 27 20 6f 72 20 27 6e 6f 6f 70 27 2c 0a  s16' or 'noop',.
5750: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
5760: 20 74 6f 20 41 50 49 73 3a 0a 2a 2a 0a 2a 2a 20   to APIs:.**.** 
5770: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
5780: 75 65 5f 62 79 74 65 73 28 29 0a 2a 2a 20 20 20  ue_bytes().**   
5790: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
57a0: 5f 62 79 74 65 73 31 36 28 29 0a 2a 2a 20 20 20  _bytes16().**   
57b0: 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20 54 68     noop.**.** Th
57c0: 65 20 41 50 49 73 20 64 65 73 69 67 6e 61 74 65  e APIs designate
57d0: 64 20 62 79 20 74 68 65 20 32 6e 64 20 74 68 72  d by the 2nd thr
57e0: 6f 75 67 68 20 34 74 68 20 61 72 67 75 6d 65 6e  ough 4th argumen
57f0: 74 73 20 61 72 65 20 61 70 70 6c 69 65 64 0a 2a  ts are applied.*
5800: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 61  * to the first a
5810: 72 67 75 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  rgument in order
5820: 2e 20 20 49 66 20 74 68 65 20 70 6f 69 6e 74 65  .  If the pointe
5830: 72 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  rs returned by t
5840: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 6e 64  he.** second and
5850: 20 66 6f 75 72 74 68 20 61 72 65 20 64 69 66 66   fourth are diff
5860: 65 72 65 6e 74 2c 20 74 68 69 73 20 72 6f 75 74  erent, this rout
5870: 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 20 20  ine returns 1.  
5880: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68  Otherwise,.** th
5890: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
58a0: 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ns 0..**.** This
58b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
58c0: 64 20 74 6f 20 74 65 73 74 20 74 6f 20 73 65 65  d to test to see
58d0: 20 77 68 65 6e 20 72 65 74 75 72 6e 65 64 20 70   when returned p
58e0: 6f 69 6e 74 65 72 73 20 66 72 6f 6d 0a 2a 2a 20  ointers from.** 
58f0: 74 68 65 20 5f 74 65 78 74 28 29 2c 20 5f 74 65  the _text(), _te
5900: 78 74 31 36 28 29 20 61 6e 64 20 5f 62 6c 6f 62  xt16() and _blob
5910: 28 29 20 41 50 49 73 20 62 65 63 6f 6d 65 20 69  () APIs become i
5920: 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73  nvalidated..*/.s
5930: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 43 68  tatic void ptrCh
5940: 6e 67 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  ngFunction(.  sq
5950: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5960: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
5970: 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33  rgc,  .  sqlite3
5980: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
5990: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
59a0: 31 2c 20 2a 70 32 3b 0a 20 20 63 6f 6e 73 74 20  1, *p2;.  const 
59b0: 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 66  char *zCmd;.  if
59c0: 28 20 61 72 67 63 21 3d 34 20 29 20 72 65 74 75  ( argc!=4 ) retu
59d0: 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f  rn;.  zCmd = (co
59e0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
59f0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
5a00: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d  v[1]);.  if( zCm
5a10: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  d==0 ) return;. 
5a20: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
5a30: 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"text")==0 ){. 
5a40: 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76     p1 = (const v
5a50: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
5a60: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
5a70: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
5a80: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65  _OMIT_UTF16.  }e
5a90: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
5aa0: 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29 3d 3d  Cmd, "text16")==
5ab0: 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63  0 ){.    p1 = (c
5ac0: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
5ad0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
5ae0: 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66  argv[0]);.#endif
5af0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
5b00: 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22  cmp(zCmd, "blob"
5b10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d  )==0 ){.    p1 =
5b20: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
5b30: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
5b40: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c  (argv[0]);.  }el
5b50: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  se{.    return;.
5b60: 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f    }.  zCmd = (co
5b70: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
5b80: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
5b90: 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d  v[2]);.  if( zCm
5ba0: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  d==0 ) return;. 
5bb0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
5bc0: 2c 22 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a  ,"bytes")==0 ){.
5bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
5be0: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
5bf0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
5c00: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65  _OMIT_UTF16.  }e
5c10: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
5c20: 43 6d 64 2c 20 22 62 79 74 65 73 31 36 22 29 3d  Cmd, "bytes16")=
5c30: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
5c40: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28  3_value_bytes16(
5c50: 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66  argv[0]);.#endif
5c60: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
5c70: 63 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f 6f 70 22  cmp(zCmd, "noop"
5c80: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 64  )==0 ){.    /* d
5c90: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d  o nothing */.  }
5ca0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
5cb0: 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28  ;.  }.  zCmd = (
5cc0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
5cd0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5ce0: 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[3]);.  if( z
5cf0: 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cmd==0 ) return;
5d00: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  .  if( strcmp(zC
5d10: 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b  md,"text")==0 ){
5d20: 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74  .    p2 = (const
5d30: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
5d40: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
5d50: 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
5d60: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
5d70: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
5d80: 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29  (zCmd, "text16")
5d90: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  ==0 ){.    p2 = 
5da0: 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c  (const void*)sql
5db0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
5dc0: 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64  6(argv[0]);.#end
5dd0: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  if.  }else if( s
5de0: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f  trcmp(zCmd, "blo
5df0: 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32  b")==0 ){.    p2
5e00: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
5e10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
5e20: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d  ob(argv[0]);.  }
5e30: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
5e40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
5e50: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
5e60: 78 74 2c 20 70 31 21 3d 70 32 29 3b 0a 7d 0a 0a  xt, p1!=p2);.}..
5e70: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
5e80: 71 6c 69 74 65 5f 74 65 73 74 5f 63 72 65 61 74  qlite_test_creat
5e90: 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 0a 2a 2a  e_function DB.**
5ea0: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c  .** Call the sql
5eb0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
5ec0: 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65 20  tion API on the 
5ed0: 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 69  given database i
5ee0: 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72  n order.** to cr
5ef0: 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e 20  eate a function 
5f00: 6e 61 6d 65 64 20 22 78 5f 63 6f 61 6c 65 73 63  named "x_coalesc
5f10: 65 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  e".  This functi
5f20: 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65  on does the same
5f30: 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65   thing.** as the
5f40: 20 22 63 6f 61 6c 65 73 63 65 22 20 66 75 6e 63   "coalesce" func
5f50: 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63  tion.  This func
5f60: 74 69 6f 6e 20 61 6c 73 6f 20 72 65 67 69 73 74  tion also regist
5f70: 65 72 73 20 61 6e 20 53 51 4c 20 66 75 6e 63 74  ers an SQL funct
5f80: 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64 20 22 78 5f  ion.** named "x_
5f90: 73 71 6c 69 74 65 5f 65 78 65 63 22 20 74 68 61  sqlite_exec" tha
5fa0: 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  t invokes sqlite
5fb0: 33 5f 65 78 65 63 28 29 2e 20 20 49 6e 76 6f 6b  3_exec().  Invok
5fc0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ing sqlite3_exec
5fd0: 28 29 0a 2a 2a 20 69 6e 20 74 68 69 73 20 77 61  ().** in this wa
5fe0: 79 20 69 73 20 69 6c 6c 65 67 61 6c 20 72 65 63  y is illegal rec
5ff0: 75 72 73 69 6f 6e 20 61 6e 64 20 73 68 6f 75 6c  ursion and shoul
6000: 64 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49 54  d raise an SQLIT
6010: 45 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 2e 0a  E_MISUSE error..
6020: 2a 2a 20 54 68 65 20 65 66 66 65 63 74 20 69 73  ** The effect is
6030: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 72 79 69   similar to tryi
6040: 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 73 61  ng to use the sa
6050: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
6060: 65 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 74  ection from.** t
6070: 77 6f 20 74 68 72 65 61 64 73 20 61 74 20 74 68  wo threads at th
6080: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
6090: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
60a0: 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20 74  motivation for t
60b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
60c0: 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61  to be able to ca
60d0: 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ll the.** sqlite
60e0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
60f0: 6e 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65  n function while
6100: 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20 70   a query is in p
6110: 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72  rogress in order
6120: 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20  .** to test the 
6130: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65  SQLITE_MISUSE de
6140: 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a  tection logic..*
6150: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
6160: 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  t_create_functio
6170: 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  n(.  void *NotUs
6180: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
6190: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
61a0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
61b0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
61c0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
61d0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
61e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
61f0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
6200: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
6210: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
6220: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
6230: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
6240: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
6250: 2a 64 62 3b 0a 20 20 65 78 74 65 72 6e 20 76 6f  *db;.  extern vo
6260: 69 64 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28  id Md5_Register(
6270: 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 20 20 69 66  sqlite3*);..  if
6280: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
6290: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
62a0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
62b0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
62c0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
62d0: 0a 20 20 20 20 20 20 20 22 20 44 42 5c 22 22 2c  .       " DB\"",
62e0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
62f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
6300: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
6310: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
6320: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
6330: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
6340: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
6350: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
6360: 78 5f 63 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c  x_coalesce", -1,
6370: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
6380: 0a 20 20 20 20 20 20 20 20 74 31 5f 69 66 6e 75  .        t1_ifnu
6390: 6c 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  llFunc, 0, 0);. 
63a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
63b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
63c0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
63d0: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 38  nction(db, "hex8
63e0: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59  ", 1, SQLITE_ANY
63f0: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
6400: 68 65 78 38 46 75 6e 63 2c 20 30 2c 20 30 29 3b  hex8Func, 0, 0);
6410: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
6420: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
6430: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6440: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
6450: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6460: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 31  nction(db, "hex1
6470: 36 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e  6", 1, SQLITE_AN
6480: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  Y, 0, .         
6490: 20 68 65 78 31 36 46 75 6e 63 2c 20 30 2c 20 30   hex16Func, 0, 0
64a0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
64b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
64c0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
64d0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
64e0: 63 74 69 6f 6e 28 64 62 2c 20 22 74 6b 74 32 32  ction(db, "tkt22
64f0: 31 33 66 75 6e 63 22 2c 20 31 2c 20 53 51 4c 49  13func", 1, SQLI
6500: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
6510: 20 20 20 20 20 20 74 6b 74 32 32 31 33 46 75 6e        tkt2213Fun
6520: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
6530: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
6540: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
6550: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
6560: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 70  _function(db, "p
6570: 6f 69 6e 74 65 72 5f 63 68 61 6e 67 65 22 2c 20  ointer_change", 
6580: 34 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30  4, SQLITE_ANY, 0
6590: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 74 72  , .          ptr
65a0: 43 68 6e 67 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  ChngFunction, 0,
65b0: 20 30 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65   0);.  }..#ifnde
65c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
65d0: 46 31 36 0a 20 20 2f 2a 20 55 73 65 20 74 68 65  F16.  /* Use the
65e0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
65f0: 66 75 6e 63 74 69 6f 6e 31 36 28 29 20 41 50 49  function16() API
6600: 20 68 65 72 65 2e 20 4d 61 69 6e 6c 79 20 66 6f   here. Mainly fo
6610: 72 20 66 75 6e 2c 20 62 75 74 20 61 6c 73 6f 20  r fun, but also 
6620: 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74  .  ** because it
6630: 20 69 73 20 6e 6f 74 20 74 65 73 74 65 64 20 61   is not tested a
6640: 6e 79 77 68 65 72 65 20 65 6c 73 65 2e 20 2a 2f  nywhere else. */
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 73 71 6c 69  E_OK ){.    sqli
6670: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
6680: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
6690: 45 4d 44 45 42 55 47 0a 20 20 20 20 69 66 28 20  EMDEBUG.    if( 
66a0: 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
66b0: 61 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  ail>0 ){.      s
66c0: 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
66d0: 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  il++;.    }.#end
66e0: 69 66 20 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  if .    pVal = s
66f0: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29  qlite3ValueNew()
6700: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
6710: 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d  ueSetStr(pVal, -
6720: 31 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65  1, "x_sqlite_exe
6730: 63 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  c", SQLITE_UTF8,
6740: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
6750: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6760: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
6770: 6e 31 36 28 64 62 2c 20 0a 20 20 20 20 20 20 20  n16(db, .       
6780: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
6790: 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
67a0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
67b0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
67c0: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36   1, SQLITE_UTF16
67d0: 2c 20 64 62 2c 20 73 71 6c 69 74 65 33 45 78 65  , db, sqlite3Exe
67e0: 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  cFunc, 0, 0);.  
67f0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
6800: 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 23 65  ee(pVal);.  }.#e
6810: 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69  ndif..  if( sqli
6820: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
6830: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
6840: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6850: 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  R;.  Tcl_SetResu
6860: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
6870: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
6880: 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
6890: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
68a0: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d  * Routines to im
68b0: 70 6c 65 6d 65 6e 74 20 74 68 65 20 78 5f 63 6f  plement the x_co
68c0: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
68d0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
68e0: 78 5f 63 6f 75 6e 74 28 29 20 63 6f 75 6e 74 73  x_count() counts
68f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
6900: 6f 6e 2d 6e 75 6c 6c 20 61 72 67 75 6d 65 6e 74  on-null argument
6910: 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  s.  But there ar
6920: 65 0a 2a 2a 20 73 6f 6d 65 20 74 77 69 73 74 73  e.** some twists
6930: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
6940: 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  poses..**.** If 
6950: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
6960: 78 5f 63 6f 75 6e 74 28 29 20 69 73 20 34 30 20  x_count() is 40 
6970: 74 68 65 6e 20 61 20 55 54 46 2d 38 20 65 72 72  then a UTF-8 err
6980: 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 2a  or is reported.*
6990: 2a 20 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75  * on the step fu
69a0: 6e 63 74 69 6f 6e 2e 20 20 49 66 20 78 5f 63 6f  nction.  If x_co
69b0: 75 6e 74 28 34 31 29 20 69 73 20 73 65 65 6e 2c  unt(41) is seen,
69c0: 20 74 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65   then a UTF-16 e
69d0: 72 72 6f 72 0a 2a 2a 20 69 73 20 72 65 70 6f 72  rror.** is repor
69e0: 74 65 64 20 6f 6e 20 74 68 65 20 73 74 65 70 20  ted on the step 
69f0: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  function.  If th
6a00: 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20 69 73  e total count is
6a10: 20 34 32 2c 20 74 68 65 6e 0a 2a 2a 20 61 20 55   42, then.** a U
6a20: 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65  TF-8 error is re
6a30: 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 66 69  ported on the fi
6a40: 6e 61 6c 69 7a 65 20 66 75 6e 63 74 69 6f 6e 2e  nalize function.
6a50: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
6a60: 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20 74 31  ct t1CountCtx t1
6a70: 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74  CountCtx;.struct
6a80: 20 74 31 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20   t1CountCtx {.  
6a90: 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63  int n;.};.static
6aa0: 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 53 74 65   void t1CountSte
6ab0: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p(.  sqlite3_con
6ac0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
6ad0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
6ae0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6af0: 76 0a 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74  v.){.  t1CountCt
6b00: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
6b10: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
6b20: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
6b30: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
6b40: 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51  ( (argc==0 || SQ
6b50: 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74  LITE_NULL!=sqlit
6b60: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
6b70: 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20 29 7b  gv[0]) ) && p ){
6b80: 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d  .    p->n++;.  }
6b90: 0a 20 20 69 66 28 20 61 72 67 63 3e 30 20 29 7b  .  if( argc>0 ){
6ba0: 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 73 71 6c  .    int v = sql
6bb0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
6bc0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[0]);.    if(
6bd0: 20 76 3d 3d 34 30 20 29 7b 0a 20 20 20 20 20 20   v==40 ){.      
6be0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
6bf0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 76  rror(context, "v
6c00: 61 6c 75 65 20 6f 66 20 34 30 20 68 61 6e 64 65  alue of 40 hande
6c10: 64 20 74 6f 20 78 5f 63 6f 75 6e 74 22 2c 20 2d  d to x_count", -
6c20: 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  1);.#ifndef SQLI
6c30: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
6c40: 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3d 3d 34    }else if( v==4
6c50: 31 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  1 ){.      const
6c60: 20 63 68 61 72 20 7a 55 74 66 31 36 45 72 72 4d   char zUtf16ErrM
6c70: 73 67 5b 5d 20 3d 20 7b 20 30 2c 20 30 78 36 31  sg[] = { 0, 0x61
6c80: 2c 20 30 2c 20 30 78 36 32 2c 20 30 2c 20 30 78  , 0, 0x62, 0, 0x
6c90: 36 33 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 20 20  63, 0, 0, 0};.  
6ca0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6cb0: 6c 74 5f 65 72 72 6f 72 31 36 28 63 6f 6e 74 65  lt_error16(conte
6cc0: 78 74 2c 20 26 7a 55 74 66 31 36 45 72 72 4d 73  xt, &zUtf16ErrMs
6cd0: 67 5b 31 2d 53 51 4c 49 54 45 5f 42 49 47 45 4e  g[1-SQLITE_BIGEN
6ce0: 44 49 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64  DIAN], -1);.#end
6cf0: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 20  if.    }.  }.}  
6d00: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31   .static void t1
6d10: 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71  CountFinalize(sq
6d20: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6d30: 6f 6e 74 65 78 74 29 7b 0a 20 20 74 31 43 6f 75  ontext){.  t1Cou
6d40: 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ntCtx *p;.  p = 
6d50: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
6d60: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
6d70: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
6d80: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
6d90: 66 28 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20  f( p->n==42 ){. 
6da0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6db0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
6dc0: 74 2c 20 22 78 5f 63 6f 75 6e 74 20 74 6f 74 61  t, "x_count tota
6dd0: 6c 73 20 74 6f 20 34 32 22 2c 20 2d 31 29 3b 0a  ls to 42", -1);.
6de0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6df0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6e00: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f  int(context, p ?
6e10: 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20 20 20   p->n : 0);.    
6e20: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  }.  }.}../*.** U
6e30: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 74 65  sage:  sqlite_te
6e40: 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67  st_create_aggreg
6e50: 61 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c  ate DB.**.** Cal
6e60: 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72  l the sqlite3_cr
6e70: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50  eate_function AP
6e80: 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 64  I on the given d
6e90: 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65 72  atabase in order
6ea0: 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61 20  .** to create a 
6eb0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
6ec0: 78 5f 63 6f 75 6e 74 22 2e 20 20 54 68 69 73 20  x_count".  This 
6ed0: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68  function does th
6ee0: 65 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20  e same thing.** 
6ef0: 61 73 20 74 68 65 20 22 6d 64 35 73 75 6d 22 20  as the "md5sum" 
6f00: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
6f10: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74  The original mot
6f20: 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  ivation for this
6f30: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20   routine was to 
6f40: 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20  be able to call 
6f50: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63  the.** sqlite3_c
6f60: 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 20  reate_aggregate 
6f70: 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61  function while a
6f80: 20 71 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f   query is in pro
6f90: 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a  gress in order.*
6fa0: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 53 51  * to test the SQ
6fb0: 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65  LITE_MISUSE dete
6fc0: 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 53 65  ction logic.  Se
6fd0: 65 20 6d 69 73 75 73 65 2e 74 65 73 74 2e 0a 2a  e misuse.test..*
6fe0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6ff0: 65 20 77 61 73 20 6c 61 74 65 72 20 65 78 74 65  e was later exte
7000: 6e 64 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  nded to test the
7010: 20 75 73 65 20 6f 66 20 73 71 6c 69 74 65 33 5f   use of sqlite3_
7020: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 0a 2a  result_error().*
7030: 2a 20 77 69 74 68 69 6e 20 61 67 67 72 65 67 61  * within aggrega
7040: 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  te functions..*/
7050: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
7060: 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74  _create_aggregat
7070: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
7080: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
7090: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
70a0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
70b0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
70c0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
70d0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
70e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
70f0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
7100: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
7110: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
7120: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
7130: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
7140: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
7150: 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21   rc;.  if( argc!
7160: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
7170: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7180: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
7190: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
71a0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
71b0: 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20   " FILENAME\"", 
71c0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
71d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
71e0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
71f0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
7200: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
7210: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
7220: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
7230: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78  _function(db, "x
7240: 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49  _count", 0, SQLI
7250: 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20  TE_UTF8, 0, 0,. 
7260: 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65 70       t1CountStep
7270: 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65  ,t1CountFinalize
7280: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
7290: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
72a0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
72b0: 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75  ction(db, "x_cou
72c0: 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  nt", 1, SQLITE_U
72d0: 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  TF8, 0, 0,.     
72e0: 20 20 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74     t1CountStep,t
72f0: 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b  1CountFinalize);
7300: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
7310: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
7320: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
7330: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7340: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
7350: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
7360: 67 65 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54  ge:  printf TEXT
7370: 0a 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70  .**.** Send outp
7380: 75 74 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55  ut to printf.  U
7390: 73 65 20 74 68 69 73 20 72 61 74 68 65 72 20 74  se this rather t
73a0: 68 61 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67  han puts to merg
73b0: 65 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  e the output.** 
73c0: 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  in the correct s
73d0: 65 71 75 65 6e 63 65 20 77 69 74 68 20 64 65 62  equence with deb
73e0: 75 67 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69  ugging printfs i
73f0: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63  nserted into C c
7400: 6f 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65  ode..** Puts use
7410: 73 20 61 20 73 65 70 61 72 61 74 65 20 62 75 66  s a separate buf
7420: 66 65 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e  fer and debuggin
7430: 67 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c  g statements wil
7440: 6c 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73  l be out of.** s
7450: 65 71 75 65 6e 63 65 20 69 66 20 69 74 20 69 73  equence if it is
7460: 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63   used..*/.static
7470: 20 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 66   int test_printf
7480: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
7490: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
74a0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
74b0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
74c0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
74d0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
74e0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
74f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7500: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
7510: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
7520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7530: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
7540: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ment */.){.  if(
7550: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
7560: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7570: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
7580: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
7590: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
75a0: 20 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22         " TEXT\""
75b0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
75c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
75d0: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
75e0: 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74   argv[1]);.  ret
75f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
7600: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
7610: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
7620: 6e 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  nt FORMAT INTEGE
7630: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
7640: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
7650: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
7660: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
7670: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
7680: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
7690: 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
76a0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
76b0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
76c0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
76d0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
76e0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
76f0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
7700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7710: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
7720: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
7730: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
7740: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
7750: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
7760: 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63  int a[3], i;.  c
7770: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
7780: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
7790: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
77a0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
77b0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
77c0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
77d0: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54      " FORMAT INT
77e0: 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b   INT INT\"", 0);
77f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7800: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
7810: 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b  (i=2; i<5; i++){
7820: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
7830: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
7840: 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20  [i], &a[i-2]) ) 
7850: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7860: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
7870: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
7880: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
7890: 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70   a[2]);.  Tcl_Ap
78a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
78b0: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
78c0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
78d0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
78e0: 0a 2f 2a 0a 2a 2a 20 49 66 20 7a 4e 75 6d 20 72  ./*.** If zNum r
78f0: 65 70 72 65 73 65 6e 74 73 20 61 6e 20 69 6e 74  epresents an int
7900: 65 67 65 72 20 74 68 61 74 20 77 69 6c 6c 20 66  eger that will f
7910: 69 74 20 69 6e 20 36 34 2d 62 69 74 73 2c 20 74  it in 64-bits, t
7920: 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 56 61 6c  hen set.** *pVal
7930: 75 65 20 74 6f 20 74 68 61 74 20 69 6e 74 65 67  ue to that integ
7940: 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 72  er and return tr
7950: 75 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72  ue.  Otherwise r
7960: 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a  eturn false..*/.
7970: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
7980: 65 33 47 65 74 49 6e 74 36 34 28 63 6f 6e 73 74  e3GetInt64(const
7990: 20 63 68 61 72 20 2a 7a 4e 75 6d 2c 20 69 36 34   char *zNum, i64
79a0: 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 66 28   *pValue){.  if(
79b0: 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34   sqlite3FitsIn64
79c0: 42 69 74 73 28 7a 4e 75 6d 29 20 29 7b 0a 20 20  Bits(zNum) ){.  
79d0: 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28    sqlite3Atoi64(
79e0: 7a 4e 75 6d 2c 20 70 56 61 6c 75 65 29 3b 0a 20  zNum, pValue);. 
79f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
7a00: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7a10: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
7a20: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
7a30: 74 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  t64 FORMAT INTEG
7a40: 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  ER INTEGER INTEG
7a50: 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  ER.**.** Call mp
7a60: 72 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65  rintf with three
7a70: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
7a80: 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  arguments.*/.sta
7a90: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
7aa0: 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20  mprintf_int64(. 
7ab0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
7ac0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
7ad0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
7ae0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
7af0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
7b00: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
7b10: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
7b20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7b30: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
7b40: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
7b50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
7b60: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
7b70: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
7b80: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
7b90: 61 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  a[3];.  char *z;
7ba0: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
7bb0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
7bc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7bd0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
7be0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
7bf0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
7c00: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e  ORMAT INT INT IN
7c10: 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T\"", 0);.    re
7c20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7c30: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
7c40: 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <5; i++){.    if
7c50: 28 20 21 73 71 6c 69 74 65 33 47 65 74 49 6e 74  ( !sqlite3GetInt
7c60: 36 34 28 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69  64(argv[i], &a[i
7c70: 2d 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 54 63  -2]) ){.      Tc
7c80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7c90: 6e 74 65 72 70 2c 20 22 61 72 67 75 6d 65 6e 74  nterp, "argument
7ca0: 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
7cb0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 22 2c  64-bit integer",
7cc0: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
7cd0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7ce0: 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c   }.  }.  z = sql
7cf0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
7d00: 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[1], a[0], a[1]
7d10: 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[2]);.  Tcl_A
7d20: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7d30: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
7d40: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
7d50: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
7d60: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
7d70: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
7d80: 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  str FORMAT INTEG
7d90: 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e  ER INTEGER STRIN
7da0: 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  G.**.** Call mpr
7db0: 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e  intf with two in
7dc0: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20  teger arguments 
7dd0: 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61  and one string a
7de0: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  rgument.*/.stati
7df0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
7e00: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
7e10: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
7e20: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
7e30: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
7e40: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
7e50: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
7e60: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
7e70: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
7e80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
7e90: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
7ea0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
7eb0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
7ec0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
7ed0: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
7ee0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
7ef0: 69 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72  if( argc<4 || ar
7f00: 67 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  gc>5 ){.    Tcl_
7f10: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7f20: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
7f30: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
7f40: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
7f50: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
7f60: 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c  INT ?STRING?\"",
7f70: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
7f80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
7f90: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
7fa0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
7fb0: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
7fc0: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
7fd0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
7fe0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
7ff0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8000: 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61  argv[1], a[0], a
8010: 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72  [1], argc>4 ? ar
8020: 67 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20  gv[4] : NULL);. 
8030: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8040: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
8050: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
8060: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
8070: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
8080: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e  age:  sqlite3_sn
8090: 70 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47  printf_str INTEG
80a0: 45 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ER FORMAT INTEGE
80b0: 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47  R INTEGER STRING
80c0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
80d0: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
80e0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
80f0: 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72  nd one string ar
8100: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
8110: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 70   int sqlite3_snp
8120: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
8130: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
8140: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8150: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
8160: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
8170: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
8180: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
8190: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
81a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
81b0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
81c0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
81d0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
81e0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
81f0: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
8200: 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68  i;.  int n;.  ch
8210: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
8220: 63 3c 35 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b  c<5 || argc>6 ){
8230: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
8240: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
8250: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
8260: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
8270: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 4e  [0],.       " IN
8280: 54 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  T FORMAT INT INT
8290: 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29   ?STRING?\"", 0)
82a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
82b0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
82c0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
82d0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e  erp, argv[1], &n
82e0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
82f0: 52 52 4f 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20  RROR;.  if( n<0 
8300: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
8310: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8320: 22 4e 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e  "N must be non-n
8330: 65 67 61 74 69 76 65 22 2c 20 30 29 3b 0a 20 20  egative", 0);.  
8340: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8350: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
8360: 33 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20  3; i<5; i++){.  
8370: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
8380: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
8390: 2c 20 26 61 5b 69 2d 33 5d 29 20 29 20 72 65 74  , &a[i-3]) ) ret
83a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
83b0: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
83c0: 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a  _malloc( n+1 );.
83d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
83e0: 74 66 28 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d  tf(n, z, argv[2]
83f0: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72  , a[0], a[1], ar
8400: 67 63 3e 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a  gc>4 ? argv[5] :
8410: 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70   NULL);.  Tcl_Ap
8420: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8430: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
8440: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
8450: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
8460: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
8470: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
8480: 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54  ouble FORMAT INT
8490: 45 47 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55  EGER INTEGER DOU
84a0: 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  BLE.**.** Call m
84b0: 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20  printf with two 
84c0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
84d0: 73 20 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65  s and one double
84e0: 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61   argument.*/.sta
84f0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
8500: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a  mprintf_double(.
8510: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
8520: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
8530: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
8540: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
8550: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
8560: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
8570: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
8580: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8590: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
85a0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
85b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
85c0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
85d0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
85e0: 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65  [3], i;.  double
85f0: 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   r;.  char *z;. 
8600: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
8610: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8620: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
8630: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
8640: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
8650: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
8660: 4d 41 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42  MAT INT INT DOUB
8670: 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  LE\"", 0);.    r
8680: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8690: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
86a0: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
86b0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
86c0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
86d0: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
86e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
86f0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75    if( Tcl_GetDou
8700: 62 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ble(interp, argv
8710: 5b 34 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72  [4], &r) ) retur
8720: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
8730: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
8740: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
8750: 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63  , a[1], r);.  Tc
8760: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8770: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
8780: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
8790: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
87a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
87b0: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
87c0: 74 66 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54  tf_scaled FORMAT
87d0: 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a   DOUBLE DOUBLE.*
87e0: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
87f0: 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  f with a single 
8800: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20  double argument 
8810: 77 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f  which is the pro
8820: 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  duct of the.** t
8830: 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76  wo arguments giv
8840: 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20  en above.  This 
8850: 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  is used to gener
8860: 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64  ate overflow and
8870: 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f   underflow.** do
8880: 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68  ubles to test th
8890: 61 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76  at they are conv
88a0: 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a  erted properly..
88b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
88c0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
88d0: 61 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  aled(.  void *No
88e0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
88f0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
8900: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
8910: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
8920: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
8930: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8950: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
8960: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
8970: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
8980: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
8990: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
89a0: 20 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65   int i;.  double
89b0: 20 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a   r[2];.  char *z
89c0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ;.  if( argc!=4 
89d0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
89e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
89f0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
8a00: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
8a10: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
8a20: 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f  FORMAT DOUBLE DO
8a30: 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  UBLE\"", 0);.   
8a40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8a50: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
8a60: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
8a70: 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
8a80: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
8a90: 69 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72  i], &r[i-2]) ) r
8aa0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8ab0: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
8ac0: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
8ad0: 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a  1], r[0]*r[1]);.
8ae0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8af0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
8b00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
8b10: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
8b20: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
8b30: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
8b40: 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46  printf_stronly F
8b50: 4f 52 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a  ORMAT STRING.**.
8b60: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
8b70: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f  with a single do
8b80: 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  uble argument wh
8b90: 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75  ich is the produ
8ba0: 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ct of the.** two
8bb0: 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e   arguments given
8bc0: 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73   above.  This is
8bd0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
8be0: 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75  e overflow and u
8bf0: 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62  nderflow.** doub
8c00: 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74  les to test that
8c10: 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72   they are conver
8c20: 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  ted properly..*/
8c30: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
8c40: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
8c50: 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  nly(.  void *Not
8c60: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
8c70: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
8c80: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
8c90: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
8ca0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
8cb0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8cd0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
8ce0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
8cf0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
8d00: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
8d10: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
8d20: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
8d30: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
8d40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8d50: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
8d60: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
8d70: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
8d80: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54       " FORMAT ST
8d90: 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20  RING\"", 0);.   
8da0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8db0: 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  R;.  }.  z = sql
8dc0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
8dd0: 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  v[1], argv[2]);.
8de0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8df0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
8e00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
8e10: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
8e20: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
8e30: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
8e40: 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
8e50: 20 46 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a   FORMAT HEX.**.*
8e60: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
8e70: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75  ith a single dou
8e80: 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  ble argument whi
8e90: 63 68 20 69 73 20 64 65 72 69 76 65 64 20 66 72  ch is derived fr
8ea0: 6f 6d 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65  om the.** hexade
8eb0: 63 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f  cimal encoding o
8ec0: 66 20 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65  f an IEEE double
8ed0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8ee0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
8ef0: 68 65 78 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  hexdouble(.  voi
8f00: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
8f10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8f20: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
8f30: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
8f40: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
8f50: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
8f60: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
8f70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
8f80: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
8f90: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
8fa0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
8fb0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
8fc0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
8fd0: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73   double r;.  uns
8fe0: 69 67 6e 65 64 20 20 78 31 2c 20 78 32 3b 0a 20  igned  x1, x2;. 
8ff0: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 75 6e 73 69 67   long long unsig
9000: 6e 65 64 20 64 3b 0a 20 20 69 66 28 20 61 72 67  ned d;.  if( arg
9010: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
9020: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9030: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
9040: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
9050: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
9060: 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49     " FORMAT STRI
9070: 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NG\"", 0);.    r
9080: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9090: 0a 20 20 7d 0a 20 20 69 66 28 20 73 73 63 61 6e  .  }.  if( sscan
90a0: 66 28 61 72 67 76 5b 32 5d 2c 20 22 25 30 38 78  f(argv[2], "%08x
90b0: 25 30 38 78 22 2c 20 26 78 32 2c 20 26 78 31 29  %08x", &x2, &x1)
90c0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
90d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
90e0: 72 70 2c 20 22 32 6e 64 20 61 72 67 75 6d 65 6e  rp, "2nd argumen
90f0: 74 20 73 68 6f 75 6c 64 20 62 65 20 31 36 2d 63  t should be 16-c
9100: 68 61 72 61 63 74 65 72 73 20 6f 66 20 68 65 78  haracters of hex
9110: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9120: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9130: 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20 64 20 3d  .  d = x2;.  d =
9140: 20 28 64 3c 3c 33 32 29 20 2b 20 78 31 3b 0a 20   (d<<32) + x1;. 
9150: 20 6d 65 6d 63 70 79 28 26 72 2c 20 26 64 2c 20   memcpy(&r, &d, 
9160: 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 7a 20  sizeof(r));.  z 
9170: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
9180: 66 28 61 72 67 76 5b 31 5d 2c 20 72 29 3b 0a 20  f(argv[1], r);. 
9190: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
91a0: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
91b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
91c0: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
91d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
91e0: 61 67 65 3a 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  age: sqlite_mall
91f0: 6f 63 5f 66 61 69 6c 20 4e 20 20 3f 52 45 50 45  oc_fail N  ?REPE
9200: 41 54 2d 49 4e 54 45 52 56 41 4c 3f 0a 2a 2a 0a  AT-INTERVAL?.**.
9210: 2a 2a 20 52 69 67 20 73 71 6c 69 74 65 4d 61 6c  ** Rig sqliteMal
9220: 6c 6f 63 28 29 20 74 6f 20 66 61 69 6c 20 6f 6e  loc() to fail on
9230: 20 74 68 65 20 4e 2d 74 68 20 63 61 6c 6c 20 61   the N-th call a
9240: 6e 64 20 65 76 65 72 79 20 52 45 50 45 41 54 2d  nd every REPEAT-
9250: 49 4e 54 45 52 56 41 4c 20 63 61 6c 6c 0a 2a 2a  INTERVAL call.**
9260: 20 61 66 74 65 72 20 74 68 61 74 2e 20 20 49 66   after that.  If
9270: 20 52 45 50 45 41 54 2d 49 4e 54 45 52 56 41 4c   REPEAT-INTERVAL
9280: 20 69 73 20 30 20 6f 72 20 69 73 20 6f 6d 69 74   is 0 or is omit
9290: 74 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 61  ted, then only a
92a0: 20 73 69 6e 67 6c 65 0a 2a 2a 20 6d 61 6c 6c 6f   single.** mallo
92b0: 63 20 77 69 6c 6c 20 66 61 69 6c 2e 20 20 49 66  c will fail.  If
92c0: 20 52 45 50 45 41 54 2d 49 4e 54 45 52 56 41 4c   REPEAT-INTERVAL
92d0: 20 69 73 20 31 20 74 68 65 6e 20 61 6c 6c 20 6d   is 1 then all m
92e0: 61 6c 6c 6f 63 73 20 61 66 74 65 72 20 74 68 65  allocs after the
92f0: 0a 2a 2a 20 66 69 72 73 74 20 66 61 69 6c 75 72  .** first failur
9300: 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
9310: 74 6f 20 66 61 69 6c 20 6f 6e 20 65 76 65 72 79  to fail on every
9320: 20 63 61 6c 6c 2e 20 20 49 66 20 52 45 50 45 41   call.  If REPEA
9330: 54 2d 49 4e 54 45 52 56 41 4c 20 69 73 0a 2a 2a  T-INTERVAL is.**
9340: 20 32 20 74 68 65 6e 20 65 76 65 72 79 20 6f 74   2 then every ot
9350: 68 65 72 20 6d 61 6c 6c 6f 63 20 77 69 6c 6c 20  her malloc will 
9360: 66 61 69 6c 2e 20 20 41 6e 64 20 73 6f 20 66 6f  fail.  And so fo
9370: 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 75 72 6e 20  rth..**.** Turn 
9380: 6f 66 66 20 74 68 69 73 20 6d 65 63 68 61 6e 69  off this mechani
9390: 73 6d 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  sm and reset the
93a0: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
93b0: 74 61 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ta()->mallocFail
93c0: 65 64 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ed .** variable 
93d0: 69 66 20 4e 3d 3d 30 2e 0a 2a 2f 0a 23 69 66 64  if N==0..*/.#ifd
93e0: 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42  ef SQLITE_MEMDEB
93f0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  UG.static int sq
9400: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
9410: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
9420: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
9430: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
9440: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
9450: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
9460: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
9470: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
9480: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9490: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
94a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
94c0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
94d0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
94e0: 20 6e 3b 0a 20 20 69 6e 74 20 72 65 70 3b 0a 20   n;.  int rep;. 
94f0: 20 69 66 28 20 61 72 67 63 21 3d 32 20 26 26 20   if( argc!=2 && 
9500: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
9510: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9520: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
9530: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
9540: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22   \"", argv[0], "
9550: 20 4e 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72   N\"", 0);.    r
9560: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9570: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
9580: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
9590: 67 76 5b 31 5d 2c 20 26 6e 29 20 29 20 72 65 74  gv[1], &n) ) ret
95a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
95b0: 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a   if( argc==3 ){.
95c0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
95d0: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
95e0: 32 5d 2c 20 26 72 65 70 29 20 29 20 72 65 74 75  2], &rep) ) retu
95f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9600: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 70 20 3d  }else{.    rep =
9610: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
9620: 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20 3d 20  3_iMallocFail = 
9630: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 4d 61  n;.  sqlite3_iMa
9640: 6c 6c 6f 63 52 65 73 65 74 20 3d 20 72 65 70 3b  llocReset = rep;
9650: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9660: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
9670: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f  * Usage: sqlite_
9680: 6d 61 6c 6c 6f 63 5f 73 74 61 74 0a 2a 2a 0a 2a  malloc_stat.**.*
9690: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
96a0: 62 65 72 20 6f 66 20 70 72 69 6f 72 20 63 61 6c  ber of prior cal
96b0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 4d 61 6c 6c  ls to sqliteMall
96c0: 6f 63 28 29 20 61 6e 64 20 73 71 6c 69 74 65 46  oc() and sqliteF
96d0: 72 65 65 28 29 2e 0a 2a 2f 0a 23 69 66 64 65 66  ree()..*/.#ifdef
96e0: 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
96f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9700: 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 28 0a  te_malloc_stat(.
9710: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
9720: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9730: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9740: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9750: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9760: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9770: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9780: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9790: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
97a0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
97b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
97c0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
97d0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
97e0: 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 73 70 72  zBuf[200];.  spr
97f0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 20 25  intf(zBuf, "%d %
9800: 64 20 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 6e  d %d", sqlite3_n
9810: 4d 61 6c 6c 6f 63 2c 73 71 6c 69 74 65 33 5f 6e  Malloc,sqlite3_n
9820: 46 72 65 65 2c 73 71 6c 69 74 65 33 5f 69 4d 61  Free,sqlite3_iMa
9830: 6c 6c 6f 63 46 61 69 6c 29 3b 0a 20 20 54 63 6c  llocFail);.  Tcl
9840: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9850: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
9860: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
9870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
9880: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
9890: 74 73 20 61 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  ts a Tcl command
98a0: 20 74 68 61 74 20 6d 61 79 20 62 65 20 69 6e 76   that may be inv
98b0: 6f 6b 65 64 20 75 73 69 6e 67 20 61 6e 79 20 6f  oked using any o
98c0: 66 0a 2a 2a 20 74 68 65 20 66 6f 75 72 20 66 6f  f.** the four fo
98d0: 72 6d 73 20 65 6e 75 6d 65 72 61 74 65 64 20 62  rms enumerated b
98e0: 65 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  elow..**.** sqli
98f0: 74 65 5f 6d 61 6c 6c 6f 63 5f 6f 75 74 73 74 61  te_malloc_outsta
9900: 6e 64 69 6e 67 0a 2a 2a 20 20 20 20 20 52 65 74  nding.**     Ret
9910: 75 72 6e 20 61 20 73 75 6d 6d 61 72 79 20 6f 66  urn a summary of
9920: 20 61 6c 6c 20 75 6e 66 72 65 65 64 20 62 6c 6f   all unfreed blo
9930: 63 6b 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c  cks of memory al
9940: 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 0a 2a  located by the.*
9950: 2a 20 20 20 20 20 63 75 72 72 65 6e 74 20 74 68  *     current th
9960: 72 65 61 64 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  read. See commen
9970: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
9980: 6e 20 73 71 6c 69 74 65 33 4f 75 74 73 74 61 6e  n sqlite3Outstan
9990: 64 69 6e 67 4d 61 6c 6c 6f 63 73 28 29 20 0a 2a  dingMallocs() .*
99a0: 2a 20 20 20 20 20 69 6e 20 75 74 69 6c 2e 63 20  *     in util.c 
99b0: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
99c0: 6e 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  n of the returne
99d0: 64 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 73  d value..**.** s
99e0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 6f 75 74  qlite_malloc_out
99f0: 73 74 61 6e 64 69 6e 67 20 2d 62 79 74 65 73 0a  standing -bytes.
9a00: 2a 2a 20 20 20 20 20 52 65 74 75 72 6e 20 74 68  **     Return th
9a10: 65 20 74 6f 74 61 6c 20 61 6d 6f 75 6e 74 20 6f  e total amount o
9a20: 66 20 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79  f unfreed memory
9a30: 20 28 69 6e 20 62 79 74 65 73 29 20 61 6c 6c 6f   (in bytes) allo
9a40: 63 61 74 65 64 20 62 79 20 0a 2a 2a 20 20 20 20  cated by .**    
9a50: 20 74 68 69 73 20 74 68 72 65 61 64 2e 0a 2a 2a   this thread..**
9a60: 0a 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  .** sqlite_mallo
9a70: 63 5f 6f 75 74 73 74 61 6e 64 69 6e 67 20 2d 6d  c_outstanding -m
9a80: 61 78 62 79 74 65 73 0a 2a 2a 20 20 20 20 20 52  axbytes.**     R
9a90: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
9aa0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 64 79 6e 61  m amount of dyna
9ab0: 6d 69 63 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  mic memory in us
9ac0: 65 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 0a 2a  e at one time .*
9ad0: 2a 20 20 20 20 20 62 79 20 74 68 69 73 20 74 68  *     by this th
9ae0: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  read..**.** sqli
9af0: 74 65 5f 6d 61 6c 6c 6f 63 5f 6f 75 74 73 74 61  te_malloc_outsta
9b00: 6e 64 69 6e 67 20 2d 63 6c 65 61 72 6d 61 78 62  nding -clearmaxb
9b10: 79 74 65 73 0a 2a 2a 20 20 20 20 20 53 65 74 20  ytes.**     Set 
9b20: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
9b30: 65 64 20 62 79 20 5b 73 71 6c 69 74 65 5f 6d 61  ed by [sqlite_ma
9b40: 6c 6c 6f 63 5f 6f 75 74 73 74 61 6e 64 69 6e 67  lloc_outstanding
9b50: 20 2d 6d 61 78 62 79 74 65 73 5d 0a 2a 2a 20 20   -maxbytes].**  
9b60: 20 20 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e     to the curren
9b70: 74 20 76 61 6c 75 65 20 6f 66 20 5b 73 71 6c 69  t value of [sqli
9b80: 74 65 5f 6d 61 6c 6c 6f 63 5f 6f 75 74 73 74 61  te_malloc_outsta
9b90: 6e 64 69 6e 67 20 2d 62 79 74 65 73 5d 2e 20 0a  nding -bytes]. .
9ba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
9bb0: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 6f 75 74 73  lite_malloc_outs
9bc0: 74 61 6e 64 69 6e 67 28 0a 20 20 43 6c 69 65 6e  tanding(.  Clien
9bd0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
9be0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
9bf0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
9c00: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
9c10: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
9c20: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
9c30: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
9c40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9c50: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
9c60: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
9c70: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
9c80: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
9c90: 2a 2f 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20 69  */.){.  extern i
9ca0: 6e 74 20 73 71 6c 69 74 65 33 4f 75 74 73 74 61  nt sqlite3Outsta
9cb0: 6e 64 69 6e 67 4d 61 6c 6c 6f 63 73 28 54 63 6c  ndingMallocs(Tcl
9cc0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
9cd0: 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ;..#if defined(S
9ce0: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
9cf0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d  defined(SQLITE_M
9d00: 45 4d 44 45 42 55 47 29 20 26 26 20 53 51 4c 49  EMDEBUG) && SQLI
9d10: 54 45 5f 4d 45 4d 44 45 42 55 47 3e 31 0a 20 20  TE_MEMDEBUG>1.  
9d20: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
9d30: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9d40: 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
9d50: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 23 69  ing(objv[1]);.#i
9d60: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
9d70: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
9d80: 4d 45 4e 54 0a 20 20 20 20 54 68 72 65 61 64 44  MENT.    ThreadD
9d90: 61 74 61 20 63 6f 6e 73 74 20 2a 70 54 64 20 3d  ata const *pTd =
9da0: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
9db0: 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20  taReadOnly();.  
9dc0: 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
9dd0: 7a 41 72 67 2c 20 22 2d 62 79 74 65 73 22 29 20  zArg, "-bytes") 
9de0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
9df0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
9e00: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
9e10: 70 54 64 2d 3e 6e 41 6c 6c 6f 63 29 29 3b 0a 20  pTd->nAlloc));. 
9e20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d     }else if( 0==
9e30: 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 63  strcmp(zArg, "-c
9e40: 6c 65 61 72 6d 61 78 62 79 74 65 73 22 29 20 29  learmaxbytes") )
9e50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9e60: 6e 4d 61 78 41 6c 6c 6f 63 20 3d 20 70 54 64 2d  nMaxAlloc = pTd-
9e70: 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 7d 65 6c  >nAlloc;.    }el
9e80: 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  se .#endif.    i
9e90: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 41 72  f( 0==strcmp(zAr
9ea0: 67 2c 20 22 2d 6d 61 78 62 79 74 65 73 22 29 20  g, "-maxbytes") 
9eb0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
9ec0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
9ed0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
9ee0: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 6e 4d 61 78  Obj(sqlite3_nMax
9ef0: 41 6c 6c 6f 63 29 29 3b 0a 20 20 20 20 7d 65 6c  Alloc));.    }el
9f00: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
9f10: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9f20: 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c  p, "bad option \
9f30: 22 22 2c 20 7a 41 72 67 2c 20 0a 20 20 20 20 20  "", zArg, .     
9f40: 20 20 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20     "\": must be 
9f50: 2d 62 79 74 65 73 2c 20 2d 6d 61 78 62 79 74 65  -bytes, -maxbyte
9f60: 73 20 6f 72 20 2d 63 6c 65 61 72 6d 61 78 62 79  s or -clearmaxby
9f70: 74 65 73 22 2c 20 30 0a 20 20 20 20 20 20 29 3b  tes", 0.      );
9f80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
9f90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
9fa0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
9fb0: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62  K;.  }..  if( ob
9fc0: 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
9fd0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
9fe0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
9ff0: 3f 2d 62 79 74 65 73 3f 22 29 3b 0a 20 20 20 20  ?-bytes?");.    
a000: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a010: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
a020: 73 71 6c 69 74 65 33 4f 75 74 73 74 61 6e 64 69  sqlite3Outstandi
a030: 6e 67 4d 61 6c 6c 6f 63 73 28 69 6e 74 65 72 70  ngMallocs(interp
a040: 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  );.#else.  retur
a050: 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66  n TCL_OK;.#endif
a060: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
a070: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
a080: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
a090: 63 68 65 20 20 20 20 20 20 42 4f 4f 4c 45 41 4e  che      BOOLEAN
a0a0: 0a 2a 2a 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  .**.*/.#if !defi
a0b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a0c0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a 73 74  SHARED_CACHE).st
a0d0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 6e  atic int test_en
a0e0: 61 62 6c 65 5f 73 68 61 72 65 64 28 0a 20 20 43  able_shared(.  C
a0f0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
a100: 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
a110: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
a120: 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
a130: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
a140: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
a150: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
a160: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
a170: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
a180: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
a190: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a1a0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
a1b0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
a1c0: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
a1d0: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
a1e0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
a1f0: 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20  .  int enable;. 
a200: 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 0a 20   int ret = 0;.. 
a210: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
a220: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
a230: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
a240: 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29  objv, "BOOLEAN")
a250: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
a260: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
a270: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
a280: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
a290: 6f 62 6a 76 5b 31 5d 2c 20 26 65 6e 61 62 6c 65  objv[1], &enable
a2a0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
a2b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
a2c0: 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 54 68   ret = sqlite3Th
a2d0: 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
a2e0: 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74  ()->useSharedDat
a2f0: 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
a300: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
a310: 63 61 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20  cache(enable);. 
a320: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a330: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
a340: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
a350: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45  (char *)sqlite3E
a360: 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f 53  rrStr(rc), TCL_S
a370: 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
a380: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a390: 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
a3a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
a3b0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
a3c0: 65 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  et));.  return T
a3d0: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
a3e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
a3f0: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
a400: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 20 20 20  _result_codes   
a410: 44 42 20 20 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a  DB    BOOLEAN.**
a420: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
a430: 65 73 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  est_extended_res
a440: 75 6c 74 5f 63 6f 64 65 73 28 0a 20 20 43 6c 69  ult_codes(.  Cli
a450: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
a460: 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
a470: 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
a480: 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
a490: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a4a0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
a4b0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
a4c0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
a4d0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
a4e0: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
a4f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a500: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a510: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
a520: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
a530: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
a540: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 61 62 6c  /.){.  int enabl
a550: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
a560: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
a570: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
a580: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
a590: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f   1, objv, "DB BO
a5a0: 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74  OLEAN");.    ret
a5b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a5c0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
a5d0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
a5e0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
a5f0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
a600: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a610: 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
a620: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
a630: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 65 6e 61  p, objv[2], &ena
a640: 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  ble) ) return TC
a650: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
a660: 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
a670: 6c 74 5f 63 6f 64 65 73 28 64 62 2c 20 65 6e 61  lt_codes(db, ena
a680: 62 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ble);.  return T
a690: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
a6a0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c  Usage: sqlite3_l
a6b0: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
a6c0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
a6d0: 74 20 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f  t test_libversio
a6e0: 6e 5f 6e 75 6d 62 65 72 28 0a 20 20 43 6c 69 65  n_number(.  Clie
a6f0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
a700: 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
a710: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
a720: 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
a730: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a740: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a750: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a760: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a770: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a780: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
a790: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a7a0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a7b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
a7c0: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
a7d0: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
a7e0: 0a 29 7b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  .){.  Tcl_SetObj
a7f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
a800: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
a810: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  ite3_libversion_
a820: 6e 75 6d 62 65 72 28 29 29 29 3b 0a 20 20 72 65  number()));.  re
a830: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
a840: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
a850: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
a860: 6e 5f 6d 65 74 61 64 61 74 61 20 44 42 20 64 62  n_metadata DB db
a870: 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c  name tblname col
a880: 6e 61 6d 65 0a 2a 2a 0a 2a 2f 0a 23 69 66 64 65  name.**.*/.#ifde
a890: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
a8a0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
a8b0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
a8c0: 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
a8d0: 61 64 61 74 61 28 0a 20 20 43 6c 69 65 6e 74 44  adata(.  ClientD
a8e0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
a8f0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
a900: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
a910: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
a920: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a930: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
a940: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
a950: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
a960: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
a970: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
a980: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a990: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
a9a0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
a9b0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
a9c0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
a9d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
a9e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
a9f0: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
aa00: 2a 7a 54 62 6c 3b 0a 20 20 63 6f 6e 73 74 20 63  *zTbl;.  const c
aa10: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74  har *zCol;.  int
aa20: 20 72 63 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a   rc;.  Tcl_Obj *
aa30: 70 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63  pRet;..  const c
aa40: 68 61 72 20 2a 7a 44 61 74 61 74 79 70 65 3b 0a  har *zDatatype;.
aa50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
aa60: 6f 6c 6c 73 65 71 3b 0a 20 20 69 6e 74 20 6e 6f  ollseq;.  int no
aa70: 74 6e 75 6c 6c 3b 0a 20 20 69 6e 74 20 70 72 69  tnull;.  int pri
aa80: 6d 61 72 79 6b 65 79 3b 0a 20 20 69 6e 74 20 61  marykey;.  int a
aa90: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20  utoincrement;.. 
aaa0: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
aab0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
aac0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
aad0: 6f 62 6a 76 2c 20 22 44 42 20 64 62 6e 61 6d 65  objv, "DB dbname
aae0: 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65   tblname colname
aaf0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
ab00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
ab10: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
ab20: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
ab30: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
ab40: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
ab50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 20  CL_ERROR;.  zDb 
ab60: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
ab70: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 54 62 6c  objv[2]);.  zTbl
ab80: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
ab90: 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7a 43 6f  (objv[3]);.  zCo
aba0: 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
abb0: 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20 20 69  g(objv[4]);..  i
abc0: 66 28 20 73 74 72 6c 65 6e 28 7a 44 62 29 3d 3d  f( strlen(zDb)==
abd0: 30 20 29 20 7a 44 62 20 3d 20 30 3b 0a 0a 20 20  0 ) zDb = 0;..  
abe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
abf0: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
ac00: 74 61 28 64 62 2c 20 7a 44 62 2c 20 7a 54 62 6c  ta(db, zDb, zTbl
ac10: 2c 20 7a 43 6f 6c 2c 20 0a 20 20 20 20 20 20 26  , zCol, .      &
ac20: 7a 44 61 74 61 74 79 70 65 2c 20 26 7a 43 6f 6c  zDatatype, &zCol
ac30: 6c 73 65 71 2c 20 26 6e 6f 74 6e 75 6c 6c 2c 20  lseq, &notnull, 
ac40: 26 70 72 69 6d 61 72 79 6b 65 79 2c 20 26 61 75  &primarykey, &au
ac50: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3b 0a 0a 20  toincrement);.. 
ac60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ac70: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
ac80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ac90: 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
aca0: 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
acb0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
acc0: 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54  .  }..  pRet = T
acd0: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54  cl_NewObj();.  T
ace0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
acf0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
ad00: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
ad10: 6a 28 7a 44 61 74 61 74 79 70 65 2c 20 2d 31 29  j(zDatatype, -1)
ad20: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
ad30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
ad40: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
ad50: 72 69 6e 67 4f 62 6a 28 7a 43 6f 6c 6c 73 65 71  ringObj(zCollseq
ad60: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
ad70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ad80: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
ad90: 4e 65 77 49 6e 74 4f 62 6a 28 6e 6f 74 6e 75 6c  NewIntObj(notnul
ada0: 6c 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  l));.  Tcl_ListO
adb0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
adc0: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
add0: 49 6e 74 4f 62 6a 28 70 72 69 6d 61 72 79 6b 65  IntObj(primaryke
ade0: 79 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  y));.  Tcl_ListO
adf0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
ae00: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
ae10: 49 6e 74 4f 62 6a 28 61 75 74 6f 69 6e 63 72 65  IntObj(autoincre
ae20: 6d 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f 53 65  ment));.  Tcl_Se
ae30: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
ae40: 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74  p, pRet);..  ret
ae50: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
ae60: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
ae70: 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
ae80: 4f 42 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65  OB../*.** sqlite
ae90: 33 5f 62 6c 6f 62 5f 72 65 61 64 20 20 43 48 41  3_blob_read  CHA
aea0: 4e 4e 45 4c 20 4f 46 46 53 45 54 20 4e 0a 2a 2a  NNEL OFFSET N.**
aeb0: 0a 2a 2a 20 20 20 54 68 69 73 20 63 6f 6d 6d 61  .**   This comma
aec0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  nd is used to te
aed0: 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
aee0: 6c 6f 62 5f 72 65 61 64 28 29 20 69 6e 20 77 61  lob_read() in wa
aef0: 79 73 20 74 68 61 74 0a 2a 2a 20 20 20 74 68 65  ys that.**   the
af00: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 69 6e 74   Tcl channel int
af10: 65 72 66 61 63 65 20 64 6f 65 73 20 6e 6f 74 2e  erface does not.
af20: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
af30: 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 20 20  ent should.**   
af40: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
af50: 20 76 61 6c 69 64 20 63 68 61 6e 6e 65 6c 20 63   valid channel c
af60: 72 65 61 74 65 64 20 62 79 20 74 68 65 20 5b 69  reated by the [i
af70: 6e 63 72 62 6c 6f 62 5d 20 6d 65 74 68 6f 64 0a  ncrblob] method.
af80: 2a 2a 20 20 20 6f 66 20 61 20 64 61 74 61 62 61  **   of a databa
af90: 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  se handle. This 
afa0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73  function calls s
afb0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
afc0: 28 29 0a 2a 2a 20 20 20 74 6f 20 72 65 61 64 20  ().**   to read 
afd0: 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 66  N bytes from off
afe0: 73 65 74 20 4f 46 46 53 45 54 20 66 72 6f 6d 20  set OFFSET from 
aff0: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 53  the underlying S
b000: 51 4c 69 74 65 0a 2a 2a 20 20 20 62 6c 6f 62 20  QLite.**   blob 
b010: 68 61 6e 64 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  handle..**.**   
b020: 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20 62 79  On success, a by
b030: 74 65 2d 61 72 72 61 79 20 6f 62 6a 65 63 74 20  te-array object 
b040: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72  containing the r
b050: 65 61 64 20 64 61 74 61 20 69 73 20 0a 2a 2a 20  ead data is .** 
b060: 20 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e 20 66    returned. On f
b070: 61 69 6c 75 72 65 2c 20 74 68 65 20 69 6e 74 65  ailure, the inte
b080: 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 20 69  rpreter result i
b090: 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20  s set to the.** 
b0a0: 20 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74    text represent
b0b0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 74  ation of the ret
b0c0: 75 72 6e 65 64 20 65 72 72 6f 72 20 63 6f 64 65  urned error code
b0d0: 20 28 69 2e 65 2e 20 22 53 51 4c 49 54 45 5f 4e   (i.e. "SQLITE_N
b0e0: 4f 4d 45 4d 22 29 0a 2a 2a 20 20 20 61 6e 64 20  OMEM").**   and 
b0f0: 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 20  a Tcl exception 
b100: 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73 74  is thrown..*/.st
b110: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c  atic int test_bl
b120: 6f 62 5f 72 65 61 64 28 0a 20 20 43 6c 69 65 6e  ob_read(.  Clien
b130: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
b140: 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f  , /* Not used */
b150: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
b160: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
b170: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
b180: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
b190: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
b1a0: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
b1b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b1c0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
b1d0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
b1e0: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
b1f0: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
b200: 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 68 61 6e 6e  /.){.  Tcl_Chann
b210: 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20 43 6c  el channel;.  Cl
b220: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
b230: 65 44 61 74 61 3b 0a 20 20 73 71 6c 69 74 65 33  eData;.  sqlite3
b240: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20  _blob *pBlob;.  
b250: 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 69  int notUsed;.  i
b260: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
b270: 69 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67  iOffset;.  unsig
b280: 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a  ned char *zBuf;.
b290: 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 69    int rc;.  .  i
b2a0: 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
b2b0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
b2c0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
b2d0: 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46  jv, "CHANNEL OFF
b2e0: 53 45 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  SET N");.    ret
b2f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b300: 20 7d 0a 0a 20 20 63 68 61 6e 6e 65 6c 20 3d 20   }..  channel = 
b310: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
b320: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
b330: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
b340: 6e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  notUsed);.  if( 
b350: 21 63 68 61 6e 6e 65 6c 0a 20 20 20 7c 7c 20 54  !channel.   || T
b360: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
b370: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
b380: 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 4f 66 66 73   objv[2], &iOffs
b390: 65 74 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b  et).   || TCL_OK
b3a0: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
b3b0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
b3c0: 5b 33 5d 2c 20 26 6e 42 79 74 65 29 0a 20 20 20  [3], &nByte).   
b3d0: 7c 7c 20 6e 42 79 74 65 3c 30 20 7c 7c 20 69 4f  || nByte<0 || iO
b3e0: 66 66 73 65 74 3c 30 0a 20 20 29 7b 20 0a 20 20  ffset<0.  ){ .  
b3f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b400: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 73 74 61  OR;.  }..  insta
b410: 6e 63 65 44 61 74 61 20 3d 20 54 63 6c 5f 47 65  nceData = Tcl_Ge
b420: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
b430: 44 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20  Data(channel);. 
b440: 20 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69   pBlob = *((sqli
b450: 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74  te3_blob **)inst
b460: 61 6e 63 65 44 61 74 61 29 3b 0a 0a 20 20 7a 42  anceData);..  zB
b470: 75 66 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  uf = (unsigned c
b480: 68 61 72 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  har *)Tcl_Alloc(
b490: 6e 42 79 74 65 29 3b 0a 20 20 72 63 20 3d 20 73  nByte);.  rc = s
b4a0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
b4b0: 28 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42  (pBlob, zBuf, nB
b4c0: 79 74 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  yte, iOffset);. 
b4d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b4e0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
b4f0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
b500: 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  p, Tcl_NewByteAr
b510: 72 61 79 4f 62 6a 28 7a 42 75 66 2c 20 6e 42 79  rayObj(zBuf, nBy
b520: 74 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  te));.  }else{. 
b530: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
b540: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
b550: 29 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f  )sqlite3TestErro
b560: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56  rName(rc), TCL_V
b570: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 20 20  OLATILE);.  }.  
b580: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tcl_Free((char *
b590: 29 7a 42 75 66 29 3b 0a 0a 20 20 72 65 74 75 72  )zBuf);..  retur
b5a0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
b5b0: 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f   ? TCL_OK : TCL_
b5c0: 45 52 52 4f 52 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ERROR);.}../*.**
b5d0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
b5e0: 69 74 65 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53  ite CHANNEL OFFS
b5f0: 45 54 20 44 41 54 41 0a 2a 2a 0a 2a 2a 20 20 20  ET DATA.**.**   
b600: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
b610: 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
b620: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
b630: 69 74 65 28 29 20 69 6e 20 77 61 79 73 20 74 68  ite() in ways th
b640: 61 74 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20  at.**   the Tcl 
b650: 63 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63  channel interfac
b660: 65 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20  e does not. The 
b670: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73  first argument s
b680: 68 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68  hould.**   be th
b690: 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69  e name of a vali
b6a0: 64 20 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65  d channel create
b6b0: 64 20 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c  d by the [incrbl
b6c0: 6f 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20  ob] method.**   
b6d0: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 68 61  of a database ha
b6e0: 6e 64 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  ndle. This funct
b6f0: 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
b700: 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29 0a 2a  3_blob_write().*
b710: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 74 68 65  *   to write the
b720: 20 44 41 54 41 20 62 79 74 65 2d 61 72 72 61 79   DATA byte-array
b730: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
b740: 6e 67 20 53 51 4c 69 74 65 20 62 6c 6f 62 20 68  ng SQLite blob h
b750: 61 6e 64 6c 65 2e 0a 2a 2a 20 20 20 61 74 20 6f  andle..**   at o
b760: 66 66 73 65 74 20 4f 46 46 53 45 54 2e 0a 2a 2a  ffset OFFSET..**
b770: 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73  .**   On success
b780: 2c 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  , an empty strin
b790: 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  g is returned. O
b7a0: 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 69  n failure, the i
b7b0: 6e 74 65 72 70 72 65 74 65 72 0a 2a 2a 20 20 20  nterpreter.**   
b7c0: 72 65 73 75 6c 74 20 69 73 20 73 65 74 20 74 6f  result is set to
b7d0: 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73   the text repres
b7e0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b7f0: 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 63  returned error c
b800: 6f 64 65 20 0a 2a 2a 20 20 20 28 69 2e 65 2e 20  ode .**   (i.e. 
b810: 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 20  "SQLITE_NOMEM") 
b820: 61 6e 64 20 61 20 54 63 6c 20 65 78 63 65 70 74  and a Tcl except
b830: 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a  ion is thrown..*
b840: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
b850: 74 5f 62 6c 6f 62 5f 77 72 69 74 65 28 0a 20 20  t_blob_write(.  
b860: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
b870: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
b880: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
b890: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
b8a0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
b8b0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
b8c0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
b8d0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b8f0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b900: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
b910: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
b920: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
b930: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
b940: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b  Channel channel;
b950: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  .  ClientData in
b960: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 73 71  stanceData;.  sq
b970: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
b980: 62 3b 0a 20 20 69 6e 74 20 6e 6f 74 55 73 65 64  b;.  int notUsed
b990: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b  ;.  int iOffset;
b9a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 75 6e  .  int rc;..  un
b9b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75  signed char *zBu
b9c0: 66 3b 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20  f;.  int nBuf;. 
b9d0: 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20   .  if( objc!=4 
b9e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
b9f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
ba00: 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45  1, objv, "CHANNE
ba10: 4c 20 4f 46 46 53 45 54 20 44 41 54 41 22 29 3b  L OFFSET DATA");
ba20: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ba30: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 63 68  ERROR;.  }..  ch
ba40: 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43  annel = Tcl_GetC
ba50: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
ba60: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
ba70: 76 5b 31 5d 29 2c 20 26 6e 6f 74 55 73 65 64 29  v[1]), &notUsed)
ba80: 3b 0a 20 20 69 66 28 20 21 63 68 61 6e 6e 65 6c  ;.  if( !channel
ba90: 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54  .   || TCL_OK!=T
baa0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
bab0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
bac0: 2c 20 26 69 4f 66 66 73 65 74 29 0a 20 20 20 7c  , &iOffset).   |
bad0: 7c 20 69 4f 66 66 73 65 74 3c 30 0a 20 20 29 7b  | iOffset<0.  ){
bae0: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c   .    return TCL
baf0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
bb00: 6e 73 74 61 6e 63 65 44 61 74 61 20 3d 20 54 63  nstanceData = Tc
bb10: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
bb20: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 6e 65 6c  anceData(channel
bb30: 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 2a 28 28  );.  pBlob = *((
bb40: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29  sqlite3_blob **)
bb50: 69 6e 73 74 61 6e 63 65 44 61 74 61 29 3b 0a 0a  instanceData);..
bb60: 20 20 7a 42 75 66 20 3d 20 54 63 6c 5f 47 65 74    zBuf = Tcl_Get
bb70: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
bb80: 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 75 66 29  (objv[3], &nBuf)
bb90: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
bba0: 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f  _blob_write(pBlo
bbb0: 62 2c 20 7a 42 75 66 2c 20 6e 42 75 66 2c 20 69  b, zBuf, nBuf, i
bbc0: 4f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  Offset);.  if( r
bbd0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
bbe0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
bbf0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
bc00: 2a 29 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  *)sqlite3TestErr
bc10: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
bc20: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a  VOLATILE);.  }..
bc30: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
bc40: 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b  LITE_OK ? TCL_OK
bc50: 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d   : TCL_ERROR);.}
bc60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55  .#endif../*.** U
bc70: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 72  sage: sqlite3_cr
bc80: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
bc90: 32 20 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45  2 DB-HANDLE NAME
bca0: 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52   CMP-PROC DEL-PR
bcb0: 4f 43 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  OC.**.**   This 
bcc0: 54 63 6c 20 70 72 6f 63 20 69 73 20 75 73 65 64  Tcl proc is used
bcd0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65   for testing the
bce0: 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a 2a 2a   experimental.**
bcf0: 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
bd00: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 29  e_collation_v2()
bd10: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
bd20: 74 72 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74  truct TestCollat
bd30: 69 6f 6e 58 20 7b 0a 20 20 54 63 6c 5f 49 6e 74  ionX {.  Tcl_Int
bd40: 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
bd50: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 70 3b 0a 20 20  cl_Obj *pCmp;.  
bd60: 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 6c 3b 0a 7d  Tcl_Obj *pDel;.}
bd70: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
bd80: 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20   TestCollationX 
bd90: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 3b 0a  TestCollationX;.
bda0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
bdb0: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44  CreateCollationD
bdc0: 65 6c 28 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a  el(void *pCtx){.
bdd0: 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58    TestCollationX
bde0: 20 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61   *p = (TestColla
bdf0: 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 0a 20  tionX *)pCtx;.. 
be00: 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45 76   int rc = Tcl_Ev
be10: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
be20: 70 2c 20 70 2d 3e 70 44 65 6c 2c 20 54 43 4c 5f  p, p->pDel, TCL_
be30: 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f  EVAL_DIRECT|TCL_
be40: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
be50: 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29  if( rc!=TCL_OK )
be60: 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72  {.    Tcl_Backgr
be70: 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74  oundError(p->int
be80: 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c  erp);.  }..  Tcl
be90: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
bea0: 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 44 65  >pCmp);.  Tcl_De
beb0: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44  crRefCount(p->pD
bec0: 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  el);.  sqlite3_f
bed0: 72 65 65 28 28 76 6f 69 64 20 2a 29 70 29 3b 0a  ree((void *)p);.
bee0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  }.static int tes
bef0: 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e  tCreateCollation
bf00: 43 6d 70 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  Cmp(.  void *pCt
bf10: 78 2c 0a 20 20 69 6e 74 20 6e 4c 65 66 74 2c 0a  x,.  int nLeft,.
bf20: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4c    const void *zL
bf30: 65 66 74 2c 0a 20 20 69 6e 74 20 6e 52 69 67 68  eft,.  int nRigh
bf40: 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  t,.  const void 
bf50: 2a 7a 52 69 67 68 74 0a 29 7b 0a 20 20 54 65 73  *zRight.){.  Tes
bf60: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d  tCollationX *p =
bf70: 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58   (TestCollationX
bf80: 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f   *)pCtx;.  Tcl_O
bf90: 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63  bj *pScript = Tc
bfa0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
bfb0: 2d 3e 70 43 6d 70 29 3b 0a 20 20 69 6e 74 20 69  ->pCmp);.  int i
bfc0: 52 65 73 20 3d 20 30 3b 0a 0a 20 20 54 63 6c 5f  Res = 0;..  Tcl_
bfd0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
bfe0: 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ript);.  Tcl_Lis
bff0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
c000: 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63  t(0, pScript, Tc
c010: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
c020: 63 68 61 72 20 2a 29 7a 4c 65 66 74 2c 20 6e 4c  char *)zLeft, nL
c030: 65 66 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  eft));.  Tcl_Lis
c040: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
c050: 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63  t(0, pScript, Tc
c060: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
c070: 63 68 61 72 20 2a 29 7a 52 69 67 68 74 2c 6e 52  char *)zRight,nR
c080: 69 67 68 74 29 29 3b 0a 0a 20 20 69 66 28 20 54  ight));..  if( T
c090: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f  CL_OK!=Tcl_EvalO
c0a0: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
c0b0: 70 53 63 72 69 70 74 2c 20 54 43 4c 5f 45 56 41  pScript, TCL_EVA
c0c0: 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45 56 41  L_DIRECT|TCL_EVA
c0d0: 4c 5f 47 4c 4f 42 41 4c 29 0a 20 20 20 7c 7c 20  L_GLOBAL).   || 
c0e0: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
c0f0: 6e 74 46 72 6f 6d 4f 62 6a 28 70 2d 3e 69 6e 74  ntFromObj(p->int
c100: 65 72 70 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52  erp, Tcl_GetObjR
c110: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
c120: 2c 20 26 69 52 65 73 29 0a 20 20 29 7b 0a 20 20  , &iRes).  ){.  
c130: 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64    Tcl_Background
c140: 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29  Error(p->interp)
c150: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72  ;.  }.  Tcl_Decr
c160: 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
c170: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 69 52 65  );..  return iRe
c180: 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  s;.}.static int 
c190: 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  test_create_coll
c1a0: 61 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65  ation_v2(.  Clie
c1b0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
c1c0: 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a  a, /* Not used *
c1d0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
c1e0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
c1f0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
c200: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
c210: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
c220: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
c230: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c240: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
c250: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
c260: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
c270: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
c280: 2a 2f 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c  */.){.  TestColl
c290: 61 74 69 6f 6e 58 20 2a 70 3b 0a 20 20 73 71 6c  ationX *p;.  sql
c2a0: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
c2b0: 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
c2c0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
c2d0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
c2e0: 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d  , "DB-HANDLE NAM
c2f0: 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50  E CMP-PROC DEL-P
c300: 52 4f 43 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ROC");.    retur
c310: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
c320: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
c330: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
c340: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
c350: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
c360: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
c370: 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69  p = (TestCollati
c380: 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  onX *)sqlite3_ma
c390: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65 73 74  lloc(sizeof(Test
c3a0: 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20  CollationX));.  
c3b0: 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33  p->pCmp = objv[3
c3c0: 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f  ];.  p->pDel = o
c3d0: 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74  bjv[4];.  p->int
c3e0: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
c3f0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
c400: 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c  (p->pCmp);.  Tcl
c410: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _IncrRefCount(p-
c420: 3e 70 44 65 6c 29 3b 0a 0a 20 20 73 71 6c 69 74  >pDel);..  sqlit
c430: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
c440: 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47  ion_v2(db, Tcl_G
c450: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
c460: 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ), SQLITE_UTF8, 
c470: 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70  .      (void *)p
c480: 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c  , testCreateColl
c490: 61 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72  ationCmp, testCr
c4a0: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c  eateCollationDel
c4b0: 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  .  );.  return T
c4c0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
c4d0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c  Usage: sqlite3_l
c4e0: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42  oad_extension DB
c4f0: 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52  -HANDLE FILE ?PR
c500: 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OC?.*/.static in
c510: 74 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65  t test_load_exte
c520: 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74 44  nsion(.  ClientD
c530: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
c540: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
c550: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
c560: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
c570: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
c580: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
c590: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
c5a0: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
c5b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c5c0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
c5d0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
c5e0: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
c5f0: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
c600: 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  ){.  Tcl_CmdInfo
c610: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69   cmdInfo;.  sqli
c620: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
c630: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a  c;.  char *zDb;.
c640: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20    char *zFile;. 
c650: 20 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20 30   char *zProc = 0
c660: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
c670: 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
c680: 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =4 && objc!=3 ){
c690: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
c6a0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
c6b0: 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c   objv, "DB-HANDL
c6c0: 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29 3b  E FILE ?PROC?");
c6d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
c6e0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62  ERROR;.  }.  zDb
c6f0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
c700: 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46 69  (objv[1]);.  zFi
c710: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
c720: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
c730: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
c740: 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47 65    zProc = Tcl_Ge
c750: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
c760: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74 72  ;.  }..  /* Extr
c770: 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62 61  act the C databa
c780: 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74  se handle from t
c790: 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e  he Tcl command n
c7a0: 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63  ame */.  if( !Tc
c7b0: 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f  l_GetCommandInfo
c7c0: 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63  (interp, zDb, &c
c7d0: 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54  mdInfo) ){.    T
c7e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c7f0: 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64  interp, "command
c800: 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a   not found: ", z
c810: 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  Db, (char*)0);. 
c820: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
c830: 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20  ROR;.  }.  db = 
c840: 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65 44  ((struct SqliteD
c850: 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c  b*)cmdInfo.objCl
c860: 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20  ientData)->db;. 
c870: 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20   assert(db);..  
c880: 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e 64 65  /* Call the unde
c890: 72 6c 79 69 6e 67 20 43 20 66 75 6e 63 74 69 6f  rlying C functio
c8a0: 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  n. If an error o
c8b0: 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74 6f  ccurs, set rc to
c8c0: 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f 52   .  ** TCL_ERROR
c8d0: 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65 72   and load any er
c8e0: 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  ror string into 
c8f0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
c900: 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72 72   If no .  ** err
c910: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 72  or occurs, set r
c920: 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20 2a  c to TCL_OK..  *
c930: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c940: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
c950: 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  ION.  rc = SQLIT
c960: 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72 20  E_ERROR;.  zErr 
c970: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
c980: 66 28 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d  f("this build om
c990: 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  its sqlite3_load
c9a0: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a  _extension()");.
c9b0: 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71 6c  #else.  rc = sql
c9c0: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
c9d0: 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a  ion(db, zFile, z
c9e0: 50 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23 65  Proc, &zErr);.#e
c9f0: 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53  ndif.  if( rc!=S
ca00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ca10: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
ca20: 74 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45 72  terp, zErr ? zEr
ca30: 72 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c 41  r : "", TCL_VOLA
ca40: 54 49 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d 20  TILE);.    rc = 
ca50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  TCL_ERROR;.  }el
ca60: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c  se{.    rc = TCL
ca70: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  _OK;.  }.  sqlit
ca80: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 0a  e3_free(zErr);..
ca90: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
caa0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
cab0: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
cac0: 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41  _extension DB-HA
cad0: 4e 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74  NDLE ONOFF.*/.st
cae0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 6e  atic int test_en
caf0: 61 62 6c 65 5f 6c 6f 61 64 28 0a 20 20 43 6c 69  able_load(.  Cli
cb00: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
cb10: 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  ta, /* Not used 
cb20: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
cb30: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
cb40: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
cb50: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
cb60: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
cb70: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
cb80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
cb90: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
cba0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
cbb0: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
cbc0: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
cbd0: 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64   */.){.  Tcl_Cmd
cbe0: 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
cbf0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
cc00: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20  har *zDb;.  int 
cc10: 6f 6e 6f 66 66 3b 0a 0a 20 20 69 66 28 20 6f 62  onoff;..  if( ob
cc20: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
cc30: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
cc40: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
cc50: 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 22  DB-HANDLE ONOFF"
cc60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
cc70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
cc80: 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
cc90: 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20  ng(objv[1]);..  
cca0: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 43  /* Extract the C
ccb0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
ccc0: 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f   from the Tcl co
ccd0: 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20  mmand name */.  
cce0: 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
ccf0: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
cd00: 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  zDb, &cmdInfo) )
cd10: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
cd20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
cd30: 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e  command not foun
cd40: 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72  d: ", zDb, (char
cd50: 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
cd60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
cd70: 20 20 64 62 20 3d 20 28 28 73 74 72 75 63 74 20    db = ((struct 
cd80: 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
cd90: 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29  o.objClientData)
cda0: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64  ->db;.  assert(d
cdb0: 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68  b);..  /* Get th
cdc0: 65 20 6f 6e 6f 66 66 20 70 61 72 61 6d 65 74 65  e onoff paramete
cdd0: 72 20 2a 2f 0a 20 20 69 66 28 20 54 63 6c 5f 47  r */.  if( Tcl_G
cde0: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
cdf0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
ce00: 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20  , &onoff) ){.   
ce10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ce20: 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  R;.  }..#ifdef S
ce30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
ce40: 45 58 54 45 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f  EXTENSION.  Tcl_
ce50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ce60: 65 72 70 2c 20 22 74 68 69 73 20 62 75 69 6c 64  erp, "this build
ce70: 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c   omits sqlite3_l
ce80: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22  oad_extension()"
ce90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
cea0: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73  ERROR;.#else.  s
ceb0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
cec0: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c  ad_extension(db,
ced0: 20 6f 6e 6f 66 66 29 3b 0a 20 20 72 65 74 75 72   onoff);.  retur
cee0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66  n TCL_OK;.#endif
cef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
cf00: 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a    sqlite_abort.*
cf10: 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
cf20: 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65 64 69  e process immedi
cf30: 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69 73 20  ately.  This is 
cf40: 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68 75 74  not a clean shut
cf50: 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  down..** This co
cf60: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
cf70: 20 74 65 73 74 20 74 68 65 20 72 65 63 6f 76 65   test the recove
cf80: 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20 64 61  rability of a da
cf90: 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65  tabase in.** the
cfa0: 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72 6f 67   event of a prog
cfb0: 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74  ram crash..*/.st
cfc0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
cfd0: 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a 4e  abort(.  void *N
cfe0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
cff0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
d000: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
d010: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
d020: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
d030: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d050: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
d060: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
d070: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
d080: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
d090: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
d0a0: 20 20 61 73 73 65 72 74 28 20 69 6e 74 65 72 70    assert( interp
d0b0: 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68 69 73  ==0 );   /* This
d0c0: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
d0d0: 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  l */.  return TC
d0e0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  L_OK;.}../*.** T
d0f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
d100: 74 69 6e 65 20 69 73 20 61 20 75 73 65 72 2d 64  tine is a user-d
d110: 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74  efined SQL funct
d120: 69 6f 6e 20 77 68 6f 73 65 20 70 75 72 70 6f 73  ion whose purpos
d130: 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73 74 20  e.** is to test 
d140: 74 68 65 20 73 71 6c 69 74 65 5f 73 65 74 5f 72  the sqlite_set_r
d150: 65 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a 2f 0a  esult() API..*/.
d160: 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
d170: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
d180: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
d190: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
d1a0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
d1b0: 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e 3d 32    while( argc>=2
d1c0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
d1d0: 61 72 20 2a 7a 41 72 67 30 20 3d 20 28 63 68 61  ar *zArg0 = (cha
d1e0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
d1f0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
d200: 20 20 20 20 69 66 28 20 7a 41 72 67 30 20 29 7b      if( zArg0 ){
d210: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
d220: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72  lite3StrICmp(zAr
d230: 67 30 2c 20 22 69 6e 74 22 29 20 29 7b 0a 20 20  g0, "int") ){.  
d240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
d250: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
d260: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
d270: 69 6e 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20  int(argv[1]));. 
d280: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
d290: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
d2a0: 72 67 30 2c 22 69 6e 74 36 34 22 29 3d 3d 30 20  rg0,"int64")==0 
d2b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d2c0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
d2d0: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
d2e0: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67  _value_int64(arg
d2f0: 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65  v[1]));.      }e
d300: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
d310: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 73 74  trICmp(zArg0,"st
d320: 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ring")==0 ){.   
d330: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
d340: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
d350: 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
d360: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
d370: 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20 20  [1]), -1,.      
d380: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41        SQLITE_TRA
d390: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
d3a0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
d3b0: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 64  StrICmp(zArg0,"d
d3c0: 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ouble")==0 ){.  
d3d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
d3e0: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
d3f0: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
d400: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 31  ue_double(argv[1
d410: 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ]));.      }else
d420: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
d430: 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c 6c 22  Cmp(zArg0,"null"
d440: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
d450: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
d460: 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ull(context);.  
d470: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
d480: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72  lite3StrICmp(zAr
d490: 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30 20 29  g0,"value")==0 )
d4a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d4b0: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
d4c0: 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 73 71 6c  ontext, argv[sql
d4d0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
d4e0: 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20 20 20  rgv[1])]);.     
d4f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d500: 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
d510: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
d520: 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72  e{.      goto er
d530: 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ror_out;.    }. 
d540: 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20     argc -= 2;.  
d550: 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20 7d    argv += 2;.  }
d560: 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72 72 6f  .  return;..erro
d570: 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
d580: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
d590: 6e 74 65 78 74 2c 22 66 69 72 73 74 20 61 72 67  ntext,"first arg
d5a0: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20  ument should be 
d5b0: 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20 20  one of: ".      
d5c0: 22 69 6e 74 20 69 6e 74 36 34 20 73 74 72 69 6e  "int int64 strin
d5d0: 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20 76 61  g double null va
d5e0: 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a  lue", -1);.}../*
d5f0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
d600: 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73  ite_register_tes
d610: 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42 20 20  t_function  DB  
d620: 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73  NAME.**.** Regis
d630: 74 65 72 20 74 68 65 20 74 65 73 74 20 53 51 4c  ter the test SQL
d640: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65   function on the
d650: 20 64 61 74 61 62 61 73 65 20 44 42 20 75 6e 64   database DB und
d660: 65 72 20 74 68 65 20 6e 61 6d 65 20 4e 41 4d 45  er the name NAME
d670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d680: 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75  test_register_fu
d690: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nc(.  void *NotU
d6a0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
d6b0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
d6c0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
d6d0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
d6e0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
d6f0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
d700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d710: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
d720: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
d730: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
d740: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
d750: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
d760: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
d770: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
d780: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
d790: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d7a0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
d7b0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
d7c0: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
d7d0: 20 20 20 22 20 44 42 20 46 55 4e 43 54 49 4f 4e     " DB FUNCTION
d7e0: 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20 20 20  -NAME", 0);.    
d7f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d800: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
d810: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
d820: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
d830: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d840: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
d850: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
d860: 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d  n(db, argv[2], -
d870: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
d880: 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74 46 75  0, .      testFu
d890: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  nc, 0, 0);.  if(
d8a0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 54 63   rc!=0 ){.    Tc
d8b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d8c0: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
d8d0: 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20  rStr(rc), 0);.  
d8e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d8f0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  OR;.  }.  if( sq
d900: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
d910: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
d920: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
d930: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
d940: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
d950: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 66  sage:  sqlite3_f
d960: 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20 0a 2a  inalize  STMT .*
d970: 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20  *.** Finalize a 
d980: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
d990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d9a0: 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 28 0a 20  test_finalize(. 
d9b0: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
d9c0: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
d9d0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
d9e0: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
d9f0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
da00: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
da10: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
da20: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
da30: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
da40: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
da50: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
da60: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
da70: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
da80: 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
da90: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
daa0: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
dab0: 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72  TMT>", 0);.    r
dac0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
dad0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
dae0: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
daf0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
db00: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
db10: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
db20: 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 70 53  ERROR;..  if( pS
db30: 74 6d 74 20 29 7b 0a 20 20 20 20 64 62 20 3d 20  tmt ){.    db = 
db40: 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 3b  StmtToDb(pStmt);
db50: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
db60: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
db70: 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  mt);.  Tcl_SetRe
db80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
db90: 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
dba0: 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
dbb0: 29 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 73  );.  if( db && s
dbc0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
dbd0: 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
dbe0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
dbf0: 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
dc00: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
dc10: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
dc20: 72 65 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a  reset  STMT .**.
dc30: 2a 2a 20 52 65 73 65 74 20 61 20 73 74 61 74 65  ** Reset a state
dc40: 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  ment handle..*/.
dc50: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
dc60: 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20  reset(.  void * 
dc70: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
dc80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
dc90: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
dca0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
dcb0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
dcc0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
dcd0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
dce0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
dcf0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
dd00: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
dd10: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
dd20: 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
dd30: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
dd40: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
dd50: 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a   " <STMT>", 0);.
dd60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dd70: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
dd80: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
dd90: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
dda0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
ddb0: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
ddc0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
ddd0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
dde0: 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  t(pStmt);.  if( 
ddf0: 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33  pStmt && sqlite3
de00: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
de10: 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
de20: 6d 74 29 2c 20 72 63 29 20 29 7b 0a 20 20 20 20  mt), rc) ){.    
de30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
de40: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52  ;.  }.  Tcl_SetR
de50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
de60: 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
de70: 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
de80: 43 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 72 63 20  C);./*.  if( rc 
de90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
dea0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a  L_ERROR;.  }.*/.
deb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
dec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
ded0: 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65    sqlite3_expire
dee0: 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65  d STMT .**.** Re
def0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 72  turn TRUE if a r
df00: 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
df10: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
df20: 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a 2f   recommended..*/
df30: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
df40: 5f 65 78 70 69 72 65 64 28 0a 20 20 76 6f 69 64  _expired(.  void
df50: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
df60: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
df70: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
df80: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
df90: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
dfa0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
dfb0: 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  t;.  if( objc!=2
dfc0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
dfd0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
dfe0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
dff0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
e000: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
e010: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
e020: 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
e030: 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  >", 0);.    retu
e040: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e050: 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
e060: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
e070: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
e080: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
e090: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e0a0: 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
e0b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
e0c0: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
e0d0: 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28  sqlite3_expired(
e0e0: 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75  pStmt)));.  retu
e0f0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
e100: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
e110: 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e  te3_transfer_bin
e120: 64 69 6e 67 73 20 46 52 4f 4d 53 54 4d 54 20 54  dings FROMSTMT T
e130: 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61 6e  OSTMT.**.** Tran
e140: 73 66 65 72 20 61 6c 6c 20 62 69 6e 64 69 6e 67  sfer all binding
e150: 73 20 66 72 6f 6d 20 46 52 4f 4d 53 54 4d 54 20  s from FROMSTMT 
e160: 6f 76 65 72 20 74 6f 20 54 4f 53 54 4d 54 0a 2a  over to TOSTMT.*
e170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
e180: 74 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 28  t_transfer_bind(
e190: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
e1a0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
e1b0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
e1c0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
e1d0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
e1e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
e1f0: 74 20 2a 70 53 74 6d 74 31 2c 20 2a 70 53 74 6d  t *pStmt1, *pStm
e200: 74 32 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t2;.  if( objc!=
e210: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
e220: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e230: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
e240: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
e250: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
e260: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
e270: 76 5b 30 5d 2c 20 30 29 2c 20 22 20 46 52 4f 4d  v[0], 0), " FROM
e280: 2d 53 54 4d 54 20 54 4f 2d 53 54 4d 54 22 2c 20  -STMT TO-STMT", 
e290: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
e2a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
e2b0: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
e2c0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
e2d0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
e2e0: 29 2c 20 26 70 53 74 6d 74 31 29 29 20 72 65 74  ), &pStmt1)) ret
e2f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e300: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
e310: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
e320: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
e330: 5d 29 2c 20 26 70 53 74 6d 74 32 29 29 20 72 65  ]), &pStmt2)) re
e340: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e350: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
e360: 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
e370: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
e380: 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f  qlite3_transfer_
e390: 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 31 2c  bindings(pStmt1,
e3a0: 70 53 74 6d 74 32 29 29 29 3b 0a 20 20 72 65 74  pStmt2)));.  ret
e3b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
e3c0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
e3d0: 69 74 65 33 5f 63 68 61 6e 67 65 73 20 44 42 0a  ite3_changes DB.
e3e0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
e3f0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
e400: 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  es made to the d
e410: 61 74 61 62 61 73 65 20 62 79 20 74 68 65 20 6c  atabase by the l
e420: 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75  ast SQL.** execu
e430: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
e440: 69 6e 74 20 74 65 73 74 5f 63 68 61 6e 67 65 73  int test_changes
e450: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
e460: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
e470: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
e480: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
e490: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
e4a0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
e4b0: 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  b;.  if( objc!=2
e4c0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
e4d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e4e0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
e4f0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
e500: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
e510: 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
e520: 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
e530: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e540: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
e550: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
e560: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e570: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
e580: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e590: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
e5a0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
e5b0: 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
e5c0: 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a 20  changes(db)));. 
e5d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
e5e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
e5f0: 20 74 68 65 20 22 73 74 61 74 69 63 5f 62 69 6e   the "static_bin
e600: 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76 61  d_value" that va
e610: 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75 6e  riables are boun
e620: 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65  d to when.** the
e630: 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20   FLAG option of 
e640: 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73 20  sqlite3_bind is 
e650: 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74  "static".*/.stat
e660: 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f  ic char *sqlite_
e670: 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
e680: 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  e = 0;.static in
e690: 74 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  t sqlite_static_
e6a0: 62 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b 0a  bind_nbyte = 0;.
e6b0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
e6c0: 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20  qlite3_bind  VM 
e6d0: 20 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41   IDX  VALUE  FLA
e6e0: 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68  GS.**.** Sets th
e6f0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49  e value of the I
e700: 44 58 2d 74 68 20 6f 63 63 75 72 61 6e 63 65 20  DX-th occurance 
e710: 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f 72  of "?" in the or
e720: 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74  iginal SQL.** st
e730: 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73 20  ring.  VALUE is 
e740: 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20 20  the new value.  
e750: 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22  If FLAGS=="null"
e760: 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a   then VALUE is.*
e770: 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74 68  * ignored and th
e780: 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74  e value is set t
e790: 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47  o NULL.  If FLAG
e7a0: 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65 6e  S=="static" then
e7b0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 73  .** the value is
e7c0: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
e7d0: 65 20 6f 66 20 61 20 73 74 61 74 69 63 20 76 61  e of a static va
e7e0: 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20  riable named.** 
e7f0: 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  "sqlite_static_b
e800: 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66 20  ind_value".  If 
e810: 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20  FLAGS=="normal" 
e820: 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  then a copy.** o
e830: 66 20 74 68 65 20 56 41 4c 55 45 20 69 73 20 6d  f the VALUE is m
e840: 61 64 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d  ade.  If FLAGS==
e850: 22 62 6c 6f 62 31 30 22 20 74 68 65 6e 20 61 20  "blob10" then a 
e860: 56 41 4c 55 45 20 69 73 20 69 67 6e 6f 72 65 64  VALUE is ignored
e870: 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79 74 65  .** an a 10-byte
e880: 20 62 6c 6f 62 20 22 61 62 63 5c 30 30 30 78 79   blob "abc\000xy
e890: 7a 5c 30 30 30 70 71 22 20 69 73 20 69 6e 73 65  z\000pq" is inse
e8a0: 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rted..*/.static 
e8b0: 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 28 0a 20  int test_bind(. 
e8c0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
e8d0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
e8e0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
e8f0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
e900: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
e910: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
e920: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
e930: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e940: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
e950: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
e960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
e970: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
e980: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
e990: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
e9a0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
e9b0: 64 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  dx;.  if( argc!=
e9c0: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
e9d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e9e0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
e9f0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
ea00: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
ea10: 20 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45 20   " VM IDX VALUE 
ea20: 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72  (null|static|nor
ea30: 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20  mal)\"", 0);.   
ea40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ea50: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
ea60: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
ea70: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70 53  rp, argv[1], &pS
ea80: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
ea90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
eaa0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
eab0: 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78 29  , argv[2], &idx)
eac0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
ead0: 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  ROR;.  if( strcm
eae0: 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22  p(argv[4],"null"
eaf0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
eb00: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
eb10: 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a  ll(pStmt, idx);.
eb20: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
eb30: 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74  mp(argv[4],"stat
eb40: 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ic")==0 ){.    r
eb50: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
eb60: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78  _text(pStmt, idx
eb70: 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  , sqlite_static_
eb80: 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20  bind_value, -1, 
eb90: 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
eba0: 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
ebb0: 73 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29 3d  static-nbytes")=
ebc0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
ebd0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
ebe0: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c  (pStmt, idx, sql
ebf0: 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
ec00: 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20  value,.         
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
ec30: 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
ec40: 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65  _nbyte, 0);.  }e
ec50: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
ec60: 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29  rgv[4],"normal")
ec70: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
ec80: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
ec90: 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61 72  t(pStmt, idx, ar
eca0: 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  gv[3], -1, SQLIT
ecb0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
ecc0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
ecd0: 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31 30  (argv[4],"blob10
ece0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
ecf0: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
ed00: 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ext(pStmt, idx, 
ed10: 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70  "abc\000xyz\000p
ed20: 71 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f 53  q", 10, SQLITE_S
ed30: 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b  TATIC);.  }else{
ed40: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
ed50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 34  esult(interp, "4
ed60: 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  th argument shou
ed70: 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
ed80: 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73  "\"null\" or \"s
ed90: 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72  tatic\" or \"nor
eda0: 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  mal\"", 0);.    
edb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
edc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
edd0: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
ede0: 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
edf0: 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
ee00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ee10: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
ee20: 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
ee30: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
ee40: 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20   "(%d) ", rc);. 
ee50: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ee60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
ee70: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
ee80: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
ee90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
eea0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
eeb0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
eec0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
eed0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64  ./*.** Usage: ad
eee0: 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c  d_test_collate <
eef0: 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c  db ptr> <utf8> <
ef00: 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62  utf16le> <utf16b
ef10: 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  e>.**.** This fu
ef20: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
ef30: 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
ef40: 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20 63  te selects the c
ef50: 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f 6e  orrect collation
ef60: 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61 6c  .** sequence cal
ef70: 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69  lback when multi
ef80: 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f  ple versions (fo
ef90: 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74  r different text
efa0: 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61   encodings).** a
efb0: 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  re available..**
efc0: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
efd0: 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
efe0: 72 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rs the collation
eff0: 20 73 65 71 75 65 6e 63 65 20 22 74 65 73 74 5f   sequence "test_
f000: 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74 68  collate".** with
f010: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
f020: 20 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f 6e   <db>. The secon
f030: 64 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  d argument must 
f040: 62 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68 72  be a list of thr
f050: 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61  ee.** boolean va
f060: 6c 75 65 73 2e 20 49 66 20 74 68 65 20 66 69 72  lues. If the fir
f070: 73 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  st is true, then
f080: 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65   a version of te
f090: 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a  st_collate is.**
f0a0: 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
f0b0: 55 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73 65  UTF-8, if the se
f0c0: 63 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61 20  cond is true, a 
f0d0: 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73  version is regis
f0e0: 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54 46  tered for.** UTF
f0f0: 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74 68  -16le, if the th
f100: 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20 55  ird is true, a U
f110: 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20  TF-16be version 
f120: 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
f130: 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f   Previous versio
f140: 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61  ns of test_colla
f150: 74 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  te are deleted..
f160: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
f170: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65 73  ion sequence tes
f180: 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d 70  t_collate is imp
f190: 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c  lemented by call
f1a0: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  ing the.** follo
f1b0: 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a  wing TCL script:
f1c0: 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 63  .**.**   "test_c
f1d0: 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c 68  ollate <enc> <lh
f1e0: 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20  s> <rhs>".**.** 
f1f0: 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c 72  The <lhs> and <r
f200: 68 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f 20  hs> are the two 
f210: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f 6d  values being com
f220: 70 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20 69  pared, encoded i
f230: 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20  n UTF-8..** The 
f240: 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72 20  <enc> parameter 
f250: 69 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  is the encoding 
f260: 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  of the collation
f270: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
f280: 2a 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 65  * SQLite selecte
f290: 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20 54  d to call. The T
f2a0: 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 20 69  CL test script i
f2b0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a  mplements the.**
f2c0: 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 20   "test_collate" 
f2d0: 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  proc..**.** Note
f2e0: 20 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c 20   that this will 
f2f0: 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20 6f  only work with o
f300: 6e 65 20 69 6e 74 65 70 72 65 74 65 72 20 61 74  ne intepreter at
f310: 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68 65 0a   a time, as the.
f320: 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e 74 65  ** interp pointe
f330: 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20 65 76  r to use when ev
f340: 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54 43 4c  aluating the TCL
f350: 20 73 63 72 69 70 74 20 69 73 20 73 74 6f 72 65   script is store
f360: 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f 6c  d in.** pTestCol
f370: 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73  lateInterp..*/.s
f380: 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72 70  tatic Tcl_Interp
f390: 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e  * pTestCollateIn
f3a0: 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69 6e 74  terp;.static int
f3b0: 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75   test_collate_fu
f3c0: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  nc(.  void *pCtx
f3d0: 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e  , .  int nA, con
f3e0: 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69  st void *zA,.  i
f3f0: 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69  nt nB, const voi
f400: 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f 49  d *zB.){.  Tcl_I
f410: 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65 73 74  nterp *i = pTest
f420: 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 20  CollateInterp;. 
f430: 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 28 69 6e   int encin = (in
f440: 74 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 72 65  t)pCtx;.  int re
f450: 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 73  s;.  int n;..  s
f460: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
f470: 61 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  al;.  Tcl_Obj *p
f480: 58 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  X;..  pX = Tcl_N
f490: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
f4a0: 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b  t_collate", -1);
f4b0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
f4c0: 75 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74  unt(pX);..  swit
f4d0: 63 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20  ch( encin ){.   
f4e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46   case SQLITE_UTF
f4f0: 38 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  8:.      Tcl_Lis
f500: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f510: 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74  t(i,pX,Tcl_NewSt
f520: 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c  ringObj("UTF-8",
f530: 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  -1));.      brea
f540: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
f550: 54 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20  TE_UTF16LE:.    
f560: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f570: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c  endElement(i,pX,
f580: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
f590: 28 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29  ("UTF-16LE",-1))
f5a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f5b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
f5c0: 54 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63  TF16BE:.      Tc
f5d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f5e0: 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f  lement(i,pX,Tcl_
f5f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
f600: 46 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20  F-16BE",-1));.  
f610: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
f620: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
f630: 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20  sert(0);.  }..  
f640: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
f650: 6c 75 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69  lueNew();.  sqli
f660: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
f670: 56 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63  Val, nA, zA, enc
f680: 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  in, SQLITE_STATI
f690: 43 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  C);.  n = sqlite
f6a0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56  3_value_bytes(pV
f6b0: 61 6c 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  al);.  Tcl_ListO
f6c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f6d0: 69 2c 70 58 2c 0a 20 20 20 20 20 20 54 63 6c 5f  i,pX,.      Tcl_
f6e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
f6f0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
f700: 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29  e_text(pVal),n))
f710: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
f720: 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c  SetStr(pVal, nB,
f730: 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49   zB, encin, SQLI
f740: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 6e 20  TE_STATIC);.  n 
f750: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
f760: 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 54  bytes(pVal);.  T
f770: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f780: 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20  Element(i,pX,.  
f790: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
f7a0: 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69  gObj((char*)sqli
f7b0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
f7c0: 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 73 71 6c 69  Val),n));.  sqli
f7d0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
f7e0: 6c 29 3b 0a 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  l);..  Tcl_EvalO
f7f0: 62 6a 45 78 28 69 2c 20 70 58 2c 20 30 29 3b 0a  bjEx(i, pX, 0);.
f800: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
f810: 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 47 65  nt(pX);.  Tcl_Ge
f820: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 2c 20 54  tIntFromObj(i, T
f830: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
f840: 69 29 2c 20 26 72 65 73 29 3b 0a 20 20 72 65 74  i), &res);.  ret
f850: 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69  urn res;.}.stati
f860: 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61  c int test_colla
f870: 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  te(.  void * cli
f880: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
f890: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
f8a0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
f8b0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
f8c0: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
f8d0: 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a  *db;.  int val;.
f8e0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
f8f0: 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVal;.  int rc;
f900: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
f910: 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b  ) goto bad_args;
f920: 0a 20 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49  .  pTestCollateI
f930: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
f940: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
f950: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
f960: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
f970: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
f980: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69   TCL_ERROR;..  i
f990: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
f9a0: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
f9b0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
f9c0: 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
f9d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
f9e0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
f9f0: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
fa00: 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
fa10: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20  SQLITE_UTF8, .  
fa20: 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29          (void *)
fa30: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 76 61 6c  SQLITE_UTF8, val
fa40: 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75  ?test_collate_fu
fa50: 6e 63 3a 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  nc:0);.  if( rc=
fa60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fa70: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
fa80: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
fa90: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
faa0: 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [3], &val) ) ret
fab0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fac0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
fad0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
fae0: 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61  (db, "test_colla
faf0: 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  te", SQLITE_UTF1
fb00: 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  6LE, .          
fb10: 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45    (void *)SQLITE
fb20: 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74 65  _UTF16LE, val?te
fb30: 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
fb40: 30 29 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f  0);.    if( TCL_
fb50: 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
fb60: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
fb70: 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29  , objv[4], &val)
fb80: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
fb90: 52 4f 52 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ROR;..#ifdef SQL
fba0: 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20  ITE_MEMDEBUG.   
fbb0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 4d 61   if( sqlite3_iMa
fbc0: 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a 20 20  llocFail>0 ){.  
fbd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c      sqlite3_iMal
fbe0: 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d  locFail++;.    }
fbf0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 56 61 6c  .#endif.    pVal
fc00: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
fc10: 65 77 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ew();.    sqlite
fc20: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
fc30: 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f 6c  l, -1, "test_col
fc40: 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  late", SQLITE_UT
fc50: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
fc60: 43 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  C);.    rc = sql
fc70: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
fc80: 61 74 69 6f 6e 31 36 28 64 62 2c 20 0a 20 20 20  ation16(db, .   
fc90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
fca0: 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
fcb0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
fcc0: 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  ), SQLITE_UTF16B
fcd0: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 76  E, .          (v
fce0: 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46  oid *)SQLITE_UTF
fcf0: 31 36 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63  16BE, val?test_c
fd00: 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
fd10: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
fd20: 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a  Free(pVal);.  }.
fd30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
fd40: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
fd50: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
fd60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a  n TCL_ERROR;.  .
fd70: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
fd80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
fd90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
fda0: 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45  rp, sqlite3TestE
fdb0: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
fdc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
fdd0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
fde0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61  turn TCL_OK;..ba
fdf0: 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70  d_args:.  Tcl_Ap
fe00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
fe10: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
fe20: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
fe30: 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74  .      Tcl_GetSt
fe40: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
fe50: 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20  [0], 0), " <DB> 
fe60: 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
fe70: 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b   <utf16be>", 0);
fe80: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
fe90: 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  ROR;.}../*.** Wh
fea0: 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  en the collation
feb0: 20 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b   needed callback
fec0: 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 72 65 63   is invoked, rec
fed0: 6f 72 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ord the name of 
fee0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
fef0: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  d collating func
ff00: 74 69 6f 6e 20 68 65 72 65 2e 20 20 54 68 65 20  tion here.  The 
ff10: 72 65 63 6f 72 64 65 64 20 6e 61 6d 65 20 69 73  recorded name is
ff20: 20 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f 20 61 20   linked.** to a 
ff30: 54 43 4c 20 76 61 72 69 61 62 6c 65 20 61 6e 64  TCL variable and
ff40: 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   used to make su
ff50: 72 65 20 74 68 61 74 20 74 68 65 20 72 65 71 75  re that the requ
ff60: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 0a  ested collation.
ff70: 2a 2a 20 6e 61 6d 65 20 69 73 20 63 6f 72 72 65  ** name is corre
ff80: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ct..*/.static ch
ff90: 61 72 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74  ar zNeededCollat
ffa0: 69 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61 74 69 63  ion[200];.static
ffb0: 20 63 68 61 72 20 2a 70 7a 4e 65 65 64 65 64 43   char *pzNeededC
ffc0: 6f 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e 65 65 64  ollation = zNeed
ffd0: 65 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f  edCollation;.../
ffe0: 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e  *.** Called when
fff0: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
10000 75 65 6e 63 65 20 69 73 20 6e 65 65 64 65 64 2e  uence is needed.
10010 20 20 52 65 67 69 73 74 65 72 65 64 20 75 73 69    Registered usi
10020 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  ng.** sqlite3_co
10030 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
10040 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
10050 69 64 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  id test_collate_
10060 6e 65 65 64 65 64 5f 63 62 28 0a 20 20 76 6f 69  needed_cb(.  voi
10070 64 20 2a 70 43 74 78 2c 20 0a 20 20 73 71 6c 69  d *pCtx, .  sqli
10080 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65  te3 *db,.  int e
10090 54 65 78 74 52 65 70 2c 0a 20 20 63 6f 6e 73 74  TextRep,.  const
100a0 20 76 6f 69 64 20 2a 70 4e 61 6d 65 0a 29 7b 0a   void *pName.){.
100b0 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28    int enc = ENC(
100c0 64 62 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db);.  int i;.  
100d0 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a  char *z;.  for(z
100e0 20 3d 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2c   = (char*)pName,
100f0 20 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a 5b 31 5d   i=0; *z || z[1]
10100 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; z++){.    if( 
10110 2a 7a 20 29 20 7a 4e 65 65 64 65 64 43 6f 6c 6c  *z ) zNeededColl
10120 61 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b  ation[i++] = *z;
10130 0a 20 20 7d 0a 20 20 7a 4e 65 65 64 65 64 43 6f  .  }.  zNeededCo
10140 6c 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20 30 3b 0a  llation[i] = 0;.
10150 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
10160 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 20 20  _collation(.    
10170 20 20 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c    db, "test_coll
10180 61 74 65 22 2c 20 45 4e 43 28 64 62 29 2c 20 28  ate", ENC(db), (
10190 76 6f 69 64 20 2a 29 65 6e 63 2c 20 74 65 73 74  void *)enc, test
101a0 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 29 3b 0a  _collate_func);.
101b0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
101c0 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  add_test_collate
101d0 5f 6e 65 65 64 65 64 20 44 42 0a 2a 2f 0a 73 74  _needed DB.*/.st
101e0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
101f0 6c 6c 61 74 65 5f 6e 65 65 64 65 64 28 0a 20 20  llate_needed(.  
10200 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
10210 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10220 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10230 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10240 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10250 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
10260 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
10270 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20 62  objc!=2 ) goto b
10280 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67  ad_args;.  if( g
10290 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
102a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
102b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
102c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
102d0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
102e0 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
102f0 65 64 65 64 31 36 28 64 62 2c 20 30 2c 20 74 65  eded16(db, 0, te
10300 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
10310 64 5f 63 62 29 3b 0a 20 20 7a 4e 65 65 64 65 64  d_cb);.  zNeeded
10320 43 6f 6c 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20 30  Collation[0] = 0
10330 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
10340 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
10350 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
10360 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10370 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10380 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c  .bad_args:.  Tcl
10390 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
103a0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
103b0 44 42 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  DB");.  return T
103c0 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  CL_ERROR;.}../*.
103d0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 61 64 64  ** tclcmd:   add
103e0 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f  _alignment_test_
103f0 63 6f 6c 6c 61 74 69 6f 6e 73 20 20 44 42 0a 2a  collations  DB.*
10400 2a 0a 2a 2a 20 41 64 64 20 74 77 6f 20 6e 65 77  *.** Add two new
10410 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10420 6e 63 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nces to the data
10430 62 61 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20  base DB.**.**   
10440 20 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 0a    utf16_aligned.
10450 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 75 6e 61  **     utf16_una
10460 6c 69 67 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74  ligned.**.** Bot
10470 68 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  h collating sequ
10480 65 6e 63 65 73 20 75 73 65 20 74 68 65 20 73 61  ences use the sa
10490 6d 65 20 73 6f 72 74 20 6f 72 64 65 72 20 61 73  me sort order as
104a0 20 42 49 4e 41 52 59 2e 0a 2a 2a 20 54 68 65 20   BINARY..** The 
104b0 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20  only difference 
104c0 69 73 20 74 68 61 74 20 74 68 65 20 75 74 66 31  is that the utf1
104d0 36 5f 61 6c 69 67 6e 65 64 20 63 6f 6c 6c 61 74  6_aligned collat
104e0 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
104f0 69 73 20 64 65 63 6c 61 72 65 64 20 77 69 74 68  is declared with
10500 20 74 68 65 20 53 51 4c 49 54 45 5f 55 54 46 31   the SQLITE_UTF1
10510 36 5f 41 4c 49 47 4e 45 44 20 66 6c 61 67 2e 0a  6_ALIGNED flag..
10520 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e  ** Both collatin
10530 67 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 63 72  g functions incr
10540 65 6d 65 6e 74 20 74 68 65 20 75 6e 61 6c 69 67  ement the unalig
10550 6e 65 64 20 75 74 66 31 36 20 63 6f 75 6e 74 65  ned utf16 counte
10560 72 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 74 68  r.** whenever th
10570 65 79 20 73 65 65 20 61 20 73 74 72 69 6e 67 20  ey see a string 
10580 74 68 61 74 20 62 65 67 69 6e 73 20 6f 6e 20 61  that begins on a
10590 6e 20 6f 64 64 20 62 79 74 65 20 62 6f 75 6e 64  n odd byte bound
105a0 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ary..*/.static i
105b0 6e 74 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72  nt unaligned_str
105c0 69 6e 67 5f 63 6f 75 6e 74 65 72 20 3d 20 30 3b  ing_counter = 0;
105d0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 69 67  .static int alig
105e0 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a 20  nmentCollFunc(. 
105f0 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
10600 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
10610 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
10620 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
10630 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
10640 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
10650 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
10660 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
10670 3b 0a 20 20 69 66 28 20 6e 4b 65 79 31 3e 30 20  ;.  if( nKey1>0 
10680 26 26 20 31 3d 3d 28 31 26 28 69 6e 74 29 70 4b  && 1==(1&(int)pK
10690 65 79 31 29 20 29 20 75 6e 61 6c 69 67 6e 65 64  ey1) ) unaligned
106a0 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b  _string_counter+
106b0 2b 3b 0a 20 20 69 66 28 20 6e 4b 65 79 32 3e 30  +;.  if( nKey2>0
106c0 20 26 26 20 31 3d 3d 28 31 26 28 69 6e 74 29 70   && 1==(1&(int)p
106d0 4b 65 79 32 29 20 29 20 75 6e 61 6c 69 67 6e 65  Key2) ) unaligne
106e0 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
106f0 2b 2b 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d  ++;.  rc = memcm
10700 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
10710 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
10720 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  ){.    rc = nKey
10730 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  1 - nKey2;.  }. 
10740 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
10750 61 74 69 63 20 69 6e 74 20 61 64 64 5f 61 6c 69  atic int add_ali
10760 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
10770 61 74 69 6f 6e 73 28 0a 20 20 76 6f 69 64 20 2a  ations(.  void *
10780 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
10790 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
107a0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
107b0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
107c0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
107d0 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f  te3 *db;.  if( o
107e0 62 6a 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 66  bjc>=2 ){.    if
107f0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
10800 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
10810 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
10820 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
10830 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
10840 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
10850 74 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f  tion(db, "utf16_
10860 75 6e 61 6c 69 67 6e 65 64 22 2c 0a 20 20 20 20  unaligned",.    
10870 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36      SQLITE_UTF16
10880 2c 20 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c  , .        0, al
10890 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29  ignmentCollFunc)
108a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
108b0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
108c0 62 2c 20 22 75 74 66 31 36 5f 61 6c 69 67 6e 65  b, "utf16_aligne
108d0 64 22 2c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  d",.        SQLI
108e0 54 45 5f 55 54 46 31 36 20 7c 20 53 51 4c 49 54  TE_UTF16 | SQLIT
108f0 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 2c  E_UTF16_ALIGNED,
10900 20 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69   .        0, ali
10910 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b  gnmentCollFunc);
10920 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10930 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
10940 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
10950 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29  LITE_OMIT_UTF16)
10960 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65   */../*.** Usage
10970 3a 20 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74  : add_test_funct
10980 69 6f 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74  ion <db ptr> <ut
10990 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75  f8> <utf16le> <u
109a0 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68  tf16be>.**.** Th
109b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
109c0 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74  sed to test that
109d0 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20   SQLite selects 
109e0 74 68 65 20 63 6f 72 72 65 63 74 20 75 73 65 72  the correct user
109f0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  .** function cal
10a00 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69  lback when multi
10a10 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f  ple versions (fo
10a20 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74  r different text
10a30 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61   encodings).** a
10a40 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  re available..**
10a50 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
10a60 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
10a70 72 73 20 75 70 20 74 6f 20 74 68 72 65 65 20 76  rs up to three v
10a80 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75  ersions of the u
10a90 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ser function.** 
10aa0 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20  "test_function" 
10ab0 77 69 74 68 20 64 61 74 61 62 61 73 65 20 68 61  with database ha
10ac0 6e 64 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74  ndle <db>.  If t
10ad0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
10ae0 6e 74 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74  nt is.** true, t
10af0 68 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66  hen a version of
10b00 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69   test_function i
10b10 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
10b20 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a   UTF-8, if the.*
10b30 2a 20 74 68 69 72 64 20 69 73 20 74 72 75 65 2c  * third is true,
10b40 20 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65   a version is re
10b50 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
10b60 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f  -16le, if the fo
10b70 75 72 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c  urth is.** true,
10b80 20 61 20 55 54 46 2d 31 36 62 65 20 76 65 72 73   a UTF-16be vers
10b90 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
10ba0 2e 20 20 50 72 65 76 69 6f 75 73 20 76 65 72 73  .  Previous vers
10bb0 69 6f 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f  ions of.** test_
10bc0 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c  function are del
10bd0 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
10be0 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73  user function is
10bf0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
10c00 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c  calling the foll
10c10 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  owing TCL script
10c20 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f  :.**.**   "test_
10c30 66 75 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c  function <enc> <
10c40 61 72 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72  arg>".**.** Wher
10c50 65 20 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f  e <enc> is one o
10c60 66 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c  f UTF-8, UTF-16L
10c70 45 20 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e  E or UTF16BE, an
10c80 64 20 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a  d <arg> is the.*
10c90 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
10ca0 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
10cb0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  SQL function. Th
10cc0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
10cd0 20 62 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73   by.** the TCL s
10ce0 63 72 69 70 74 20 69 73 20 75 73 65 64 20 61 73  cript is used as
10cf0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
10d00 65 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e  e of the SQL fun
10d10 63 74 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20  ction. It.** is 
10d20 70 61 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65  passed to SQLite
10d30 20 75 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20   using UTF-16BE 
10d40 66 6f 72 20 61 20 55 54 46 2d 38 20 74 65 73 74  for a UTF-8 test
10d50 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46  _function(), UTF
10d60 2d 38 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d  -8.** for a UTF-
10d70 31 36 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69  16LE test_functi
10d80 6f 6e 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36  on(), and UTF-16
10d90 4c 45 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d  LE for an implem
10da0 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  entation that.**
10db0 20 70 72 65 66 65 72 73 20 55 54 46 2d 31 36 42   prefers UTF-16B
10dc0 45 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  E..*/.#ifndef SQ
10dd0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
10de0 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
10df0 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 28 0a  _function_utf8(.
10e00 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
10e10 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
10e20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
10e30 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
10e40 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10e50 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
10e60 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *pX;.  sqlite3_v
10e70 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
10e80 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65  terp = (Tcl_Inte
10e90 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  rp *)sqlite3_use
10ea0 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
10eb0 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  pX = Tcl_NewStri
10ec0 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63  ngObj("test_func
10ed0 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63  tion", -1);.  Tc
10ee0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
10ef0 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  X);.  Tcl_ListOb
10f00 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10f10 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e  nterp, pX, Tcl_N
10f20 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
10f30 2d 38 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  -8", -1));.  Tcl
10f40 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10f50 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
10f60 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  , .      Tcl_New
10f70 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a  StringObj((char*
10f80 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
10f90 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31  ext(argv[0]), -1
10fa0 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
10fb0 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  jEx(interp, pX, 
10fc0 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
10fd0 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73 71  fCount(pX);.  sq
10fe0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
10ff0 74 28 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53  t(pCtx, Tcl_GetS
11000 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
11010 72 70 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  rp), -1, SQLITE_
11020 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56  TRANSIENT);.  pV
11030 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
11040 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74 65  eNew();.  sqlite
11050 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
11060 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74  l, -1, Tcl_GetSt
11070 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
11080 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54  p), .      SQLIT
11090 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
110a0 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
110b0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62  3_result_text16b
110c0 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f  e(pCtx, sqlite3_
110d0 76 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70  value_text16be(p
110e0 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20  Val),.      -1, 
110f0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
11100 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
11110 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73  eFree(pVal);.}.s
11120 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
11130 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65  function_utf16le
11140 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
11150 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
11160 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
11170 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
11180 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
11190 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  interp;.  Tcl_Ob
111a0 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  j *pX;.  sqlite3
111b0 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
111c0 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e  interp = (Tcl_In
111d0 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75  terp *)sqlite3_u
111e0 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a  ser_data(pCtx);.
111f0 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74    pX = Tcl_NewSt
11200 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75  ringObj("test_fu
11210 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20  nction", -1);.  
11220 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
11230 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  (pX);.  Tcl_List
11240 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11250 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c  (interp, pX, Tcl
11260 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
11270 54 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a  TF-16LE", -1));.
11280 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
11290 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
112a0 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63  p, pX, .      Tc
112b0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
112c0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
112d0 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
112e0 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  ), -1));.  Tcl_E
112f0 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
11300 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44   pX, 0);.  Tcl_D
11310 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ecrRefCount(pX);
11320 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
11330 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20 73  3ValueNew();.  s
11340 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
11350 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f  r(pVal, -1, Tcl_
11360 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
11370 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20  interp), .      
11380 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
11390 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
113a0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
113b0 78 74 28 70 43 74 78 2c 28 63 68 61 72 2a 29 73  xt(pCtx,(char*)s
113c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
113d0 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54  t(pVal),-1,SQLIT
113e0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
113f0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
11400 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63  (pVal);.}.static
11410 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74   void test_funct
11420 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73  ion_utf16be(.  s
11430 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
11440 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
11450 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
11460 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54  ue **argv.){.  T
11470 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11480 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  p;.  Tcl_Obj *pX
11490 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
114a0 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72  e *pVal;.  inter
114b0 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20  p = (Tcl_Interp 
114c0 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
114d0 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20  ata(pCtx);.  pX 
114e0 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
114f0 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  bj("test_functio
11500 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  n", -1);.  Tcl_I
11510 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ncrRefCount(pX);
11520 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
11530 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11540 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53  rp, pX, Tcl_NewS
11550 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36  tringObj("UTF-16
11560 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  BE", -1));.  Tcl
11570 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11580 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
11590 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  , .      Tcl_New
115a0 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a  StringObj((char*
115b0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
115c0 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31  ext(argv[0]), -1
115d0 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
115e0 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  jEx(interp, pX, 
115f0 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
11600 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56  fCount(pX);.  pV
11610 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
11620 65 4e 65 77 28 29 3b 0a 20 20 73 71 6c 69 74 65  eNew();.  sqlite
11630 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
11640 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74  l, -1, Tcl_GetSt
11650 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
11660 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54  p), .      SQLIT
11670 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
11680 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
11690 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c  3_result_text16l
116a0 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f  e(pCtx, sqlite3_
116b0 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70  value_text16le(p
116c0 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20  Val),.      -1, 
116d0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
116e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
116f0 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23  eFree(pVal);.}.#
11700 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11710 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74  OMIT_UTF16 */.st
11720 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66 75  atic int test_fu
11730 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  nction(.  void *
11740 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
11750 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11760 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
11770 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
11780 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
11790 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
117a0 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
117b0 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20  b;.  int val;.. 
117c0 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67   if( objc!=5 ) g
117d0 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
117e0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
117f0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
11800 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
11810 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
11820 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28  CL_ERROR;..  if(
11830 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
11840 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
11850 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
11860 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
11870 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
11880 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  val ){.    sqlit
11890 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
118a0 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e  on(db, "test_fun
118b0 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54  ction", 1, SQLIT
118c0 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20  E_UTF8, .       
118d0 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75   interp, test_fu
118e0 6e 63 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20  nction_utf8, 0, 
118f0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43  0);.  }.  if( TC
11900 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f  L_OK!=Tcl_GetBoo
11910 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
11920 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
11930 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
11940 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c  ERROR;.  if( val
11950 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
11960 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
11970 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69  db, "test_functi
11980 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  on", 1, SQLITE_U
11990 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20  TF16LE, .       
119a0 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75   interp, test_fu
119b0 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20  nction_utf16le, 
119c0 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
119d0 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
119e0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
119f0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
11a00 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
11a10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
11a20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  val ){.    sqlit
11a30 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
11a40 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e  on(db, "test_fun
11a50 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54  ction", 1, SQLIT
11a60 45 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20  E_UTF16BE, .    
11a70 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74      interp, test
11a80 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62  _function_utf16b
11a90 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  e, 0, 0);.  }.. 
11aa0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11ab0 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f  bad_args:.  Tcl_
11ac0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11ad0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
11ae0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
11af0 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  ",.      Tcl_Get
11b00 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
11b10 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42  jv[0], 0), " <DB
11b20 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c  > <utf8> <utf16l
11b30 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30  e> <utf16be>", 0
11b40 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
11b50 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
11b60 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  /.  return TCL_E
11b70 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  RROR;.}../*.** U
11b80 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 74 65  sage:         te
11b90 73 74 5f 65 72 72 73 74 72 20 3c 65 72 72 20 63  st_errstr <err c
11ba0 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ode>.**.** Test 
11bb0 74 68 61 74 20 74 68 65 20 65 6e 67 6c 69 73 68  that the english
11bc0 20 6c 61 6e 67 75 61 67 65 20 73 74 72 69 6e 67   language string
11bd0 20 65 71 75 69 76 61 6c 65 6e 74 73 20 66 6f 72   equivalents for
11be0 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
11bf0 64 65 73 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e  des.** are sane.
11c00 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   The parameter i
11c10 73 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70  s an integer rep
11c20 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c  resenting an sql
11c30 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
11c40 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
11c50 20 61 20 6c 69 73 74 20 6f 66 20 74 77 6f 20 65   a list of two e
11c60 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 72  lements, the str
11c70 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
11c80 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72  on of the.** err
11c90 6f 72 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  or code and the 
11ca0 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  english language
11cb0 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f   explanation..*/
11cc0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
11cd0 5f 65 72 72 73 74 72 28 0a 20 20 76 6f 69 64 20  _errstr(.  void 
11ce0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
11cf0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11d00 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
11d10 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
11d20 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61   objv[].){.  cha
11d30 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20  r *zCode;.  int 
11d40 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  i;.  if( objc!=1
11d50 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
11d60 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
11d70 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f   1, objv, "<erro
11d80 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a  r code>");.  }..
11d90 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65    zCode = Tcl_Ge
11da0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
11db0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32  ;.  for(i=0; i<2
11dc0 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  00; i++){.    if
11dd0 28 20 30 3d 3d 73 74 72 63 6d 70 28 74 31 45 72  ( 0==strcmp(t1Er
11de0 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64  rorName(i), zCod
11df0 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  e) ) break;.  }.
11e00 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
11e10 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
11e20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 29  sqlite3ErrStr(i)
11e30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
11e40 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
11e50 55 73 61 67 65 3a 20 20 20 20 62 72 65 61 6b 70  Usage:    breakp
11e60 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  oint.**.** This 
11e70 72 6f 75 74 69 6e 65 20 65 78 69 73 74 73 20 66  routine exists f
11e80 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d  or one purpose -
11e90 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 70 6c   to provide a pl
11ea0 61 63 65 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20  ace to put a.** 
11eb0 62 72 65 61 6b 70 6f 69 6e 74 20 77 69 74 68 20  breakpoint with 
11ec0 47 44 42 20 74 68 61 74 20 63 61 6e 20 62 65 20  GDB that can be 
11ed0 74 72 69 67 67 65 72 65 64 20 75 73 69 6e 67 20  triggered using 
11ee0 54 43 4c 20 63 6f 64 65 2e 20 20 54 68 65 20 75  TCL code.  The u
11ef0 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 69  se.** for this i
11f00 73 20 77 68 65 6e 20 61 20 70 61 72 74 69 63 75  s when a particu
11f10 6c 61 72 20 74 65 73 74 20 66 61 69 6c 73 20 6f  lar test fails o
11f20 6e 20 28 73 61 79 29 20 74 68 65 20 31 34 38 35  n (say) the 1485
11f30 74 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a  th iteration..**
11f40 20 49 6e 20 74 68 65 20 54 43 4c 20 74 65 73 74   In the TCL test
11f50 20 73 63 72 69 70 74 2c 20 77 65 20 63 61 6e 20   script, we can 
11f60 61 64 64 20 63 6f 64 65 20 6c 69 6b 65 20 74 68  add code like th
11f70 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66  is:.**.**     if
11f80 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72 65 61   {$i==1485} brea
11f90 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65  kpoint.**.** The
11fa0 6e 20 72 75 6e 20 74 65 73 74 66 69 78 74 75 72  n run testfixtur
11fb0 65 20 69 6e 20 74 68 65 20 64 65 62 75 67 67 65  e in the debugge
11fc0 72 20 61 6e 64 20 77 61 69 74 20 66 6f 72 20 74  r and wait for t
11fd0 68 65 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f  he breakpoint to
11fe0 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68 65 6e 20  .** fire.  Then 
11ff0 61 64 64 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b  additional break
12000 70 6f 69 6e 74 73 20 63 61 6e 20 62 65 20 73 65  points can be se
12010 74 20 74 6f 20 74 72 61 63 65 20 64 6f 77 6e 20  t to trace down 
12020 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74  the bug..*/.stat
12030 69 63 20 69 6e 74 20 74 65 73 74 5f 62 72 65 61  ic int test_brea
12040 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  kpoint(.  void *
12050 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
12060 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
12070 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
12080 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
12090 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
120a0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
120b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
120c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
120d0 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
120e0 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
120f0 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
12100 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
12110 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
12120 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ;         /* Do 
12130 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a  nothing */.}../*
12140 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
12150 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
12160 6f 62 20 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a  ob  STMT IDX N.*
12170 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
12180 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62  lite3_bind_zerob
12190 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20  lob interface.  
121a0 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
121b0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
121c0 20 49 44 58 20 69 73 20 74 68 65 20 69 6e 64 65   IDX is the inde
121d0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
121e0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
121f0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
12200 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
12210 73 20 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d  s a N-byte zero-
12220 66 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74  filled BLOB to t
12230 68 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  he wildcard..*/.
12240 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
12250 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20  bind_zeroblob(. 
12260 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
12270 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
12280 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
12290 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
122a0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
122b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
122c0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
122d0 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  x;.  int n;.  in
122e0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
122f0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
12300 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
12310 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
12320 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
12330 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
12340 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
12350 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
12360 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29  TMT N VALUE", 0)
12370 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
12380 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
12390 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
123a0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
123b0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
123c0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
123d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
123e0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
123f0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12400 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
12410 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12420 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
12430 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
12440 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20   objv[3], &n) ) 
12450 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12460 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
12470 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28  3_bind_zeroblob(
12480 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a  pStmt, idx, n);.
12490 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
124a0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
124b0 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
124c0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
124d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
124e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
124f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12500 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
12510 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
12520 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
12530 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
12540 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a   STMT N VALUE.**
12550 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
12560 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e  ite3_bind_int in
12570 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
12580 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
12590 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
125a0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
125b0 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
125c0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
125d0 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
125e0 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32 2d 62  .** binds a 32-b
125f0 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45  it integer VALUE
12600 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72   to that wildcar
12610 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12620 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a   test_bind_int(.
12630 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
12640 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
12650 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
12660 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
12670 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
12680 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
12690 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
126a0 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b  dx;.  int value;
126b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
126c0 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
126d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
126e0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
126f0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
12700 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
12710 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12720 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
12730 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
12740 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
12750 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
12760 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
12770 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
12780 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
12790 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
127a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
127b0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
127c0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
127d0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
127e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
127f0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
12800 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
12810 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
12820 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20  value) ) return 
12830 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
12840 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
12850 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  int(pStmt, idx, 
12860 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71  value);.  if( sq
12870 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
12880 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
12890 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
128a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
128b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
128c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
128d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
128e0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
128f0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
12900 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
12910 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d 54  bind_int64  STMT
12920 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54   N VALUE.**.** T
12930 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
12940 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65 72  bind_int64 inter
12950 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
12960 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
12970 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
12980 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
12990 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
129a0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
129b0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
129c0 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20   binds a 64-bit 
129d0 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f  integer VALUE to
129e0 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a   that wildcard..
129f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
12a00 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20  st_bind_int64(. 
12a10 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
12a20 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
12a30 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
12a40 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
12a50 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
12a60 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
12a70 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
12a80 78 3b 0a 20 20 69 36 34 20 76 61 6c 75 65 3b 0a  x;.  i64 value;.
12a90 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
12aa0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
12ab0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
12ac0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
12ad0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
12ae0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
12af0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
12b00 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
12b10 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22   " STMT N VALUE"
12b20 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
12b30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
12b40 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
12b50 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
12b60 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
12b70 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
12b80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12b90 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
12ba0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
12bb0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29  , objv[2], &idx)
12bc0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12bd0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
12be0 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
12bf0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
12c00 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75  , &value) ) retu
12c10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
12c20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
12c30 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
12c40 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69  idx, value);.  i
12c50 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
12c60 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
12c70 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
12c80 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
12c90 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
12ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12cb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12cc0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
12cd0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
12ce0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
12cf0 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
12d00 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a    STMT N VALUE.*
12d10 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
12d20 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
12d30 65 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  e interface.  ST
12d40 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
12d50 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
12d60 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
12d70 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
12d80 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
12d90 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
12da0 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
12db0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56  64-bit integer V
12dc0 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c  ALUE to that wil
12dd0 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
12de0 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 64   int test_bind_d
12df0 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20  ouble(.  void * 
12e00 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
12e10 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12e20 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
12e30 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
12e40 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
12e50 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
12e60 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75    int idx;.  dou
12e70 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ble value;.  int
12e80 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
12e90 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
12ea0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12eb0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
12ec0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
12ed0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
12ee0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
12ef0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
12f00 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b  MT N VALUE", 0);
12f10 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12f20 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
12f30 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
12f40 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
12f50 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
12f60 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
12f70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
12f80 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
12f90 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
12fa0 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
12fb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12fc0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75    if( Tcl_GetDou
12fd0 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  bleFromObj(inter
12fe0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
12ff0 75 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ue) ) return TCL
13000 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
13010 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
13020 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ble(pStmt, idx, 
13030 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71  value);.  if( sq
13040 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
13050 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
13060 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
13070 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13080 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
13090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
130a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
130b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
130c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
130d0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
130e0 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54 20 4e  ind_null  STMT N
130f0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
13100 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
13110 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  l interface.  ST
13120 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
13130 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
13140 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
13150 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
13160 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
13170 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
13180 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
13190 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69 6c 64  NULL to the wild
131a0 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
131b0 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75  int test_bind_nu
131c0 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ll(.  void * cli
131d0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
131e0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
131f0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
13200 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
13210 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
13220 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
13230 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72 63  nt idx;.  int rc
13240 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
13250 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
13260 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13270 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
13280 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
13290 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
132a0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
132b0 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
132c0 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  N", 0);.    retu
132d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
132e0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
132f0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
13300 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
13310 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
13320 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13330 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
13340 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
13350 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
13360 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
13370 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
13380 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
13390 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20  (pStmt, idx);.  
133a0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
133b0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
133c0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
133d0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
133e0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
133f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13400 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13410 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
13420 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
13430 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
13440 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 20  ite3_bind_text  
13450 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59  STMT N STRING BY
13460 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  TES.**.** Test t
13470 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
13480 74 65 78 74 20 69 6e 74 65 72 66 61 63 65 2e 20  text interface. 
13490 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
134a0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
134b0 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
134c0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
134d0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
134e0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
134f0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
13500 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20   a UTF-8 string 
13510 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69  STRING to the wi
13520 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72  ldcard.  The str
13530 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74  ing is BYTES byt
13540 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73  es.** long..*/.s
13550 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
13560 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69 64  ind_text(.  void
13570 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
13580 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
13590 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
135a0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
135b0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
135c0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
135d0 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
135e0 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
135f0 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
13600 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
13610 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
13620 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13630 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
13640 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
13650 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
13660 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
13670 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
13680 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22  T N VALUE BYTES"
13690 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
136a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
136b0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
136c0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
136d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
136e0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
136f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13700 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
13710 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
13720 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29  , objv[2], &idx)
13730 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13740 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54  ROR;.  value = T
13750 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
13760 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c  v[3]);.  if( Tcl
13770 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
13780 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
13790 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
137a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
137b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
137c0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78  _text(pStmt, idx
137d0 2c 20 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20  , value, bytes, 
137e0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
137f0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
13800 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
13810 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
13820 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
13830 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
13840 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13850 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
13860 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13870 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f   sqlite3TestErro
13880 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
13890 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
138a0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
138b0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
138c0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
138d0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
138e0 20 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20   ?-static? STMT 
138f0 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a  N STRING BYTES.*
13900 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
13910 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
13920 36 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  6 interface.  ST
13930 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
13940 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
13950 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
13960 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
13970 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
13980 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
13990 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
139a0 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 53 54  UTF-16 string ST
139b0 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64  RING to the wild
139c0 63 61 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e  card.  The strin
139d0 67 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73  g is BYTES bytes
139e0 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  .** long..*/.sta
139f0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
13a00 64 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69 64  d_text16(.  void
13a10 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
13a20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
13a30 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
13a40 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
13a50 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
13a60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13a70 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f  UTF16.  sqlite3_
13a80 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
13a90 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  nt idx;.  int by
13aa0 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
13ab0 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
13ac0 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 29 20   void (*xDel)() 
13ad0 3d 20 28 6f 62 6a 63 3d 3d 36 3f 53 51 4c 49 54  = (objc==6?SQLIT
13ae0 45 5f 53 54 41 54 49 43 3a 53 51 4c 49 54 45 5f  E_STATIC:SQLITE_
13af0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 54 63  TRANSIENT);.  Tc
13b00 6c 5f 4f 62 6a 20 2a 6f 53 74 6d 74 20 20 20 20  l_Obj *oStmt    
13b10 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a  = objv[objc-4];.
13b20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20    Tcl_Obj *oN   
13b30 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d      = objv[objc-
13b40 33 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  3];.  Tcl_Obj *o
13b50 53 74 72 69 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f  String  = objv[o
13b60 62 6a 63 2d 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62  bjc-2];.  Tcl_Ob
13b70 6a 20 2a 6f 42 79 74 65 73 20 20 20 3d 20 6f 62  j *oBytes   = ob
13b80 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69  jv[objc-1];..  i
13b90 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
13ba0 6a 63 21 3d 36 29 7b 0a 20 20 20 20 54 63 6c 5f  jc!=6){.    Tcl_
13bb0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13bc0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
13bd0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
13be0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
13bf0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
13c00 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
13c10 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45  TMT N VALUE BYTE
13c20 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
13c30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13c40 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
13c50 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
13c60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 53  Tcl_GetString(oS
13c70 74 6d 74 29 2c 20 26 70 53 74 6d 74 29 20 29 20  tmt), &pStmt) ) 
13c80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13c90 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
13ca0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
13cb0 2c 20 6f 4e 2c 20 26 69 64 78 29 20 29 20 72 65  , oN, &idx) ) re
13cc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13cd0 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a    value = (char*
13ce0 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61  )Tcl_GetByteArra
13cf0 79 46 72 6f 6d 4f 62 6a 28 6f 53 74 72 69 6e 67  yFromObj(oString
13d00 2c 20 30 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  , 0);.  if( Tcl_
13d10 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
13d20 74 65 72 70 2c 20 6f 42 79 74 65 73 2c 20 26 62  terp, oBytes, &b
13d30 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
13d40 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
13d50 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
13d60 65 78 74 31 36 28 70 53 74 6d 74 2c 20 69 64 78  ext16(pStmt, idx
13d70 2c 20 28 76 6f 69 64 20 2a 29 76 61 6c 75 65 2c  , (void *)value,
13d80 20 62 79 74 65 73 2c 20 78 44 65 6c 29 3b 0a 20   bytes, xDel);. 
13d90 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
13da0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
13db0 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
13dc0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
13dd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
13de0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13df0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13e00 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69  RROR;.  }..#endi
13e10 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
13e20 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
13e30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
13e40 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
13e50 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 20  ite3_bind_blob  
13e60 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45  STMT N DATA BYTE
13e70 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  S.**.** Test the
13e80 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
13e90 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  ob interface.  S
13ea0 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
13eb0 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
13ec0 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
13ed0 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
13ee0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
13ef0 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
13f00 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
13f10 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c   BLOB to the wil
13f20 64 63 61 72 64 2e 20 20 54 68 65 20 42 4c 4f 42  dcard.  The BLOB
13f30 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73 20   is BYTES bytes 
13f40 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
13f50 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
13f60 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20  _blob(.  void * 
13f70 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
13f80 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
13f90 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
13fa0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
13fb0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
13fc0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
13fd0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
13fe0 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a   bytes;.  char *
13ff0 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
14000 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
14010 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
14020 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14030 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
14040 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
14050 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
14060 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
14070 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
14080 20 44 41 54 41 20 42 59 54 45 53 22 2c 20 30 29   DATA BYTES", 0)
14090 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
140a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
140b0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
140c0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
140d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
140e0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
140f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14100 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
14110 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
14120 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
14130 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14140 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47  .  value = Tcl_G
14150 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
14160 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
14170 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
14180 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
14190 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
141a0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
141b0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
141c0 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  b(pStmt, idx, va
141d0 6c 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49  lue, bytes, SQLI
141e0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
141f0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
14200 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
14210 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
14220 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
14230 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
14240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14250 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14260 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
14270 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
14280 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
14290 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
142a0 65 74 65 72 5f 63 6f 75 6e 74 20 20 53 54 4d 54  eter_count  STMT
142b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
142c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 69 6c 64  e number of wild
142d0 63 61 72 64 73 20 69 6e 20 74 68 65 20 67 69 76  cards in the giv
142e0 65 6e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  en statement..*/
142f0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
14300 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
14310 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  count(.  void * 
14320 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
14330 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14340 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
14350 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
14360 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
14370 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
14380 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
14390 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
143a0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
143b0 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
143c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
143d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
143e0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
143f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
14400 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
14410 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
14420 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
14430 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
14440 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
14450 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e  tObj(sqlite3_bin
14460 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
14470 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  t(pStmt)));.  re
14480 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
14490 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
144a0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
144b0 6d 65 74 65 72 5f 6e 61 6d 65 20 20 53 54 4d 54  meter_name  STMT
144c0 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e    N.**.** Return
144d0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
144e0 20 4e 74 68 20 77 69 6c 64 63 61 72 64 2e 20 20   Nth wildcard.  
144f0 54 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  The first wildca
14500 72 64 20 69 73 20 31 2e 0a 2a 2a 20 41 6e 20 65  rd is 1..** An e
14510 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 72  mpty string is r
14520 65 74 75 72 6e 65 64 20 69 66 20 4e 20 69 73 20  eturned if N is 
14530 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 6f 72 20  out of range or 
14540 69 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 0a  if the wildcard.
14550 2a 2a 20 69 73 20 6e 61 6d 65 6c 65 73 73 2e 0a  ** is nameless..
14560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
14570 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
14580 72 5f 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a  r_name(.  void *
14590 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
145a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
145b0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
145c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
145d0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
145e0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
145f0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
14600 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
14610 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
14620 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
14630 2c 20 22 53 54 4d 54 20 4e 22 29 3b 0a 20 20 20  , "STMT N");.   
14640 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14650 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
14660 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
14670 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
14680 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
14690 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
146a0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
146b0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
146c0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
146d0 20 26 69 29 20 29 20 72 65 74 75 72 6e 20 54 43   &i) ) return TC
146e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
146f0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
14700 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65  rp, .     Tcl_Ne
14710 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
14720 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
14730 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c  r_name(pStmt,i),
14740 2d 31 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  -1).  );.  retur
14750 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
14760 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
14770 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
14780 65 72 5f 69 6e 64 65 78 20 20 53 54 4d 54 20 20  er_index  STMT  
14790 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  NAME.**.** Retur
147a0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
147b0 68 65 20 77 69 6c 64 63 61 72 64 20 63 61 6c 6c  he wildcard call
147c0 65 64 20 4e 41 4d 45 2e 20 20 52 65 74 75 72 6e  ed NAME.  Return
147d0 20 30 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a   0 if there is.*
147e0 2a 20 6e 6f 20 73 75 63 68 20 77 69 6c 64 63 61  * no such wildca
147f0 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
14800 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61  t test_bind_para
14810 6d 65 74 65 72 5f 69 6e 64 65 78 28 0a 20 20 76  meter_index(.  v
14820 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
14830 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
14840 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
14850 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
14860 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
14870 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
14880 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
14890 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
148a0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
148b0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
148c0 54 4d 54 20 4e 41 4d 45 22 29 3b 0a 20 20 20 20  TMT NAME");.    
148d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
148e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
148f0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
14900 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
14910 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
14920 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
14930 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
14940 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
14950 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49  , .     Tcl_NewI
14960 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20 20 73 71  ntObj(.       sq
14970 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
14980 65 74 65 72 5f 69 6e 64 65 78 28 70 53 74 6d 74  eter_index(pStmt
14990 2c 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  ,Tcl_GetString(o
149a0 62 6a 76 5b 32 5d 29 29 0a 20 20 20 20 20 29 0a  bjv[2])).     ).
149b0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43    );.  return TC
149c0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
149d0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
149e0 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 53  clear_bindings S
149f0 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  TMT.**.*/.static
14a00 20 69 6e 74 20 74 65 73 74 5f 63 6c 65 61 72 5f   int test_clear_
14a10 62 69 6e 64 69 6e 67 73 28 0a 20 20 76 6f 69 64  bindings(.  void
14a20 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
14a30 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
14a40 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
14a50 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
14a60 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
14a70 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
14a80 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
14a90 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
14aa0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
14ab0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
14ac0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
14ad0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
14ae0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
14af0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
14b00 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
14b10 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
14b20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14b30 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
14b40 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
14b50 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
14b60 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 70  clear_bindings(p
14b70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
14b80 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
14b90 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
14ba0 74 65 33 5f 73 6c 65 65 70 20 4d 49 4c 4c 49 53  te3_sleep MILLIS
14bb0 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74 61 74 69 63  ECONDS.*/.static
14bc0 20 69 6e 74 20 74 65 73 74 5f 73 6c 65 65 70 28   int test_sleep(
14bd0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
14be0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
14bf0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
14c00 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
14c10 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
14c20 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a 0a 20 20  ){.  int ms;..  
14c30 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
14c40 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
14c50 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
14c60 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e  bjv, "MILLISECON
14c70 44 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DS");.    return
14c80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
14c90 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
14ca0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
14cb0 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29 20 29 7b  objv[1], &ms) ){
14cc0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14cd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
14ce0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
14cf0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
14d00 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73 6c 65 65  Obj(sqlite3_slee
14d10 70 28 6d 73 29 29 29 3b 0a 20 20 72 65 74 75 72  p(ms)));.  retur
14d20 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
14d30 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
14d40 33 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a  3_errcode DB.**.
14d50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74  ** Return the st
14d60 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
14d70 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
14d80 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a  recent sqlite3_*
14d90 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   API.** error co
14da0 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45  de. e.g. "SQLITE
14db0 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74  _ERROR"..*/.stat
14dc0 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 63  ic int test_errc
14dd0 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ode(.  void * cl
14de0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
14df0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
14e00 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
14e10 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
14e20 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
14e30 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
14e40 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
14e50 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
14e60 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
14e70 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14e80 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
14e90 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
14ea0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
14eb0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
14ec0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
14ed0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14ee0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
14ef0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
14f00 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
14f10 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
14f20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14f30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
14f40 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28  rcode(db);.  if(
14f50 20 28 72 63 26 30 78 66 66 29 3d 3d 72 63 20 29   (rc&0xff)==rc )
14f60 7b 0a 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20  {.    zBuf[0] = 
14f70 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
14f80 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 2b 25  sprintf(zBuf,"+%
14f90 64 22 2c 20 72 63 3e 3e 38 29 3b 0a 20 20 7d 0a  d", rc>>8);.  }.
14fa0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14fb0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
14fc0 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
14fd0 63 29 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  c), zBuf, 0);.  
14fe0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
14ff0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
15000 20 74 65 73 74 5f 65 72 72 6d 73 67 20 44 42 0a   test_errmsg DB.
15010 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
15020 65 20 55 54 46 2d 38 20 72 65 70 72 65 73 65 6e  e UTF-8 represen
15030 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72  tation of the er
15040 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
15050 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f  ng for the.** mo
15060 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
15070 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f  3_* API call..*/
15080 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
15090 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69 64 20  _errmsg(.  void 
150a0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
150b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
150c0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
150d0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
150e0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
150f0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
15100 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 0a 20  t char *zErr;.. 
15110 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
15120 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
15130 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
15140 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
15150 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
15160 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
15170 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22  (objv[0]), " DB"
15180 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
15190 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
151a0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
151b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
151c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
151d0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
151e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a   TCL_ERROR;..  z
151f0 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72  Err = sqlite3_er
15200 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63 6c 5f  rmsg(db);.  Tcl_
15210 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
15220 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
15230 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31 29 29  ngObj(zErr, -1))
15240 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
15250 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
15260 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67  e:   test_errmsg
15270 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  16 DB.**.** Retu
15280 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36 20 72  rns the UTF-16 r
15290 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
152a0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
152b0 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ge string for th
152c0 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
152d0 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63   sqlite3_* API c
152e0 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61 20 62  all. This is a b
152f0 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65 63 74  yte array object
15300 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a 2a 20   at the TCL .** 
15310 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20 69 6e  level, and it in
15320 63 6c 75 64 65 73 20 74 68 65 20 30 78 30 30 20  cludes the 0x00 
15330 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20  0x00 terminator 
15340 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e 64  bytes at the end
15350 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46 2d 31   of the.** UTF-1
15360 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  6 string..*/.sta
15370 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72  tic int test_err
15380 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  msg16(.  void * 
15390 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
153a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
153b0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
153c0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
153d0 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
153e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
153f0 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  16.  sqlite3 *db
15400 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
15410 7a 45 72 72 3b 0a 20 20 69 6e 74 20 62 79 74 65  zErr;.  int byte
15420 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62  s = 0;..  if( ob
15430 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
15440 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15450 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
15460 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
15470 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
15480 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
15490 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
154a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
154b0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
154c0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
154d0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
154e0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
154f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15500 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73  ROR;..  zErr = s
15510 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
15520 64 62 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  db);.  if( zErr 
15530 29 7b 0a 20 20 20 20 62 79 74 65 73 20 3d 20 73  ){.    bytes = s
15540 71 6c 69 74 65 33 55 74 66 31 36 42 79 74 65 4c  qlite3Utf16ByteL
15550 65 6e 28 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20  en(zErr, -1);.  
15560 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
15570 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
15580 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
15590 28 7a 45 72 72 2c 20 62 79 74 65 73 29 29 3b 0a  (zErr, bytes));.
155a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
155b0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
155c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
155d0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
155e0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20  sqlite3_prepare 
155f0 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69  DB sql bytes tai
15600 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  lvar.**.** Compi
15610 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e  le up to <bytes>
15620 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75   bytes of the su
15630 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e  pplied SQL strin
15640 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a  g <sql> using.**
15650 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
15660 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d   <DB>. The param
15670 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69  eter <tailval> i
15680 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
15690 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62  global.** variab
156a0 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74  le that is set t
156b0 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72  o the unused por
156c0 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69  tion of <sql> (i
156d0 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d  f any). A.** STM
156e0 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75  T handle is retu
156f0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
15700 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
15710 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
15720 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
15730 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
15740 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
15750 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
15760 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
15770 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
15780 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74  *zSql;.  int byt
15790 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  es;.  const char
157a0 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73   *zTail = 0;.  s
157b0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
157c0 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  mt = 0;.  char z
157d0 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72  Buf[50];.  int r
157e0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
157f0 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
15800 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15810 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
15820 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
15830 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
15840 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
15850 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  " DB sql bytes t
15860 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20  ailvar", 0);.   
15870 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15880 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
15890 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
158a0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
158b0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
158c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
158d0 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
158e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
158f0 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
15900 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
15910 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  rp, objv[3], &by
15920 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
15930 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
15940 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
15950 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
15960 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c  , &pStmt, &zTail
15970 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
15980 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
15990 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
159a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
159b0 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
159c0 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20     if( bytes>=0 
159d0 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d  ){.      bytes =
159e0 20 62 79 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d   bytes - (zTail-
159f0 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
15a00 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
15a10 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
15a20 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   0, Tcl_NewStrin
15a30 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65  gObj(zTail, byte
15a40 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  s), 0);.  }.  if
15a50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15a60 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15a70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
15a80 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25  printf(zBuf, "(%
15a90 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
15aa0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15ab0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
15ac0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
15ad0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
15ae0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
15af0 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
15b00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
15b10 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
15b20 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
15b30 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
15b40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
15b50 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15b60 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
15b70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
15b80 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
15b90 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
15ba0 72 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c  repare_v2 DB sql
15bb0 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a   bytes tailvar.*
15bc0 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
15bd0 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
15be0 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
15bf0 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
15c00 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
15c10 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
15c20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
15c30 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
15c40 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
15c50 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
15c60 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
15c70 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
15c80 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
15c90 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
15ca0 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
15cb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
15cc0 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28 0a 20  st_prepare_v2(. 
15cd0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
15ce0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
15cf0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
15d00 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
15d10 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
15d20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
15d30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
15d40 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  ql;.  int bytes;
15d50 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15d60 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Tail = 0;.  sqli
15d70 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
15d80 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
15d90 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
15da0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
15db0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
15dc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
15dd0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
15de0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
15df0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
15e00 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
15e10 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
15e20 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  var", 0);.    re
15e30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15e40 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
15e50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
15e60 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
15e70 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
15e80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15e90 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74    zSql = Tcl_Get
15ea0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
15eb0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
15ec0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
15ed0 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73   objv[3], &bytes
15ee0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15ef0 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
15f00 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
15f10 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
15f20 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c  , &pStmt, &zTail
15f30 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d  );.  assert(rc==
15f40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74  SQLITE_OK || pSt
15f50 6d 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 73 71  mt==0);.  if( sq
15f60 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
15f70 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
15f80 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15f90 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c  ROR;.  if( zTail
15fa0 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65   ){.    if( byte
15fb0 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79  s>=0 ){.      by
15fc0 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 7a  tes = bytes - (z
15fd0 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20  Tail-zSql);.    
15fe0 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74  }.    Tcl_ObjSet
15ff0 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
16000 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77  v[4], 0, Tcl_New
16010 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c  StringObj(zTail,
16020 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d   bytes), 0);.  }
16030 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16040 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
16050 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  rt( pStmt==0 );.
16060 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
16070 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
16080 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16090 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
160a0 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  f, sqlite3_errms
160b0 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
160c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
160d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
160e0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
160f0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
16100 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
16110 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
16120 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16130 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16140 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
16150 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
16160 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
16170 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
16180 74 65 33 5f 70 72 65 70 61 72 65 31 36 20 44 42  te3_prepare16 DB
16190 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76   sql bytes tailv
161a0 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  ar.**.** Compile
161b0 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62   up to <bytes> b
161c0 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70  ytes of the supp
161d0 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20  lied SQL string 
161e0 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64  <sql> using.** d
161f0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
16200 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74  DB>. The paramet
16210 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20  er <tailval> is 
16220 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c  the name of a gl
16230 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  obal.** variable
16240 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20   that is set to 
16250 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69  the unused porti
16260 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20  on of <sql> (if 
16270 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20  any). A.** STMT 
16280 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e  handle is return
16290 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
162a0 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36  t test_prepare16
162b0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
162c0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
162d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
162e0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
162f0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
16300 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
16310 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
16320 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
16330 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b  onst void *zSql;
16340 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
16350 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f  Tail = 0;.  Tcl_
16360 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a  Obj *pTail = 0;.
16370 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
16380 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
16390 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69  r zBuf[50]; .  i
163a0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74  nt rc;.  int byt
163b0 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
163c0 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
163d0 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61  r specified as a
163e0 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  rg 3 */.  int ob
163f0 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  jlen;           
16400 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d      /* The byte-
16410 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20  array length of 
16420 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20  arg 2 */..  if( 
16430 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  objc!=5 ){.    T
16440 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16450 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
16460 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
16470 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
16480 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
16490 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
164a0 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30  ytes tailvar", 0
164b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
164c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
164d0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
164e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
164f0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
16500 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
16510 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20  L_ERROR;.  zSql 
16520 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
16530 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
16540 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69  ], &objlen);.  i
16550 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
16560 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
16570 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
16580 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16590 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
165a0 33 5f 70 72 65 70 61 72 65 31 36 28 64 62 2c 20  3_prepare16(db, 
165b0 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
165c0 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20  tmt, &zTail);.  
165d0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
165e0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
165f0 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
16600 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
16610 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
16620 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16630 0a 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b  ..  if( zTail ){
16640 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62  .    objlen = ob
16650 6a 6c 65 6e 20 2d 20 28 28 75 38 20 2a 29 7a 54  jlen - ((u8 *)zT
16660 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b  ail-(u8 *)zSql);
16670 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 62  .  }else{.    ob
16680 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  jlen = 0;.  }.  
16690 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42  pTail = Tcl_NewB
166a0 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20  yteArrayObj((u8 
166b0 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29  *)zTail, objlen)
166c0 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
166d0 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 54  ount(pTail);.  T
166e0 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
166f0 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30  terp, objv[4], 0
16700 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 54  , pTail, 0);.  T
16710 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
16720 70 54 61 69 6c 29 3b 0a 0a 20 20 69 66 28 20 70  pTail);..  if( p
16730 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
16740 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
16750 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
16760 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
16770 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16780 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  R;.  }.  Tcl_App
16790 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
167a0 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64  , zBuf, 0);.#end
167b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
167c0 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
167d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
167e0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
167f0 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32  te3_prepare16_v2
16800 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
16810 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  ilvar.**.** Comp
16820 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73  ile up to <bytes
16830 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73  > bytes of the s
16840 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69  upplied SQL stri
16850 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a  ng <sql> using.*
16860 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
16870 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61  e <DB>. The para
16880 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20  meter <tailval> 
16890 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
168a0 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61   global.** varia
168b0 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20  ble that is set 
168c0 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f  to the unused po
168d0 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28  rtion of <sql> (
168e0 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54  if any). A.** ST
168f0 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74  MT handle is ret
16900 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
16910 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72   int test_prepar
16920 65 31 36 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a  e16_v2(.  void *
16930 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
16940 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
16950 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
16960 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
16970 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
16980 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
16990 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
169a0 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
169b0 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76  *zSql;.  const v
169c0 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  oid *zTail = 0;.
169d0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c    Tcl_Obj *pTail
169e0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
169f0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
16a00 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
16a10 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ; .  int rc;.  i
16a20 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20  nt bytes;       
16a30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16a40 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65  integer specifie
16a50 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20  d as arg 3 */.  
16a60 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20  int objlen;     
16a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16a80 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67   byte-array leng
16a90 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a  th of arg 2 */..
16aa0 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b    if( objc!=5 ){
16ab0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
16ac0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
16ad0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
16ae0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
16af0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
16b00 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
16b10 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76   sql bytes tailv
16b20 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ar", 0);.    ret
16b30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16b40 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
16b50 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
16b60 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
16b70 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
16b80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16b90 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42   zSql = Tcl_GetB
16ba0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
16bb0 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e  objv[2], &objlen
16bc0 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
16bd0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
16be0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74  p, objv[3], &byt
16bf0 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
16c00 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
16c10 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
16c20 36 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62  6_v2(db, zSql, b
16c30 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 26 7a  ytes, &pStmt, &z
16c40 54 61 69 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c  Tail);.  if( sql
16c50 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
16c60 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
16c70 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16c80 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  OR;.  if( rc ){.
16c90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16ca0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
16cb0 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 6f 62   zTail ){.    ob
16cc0 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20  jlen = objlen - 
16cd0 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38  ((u8 *)zTail-(u8
16ce0 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73   *)zSql);.  }els
16cf0 65 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  e{.    objlen = 
16d00 30 3b 0a 20 20 7d 0a 20 20 70 54 61 69 6c 20 3d  0;.  }.  pTail =
16d10 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
16d20 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c  yObj((u8 *)zTail
16d30 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 54 63 6c  , objlen);.  Tcl
16d40 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _IncrRefCount(pT
16d50 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 53  ail);.  Tcl_ObjS
16d60 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
16d70 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c  bjv[4], 0, pTail
16d80 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
16d90 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
16da0 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
16db0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16dc0 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
16dd0 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
16de0 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
16df0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
16e00 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
16e10 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
16e20 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53   0);.#endif /* S
16e30 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
16e40 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
16e50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
16e60 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65  age: sqlite3_ope
16e70 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69  n filename ?opti
16e80 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61  ons-list?.*/.sta
16e90 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65  tic int test_ope
16ea0 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
16eb0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
16ec0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
16ed0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
16ee0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
16ef0 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ].){.  const cha
16f00 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  r *zFilename;.  
16f10 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
16f20 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42  nt rc;.  char zB
16f30 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
16f40 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21  objc!=3 && objc!
16f50 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
16f60 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
16f70 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
16f80 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
16f90 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
16fa0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
16fb0 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69   " filename opti
16fc0 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20  ons-list", 0);. 
16fd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16fe0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c  ROR;.  }..  zFil
16ff0 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  ename = Tcl_GetS
17000 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
17010 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
17020 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  pen(zFilename, &
17030 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71  db);.  .  if( sq
17040 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
17050 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
17060 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75  zBuf, db) ) retu
17070 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17080 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17090 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
170a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
170b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
170c0 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ge: sqlite3_open
170d0 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69  16 filename opti
170e0 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ons.*/.static in
170f0 74 20 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20  t test_open16(. 
17100 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
17110 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
17120 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
17130 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
17140 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
17150 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17160 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e  OMIT_UTF16.  con
17170 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61  st void *zFilena
17180 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  me;.  sqlite3 *d
17190 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  b;.  int rc;.  c
171a0 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
171b0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
171c0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
171d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
171e0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
171f0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
17200 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17210 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69  g(objv[0]), " fi
17220 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c  lename options-l
17230 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ist", 0);.    re
17240 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17250 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65    }..  zFilename
17260 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
17270 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
17280 31 5d 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  1], 0);.  rc = s
17290 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46  qlite3_open16(zF
172a0 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20  ilename, &db);. 
172b0 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54   .  if( sqlite3T
172c0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
172d0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
172e0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
172f0 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70  _ERROR;.  Tcl_Ap
17300 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17310 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e  p, zBuf, 0);.#en
17320 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
17330 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
17340 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
17350 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
17360 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20  ite3_complete16 
17370 3c 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a  <UTF-16 string>.
17380 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  **.** Return 1 i
17390 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 61  f the supplied a
173a0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d  rgument is a com
173b0 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d  plete SQL statem
173c0 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  ent, or zero.** 
173d0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
173e0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
173f0 6d 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64  mplete16(.  void
17400 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
17410 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
17420 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
17430 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
17440 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20  T objv[].){.#if 
17450 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
17460 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26  OMIT_COMPLETE) &
17470 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
17480 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20  E_OMIT_UTF16).  
17490 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69  char *zBuf;..  i
174a0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
174b0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
174c0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
174d0 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c  jv, "<utf-16 sql
174e0 3e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  >");.    return 
174f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
17500 20 20 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29    zBuf = (char*)
17510 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
17520 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
17530 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62   0);.  Tcl_SetOb
17540 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
17550 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
17560 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36  lite3_complete16
17570 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66  (zBuf)));.#endif
17580 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
17590 43 4f 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49  COMPLETE && SQLI
175a0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
175b0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
175c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
175d0 3a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 53  : sqlite3_step S
175e0 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63  TMT.**.** Advanc
175f0 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
17600 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e  to the next row.
17610 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
17620 65 73 74 5f 73 74 65 70 28 0a 20 20 76 6f 69 64  est_step(.  void
17630 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
17640 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
17650 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
17660 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
17670 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
17680 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
17690 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
176a0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
176b0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
176c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
176d0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
176e0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
176f0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
17700 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
17710 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
17720 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17730 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
17740 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
17750 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
17760 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
17770 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17780 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
17790 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a  3_step(pStmt);..
177a0 20 20 2f 2a 20 69 66 28 20 72 63 21 3d 53 51 4c    /* if( rc!=SQL
177b0 49 54 45 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d  ITE_DONE && rc!=
177c0 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 72 65 74  SQLITE_ROW ) ret
177d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 2a  urn TCL_ERROR; *
177e0 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  /.  Tcl_SetResul
177f0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
17800 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
17810 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
17820 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
17830 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
17840 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d  column_count STM
17850 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
17860 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
17870 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
17880 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  y the sql statem
17890 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61  ent STMT..*/.sta
178a0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
178b0 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  umn_count(.  voi
178c0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
178d0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
178e0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
178f0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
17900 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
17910 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
17920 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
17930 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
17940 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17950 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
17960 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
17970 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
17980 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
17990 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
179a0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
179b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
179c0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
179d0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
179e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
179f0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
17a00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17a10 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
17a20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
17a30 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
17a40 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
17a50 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75  pStmt)));.  retu
17a60 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
17a70 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
17a80 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53  e3_column_type S
17a90 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
17aa0 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65   Return the type
17ab0 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e 20   of the data in 
17ac0 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20  column 'column' 
17ad0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
17ae0 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
17af0 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79  t test_column_ty
17b00 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  pe(.  void * cli
17b10 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17b20 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17b30 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17b40 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17b50 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
17b60 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
17b70 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70  nt col;.  int tp
17b80 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
17b90 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
17ba0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
17bb0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
17bc0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
17bd0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
17be0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
17bf0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
17c00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17c10 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
17c20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
17c30 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
17c40 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
17c50 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
17c60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17c70 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17c80 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17c90 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
17ca0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17cb0 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74 65  ;..  tp = sqlite
17cc0 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
17cd0 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69  tmt, col);.  swi
17ce0 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20 63  tch( tp ){.    c
17cf0 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
17d00 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f 53  ER: .      Tcl_S
17d10 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
17d20 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f   "INTEGER", TCL_
17d30 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
17d40 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
17d50 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20  SQLITE_NULL:.   
17d60 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
17d70 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c  (interp, "NULL",
17d80 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20   TCL_STATIC); . 
17d90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17da0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
17db0 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  T:.      Tcl_Set
17dc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
17dd0 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41 54  FLOAT", TCL_STAT
17de0 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
17df0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
17e00 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 54  TE_TEXT:.      T
17e10 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
17e20 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43 4c  erp, "TEXT", TCL
17e30 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
17e40 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
17e50 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20   SQLITE_BLOB:.  
17e60 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
17e70 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22  t(interp, "BLOB"
17e80 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
17e90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17ea0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
17eb0 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a  assert(0);.  }..
17ec0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
17ed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
17ee0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
17ef0 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d  int64 STMT colum
17f00 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
17f10 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d  he data in colum
17f20 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68  n 'column' of th
17f30 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61  e current row ca
17f40 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65  st as an.** wide
17f50 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67 65   (64-bit) intege
17f60 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
17f70 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   test_column_int
17f80 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  64(.  void * cli
17f90 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17fa0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17fb0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17fc0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17fd0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
17fe0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
17ff0 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69 56  nt col;.  i64 iV
18000 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  al;..  if( objc!
18010 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
18020 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
18030 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
18040 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
18050 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
18060 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
18070 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
18080 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
18090 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
180a0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
180b0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
180c0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
180d0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
180e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
180f0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
18100 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
18110 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
18120 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18130 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73 71  OR;..  iVal = sq
18140 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
18150 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  64(pStmt, col);.
18160 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
18170 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
18180 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56 61  ewWideIntObj(iVa
18190 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
181a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
181b0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
181c0 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20 63  lumn_blob STMT c
181d0 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  olumn.*/.static 
181e0 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
181f0 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63  blob(.  void * c
18200 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
18210 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18220 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
18230 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
18240 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
18250 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
18260 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74   int col;..  int
18270 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   len;.  const vo
18280 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69 66  id *pBlob;..  if
18290 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
182a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
182b0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
182c0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
182d0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
182e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
182f0 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
18300 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
18310 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18320 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
18330 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
18340 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
18350 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
18360 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
18370 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
18380 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
18390 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
183a0 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
183b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 6c 65  TCL_ERROR;..  le
183c0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
183d0 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
183e0 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20  col);.  pBlob = 
183f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
18400 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  lob(pStmt, col);
18410 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
18420 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
18430 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
18440 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20 20  pBlob, len));.  
18450 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
18460 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
18470 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
18480 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  uble STMT column
18490 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
184a0 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e  e data in column
184b0 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65   'column' of the
184c0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73   current row cas
184d0 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a 2a  t as a double..*
184e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
184f0 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  t_column_double(
18500 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
18510 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
18520 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
18530 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
18540 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
18550 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
18560 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
18570 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72 56  col;.  double rV
18580 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  al;..  if( objc!
18590 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
185a0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
185b0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
185c0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
185d0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
185e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
185f0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
18600 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
18610 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
18620 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
18630 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
18640 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18650 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
18660 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18670 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
18680 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
18690 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
186a0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
186b0 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73 71  OR;..  rVal = sq
186c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
186d0 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  ble(pStmt, col);
186e0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
186f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
18700 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56 61  NewDoubleObj(rVa
18710 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
18720 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18730 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64 61  sage: sqlite3_da
18740 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a  ta_count STMT .*
18750 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18760 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
18770 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
18780 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  e sql statement 
18790 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  STMT..*/.static 
187a0 69 6e 74 20 74 65 73 74 5f 64 61 74 61 5f 63 6f  int test_data_co
187b0 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  unt(.  void * cl
187c0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
187d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
187e0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
187f0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
18800 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
18810 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
18820 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
18830 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
18840 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
18850 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
18860 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
18870 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
18880 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
18890 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
188a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
188b0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
188c0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
188d0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
188e0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
188f0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
18900 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63  TCL_ERROR;..  Tc
18910 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
18920 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
18930 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61 74  tObj(sqlite3_dat
18940 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  a_count(pStmt)))
18950 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
18960 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
18970 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
18980 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
18990 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
189a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
189b0 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
189c0 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
189d0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
189e0 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
189f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18a00 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a 20  est_stmt_utf8(. 
18a10 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
18a20 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ta,        /* Po
18a30 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20  inter to SQLite 
18a40 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  API function to 
18a50 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54  be invoke */.  T
18a60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18a70 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18a80 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18a90 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
18aa0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
18ab0 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f  .  int col;.  co
18ac0 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75 6e  nst char *(*xFun
18ad0 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  c)(sqlite3_stmt*
18ae0 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44  , int) = clientD
18af0 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ata;.  const cha
18b00 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 69 66 28 20  r *zRet;..  if( 
18b10 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
18b20 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
18b30 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
18b40 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
18b50 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
18b60 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
18b70 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
18b80 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
18b90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18ba0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
18bb0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
18bc0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
18bd0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
18be0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18bf0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
18c00 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
18c10 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
18c20 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
18c30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20  L_ERROR;.  zRet 
18c40 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
18c50 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20  ol);.  if( zRet 
18c60 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
18c70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
18c80 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20  ar *)zRet, 0);. 
18c90 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
18ca0 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
18cb0 74 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65  t test_global_re
18cc0 63 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20  cover(.  void * 
18cd0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18ce0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18cf0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18d00 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18d10 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
18d20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f   SQLITE_OMIT_GLO
18d30 42 41 4c 52 45 43 4f 56 45 52 0a 20 20 69 6e 74  BALRECOVER.  int
18d40 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21   rc;.  if( objc!
18d50 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
18d60 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
18d70 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 1, objv, "");
18d80 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18d90 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
18da0 3d 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c  = sqlite3_global
18db0 5f 72 65 63 6f 76 65 72 28 29 3b 0a 20 20 54 63  _recover();.  Tc
18dc0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
18dd0 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
18de0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
18df0 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e 64 69 66  _STATIC);.#endif
18e00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
18e10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
18e20 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
18e30 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d  _text STMT colum
18e40 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
18e50 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
18e60 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75  cltype STMT colu
18e70 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
18e80 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
18e90 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ame STMT column.
18ea0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
18eb0 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a 20  st_stmt_utf16(. 
18ec0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
18ed0 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ta,     /* Point
18ee0 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49  er to SQLite API
18ef0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
18f00 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c  invoked */.  Tcl
18f10 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18f20 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
18f30 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
18f40 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
18f50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
18f60 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  6.  sqlite3_stmt
18f70 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
18f80 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ol;.  Tcl_Obj *p
18f90 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Ret;.  const voi
18fa0 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f  d *zName16;.  co
18fb0 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e  nst void *(*xFun
18fc0 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  c)(sqlite3_stmt*
18fd0 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44  , int) = clientD
18fe0 61 74 61 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ata;..  if( objc
18ff0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
19000 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19010 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
19020 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
19030 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
19040 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
19050 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
19060 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
19070 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19080 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
19090 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
190a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
190b0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
190c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
190d0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
190e0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
190f0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
19100 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19110 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20  ROR;..  zName16 
19120 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
19130 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ol);.  if( zName
19140 31 36 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  16 ){.    pRet =
19150 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
19160 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 73 71  yObj(zName16, sq
19170 6c 69 74 65 33 55 74 66 31 36 42 79 74 65 4c 65  lite3Utf16ByteLe
19180 6e 28 7a 4e 61 6d 65 31 36 2c 20 2d 31 29 2b 32  n(zName16, -1)+2
19190 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
191a0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
191b0 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  pRet);.  }.#endi
191c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
191d0 5f 55 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74  _UTF16 */..  ret
191e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
191f0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
19200 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53  te3_column_int S
19210 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
19220 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
19230 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d  column_bytes STM
19240 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
19250 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
19260 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54 4d  lumn_bytes16 STM
19270 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73  T column.**.*/.s
19280 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
19290 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20  tmt_int(.  void 
192a0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  * clientData,   
192b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
192c0 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69  QLite API functi
192d0 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  on to be invoked
192e0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
192f0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
19300 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
19310 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
19320 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
19330 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
19340 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63  l;.  int (*xFunc
19350 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
19360 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44 61   int) = clientDa
19370 74 61 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ta;..  if( objc!
19380 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
19390 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
193a0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
193b0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
193c0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
193d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
193e0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
193f0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
19400 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
19410 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
19420 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
19430 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19440 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
19450 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19460 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
19470 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
19480 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
19490 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
194a0 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  OR;..  Tcl_SetOb
194b0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
194c0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46  Tcl_NewIntObj(xF
194d0 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29  unc(pStmt, col))
194e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
194f0 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
19500 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
19510 4f 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  O./*.** Usage:  
19520 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
19530 64 57 72 69 74 65 20 3c 66 69 6c 65 6e 61 6d 65  dWrite <filename
19540 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  >.*/.static int 
19550 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4f 70  test_sqlite3OsOp
19560 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20 76  enReadWrite(.  v
19570 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
19580 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
19590 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
195a0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
195b0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
195c0 20 4f 73 46 69 6c 65 20 2a 70 46 69 6c 65 3b 0a   OsFile *pFile;.
195d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
195e0 64 75 6d 6d 79 3b 0a 20 20 63 68 61 72 20 7a 42  dummy;.  char zB
195f0 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
19600 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
19610 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19620 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
19630 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
19640 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
19650 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19660 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65  [0]), " filename
19670 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
19680 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19690 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
196a0 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
196b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
196c0 6a 76 5b 31 5d 29 2c 20 26 70 46 69 6c 65 2c 20  jv[1]), &pFile, 
196d0 26 64 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72  &dummy);.  if( r
196e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
196f0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
19700 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
19710 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
19720 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
19730 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19740 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  RROR;.  }.  sqli
19750 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
19760 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
19770 75 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20 54 63  uf, pFile);.  Tc
19780 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
19790 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
197a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
197b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
197c0 3a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  :  sqlite3OsClos
197d0 65 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e 0a  e <file handle>.
197e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
197f0 73 74 5f 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  st_sqlite3OsClos
19800 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
19810 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
19820 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
19830 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
19840 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
19850 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 70  ].){.  OsFile *p
19860 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  File;.  int rc;.
19870 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
19880 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
19890 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
198a0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
198b0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
198c0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
198d0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66  ng(objv[0]), " f
198e0 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30 29 3b 0a  ilehandle", 0);.
198f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19900 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
19910 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   getFilePointer(
19920 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
19930 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
19940 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72  &pFile) ){.    r
19950 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19960 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
19970 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 46 69 6c  te3OsClose(&pFil
19980 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
19990 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
199a0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
199b0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
199c0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
199d0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
199e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
199f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
19a00 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
19a10 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 4f 73  sage:  sqlite3Os
19a20 4c 6f 63 6b 20 3c 66 69 6c 65 20 68 61 6e 64 6c  Lock <file handl
19a30 65 3e 20 3c 6c 6f 63 6b 74 79 70 65 3e 0a 2a 2f  e> <locktype>.*/
19a40 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
19a50 5f 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 0a  _sqlite3OsLock(.
19a60 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
19a70 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
19a80 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
19a90 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
19aa0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
19ab0 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 20 70 46 69  {.  OsFile * pFi
19ac0 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  le;.  int rc;.. 
19ad0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
19ae0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19af0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
19b00 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
19b10 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
19b20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
19b30 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 0a 20 20 20  g(objv[0]), .   
19b40 20 20 20 20 20 22 20 66 69 6c 65 68 61 6e 64 6c       " filehandl
19b50 65 20 28 53 48 41 52 45 44 7c 52 45 53 45 52 56  e (SHARED|RESERV
19b60 45 44 7c 50 45 4e 44 49 4e 47 7c 45 58 43 4c 55  ED|PENDING|EXCLU
19b70 53 49 56 45 29 22 2c 20 30 29 3b 0a 20 20 20 20  SIVE)", 0);.    
19b80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19b90 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
19ba0 46 69 6c 65 50 6f 69 6e 74 65 72 28 69 6e 74 65  FilePointer(inte
19bb0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
19bc0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 46 69  g(objv[1]), &pFi
19bd0 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  le) ){.    retur
19be0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19bf0 0a 0a 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d  ..  if( 0==strcm
19c00 70 28 22 53 48 41 52 45 44 22 2c 20 54 63 6c 5f  p("SHARED", Tcl_
19c10 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
19c20 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ])) ){.    rc = 
19c30 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46  sqlite3OsLock(pF
19c40 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ile, SHARED_LOCK
19c50 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
19c60 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 52 45 53  ( 0==strcmp("RES
19c70 45 52 56 45 44 22 2c 20 54 63 6c 5f 47 65 74 53  ERVED", Tcl_GetS
19c80 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20  tring(objv[2])) 
19c90 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
19ca0 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c  te3OsLock(pFile,
19cb0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
19cc0 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20  .  }.  else if( 
19cd0 30 3d 3d 73 74 72 63 6d 70 28 22 50 45 4e 44 49  0==strcmp("PENDI
19ce0 4e 47 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  NG", Tcl_GetStri
19cf0 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a  ng(objv[2])) ){.
19d00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19d10 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 50 45  OsLock(pFile, PE
19d20 4e 44 49 4e 47 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  NDING_LOCK);.  }
19d30 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73  .  else if( 0==s
19d40 74 72 63 6d 70 28 22 45 58 43 4c 55 53 49 56 45  trcmp("EXCLUSIVE
19d50 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
19d60 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20  (objv[2])) ){.  
19d70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19d80 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 45 58 43 4c  Lock(pFile, EXCL
19d90 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  USIVE_LOCK);.  }
19da0 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70  else{.    Tcl_Ap
19db0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19dc0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
19dd0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
19de0 20 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65   .        Tcl_Ge
19df0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
19e00 2c 20 0a 20 20 20 20 20 20 20 20 22 20 66 69 6c  , .        " fil
19e10 65 68 61 6e 64 6c 65 20 28 53 48 41 52 45 44 7c  ehandle (SHARED|
19e20 52 45 53 45 52 56 45 44 7c 50 45 4e 44 49 4e 47  RESERVED|PENDING
19e30 7c 45 58 43 4c 55 53 49 56 45 29 22 2c 20 30 29  |EXCLUSIVE)", 0)
19e40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
19e50 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
19e60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19e70 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
19e80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
19e90 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
19ea0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
19eb0 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
19ec0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
19ed0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
19ee0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
19ef0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 20  sqlite3OsUnlock 
19f00 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e 0a 2a 2f  <file handle>.*/
19f10 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
19f20 5f 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b  _sqlite3OsUnlock
19f30 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
19f40 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
19f50 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
19f60 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
19f70 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
19f80 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 20 70  .){.  OsFile * p
19f90 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  File;.  int rc;.
19fa0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
19fb0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
19fc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
19fd0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
19fe0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
19ff0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1a000 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66  ng(objv[0]), " f
1a010 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30 29 3b 0a  ilehandle", 0);.
1a020 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a030 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1a040 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   getFilePointer(
1a050 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1a060 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1a070 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72  &pFile) ){.    r
1a080 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a090 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
1a0a0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 69 6c  te3OsUnlock(pFil
1a0b0 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 69  e, NO_LOCK);.  i
1a0c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a0d0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
1a0e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1a0f0 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
1a100 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
1a110 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
1a120 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a130 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1a140 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1a150 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c  sqlite3OsTempFil
1a160 65 4e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63 20  eName.*/.static 
1a170 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33  int test_sqlite3
1a180 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 0a  OsTempFileName(.
1a190 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1a1a0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1a1b0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1a1c0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1a1d0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1a1e0 7b 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53  {.  char zFile[S
1a1f0 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
1a200 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  IZE];.  int rc;.
1a210 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1a220 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46  sTempFileName(zF
1a230 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
1a240 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a250 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1a260 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
1a270 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
1a280 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
1a290 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a2a0 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  R;.  }.  Tcl_App
1a2b0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a2c0 2c 20 7a 46 69 6c 65 2c 20 30 29 3b 0a 20 20 72  , zFile, 0);.  r
1a2d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1a2e0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73  #endif../*.** Us
1a2f0 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 73 65 74  age:  sqlite_set
1a300 5f 6d 61 67 69 63 20 20 44 42 20 20 4d 41 47 49  _magic  DB  MAGI
1a310 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53  C-NUMBER.**.** S
1a320 65 74 20 74 68 65 20 64 62 2d 3e 6d 61 67 69 63  et the db->magic
1a330 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73   value.  This is
1a340 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 65 72   used to test er
1a350 72 6f 72 20 72 65 63 6f 76 65 72 79 20 6c 6f 67  ror recovery log
1a360 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ic..*/.static in
1a370 74 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67  t sqlite_set_mag
1a380 69 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ic(.  void * cli
1a390 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1a3a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1a3b0 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
1a3c0 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71  r **argv.){.  sq
1a3d0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
1a3e0 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
1a3f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a400 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a410 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a420 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
1a430 20 20 20 20 20 20 20 20 20 22 20 44 42 20 4d 41           " DB MA
1a440 47 49 43 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  GIC", 0);.    re
1a450 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a460 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1a470 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
1a480 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
1a490 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a4a0 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  .  if( strcmp(ar
1a4b0 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
1a4c0 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29  AGIC_OPEN")==0 )
1a4d0 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
1a4e0 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  = SQLITE_MAGIC_O
1a4f0 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  PEN;.  }else if(
1a500 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c   strcmp(argv[2],
1a510 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43   "SQLITE_MAGIC_C
1a520 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20  LOSED")==0 ){.  
1a530 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
1a540 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45  LITE_MAGIC_CLOSE
1a550 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  D;.  }else if( s
1a560 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
1a570 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
1a580 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  Y")==0 ){.    db
1a590 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
1a5a0 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d  _MAGIC_BUSY;.  }
1a5b0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1a5c0 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45  argv[2], "SQLITE
1a5d0 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d  _MAGIC_ERROR")==
1a5e0 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
1a5f0 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
1a600 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  C_ERROR;.  }else
1a610 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
1a620 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
1a630 20 26 64 62 2d 3e 6d 61 67 69 63 29 20 29 7b 0a   &db->magic) ){.
1a640 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a650 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
1a660 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1a670 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1a680 74 65 33 5f 69 6e 74 65 72 72 75 70 74 20 20 44  te3_interrupt  D
1a690 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67 67 65 72  B .**.** Trigger
1a6a0 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20 6f 6e   an interrupt on
1a6b0 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   DB.*/.static in
1a6c0 74 20 74 65 73 74 5f 69 6e 74 65 72 72 75 70 74  t test_interrupt
1a6d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1a6e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1a6f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1a700 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1a710 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
1a720 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1a730 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
1a740 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a750 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1a760 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1a770 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20  \"", argv[0], " 
1a780 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1a790 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a7a0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1a7b0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1a7c0 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1a7d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a7e0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72    sqlite3_interr
1a7f0 75 70 74 28 64 62 29 3b 0a 20 20 72 65 74 75 72  upt(db);.  retur
1a800 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  n TCL_OK;.}..sta
1a810 74 69 63 20 75 38 20 2a 73 71 6c 69 74 65 33 5f  tic u8 *sqlite3_
1a820 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d  stack_baseline =
1a830 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20   0;../*.** Fill 
1a840 74 68 65 20 73 74 61 63 6b 20 77 69 74 68 20 61  the stack with a
1a850 20 6b 6e 6f 77 6e 20 62 69 74 70 61 74 74 65 72   known bitpatter
1a860 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1a870 64 20 70 72 65 70 53 74 61 63 6b 28 76 6f 69 64  d prepStack(void
1a880 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33  ){.  int i;.  u3
1a890 32 20 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b  2 bigBuf[65536];
1a8a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
1a8b0 7a 65 6f 66 28 62 69 67 42 75 66 29 3b 20 69 2b  zeof(bigBuf); i+
1a8c0 2b 29 20 62 69 67 42 75 66 5b 69 5d 20 3d 20 30  +) bigBuf[i] = 0
1a8d0 78 64 65 61 64 62 65 65 66 3b 0a 20 20 73 71 6c  xdeadbeef;.  sql
1a8e0 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c  ite3_stack_basel
1a8f0 69 6e 65 20 3d 20 28 75 38 2a 29 26 62 69 67 42  ine = (u8*)&bigB
1a900 75 66 5b 36 35 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a  uf[65536];.}../*
1a910 0a 2a 2a 20 47 65 74 20 74 68 65 20 63 75 72 72  .** Get the curr
1a920 65 6e 74 20 73 74 61 63 6b 20 64 65 70 74 68 2e  ent stack depth.
1a930 20 20 55 73 65 64 20 66 6f 72 20 64 65 62 75 67    Used for debug
1a940 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36  ging only..*/.u6
1a950 34 20 73 71 6c 69 74 65 33 53 74 61 63 6b 44 65  4 sqlite3StackDe
1a960 70 74 68 28 76 6f 69 64 29 7b 0a 20 20 75 38 20  pth(void){.  u8 
1a970 78 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 36 34  x;.  return (u64
1a980 29 28 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f  )(sqlite3_stack_
1a990 62 61 73 65 6c 69 6e 65 20 2d 20 26 78 29 3b 0a  baseline - &x);.
1a9a0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1a9b0 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 75   sqlite3_stack_u
1a9c0 73 65 64 20 44 42 20 53 51 4c 0a 2a 2a 0a 2a 2a  sed DB SQL.**.**
1a9d0 20 54 72 79 20 74 6f 20 6d 65 61 73 75 72 65 20   Try to measure 
1a9e0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 74  the amount of st
1a9f0 61 63 6b 20 73 70 61 63 65 20 75 73 65 64 20 62  ack space used b
1aa00 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  y a call to sqli
1aa10 74 65 33 5f 65 78 65 63 0a 2a 2f 0a 73 74 61 74  te3_exec.*/.stat
1aa20 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 61 63  ic int test_stac
1aa30 6b 5f 75 73 65 64 28 0a 20 20 76 6f 69 64 20 2a  k_used(.  void *
1aa40 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1aa50 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1aa60 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1aa70 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1aa80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1aa90 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72   int i;.  if( ar
1aaa0 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1aab0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1aac0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1aad0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1aae0 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1aaf0 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c        " DB SQL",
1ab00 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1ab10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1ab20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1ab30 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1ab40 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1ab50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 72   TCL_ERROR;.  pr
1ab60 65 70 53 74 61 63 6b 28 29 3b 0a 20 20 28 76 6f  epStack();.  (vo
1ab70 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
1ab80 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20  db, argv[2], 0, 
1ab90 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 36  0, 0);.  for(i=6
1aba0 35 35 33 35 3b 20 69 3e 3d 30 20 26 26 20 28 28  5535; i>=0 && ((
1abb0 75 33 32 2a 29 73 71 6c 69 74 65 33 5f 73 74 61  u32*)sqlite3_sta
1abc0 63 6b 5f 62 61 73 65 6c 69 6e 65 29 5b 2d 69 5d  ck_baseline)[-i]
1abd0 3d 3d 30 78 64 65 61 64 62 65 65 66 3b 20 69 2d  ==0xdeadbeef; i-
1abe0 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  -){}.  Tcl_SetOb
1abf0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1ac00 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 2a  Tcl_NewIntObj(i*
1ac10 34 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  4));.  return TC
1ac20 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1ac30 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c  sage: sqlite_del
1ac40 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20  ete_function DB 
1ac50 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a  function-name.**
1ac60 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 75  .** Delete the u
1ac70 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 27 66 75  ser function 'fu
1ac80 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f  nction-name' fro
1ac90 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  m database handl
1aca0 65 20 44 42 2e 20 49 74 0a 2a 2a 20 69 73 20 61  e DB. It.** is a
1acb0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1acc0 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 77 61  user function wa
1acd0 73 20 63 72 65 61 74 65 64 20 61 73 20 55 54 46  s created as UTF
1ace0 38 2c 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66  8, any number of
1acf0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 28 74  .** arguments (t
1ad00 68 65 20 77 61 79 20 74 68 65 20 54 43 4c 20 69  he way the TCL i
1ad10 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 69 74  nterface does it
1ad20 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1ad30 20 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e   delete_function
1ad40 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1ad50 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1ad60 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1ad70 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1ad80 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
1ad90 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
1ada0 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  b;.  if( argc!=3
1adb0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1adc0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1add0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1ade0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1adf0 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1ae00 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e   " DB function-n
1ae10 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ame", 0);.    re
1ae20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ae30 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1ae40 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
1ae50 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
1ae60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ae70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1ae80 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
1ae90 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c  db, argv[2], -1,
1aea0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
1aeb0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c   0, 0, 0);.  Tcl
1aec0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1aed0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
1aee0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
1aef0 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
1af00 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1af10 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1af20 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f  _delete_collatio
1af30 6e 20 44 42 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e  n DB collation-n
1af40 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65  ame.**.** Delete
1af50 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1af60 65 71 75 65 6e 63 65 20 27 63 6f 6c 6c 61 74 69  equence 'collati
1af70 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61  on-name' from da
1af80 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a  tabase handle .*
1af90 2a 20 44 42 2e 20 49 74 20 69 73 20 61 73 73 75  * DB. It is assu
1afa0 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 6f 6c  med that the col
1afb0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1afc0 77 61 73 20 63 72 65 61 74 65 64 20 61 73 20 55  was created as U
1afd0 54 46 38 20 28 74 68 65 20 0a 2a 2a 20 77 61 79  TF8 (the .** way
1afe0 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61   the TCL interfa
1aff0 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a  ce does it)..*/.
1b000 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65 74  static int delet
1b010 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 76  e_collation(.  v
1b020 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1b030 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1b040 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1b050 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1b060 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  v.){.  int rc;. 
1b070 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1b080 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1b090 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1b0a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1b0b0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1b0c0 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1b0d0 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1b0e0 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c   function-name",
1b0f0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1b100 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1b110 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1b120 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1b130 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1b140 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1b150 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1b160 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
1b170 61 72 67 76 5b 32 5d 2c 20 53 51 4c 49 54 45 5f  argv[2], SQLITE_
1b180 55 54 46 38 2c 20 30 2c 20 30 29 3b 0a 20 20 54  UTF8, 0, 0);.  T
1b190 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1b1a0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
1b1b0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
1b1c0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
1b1d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1b1e0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1b1f0 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
1b200 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  it DB.**.** Retu
1b210 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 64  rn true if the d
1b220 61 74 61 62 61 73 65 20 44 42 20 69 73 20 63 75  atabase DB is cu
1b230 72 72 65 6e 74 6c 79 20 69 6e 20 61 75 74 6f 2d  rrently in auto-
1b240 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a 2a 2a 20  commit mode..** 
1b250 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
1b260 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
1b270 6e 74 20 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  nt get_autocommi
1b280 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
1b290 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1b2a0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1b2b0 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1b2c0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61   **argv.){.  cha
1b2d0 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 73 71  r zBuf[30];.  sq
1b2e0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
1b2f0 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
1b300 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1b310 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1b320 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1b330 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1b340 0a 20 20 20 20 20 20 20 20 22 20 44 42 22 2c 20  .        " DB", 
1b350 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1b360 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1b370 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1b380 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
1b390 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1b3a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70 72  TCL_ERROR;.  spr
1b3b0 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
1b3c0 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
1b3d0 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20 20  ocommit(db));.  
1b3e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1b3f0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1b400 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1b410 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1b420 67 65 3a 20 73 71 6c 69 74 65 33 5f 62 75 73 79  ge: sqlite3_busy
1b430 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d 53 0a 2a  _timeout DB MS.*
1b440 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
1b450 79 20 74 69 6d 65 6f 75 74 2e 20 20 54 68 69 73  y timeout.  This
1b460 20 69 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 20   is more easily 
1b470 64 6f 6e 65 20 75 73 69 6e 67 20 74 68 65 20 74  done using the t
1b480 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f 64  imeout.** method
1b490 20 6f 66 20 74 68 65 20 54 43 4c 20 69 6e 74 65   of the TCL inte
1b4a0 72 66 61 63 65 2e 20 20 42 75 74 20 77 65 20 6e  rface.  But we n
1b4b0 65 65 64 20 61 20 77 61 79 20 74 6f 20 74 65 73  eed a way to tes
1b4c0 74 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  t the case.** wh
1b4d0 65 72 65 20 69 74 20 72 65 74 75 72 6e 73 20 53  ere it returns S
1b4e0 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f  QLITE_MISUSE..*/
1b4f0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1b500 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 0a 20  _busy_timeout(. 
1b510 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1b520 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1b530 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b540 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
1b550 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c  rgv.){.  int rc,
1b560 20 6d 73 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   ms;.  sqlite3 *
1b570 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
1b580 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1b590 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b5a0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1b5b0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1b5c0 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1b5d0 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
1b5e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b5f0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1b600 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1b610 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1b620 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1b630 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1b640 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
1b650 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74  v[2], &ms) ) ret
1b660 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 75   rc = sqlite3_bu
1b680 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 6d  sy_timeout(db, m
1b690 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  s);.  Tcl_Append
1b6a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
1b6b0 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
1b6c0 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
1b6d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b6e0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 74  ./*.** Usage:  t
1b6f0 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
1b700 20 56 41 52 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a   VARIABLENAME.**
1b710 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1b720 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 74 65 72  ame of the inter
1b730 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69  nal representati
1b740 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20 76 61  on for the.** va
1b750 6c 75 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  lue of the given
1b760 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74   variable..*/.st
1b770 61 74 69 63 20 69 6e 74 20 74 63 6c 5f 76 61 72  atic int tcl_var
1b780 69 61 62 6c 65 5f 74 79 70 65 28 0a 20 20 76 6f  iable_type(.  vo
1b790 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1b7a0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1b7b0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1b7c0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1b7d0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1b7e0 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 3b 0a 20  Tcl_Obj *pVar;. 
1b7f0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1b800 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1b810 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1b820 6f 62 6a 76 2c 20 22 56 41 52 49 41 42 4c 45 22  objv, "VARIABLE"
1b830 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1b840 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
1b850 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72  Var = Tcl_GetVar
1b860 32 45 78 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  2Ex(interp, Tcl_
1b870 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1b880 5d 29 2c 20 30 2c 20 54 43 4c 5f 4c 45 41 56 45  ]), 0, TCL_LEAVE
1b890 5f 45 52 52 5f 4d 53 47 29 3b 0a 20 20 69 66 28  _ERR_MSG);.  if(
1b8a0 20 70 56 61 72 3d 3d 30 20 29 20 72 65 74 75 72   pVar==0 ) retur
1b8b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1b8c0 66 28 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72  f( pVar->typePtr
1b8d0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
1b8e0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1b8f0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1b900 6a 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d  j(pVar->typePtr-
1b910 3e 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d  >name, -1));.  }
1b920 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1b930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1b940 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  :  sqlite3_relea
1b950 73 65 5f 6d 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a  se_memory ?N?.**
1b960 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72  .** Attempt to r
1b970 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 63 75  elease memory cu
1b980 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 75 74  rrently held but
1b990 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 72 65   not actually re
1b9a0 71 75 69 72 65 64 2e 0a 2a 2a 20 54 68 65 20 69  quired..** The i
1b9b0 6e 74 65 67 65 72 20 4e 20 69 73 20 74 68 65 20  nteger N is the 
1b9c0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1b9d0 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
1b9e0 20 72 65 6c 65 61 73 65 2e 20 20 54 68 65 20 0a   release.  The .
1b9f0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1ba00 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
1ba10 20 6d 65 6d 6f 72 79 20 61 63 74 75 61 6c 6c 79   memory actually
1ba20 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74   released..*/.st
1ba30 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65  atic int test_re
1ba40 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20  lease_memory(.  
1ba50 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1ba60 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1ba70 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1ba80 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1ba90 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1baa0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1bab0 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
1bac0 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20 26 26 20  _MANAGEMENT) && 
1bad0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1bae0 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 69  OMIT_DISKIO).  i
1baf0 6e 74 20 4e 3b 0a 20 20 69 6e 74 20 61 6d 74 3b  nt N;.  int amt;
1bb00 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26  .  if( objc!=1 &
1bb10 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  & objc!=2 ){.   
1bb20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1bb30 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1bb40 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72  v, "?N?");.    r
1bb50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bb60 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d  .  }.  if( objc=
1bb70 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  =2 ){.    if( Tc
1bb80 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1bb90 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
1bba0 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &N) ) return TC
1bbb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  L_ERROR;.  }else
1bbc0 7b 0a 20 20 20 20 4e 20 3d 20 2d 31 3b 0a 20 20  {.    N = -1;.  
1bbd0 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65  }.  amt = sqlite
1bbe0 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
1bbf0 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  (N);.  Tcl_SetOb
1bc00 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1bc10 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6d  Tcl_NewIntObj(am
1bc20 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  t));.#endif.  re
1bc30 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1bc40 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1bc50 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
1bc60 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20  limit ?N?.**.** 
1bc70 51 75 65 72 79 20 6f 72 20 73 65 74 20 74 68 65  Query or set the
1bc80 20 73 6f 66 74 20 68 65 61 70 20 6c 69 6d 69 74   soft heap limit
1bc90 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1bca0 20 74 68 72 65 61 64 2e 20 20 54 68 65 0a 2a 2a   thread.  The.**
1bcb0 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c 79 20 63   limit is only c
1bcc0 68 61 6e 67 65 64 20 69 66 20 74 68 65 20 4e 20  hanged if the N 
1bcd0 69 73 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  is present.  The
1bce0 20 70 72 65 76 69 6f 75 73 20 6c 69 6d 69 74 0a   previous limit.
1bcf0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
1bd00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1bd10 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  st_soft_heap_lim
1bd20 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  it(.  void * cli
1bd30 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1bd40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1bd50 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1bd60 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1bd70 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  [].){.#if define
1bd80 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1bd90 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
1bda0 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  T) && !defined(S
1bdb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
1bdc0 4f 29 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20  O).  int amt;.  
1bdd0 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f  if( objc!=1 && o
1bde0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1bdf0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1be00 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1be10 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  "?N?");.    retu
1be20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1be30 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65  }.  amt = sqlite
1be40 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
1be50 6e 6c 79 28 29 2d 3e 6e 53 6f 66 74 48 65 61 70  nly()->nSoftHeap
1be60 4c 69 6d 69 74 3b 0a 20 20 69 66 28 20 6f 62 6a  Limit;.  if( obj
1be70 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  c==2 ){.    int 
1be80 4e 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  N;.    if( Tcl_G
1be90 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1bea0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e  erp, objv[1], &N
1beb0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1bec0 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
1bed0 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
1bee0 74 28 4e 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  t(N);.  }.  Tcl_
1bef0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1bf00 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1bf10 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66  bj(amt));.#endif
1bf20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1bf30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1bf40 3a 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61  :   sqlite3_clea
1bf50 72 5f 74 73 64 5f 6d 65 6d 64 65 62 75 67 0a 2a  r_tsd_memdebug.*
1bf60 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 6f  *.** Clear all o
1bf70 66 20 74 68 65 20 4d 45 4d 44 45 42 55 47 20 69  f the MEMDEBUG i
1bf80 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f  nformation out o
1bf90 66 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  f thread-specifi
1bfa0 63 20 64 61 74 61 2e 0a 2a 2a 20 54 68 69 73 20  c data..** This 
1bfb0 77 69 6c 6c 20 61 6c 6c 6f 77 20 69 74 20 74 6f  will allow it to
1bfc0 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   be deallocated.
1bfd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1bfe0 65 73 74 5f 63 6c 65 61 72 5f 74 73 64 5f 6d 65  est_clear_tsd_me
1bff0 6d 64 65 62 75 67 28 0a 20 20 76 6f 69 64 20 2a  mdebug(.  void *
1c000 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1c010 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c020 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1c030 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1c040 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 72 65 74 75  objv[].){.  retu
1c050 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1c060 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
1c070 69 74 65 33 5f 74 73 64 5f 72 65 6c 65 61 73 65  ite3_tsd_release
1c080 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  .**.** Call sqli
1c090 74 65 33 52 65 6c 65 61 73 65 54 68 72 65 61 64  te3ReleaseThread
1c0a0 44 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Data..*/.static 
1c0b0 69 6e 74 20 74 65 73 74 5f 74 73 64 5f 72 65 6c  int test_tsd_rel
1c0c0 65 61 73 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  ease(.  void * c
1c0d0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1c0e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c0f0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1c100 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1c110 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69  jv[].){.#if defi
1c120 6e 65 64 28 53 51 4c 49 54 45 5f 4d 45 4d 44 45  ned(SQLITE_MEMDE
1c130 42 55 47 29 0a 20 20 73 71 6c 69 74 65 33 52 65  BUG).  sqlite3Re
1c140 6c 65 61 73 65 54 68 72 65 61 64 44 61 74 61 28  leaseThreadData(
1c150 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
1c160 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1c170 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
1c180 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
1c190 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  nup.**.** Call t
1c1a0 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  he sqlite3_threa
1c1b0 64 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a  d_cleanup API..*
1c1c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1c1d0 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  t_thread_cleanup
1c1e0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1c1f0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1c200 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c210 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c220 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c230 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 68  .){.  sqlite3_th
1c240 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a  read_cleanup();.
1c250 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c260 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
1c270 3a 20 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65  :   sqlite3_page
1c280 72 5f 72 65 66 63 6f 75 6e 74 73 20 20 44 42 0a  r_refcounts  DB.
1c290 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c  **.** Return a l
1c2a0 69 73 74 20 6f 66 20 6e 75 6d 62 65 72 73 20 77  ist of numbers w
1c2b0 68 69 63 68 20 61 72 65 20 74 68 65 20 50 61 67  hich are the Pag
1c2c0 65 72 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 61  erRefcount for a
1c2d0 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20 6f 6e 20  ll.** pagers on 
1c2e0 65 61 63 68 20 64 61 74 61 62 61 73 65 20 63 6f  each database co
1c2f0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
1c300 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 61 67  tic int test_pag
1c310 65 72 5f 72 65 66 63 6f 75 6e 74 73 28 0a 20 20  er_refcounts(.  
1c320 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1c330 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1c340 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1c350 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1c360 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1c370 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1c380 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 76 2c   int i;.  int v,
1c390 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a   *a;.  Tcl_Obj *
1c3a0 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66 28 20  pResult;..  if( 
1c3b0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1c3c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c3d0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1c3e0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1c3f0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
1c400 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
1c410 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
1c420 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1c430 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c440 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1c450 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1c460 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c470 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
1c480 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c490 0a 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c  .  pResult = Tcl
1c4a0 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 66 6f 72  _NewObj();.  for
1c4b0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
1c4c0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64   i++){.    if( d
1c4d0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30  b->aDb[i].pBt==0
1c4e0 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 2d 31   ){.      v = -1
1c4f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c500 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 50 61     a = sqlite3Pa
1c510 67 65 72 53 74 61 74 73 28 73 71 6c 69 74 65 33  gerStats(sqlite3
1c520 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
1c530 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20  Db[i].pBt));.   
1c540 20 20 20 76 20 3d 20 61 5b 30 5d 3b 0a 20 20 20     v = a[0];.   
1c550 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f   }.    Tcl_ListO
1c560 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1c570 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f  0, pResult, Tcl_
1c580 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20  NewIntObj(v));. 
1c590 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
1c5a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
1c5b0 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e  esult);.  return
1c5c0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
1c5d0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72  ** tclcmd:   wor
1c5e0 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a  king_64bit_int.*
1c5f0 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75  *.** Some TCL bu
1c600 69 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e  ilds (ex: cygwin
1c610 29 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  ) do not support
1c620 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73   64-bit integers
1c630 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73  .  This.** leads
1c640 20 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   to a number of 
1c650 74 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20  test failures.  
1c660 54 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d  The present comm
1c670 61 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a  and checks the.*
1c680 2a 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73  * TCL build to s
1c690 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
1c6a0 74 20 69 74 20 73 75 70 70 6f 72 74 73 20 36 34  t it supports 64
1c6b0 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20  -bit integers.  
1c6c0 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52  It.** returns TR
1c6d0 55 45 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  UE if it does an
1c6e0 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a  d FALSE if not..
1c6f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  **.** This comma
1c700 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 77 61  nd is used to wa
1c710 72 6e 20 75 73 65 72 73 20 74 68 61 74 20 74 68  rn users that th
1c720 65 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73  eir TCL build is
1c730 20 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e   defective.** an
1c740 64 20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72  d that the error
1c750 73 20 74 68 65 79 20 61 72 65 20 73 65 65 69 6e  s they are seein
1c760 67 20 69 6e 20 74 68 65 20 74 65 73 74 20 73 63  g in the test sc
1c770 72 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a  ripts might be.*
1c780 2a 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  * a result of th
1c790 65 69 72 20 64 65 66 65 63 74 69 76 65 20 54 43  eir defective TC
1c7a0 4c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 72  L rather than pr
1c7b0 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65  oblems in SQLite
1c7c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c7d0 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
1c7e0 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
1c7f0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
1c800 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
1c810 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
1c820 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
1c830 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
1c840 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
1c850 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
1c860 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
1c870 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
1c880 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1c890 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1c8a0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
1c8b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c8c0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
1c8d0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  uments */.){.  T
1c8e0 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a  cl_Obj *pTestObj
1c8f0 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20  ;.  int working 
1c900 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a  = 0;..  pTestObj
1c910 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e   = Tcl_NewWideIn
1c920 74 4f 62 6a 28 31 30 30 30 30 30 30 2a 28 69 36  tObj(1000000*(i6
1c930 34 29 31 32 33 34 35 36 37 38 39 30 29 3b 0a 20  4)1234567890);. 
1c940 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d   working = strcm
1c950 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  p(Tcl_GetString(
1c960 70 54 65 73 74 4f 62 6a 29 2c 20 22 31 32 33 34  pTestObj), "1234
1c970 35 36 37 38 39 30 30 30 30 30 30 30 22 29 3d 3d  567890000000")==
1c980 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  0;.  Tcl_DecrRef
1c990 43 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b  Count(pTestObj);
1c9a0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1c9b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1c9c0 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f  NewBooleanObj(wo
1c9d0 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72  rking));.  retur
1c9e0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
1c9f0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d  .** Register com
1ca00 6d 61 6e 64 73 20 77 69 74 68 20 74 68 65 20 54  mands with the T
1ca10 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  CL interpreter..
1ca20 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73  */.int Sqlitetes
1ca30 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t1_Init(Tcl_Inte
1ca40 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65  rp *interp){.  e
1ca50 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1ca60 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
1ca70 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
1ca80 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
1ca90 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
1caa0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  nt sqlite3_open_
1cab0 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  file_count;.  ex
1cac0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
1cad0 5f 73 6f 72 74 5f 63 6f 75 6e 74 3b 0a 20 20 65  _sort_count;.  e
1cae0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1caf0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a  3_current_time;.
1cb00 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
1cb10 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
1cb20 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  e;.  extern int 
1cb30 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72  sqlite3BtreeShar
1cb40 65 64 43 61 63 68 65 52 65 70 6f 72 74 28 76 6f  edCacheReport(vo
1cb50 69 64 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  id*,.           
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
1cb80 63 6c 5f 49 6e 74 65 72 70 2a 2c 69 6e 74 2c 54  cl_Interp*,int,T
1cb90 63 6c 5f 4f 62 6a 2a 43 4f 4e 53 54 2a 29 3b 0a  cl_Obj*CONST*);.
1cba0 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
1cbb0 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  {.     char *zNa
1cbc0 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 43 6d 64  me;.     Tcl_Cmd
1cbd0 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d  Proc *xProc;.  }
1cbe0 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20   aCmd[] = {.    
1cbf0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
1cc00 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20 20 20  ntf_int",       
1cc10 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1cc20 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
1cc30 66 5f 69 6e 74 20 20 20 20 7d 2c 0a 20 20 20 20  f_int    },.    
1cc40 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
1cc50 6e 74 66 5f 69 6e 74 36 34 22 2c 20 20 20 20 20  ntf_int64",     
1cc60 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1cc70 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
1cc80 66 5f 69 6e 74 36 34 20 20 7d 2c 0a 20 20 20 20  f_int64  },.    
1cc90 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
1cca0 6e 74 66 5f 73 74 72 22 2c 20 20 20 20 20 20 20  ntf_str",       
1ccb0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1ccc0 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
1ccd0 66 5f 73 74 72 20 20 20 20 7d 2c 0a 20 20 20 20  f_str    },.    
1cce0 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 70 72   { "sqlite3_snpr
1ccf0 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20 20 20  intf_str",      
1cd00 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1cd10 2a 29 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  *)sqlite3_snprin
1cd20 74 66 5f 73 74 72 20 20 20 7d 2c 0a 20 20 20 20  tf_str   },.    
1cd30 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
1cd40 6e 74 66 5f 73 74 72 6f 6e 6c 79 22 2c 20 20 20  ntf_stronly",   
1cd50 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1cd60 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
1cd70 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a 20 20 20 20  f_stronly},.    
1cd80 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
1cd90 6e 74 66 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  ntf_double",    
1cda0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1cdb0 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
1cdc0 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a 20 20 20 20  f_double },.    
1cdd0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
1cde0 6e 74 66 5f 73 63 61 6c 65 64 22 2c 20 20 20 20  ntf_scaled",    
1cdf0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1ce00 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
1ce10 66 5f 73 63 61 6c 65 64 20 7d 2c 0a 20 20 20 20  f_scaled },.    
1ce20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
1ce30 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 22 2c 20  ntf_hexdouble", 
1ce40 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1ce50 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1ce60 68 65 78 64 6f 75 62 6c 65 7d 2c 0a 20 20 20 20  hexdouble},.    
1ce70 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69   { "sqlite3_mpri
1ce80 6e 74 66 5f 7a 5f 74 65 73 74 22 2c 20 20 20 20  ntf_z_test",    
1ce90 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1cea0 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 7a  *)test_mprintf_z
1ceb0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
1cec0 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  { "sqlite3_mprin
1ced0 74 66 5f 6e 5f 74 65 73 74 22 2c 20 20 20 20 20  tf_n_test",     
1cee0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
1cef0 29 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 20  )test_mprintf_n 
1cf00 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
1cf10 20 22 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e   "sqlite3_snprin
1cf20 74 66 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  tf_int",        
1cf30 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1cf40 74 65 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e  test_snprintf_in
1cf50 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  t     },.     { 
1cf60 22 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e  "sqlite3_last_in
1cf70 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 20 20  sert_rowid",    
1cf80 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
1cf90 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69 64 20 20  est_last_rowid  
1cfa0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
1cfb0 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69  sqlite3_exec_pri
1cfc0 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20 20 20  ntf",           
1cfd0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
1cfe0 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20  st_exec_printf  
1cff0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1d000 71 6c 69 74 65 33 5f 65 78 65 63 22 2c 20 20 20  qlite3_exec",   
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1d020 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
1d030 74 5f 65 78 65 63 20 20 20 20 20 20 20 20 20 20  t_exec          
1d040 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1d050 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 22 2c 20  lite3_exec_nr", 
1d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
1d070 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
1d080 5f 65 78 65 63 5f 6e 72 20 20 20 20 20 20 20 20  _exec_nr        
1d090 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1d0a0 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70  ite3_get_table_p
1d0b0 72 69 6e 74 66 22 2c 20 20 20 20 20 20 28 54 63  rintf",      (Tc
1d0c0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
1d0d0 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
1d0e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1d0f0 74 65 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20  te3_close",     
1d100 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
1d110 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
1d120 5f 74 65 73 74 5f 63 6c 6f 73 65 20 20 20 20 20  _test_close     
1d130 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1d140 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1d150 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  on",       (Tcl_
1d160 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72  CmdProc*)test_cr
1d170 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d  eate_function  }
1d180 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1d190 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  3_create_aggrega
1d1a0 74 65 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43  te",      (Tcl_C
1d1b0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65  mdProc*)test_cre
1d1c0 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 7d 2c  ate_aggregate },
1d1d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
1d1e0 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75  register_test_fu
1d1f0 6e 63 74 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d  nction", (Tcl_Cm
1d200 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 67 69  dProc*)test_regi
1d210 73 74 65 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a  ster_func    },.
1d220 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 61       { "sqlite_a
1d230 62 6f 72 74 22 2c 20 20 20 20 20 20 20 20 20 20  bort",          
1d240 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1d250 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f  Proc*)sqlite_abo
1d260 72 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23  rt          },.#
1d270 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d  ifdef SQLITE_MEM
1d280 44 45 42 55 47 0a 20 20 20 20 20 7b 20 22 73 71  DEBUG.     { "sq
1d290 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
1d2a0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 54  ",            (T
1d2b0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
1d2c0 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 20 20  te_malloc_fail  
1d2d0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1d2e0 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 22  ite_malloc_stat"
1d2f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ,            (Tc
1d300 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
1d310 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 20 20 20  e_malloc_stat   
1d320 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
1d330 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c  { "sqlite_bind",
1d340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d350 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
1d360 29 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20  )test_bind      
1d370 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
1d380 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20   "breakpoint",  
1d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3a0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1d3b0 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20  test_breakpoint 
1d3c0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
1d3d0 22 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20  "sqlite3_key",  
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3f0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
1d400 65 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20  est_key         
1d410 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
1d420 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20  sqlite3_rekey", 
1d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d440 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
1d450 73 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20  st_rekey        
1d460 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1d470 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22  qlite_set_magic"
1d480 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
1d490 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1d4a0 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20  ite_set_magic   
1d4b0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1d4c0 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22  lite3_interrupt"
1d4d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54  ,             (T
1d4e0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
1d4f0 5f 69 6e 74 65 72 72 75 70 74 20 20 20 20 20 20  _interrupt      
1d500 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1d510 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74  ite_delete_funct
1d520 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63  ion",        (Tc
1d530 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74  l_CmdProc*)delet
1d540 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20  e_function      
1d550 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1d560 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74  te_delete_collat
1d570 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c  ion",       (Tcl
1d580 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65  _CmdProc*)delete
1d590 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20  _collation      
1d5a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1d5b0 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
1d5c0 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
1d5d0 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74  CmdProc*)get_aut
1d5e0 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d  ocommit        }
1d5f0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1d600 33 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20 20  3_stack_used",  
1d610 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
1d620 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74 61  mdProc*)test_sta
1d630 63 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d 2c  ck_used       },
1d640 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1d650 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20  _busy_timeout", 
1d660 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
1d670 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79  dProc*)test_busy
1d680 5f 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a  _timeout     },.
1d690 20 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c       { "printf",
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1d6c0 50 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74  Proc*)test_print
1d6d0 66 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  f           },. 
1d6e0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 69      { "sqlite3_i
1d6f0 6f 5f 74 72 61 63 65 22 2c 20 20 20 20 20 20 20  o_trace",       
1d700 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1d710 72 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61  roc*)test_io_tra
1d720 63 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  ce         },.  
1d730 7d 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  };.  static stru
1d740 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
1d750 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f  zName;.     Tcl_
1d760 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f  ObjCmdProc *xPro
1d770 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c  c;.     void *cl
1d780 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f  ientData;.  } aO
1d790 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  bjCmd[] = {.    
1d7a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e   { "sqlite3_conn
1d7b0 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c  ection_pointer",
1d7c0 20 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70      get_sqlite_p
1d7d0 6f 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20  ointer, 0 },.   
1d7e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
1d7f0 64 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20  d_int",         
1d800 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69       test_bind_i
1d810 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20  nt,      0 },.  
1d820 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
1d830 6e 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20  nd_zeroblob",   
1d840 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
1d850 7a 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20  zeroblob, 0 },. 
1d860 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
1d870 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20  ind_int64",     
1d880 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
1d890 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a  _int64,    0 },.
1d8a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1d8b0 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20  bind_double",   
1d8c0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
1d8d0 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c  d_double,   0 },
1d8e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1d8f0 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20  _bind_null",    
1d900 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
1d910 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d  nd_null     ,0 }
1d920 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1d930 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20  3_bind_text",   
1d940 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
1d950 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20  ind_text     ,0 
1d960 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1d970 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c  e3_bind_text16",
1d980 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
1d990 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30  bind_text16   ,0
1d9a0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1d9b0 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20  te3_bind_blob", 
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1d9d0 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c  _bind_blob     ,
1d9e0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
1d9f0 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
1da00 74 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73  ter_count",  tes
1da10 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
1da20 5f 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20  _count, 0},.    
1da30 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
1da40 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22  _parameter_name"
1da50 2c 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  ,   test_bind_pa
1da60 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30  rameter_name,  0
1da70 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1da80 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
1da90 72 5f 69 6e 64 65 78 22 2c 20 20 74 65 73 74 5f  r_index",  test_
1daa0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
1dab0 6e 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  ndex, 0},.     {
1dac0 20 22 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f   "sqlite3_clear_
1dad0 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 20  bindings",      
1dae0 20 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e    test_clear_bin
1daf0 64 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20  dings, 0},.     
1db00 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70  { "sqlite3_sleep
1db10 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
1db20 20 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20     test_sleep,  
1db30 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
1db40 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63   { "sqlite3_errc
1db50 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ode",           
1db60 20 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65      test_errcode
1db70 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
1db80 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
1db90 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20 20 20  msg",           
1dba0 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67       test_errmsg
1dbb0 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
1dbc0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
1dbd0 72 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20 20  rmsg16",        
1dbe0 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73        test_errms
1dbf0 67 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  g16      ,0 },. 
1dc00 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
1dc10 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  pen",           
1dc20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
1dc30 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
1dc40 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1dc50 6f 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20  open16",        
1dc60 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65          test_ope
1dc70 6e 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  n16        ,0 },
1dc80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1dc90 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20  _complete16",   
1dca0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
1dcb0 6d 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d  mplete16    ,0 }
1dcc0 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  ,..     { "sqlit
1dcd0 65 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20  e3_prepare",    
1dce0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
1dcf0 70 72 65 70 61 72 65 20 20 20 20 20 20 20 2c 30  prepare       ,0
1dd00 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1dd10 74 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20  te3_prepare16", 
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1dd30 5f 70 72 65 70 61 72 65 31 36 20 20 20 20 20 2c  _prepare16     ,
1dd40 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
1dd50 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22  ite3_prepare_v2"
1dd60 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
1dd70 74 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20 20  t_prepare_v2    
1dd80 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
1dd90 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f  lite3_prepare16_
1dda0 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  v2",          te
1ddb0 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20  st_prepare16_v2 
1ddc0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
1ddd0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22  qlite3_finalize"
1dde0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ,              t
1ddf0 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20  est_finalize    
1de00 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
1de10 73 71 6c 69 74 65 33 5f 72 65 73 65 74 22 2c 20  sqlite3_reset", 
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 74 65 73 74 5f 72 65 73 65 74 20 20 20 20 20 20  test_reset      
1de40 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
1de50 22 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64  "sqlite3_expired
1de60 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
1de70 20 74 65 73 74 5f 65 78 70 69 72 65 64 20 20 20   test_expired   
1de80 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
1de90 20 22 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66   "sqlite3_transf
1dea0 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20  er_bindings",   
1deb0 20 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f    test_transfer_
1dec0 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20 20 20  bind ,0 },.     
1ded0 7b 20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  { "sqlite3_chang
1dee0 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  es",            
1def0 20 20 20 74 65 73 74 5f 63 68 61 6e 67 65 73 20     test_changes 
1df00 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
1df10 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 65 70   { "sqlite3_step
1df20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
1df30 20 20 20 20 74 65 73 74 5f 73 74 65 70 20 20 20      test_step   
1df40 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20         ,0 },..  
1df50 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65     { "sqlite3_re
1df60 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20  lease_memory",  
1df70 20 20 20 20 20 20 74 65 73 74 5f 72 65 6c 65 61        test_relea
1df80 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 20 20 20 30  se_memory,     0
1df90 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1dfa0 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
1dfb0 69 74 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  it",       test_
1dfc0 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 2c  soft_heap_limit,
1dfd0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
1dfe0 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 74 73  sqlite3_clear_ts
1dff0 64 5f 6d 65 6d 64 65 62 75 67 22 2c 20 20 20 20  d_memdebug",    
1e000 74 65 73 74 5f 63 6c 65 61 72 5f 74 73 64 5f 6d  test_clear_tsd_m
1e010 65 6d 64 65 62 75 67 2c 20 30 7d 2c 0a 20 20 20  emdebug, 0},.   
1e020 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 73 64    { "sqlite3_tsd
1e030 5f 72 65 6c 65 61 73 65 22 2c 20 20 20 20 20 20  _release",      
1e040 20 20 20 20 20 74 65 73 74 5f 74 73 64 5f 72 65       test_tsd_re
1e050 6c 65 61 73 65 2c 20 20 20 20 20 20 20 20 30 7d  lease,        0}
1e060 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1e070 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
1e080 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 74  ",        test_t
1e090 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20  hread_cleanup,  
1e0a0 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
1e0b0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66  qlite3_pager_ref
1e0c0 63 6f 75 6e 74 73 22 2c 20 20 20 20 20 20 20 74  counts",       t
1e0d0 65 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  est_pager_refcou
1e0e0 6e 74 73 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20  nts,    0},..   
1e0f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61    { "sqlite3_loa
1e100 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20  d_extension",   
1e110 20 20 20 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65       test_load_e
1e120 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d  xtension,     0}
1e130 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1e140 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
1e150 74 65 6e 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65  tension", test_e
1e160 6e 61 62 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20  nable_load,     
1e170 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
1e180 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
1e190 72 65 73 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74  result_codes", t
1e1a0 65 73 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  est_extended_res
1e1b0 75 6c 74 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 0a  ult_codes, 0},..
1e1c0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1e1d0 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49 20 2a  column_*() API *
1e1e0 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  /.     { "sqlite
1e1f0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22 2c  3_column_count",
1e200 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
1e210 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30 20  olumn_count  ,0 
1e220 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1e230 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22 2c 20  e3_data_count", 
1e240 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
1e250 64 61 74 61 5f 63 6f 75 6e 74 20 20 20 20 2c 30  data_count    ,0
1e260 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1e270 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 22  te3_column_type"
1e280 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
1e290 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20 20 2c  _column_type   ,
1e2a0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
1e2b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
1e2c0 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
1e2d0 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20 20  t_column_blob   
1e2e0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
1e2f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
1e300 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 74 65  ble",         te
1e310 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  st_column_double
1e320 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
1e330 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
1e340 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 74  t64",          t
1e350 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  est_column_int64
1e360 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
1e370 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1e380 65 78 74 22 2c 20 20 20 20 20 20 20 74 65 73 74  ext",       test
1e390 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 73 71 6c  _stmt_utf8,  sql
1e3a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1e3b0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
1e3c0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
1e3d0 64 65 63 6c 74 79 70 65 22 2c 20 20 20 74 65 73  decltype",   tes
1e3e0 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 73 71  t_stmt_utf8,  sq
1e3f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
1e400 6c 74 79 70 65 20 20 7d 2c 0a 20 20 20 20 20 7b  ltype  },.     {
1e410 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
1e420 5f 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 74 65  _name",       te
1e430 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 73  st_stmt_utf8,  s
1e440 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
1e450 6d 65 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  me      },.     
1e460 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
1e470 6e 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 74  n_int",        t
1e480 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20  est_stmt_int,   
1e490 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1e4a0 6e 74 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  nt       },.    
1e4b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
1e4c0 6d 6e 5f 62 79 74 65 73 22 2c 20 20 20 20 20 20  mn_bytes",      
1e4d0 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
1e4e0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1e4f0 62 79 74 65 73 20 20 20 20 20 7d 2c 0a 23 69 66  bytes     },.#if
1e500 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1e510 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
1e520 41 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c  A.{ "sqlite3_col
1e530 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
1e540 65 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  e", test_stmt_ut
1e550 66 38 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  f8, sqlite3_colu
1e560 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65  mn_database_name
1e570 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f  },.{ "sqlite3_co
1e580 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 22  lumn_table_name"
1e590 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  , test_stmt_utf8
1e5a0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
1e5b0 5f 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20  _table_name},.{ 
1e5c0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
1e5d0 6f 72 69 67 69 6e 5f 6e 61 6d 65 22 2c 20 74 65  origin_name", te
1e5e0 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 73 71  st_stmt_utf8, sq
1e5f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
1e600 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69  gin_name},.#endi
1e610 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1e620 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20  E_OMIT_UTF16.   
1e630 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
1e640 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 20 20  umn_bytes16",   
1e650 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20   test_stmt_int, 
1e660 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
1e670 5f 62 79 74 65 73 31 36 20 20 20 7d 2c 0a 20 20  _bytes16   },.  
1e680 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
1e690 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20 20  lumn_text16",   
1e6a0 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31    test_stmt_utf1
1e6b0 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  6, sqlite3_colum
1e6c0 6e 5f 74 65 78 74 31 36 20 20 20 20 7d 2c 0a 20  n_text16    },. 
1e6d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
1e6e0 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36  olumn_decltype16
1e6f0 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ", test_stmt_utf
1e700 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  16, sqlite3_colu
1e710 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a  mn_decltype16},.
1e720 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1e730 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20  column_name16", 
1e740 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74      test_stmt_ut
1e750 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  f16, sqlite3_col
1e760 75 6d 6e 5f 6e 61 6d 65 31 36 20 20 20 20 7d 2c  umn_name16    },
1e770 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 61 6c 69  .     { "add_ali
1e780 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
1e790 61 74 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69  ations", add_ali
1e7a0 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
1e7b0 61 74 69 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d  ations, 0      }
1e7c0 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
1e7d0 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
1e7e0 54 41 44 41 54 41 0a 7b 22 73 71 6c 69 74 65 33  TADATA.{"sqlite3
1e7f0 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
1e800 5f 6e 61 6d 65 31 36 22 2c 0a 20 20 74 65 73 74  _name16",.  test
1e810 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c  _stmt_utf16, sql
1e820 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
1e830 62 61 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22  base_name16},.{"
1e840 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1e850 61 62 6c 65 5f 6e 61 6d 65 31 36 22 2c 20 74 65  able_name16", te
1e860 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 73  st_stmt_utf16, s
1e870 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61  qlite3_column_ta
1e880 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73  ble_name16},.{"s
1e890 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
1e8a0 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c 20 74 65  igin_name16", te
1e8b0 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 73  st_stmt_utf16, s
1e8c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
1e8d0 69 67 69 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65  igin_name16},.#e
1e8e0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 20 20  ndif.#endif.    
1e8f0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
1e900 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22  te_collation_v2"
1e910 2c 20 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f  , test_create_co
1e920 6c 6c 61 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c  llation_v2, 0 },
1e930 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1e940 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 22  _global_recover"
1e950 2c 20 20 20 20 20 74 65 73 74 5f 67 6c 6f 62 61  ,     test_globa
1e960 6c 5f 72 65 63 6f 76 65 72 2c 20 30 20 20 20 7d  l_recover, 0   }
1e970 2c 0a 20 20 20 20 20 7b 20 22 77 6f 72 6b 69 6e  ,.     { "workin
1e980 67 5f 36 34 62 69 74 5f 69 6e 74 22 2c 20 20 20  g_64bit_int",   
1e990 20 20 20 20 20 20 20 77 6f 72 6b 69 6e 67 5f 36         working_6
1e9a0 34 62 69 74 5f 69 6e 74 2c 20 20 20 30 20 20 20  4bit_int,   0   
1e9b0 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63  },..     /* Func
1e9c0 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20  tions from os.h 
1e9d0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1e9e0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
1e9f0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73 4f     { "sqlite3OsO
1ea00 70 65 6e 52 65 61 64 57 72 69 74 65 22 2c 74 65  penReadWrite",te
1ea10 73 74 5f 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  st_sqlite3OsOpen
1ea20 52 65 61 64 57 72 69 74 65 2c 20 30 20 7d 2c 0a  ReadWrite, 0 },.
1ea30 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 4f       { "sqlite3O
1ea40 73 43 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  sClose",        
1ea50 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 43 6c  test_sqlite3OsCl
1ea60 6f 73 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ose, 0 },.     {
1ea70 20 22 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 22   "sqlite3OsLock"
1ea80 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73  ,         test_s
1ea90 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 2c 20 30 20  qlite3OsLock, 0 
1eaa0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1eab0 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
1eac0 22 2c 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f  ", test_sqlite3O
1ead0 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 2c 20 30  sTempFileName, 0
1eae0 20 7d 2c 0a 20 20 20 0a 20 20 20 20 20 2f 2a 20   },.   .     /* 
1eaf0 43 75 73 74 6f 6d 20 74 65 73 74 20 69 6e 74 65  Custom test inte
1eb00 72 66 61 63 65 73 20 2a 2f 0a 20 20 20 20 20 7b  rfaces */.     {
1eb10 20 22 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63   "sqlite3OsUnloc
1eb20 6b 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74  k",         test
1eb30 5f 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b  _sqlite3OsUnlock
1eb40 2c 20 30 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66  , 0    },.#endif
1eb50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1eb60 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20  OMIT_UTF16.     
1eb70 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c  { "add_test_coll
1eb80 61 74 65 22 2c 20 20 20 20 20 20 20 20 74 65 73  ate",        tes
1eb90 74 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20  t_collate, 0    
1eba0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
1ebb0 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c  { "add_test_coll
1ebc0 61 74 65 5f 6e 65 65 64 65 64 22 2c 20 74 65 73  ate_needed", tes
1ebd0 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64  t_collate_needed
1ebe0 2c 20 30 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  , 0     },.     
1ebf0 7b 20 22 61 64 64 5f 74 65 73 74 5f 66 75 6e 63  { "add_test_func
1ec00 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 74 65 73  tion",       tes
1ec10 74 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20 20  t_function, 0   
1ec20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69          },.#endi
1ec30 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1ec40 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 20 7b 20  MEMDEBUG.     { 
1ec50 22 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 6f  "sqlite_malloc_o
1ec60 75 74 73 74 61 6e 64 69 6e 67 22 2c 20 73 71 6c  utstanding", sql
1ec70 69 74 65 5f 6d 61 6c 6c 6f 63 5f 6f 75 74 73 74  ite_malloc_outst
1ec80 61 6e 64 69 6e 67 2c 20 30 7d 2c 0a 23 65 6e 64  anding, 0},.#end
1ec90 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
1eca0 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 22 2c  e3_test_errstr",
1ecb0 20 20 20 20 20 74 65 73 74 5f 65 72 72 73 74 72       test_errstr
1ecc0 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  , 0             
1ecd0 7d 2c 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 76  },.     { "tcl_v
1ece0 61 72 69 61 62 6c 65 5f 74 79 70 65 22 2c 20 20  ariable_type",  
1ecf0 20 20 20 20 20 74 63 6c 5f 76 61 72 69 61 62 6c       tcl_variabl
1ed00 65 5f 74 79 70 65 2c 20 30 20 20 20 20 20 20 20  e_type, 0       
1ed10 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  },.#ifndef SQLIT
1ed20 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1ed30 43 48 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  CHE.     { "sqli
1ed40 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
1ed50 64 5f 63 61 63 68 65 22 2c 20 74 65 73 74 5f 65  d_cache", test_e
1ed60 6e 61 62 6c 65 5f 73 68 61 72 65 64 2c 20 30 20  nable_shared, 0 
1ed70 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1ed80 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65  te3_shared_cache
1ed90 5f 72 65 70 6f 72 74 22 2c 20 73 71 6c 69 74 65  _report", sqlite
1eda0 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68  3BtreeSharedCach
1edb0 65 52 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e  eReport, 0},.#en
1edc0 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
1edd0 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
1ede0 75 6d 62 65 72 22 2c 20 74 65 73 74 5f 6c 69 62  umber", test_lib
1edf0 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20  version_number, 
1ee00 30 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c  0  },.#ifdef SQL
1ee10 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
1ee20 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20  N_METADATA.     
1ee30 7b 20 22 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  { "sqlite3_table
1ee40 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
1ee50 22 2c 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f  ", test_table_co
1ee60 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30  lumn_metadata, 0
1ee70 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e    },.#endif.#ifn
1ee80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ee90 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20  INCRBLOB.     { 
1eea0 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65  "sqlite3_blob_re
1eeb0 61 64 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f  ad",  test_blob_
1eec0 72 65 61 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20  read, 0  },.    
1eed0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62   { "sqlite3_blob
1eee0 5f 77 72 69 74 65 22 2c 20 74 65 73 74 5f 62 6c  _write", test_bl
1eef0 6f 62 5f 77 72 69 74 65 2c 20 30 20 20 7d 2c 0a  ob_write, 0  },.
1ef00 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 73 74  #endif.  };.  st
1ef10 61 74 69 63 20 69 6e 74 20 62 69 74 6d 61 73 6b  atic int bitmask
1ef20 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42  _size = sizeof(B
1ef30 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20 69 6e 74  itmask)*8;.  int
1ef40 20 69 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74   i;.  extern int
1ef50 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 72 61 63   sqlite3_os_trac
1ef60 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  e;.  extern int 
1ef70 73 71 6c 69 74 65 33 5f 77 68 65 72 65 5f 74 72  sqlite3_where_tr
1ef80 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  ace;.  extern in
1ef90 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
1efa0 6f 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f 66 75  ount, sqlite3_fu
1efb0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20  llsync_count;.  
1efc0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1efd0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
1efe0 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
1eff0 73 71 6c 69 74 65 33 5f 6d 65 6d 55 73 65 64 3b  sqlite3_memUsed;
1f000 0a 20 20 65 78 74 65 72 6e 20 63 68 61 72 20 2a  .  extern char *
1f010 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 69  sqlite3_malloc_i
1f020 64 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  d;.  extern int 
1f030 73 71 6c 69 74 65 33 5f 6d 65 6d 4d 61 78 3b 0a  sqlite3_memMax;.
1f040 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
1f050 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 3b  ite3_like_count;
1f060 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
1f070 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 3b  lite3_tsd_count;
1f080 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
1f090 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f  lite3_xferopt_co
1f0a0 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
1f0b0 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
1f0c0 72 65 61 64 64 62 5f 63 6f 75 6e 74 3b 0a 20 20  readdb_count;.  
1f0d0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1f0e0 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
1f0f0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
1f100 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
1f110 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 3b  er_writej_count;
1f120 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
1f130 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
1f140 65 65 5f 63 6f 75 6e 74 3b 0a 23 69 66 20 4f 53  ee_count;.#if OS
1f150 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64  _UNIX && defined
1f160 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
1f170 20 64 65 66 69 6e 65 64 28 54 48 52 45 41 44 53   defined(THREADS
1f180 41 46 45 29 20 26 26 20 54 48 52 45 41 44 53 41  AFE) && THREADSA
1f190 46 45 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  FE.  extern int 
1f1a0 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
1f1b0 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3b 0a  achOthersLocks;.
1f1c0 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49  #endif.#if OS_WI
1f1d0 4e 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  N.  extern int s
1f1e0 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b 0a  qlite3_os_type;.
1f1f0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1f200 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 65 78 74  LITE_DEBUG.  ext
1f210 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1f220 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65  vdbe_addop_trace
1f230 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
1f240 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78  SQLITE_TEST.  ex
1f250 74 65 72 6e 20 63 68 61 72 20 73 71 6c 69 74 65  tern char sqlite
1f260 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 3b 0a  3_query_plan[];.
1f270 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 71    static char *q
1f280 75 65 72 79 5f 70 6c 61 6e 20 3d 20 73 71 6c 69  uery_plan = sqli
1f290 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 3b 0a  te3_query_plan;.
1f2a0 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d  #endif..  for(i=
1f2b0 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64  0; i<sizeof(aCmd
1f2c0 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d  )/sizeof(aCmd[0]
1f2d0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  ); i++){.    Tcl
1f2e0 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
1f2f0 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a  nterp, aCmd[i].z
1f300 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50  Name, aCmd[i].xP
1f310 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  roc, 0, 0);.  }.
1f320 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
1f330 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a  eof(aObjCmd)/siz
1f340 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b  eof(aObjCmd[0]);
1f350 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43   i++){.    Tcl_C
1f360 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
1f370 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b  interp, aObjCmd[
1f380 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  i].zName, .     
1f390 20 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50     aObjCmd[i].xP
1f3a0 72 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e  roc, aObjCmd[i].
1f3b0 63 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a  clientData, 0);.
1f3c0 20 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61    }.  Tcl_LinkVa
1f3d0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
1f3e0 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c  e_search_count",
1f3f0 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
1f400 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
1f410 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
1f420 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
1f430 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
1f440 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20  te_sort_count", 
1f450 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
1f460 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e  qlite3_sort_coun
1f470 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
1f480 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
1f490 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
1f4a0 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20  _max_blobsize", 
1f4b0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
1f4c0 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
1f4d0 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ize, TCL_LINK_IN
1f4e0 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
1f4f0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
1f500 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a  e_like_count", .
1f510 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
1f520 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74  lite3_like_count
1f530 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
1f540 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
1f550 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69  nterp, "sqlite_i
1f560 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c  nterrupt_count",
1f570 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
1f580 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
1f590 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  t_count, TCL_LIN
1f5a0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
1f5b0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
1f5c0 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f  qlite_open_file_
1f5d0 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
1f5e0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f  char*)&sqlite3_o
1f5f0 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20  pen_file_count, 
1f600 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
1f610 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1f620 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 63 75 72  erp, "sqlite_cur
1f630 72 65 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20  rent_time", .   
1f640 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
1f650 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c  e3_current_time,
1f660 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
1f670 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
1f680 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73  terp, "sqlite_os
1f690 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28  _trace",.      (
1f6a0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f  char*)&sqlite3_o
1f6b0 73 5f 74 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e  s_trace, TCL_LIN
1f6c0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
1f6d0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
1f6e0 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74  qlite3_tsd_count
1f6f0 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
1f700 26 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75  &sqlite3_tsd_cou
1f710 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
1f720 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
1f730 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
1f740 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 22  3_xferopt_count"
1f750 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
1f760 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f  sqlite3_xferopt_
1f770 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
1f780 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
1f790 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
1f7a0 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
1f7b0 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  b_count",.      
1f7c0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
1f7d0 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
1f7e0 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
1f7f0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
1f800 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
1f810 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
1f820 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
1f830 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61  har*)&sqlite3_pa
1f840 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
1f850 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
1f860 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
1f870 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
1f880 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
1f890 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
1f8a0 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65  r*)&sqlite3_page
1f8b0 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 2c 20  r_writej_count, 
1f8c0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
1f8d0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1f8e0 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
1f8f0 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
1f900 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
1f910 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70  &sqlite3_pager_p
1f920 67 66 72 65 65 5f 63 6f 75 6e 74 2c 20 54 43 4c  gfree_count, TCL
1f930 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e  _LINK_INT);.#ifn
1f940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f950 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b  UTF16.  Tcl_Link
1f960 56 61 72 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  Var(interp, "una
1f970 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
1f980 75 6e 74 65 72 22 2c 0a 20 20 20 20 20 20 28 63  unter",.      (c
1f990 68 61 72 2a 29 26 75 6e 61 6c 69 67 6e 65 64 5f  har*)&unaligned_
1f9a0 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2c 20  string_counter, 
1f9b0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
1f9c0 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 55 4e 49  endif.#if OS_UNI
1f9d0 58 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  X && defined(SQL
1f9e0 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66  ITE_TEST) && def
1f9f0 69 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29  ined(THREADSAFE)
1fa00 20 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 20   && THREADSAFE. 
1fa10 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1fa20 65 72 70 2c 20 22 74 68 72 65 61 64 73 4f 76 65  erp, "threadsOve
1fa30 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
1fa40 6f 63 6b 73 22 2c 0a 20 20 20 20 20 20 28 63 68  ocks",.      (ch
1fa50 61 72 2a 29 26 74 68 72 65 61 64 73 4f 76 65 72  ar*)&threadsOver
1fa60 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
1fa70 63 6b 73 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  cks, TCL_LINK_IN
1fa80 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  T);.#endif.#ifnd
1fa90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
1faa0 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  TF16.  Tcl_LinkV
1fab0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
1fac0 74 65 5f 6c 61 73 74 5f 6e 65 65 64 65 64 5f 63  te_last_needed_c
1fad0 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20 20 20 20 20  ollation",.     
1fae0 20 28 63 68 61 72 2a 29 26 70 7a 4e 65 65 64 65   (char*)&pzNeede
1faf0 64 43 6f 6c 6c 61 74 69 6f 6e 2c 20 54 43 4c 5f  dCollation, TCL_
1fb00 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f  LINK_STRING|TCL_
1fb10 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b  LINK_READ_ONLY);
1fb20 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1fb30 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20  QLITE_MEMDEBUG. 
1fb40 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1fb50 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6d 61 6c  erp, "sqlite_mal
1fb60 6c 6f 63 5f 69 64 22 2c 0a 20 20 20 20 20 20 28  loc_id",.      (
1fb70 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6d  char*)&sqlite3_m
1fb80 61 6c 6c 6f 63 5f 69 64 2c 20 54 43 4c 5f 4c 49  alloc_id, TCL_LI
1fb90 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 23 65 6e 64  NK_STRING);.#end
1fba0 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20  if.#if OS_WIN.  
1fbb0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
1fbc0 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74  rp, "sqlite_os_t
1fbd0 79 70 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ype",.      (cha
1fbe0 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  r*)&sqlite3_os_t
1fbf0 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ype, TCL_LINK_IN
1fc00 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  T);.#endif.#ifde
1fc10 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1fc20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
1fc30 72 70 2c 20 22 73 71 6c 69 74 65 5f 71 75 65 72  rp, "sqlite_quer
1fc40 79 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20 28  y_plan",.      (
1fc50 63 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c 61  char*)&query_pla
1fc60 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  n, TCL_LINK_STRI
1fc70 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44  NG|TCL_LINK_READ
1fc80 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23  _ONLY);.#endif.#
1fc90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1fca0 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  UG.  Tcl_LinkVar
1fcb0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
1fcc0 5f 61 64 64 6f 70 5f 74 72 61 63 65 22 2c 0a 20  _addop_trace",. 
1fcd0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
1fce0 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f  ite3_vdbe_addop_
1fcf0 74 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  trace, TCL_LINK_
1fd00 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
1fd10 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
1fd20 69 74 65 5f 77 68 65 72 65 5f 74 72 61 63 65 22  ite_where_trace"
1fd30 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
1fd40 73 71 6c 69 74 65 33 5f 77 68 65 72 65 5f 74 72  sqlite3_where_tr
1fd50 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
1fd60 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  T);.#endif.#ifde
1fd70 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55  f SQLITE_MEMDEBU
1fd80 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  G.  Tcl_LinkVar(
1fd90 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
1fda0 6d 65 6d 75 73 65 64 22 2c 0a 20 20 20 20 20 20  memused",.      
1fdb0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
1fdc0 6d 65 6d 55 73 65 64 2c 20 54 43 4c 5f 4c 49 4e  memUsed, TCL_LIN
1fdd0 4b 5f 49 4e 54 20 7c 20 54 43 4c 5f 4c 49 4e 4b  K_INT | TCL_LINK
1fde0 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54  _READ_ONLY);.  T
1fdf0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
1fe00 70 2c 20 22 73 71 6c 69 74 65 5f 6d 65 6d 6d 61  p, "sqlite_memma
1fe10 78 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  x",.      (char*
1fe20 29 26 73 71 6c 69 74 65 33 5f 6d 65 6d 4d 61 78  )&sqlite3_memMax
1fe30 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 20 7c  , TCL_LINK_INT |
1fe40 20 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f   TCL_LINK_READ_O
1fe50 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  NLY);.#endif.#if
1fe60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fe70 5f 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f 4c 69  _DISKIO.  Tcl_Li
1fe80 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
1fe90 71 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70 5f 63  qlite_opentemp_c
1fea0 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
1feb0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65  ar*)&sqlite3_ope
1fec0 6e 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54 43 4c  ntemp_count, TCL
1fed0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64  _LINK_INT);.#end
1fee0 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  if.  Tcl_LinkVar
1fef0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
1ff00 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
1ff10 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ue",.      (char
1ff20 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63  *)&sqlite_static
1ff30 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c  _bind_value, TCL
1ff40 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
1ff50 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1ff60 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  erp, "sqlite_sta
1ff70 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 22 2c  tic_bind_nbyte",
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 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
1ffa0 64 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c 49 4e  d_nbyte, TCL_LIN
1ffb0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
1ffc0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
1ffd0 71 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72 65 63  qlite_temp_direc
1ffe0 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63 68  tory",.      (ch
1fff0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 74 65 6d  ar*)&sqlite3_tem
20000 70 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c  p_directory, TCL
20010 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
20020 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
20030 65 72 70 2c 20 22 62 69 74 6d 61 73 6b 5f 73 69  erp, "bitmask_si
20040 7a 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ze",.      (char
20050 2a 29 26 62 69 74 6d 61 73 6b 5f 73 69 7a 65 2c  *)&bitmask_size,
20060 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43   TCL_LINK_INT|TC
20070 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59  L_LINK_READ_ONLY
20080 29 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20  );.#if OS_UNIX. 
20090 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
200a0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 79 6e  erp, "sqlite_syn
200b0 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  c_count",.      
200c0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
200d0 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  sync_count, TCL_
200e0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
200f0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
20100 20 22 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e   "sqlite_fullsyn
20110 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  c_count",.      
20120 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
20130 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c 20  fullsync_count, 
20140 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
20150 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 55 4e 49 58  endif /* OS_UNIX
20160 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54 43   */..  return TC
20170 4c 5f 4f 4b 3b 0a 7d 0a                          L_OK;.}.