/ Hex Artifact Content
Login

Artifact 8afb22ec54ee9f28c103c2a212e2e6970626995a:


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 36 32 20 32 30 30 37 2f 30 38 2f 31   1.262 2007/08/1
0240: 36 20 31 33 3a 30 31 3a 34 35 20 64 72 68 20 45  6 13:01:45 drh E
0250: 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  xp $.*/.#include
0260: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0270: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
0280: 23 69 6e 63 6c 75 64 65 20 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 73 71 6c  r *zArg,  .  sql
16a0: 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70 70 46 69  ite3_file **ppFi
16b0: 6c 65 0a 29 7b 0a 20 20 2a 70 70 46 69 6c 65 20  le.){.  *ppFile 
16c0: 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
16d0: 29 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74  )sqlite3TextToPt
16e0: 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74 75 72  r(zArg);.  retur
16f0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1700: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 65  ** Generate a te
1710: 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
1720: 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74  n of a pointer t
1730: 68 61 74 20 63 61 6e 20 62 65 20 75 6e 64 65 72  hat can be under
1740: 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68 65 20  stood.** by the 
1750: 67 65 74 44 62 50 6f 69 6e 74 65 72 20 61 6e 64  getDbPointer and
1760: 20 67 65 74 56 6d 50 6f 69 6e 74 65 72 20 72 6f   getVmPointer ro
1770: 75 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a 2a 2a  utines above..**
1780: 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65 6d 20  .** The problem 
1790: 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61 63 68  is, on some mach
17a0: 69 6e 65 73 20 28 53 6f 6c 61 72 69 73 29 20 69  ines (Solaris) i
17b0: 66 20 79 6f 75 20 64 6f 20 61 20 70 72 69 6e 74  f you do a print
17c0: 66 20 77 69 74 68 0a 2a 2a 20 22 25 70 22 20 79  f with.** "%p" y
17d0: 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e 20 61  ou cannot turn a
17e0: 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61 20 73  round and do a s
17f0: 63 61 6e 66 20 77 69 74 68 20 74 68 65 20 73 61  canf with the sa
1800: 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a 20 67  me "%p" and.** g
1810: 65 74 20 79 6f 75 72 20 70 6f 69 6e 74 65 72 20  et your pointer 
1820: 62 61 63 6b 2e 20 20 59 6f 75 20 68 61 76 65 20  back.  You have 
1830: 74 6f 20 70 72 65 70 65 6e 64 20 61 20 22 30 78  to prepend a "0x
1840: 22 20 62 65 66 6f 72 65 20 69 74 20 77 69 6c 6c  " before it will
1850: 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20 61 74  .** work.  Or at
1860: 20 6c 65 61 73 74 20 74 68 61 74 20 69 73 20 77   least that is w
1870: 68 61 74 20 69 73 20 72 65 70 6f 72 74 65 64 20  hat is reported 
1880: 74 6f 20 6d 65 20 28 64 72 68 29 2e 20 20 42 75  to me (drh).  Bu
1890: 74 20 74 68 69 73 0a 2a 2a 20 62 65 68 61 76 69  t this.** behavi
18a0: 6f 72 20 76 61 72 69 65 73 20 66 72 6f 6d 20 6d  or varies from m
18b0: 61 63 68 69 6e 65 20 74 6f 20 6d 61 63 68 69 6e  achine to machin
18c0: 65 2e 20 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  e.  The solution
18d0: 20 75 73 65 64 20 68 65 72 20 69 73 0a 2a 2a 20   used her is.** 
18e0: 74 6f 20 74 65 73 74 20 74 68 65 20 73 74 72 69  to test the stri
18f0: 6e 67 20 72 69 67 68 74 20 61 66 74 65 72 20 69  ng right after i
1900: 74 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  t is generated t
1910: 6f 20 73 65 65 20 69 66 20 69 74 20 63 61 6e 20  o see if it can 
1920: 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f 6f 64  be.** understood
1930: 20 62 79 20 73 63 61 6e 66 2c 20 61 6e 64 20 69   by scanf, and i
1940: 66 20 6e 6f 74 2c 20 74 72 79 20 70 72 65 70 65  f not, try prepe
1950: 6e 64 69 6e 67 20 61 6e 20 22 30 78 22 20 74 6f  nding an "0x" to
1960: 20 73 65 65 20 69 66 0a 2a 2a 20 74 68 61 74 20   see if.** that 
1970: 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74 68 69  helps.  If nothi
1980: 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66 61 74 61  ng works, a fata
1990: 6c 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65 72  l error is gener
19a0: 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
19b0: 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
19c0: 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74 65 72  terStr(Tcl_Inter
19d0: 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61 72 20  p *interp, char 
19e0: 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70 29 7b  *zPtr, void *p){
19f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1a00: 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c 20 22  ntf(100, zPtr, "
1a10: 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  %p", p);.  retur
1a20: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1a30: 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  ** The callback 
1a40: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71 6c 69  routine for sqli
1a50: 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  te3_exec_printf(
1a60: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1a70: 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 28   exec_printf_cb(
1a80: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
1a90: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
1aa0: 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65 29 7b  v, char **name){
1ab0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a  .  Tcl_DString *
1ac0: 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74 72 69  str = (Tcl_DStri
1ad0: 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74 20  ng*)pArg;.  int 
1ae0: 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f 44 53  i;..  if( Tcl_DS
1af0: 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74 72 29  tringLength(str)
1b00: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ==0 ){.    for(i
1b10: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
1b20: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72  {.      Tcl_DStr
1b30: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
1b40: 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20 3f 20  (str, name[i] ? 
1b50: 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22  name[i] : "NULL"
1b60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
1b70: 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
1b80: 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44 53  i++){.    Tcl_DS
1b90: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
1ba0: 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69 5d 20  nt(str, argv[i] 
1bb0: 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e 55 4c  ? argv[i] : "NUL
1bc0: 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  L");.  }.  retur
1bd0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
1be0: 65 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 63 61  e I/O tracing ca
1bf0: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
1c00: 63 20 46 49 4c 45 20 2a 69 6f 74 72 61 63 65 5f  c FILE *iotrace_
1c10: 66 69 6c 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  file = 0;.static
1c20: 20 76 6f 69 64 20 69 6f 5f 74 72 61 63 65 5f 63   void io_trace_c
1c30: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 63 68  allback(const ch
1c40: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
1c50: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1c60: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1c70: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70 72  zFormat);.  vfpr
1c80: 69 6e 74 66 28 69 6f 74 72 61 63 65 5f 66 69 6c  intf(iotrace_fil
1c90: 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  e, zFormat, ap);
1ca0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
1cb0: 20 66 66 6c 75 73 68 28 69 6f 74 72 61 63 65 5f   fflush(iotrace_
1cc0: 66 69 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  file);.}../*.** 
1cd0: 55 73 61 67 65 3a 20 20 69 6f 5f 74 72 61 63 65  Usage:  io_trace
1ce0: 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20   FILENAME.**.** 
1cf0: 54 75 72 6e 20 49 2f 4f 20 74 72 61 63 69 6e 67  Turn I/O tracing
1d00: 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 66 20   on or off.  If 
1d10: 46 49 4c 45 4e 41 4d 45 20 69 73 20 6e 6f 74 20  FILENAME is not 
1d20: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
1d30: 0a 2a 2a 20 49 2f 4f 20 74 72 61 63 69 6e 67 20  .** I/O tracing 
1d40: 62 65 67 69 6e 73 20 67 6f 69 6e 67 20 69 6e 74  begins going int
1d50: 6f 20 46 49 4c 45 4e 41 4d 45 2e 20 49 66 20 46  o FILENAME. If F
1d60: 49 4c 45 4e 41 4d 45 20 69 73 20 61 6e 20 65 6d  ILENAME is an em
1d70: 70 74 79 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 49  pty.** string, I
1d80: 2f 4f 20 74 72 61 63 69 6e 67 20 69 73 20 74 75  /O tracing is tu
1d90: 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  rned off..*/.sta
1da0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 69 6f 5f  tic int test_io_
1db0: 74 72 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 4e  trace(.  void *N
1dc0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
1dd0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
1de0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
1df0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
1e00: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
1e10: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e30: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
1e40: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
1e50: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
1e60: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
1e70: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
1e80: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
1e90: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1ea0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1eb0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1ec0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1ed0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 22  [0],.          "
1ee0: 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29   FILENAME\"", 0)
1ef0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1f00: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1f10: 28 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 29  ( iotrace_file )
1f20: 7b 0a 20 20 20 20 69 66 28 20 69 6f 74 72 61 63  {.    if( iotrac
1f30: 65 5f 66 69 6c 65 21 3d 73 74 64 6f 75 74 20 26  e_file!=stdout &
1f40: 26 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 21 3d  & iotrace_file!=
1f50: 73 74 64 65 72 72 20 29 7b 0a 20 20 20 20 20 20  stderr ){.      
1f60: 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65 5f 66  fclose(iotrace_f
1f70: 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
1f80: 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 30  iotrace_file = 0
1f90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6f  ;.    sqlite3_io
1fa0: 5f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a  _trace = 0;.  }.
1fb0: 20 20 69 66 28 20 61 72 67 76 5b 31 5d 5b 30 5d    if( argv[1][0]
1fc0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
1fd0: 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74 64 6f  mp(argv[1],"stdo
1fe0: 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ut")==0 ){.     
1ff0: 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20   iotrace_file = 
2000: 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73  stdout;.    }els
2010: 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
2020: 76 5b 31 5d 2c 22 73 74 64 65 72 72 22 29 3d 3d  v[1],"stderr")==
2030: 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  0 ){.      iotra
2040: 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 65 72 72  ce_file = stderr
2050: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2060: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
2070: 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c  = fopen(argv[1],
2080: 20 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20   "w");.    }.   
2090: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63   sqlite3_io_trac
20a0: 65 20 3d 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c  e = io_trace_cal
20b0: 6c 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  lback;.  }.  ret
20c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
20e0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72   sqlite3_exec_pr
20f0: 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d 41 54  intf  DB  FORMAT
2100: 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 49    STRING.**.** I
2110: 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65  nvoke the sqlite
2120: 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 29 20  3_exec_printf() 
2130: 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67 20  interface using 
2140: 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
2150: 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20 53 51  e.** DB.  The SQ
2160: 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e 67 20  L is the string 
2170: 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66 6f 72  FORMAT.  The for
2180: 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f 75 6c  mat string shoul
2190: 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e 65  d contain.** one
21a0: 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54 52 49   %s or %q.  STRI
21b0: 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75 65 20  NG is the value 
21c0: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25 73  inserted into %s
21d0: 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74 69   or %q..*/.stati
21e0: 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63 5f  c int test_exec_
21f0: 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a  printf(.  void *
2200: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
2210: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2220: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2230: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2240: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2250: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
2260: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2270: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2280: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
2290: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
22a0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
22b0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
22c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
22d0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
22e0: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  r;.  int rc;.  c
22f0: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
2300: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
2310: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
2320: 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b 0a 20  if( argc!=4 ){. 
2330: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2340: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
2350: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
2360: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
2370: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
2380: 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22 2c 20  FORMAT STRING", 
2390: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
23a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
23b0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
23c0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
23d0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
23e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
23f0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
2400: 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  r);.  zSql = sql
2410: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
2420: 76 5b 32 5d 2c 20 61 72 67 76 5b 33 5d 29 3b 0a  v[2], argv[3]);.
2430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
2440: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78  xec(db, zSql, ex
2450: 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73  ec_printf_cb, &s
2460: 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71  tr, &zErr);.  sq
2470: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2480: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
2490: 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54  , "%d", rc);.  T
24a0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
24b0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
24c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
24d0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d  ent(interp, rc==
24e0: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f  SQLITE_OK ? Tcl_
24f0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
2500: 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63  r) : zErr);.  Tc
2510: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73  l_DStringFree(&s
2520: 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  tr);.  if( zErr 
2530: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a  ) sqlite3_free(z
2540: 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Err);.  if( sqli
2550: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
2560: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
2570: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2580: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
2590: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
25a0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  ge:  sqlite3_exe
25b0: 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a  c  DB  SQL.**.**
25c0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
25d0: 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72 66 61  te3_exec interfa
25e0: 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65  ce using the ope
25f0: 6e 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2f  n database DB.*/
2600: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2610: 5f 65 78 65 63 28 0a 20 20 76 6f 69 64 20 2a 4e  _exec(.  void *N
2620: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
2630: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2640: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2650: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2660: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2670: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2690: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
26a0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
26b0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
26c0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
26d0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
26e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
26f0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
2700: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
2710: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
2720: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
2730: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a  t i, j;.  char z
2740: 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61  Buf[30];.  if( a
2750: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
2760: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2770: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
2780: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
2790: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
27a0: 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c        " DB SQL",
27b0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
27c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
27d0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
27e0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
27f0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2800: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
2810: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
2820: 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  tr);.  zSql = sq
2830: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2840: 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20  s", argv[2]);.  
2850: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53 71 6c 5b  for(i=j=0; zSql[
2860: 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  i];){.    if( zS
2870: 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20  ql[i]=='%' ){.  
2880: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2890: 28 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53  (testHexToInt(zS
28a0: 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b 20 74  ql[i+1])<<4) + t
28b0: 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c  estHexToInt(zSql
28c0: 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 20  [i+2]);.      i 
28d0: 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  += 3;.    }else{
28e0: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
28f0: 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a 20 20   = zSql[i++];.  
2900: 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 6a    }.  }.  zSql[j
2910: 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  ] = 0;.  rc = sq
2920: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
2930: 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66  Sql, exec_printf
2940: 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72  _cb, &str, &zErr
2950: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2960: 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e  e(zSql);.  sprin
2970: 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 72  tf(zBuf, "%d", r
2980: 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  c);.  Tcl_Append
2990: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
29a0: 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70  zBuf);.  Tcl_App
29b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
29c0: 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p, rc==SQLITE_OK
29d0: 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61   ? Tcl_DStringVa
29e0: 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72  lue(&str) : zErr
29f0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
2a00: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66  Free(&str);.  if
2a10: 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33  ( zErr ) sqlite3
2a20: 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69  _free(zErr);.  i
2a30: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
2a40: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
2a50: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
2a60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
2a70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2a80: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
2a90: 74 65 33 5f 65 78 65 63 5f 6e 72 20 20 44 42 20  te3_exec_nr  DB 
2aa0: 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b   SQL.**.** Invok
2ab0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78  e the sqlite3_ex
2ac0: 65 63 20 69 6e 74 65 72 66 61 63 65 20 75 73 69  ec interface usi
2ad0: 6e 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ng the open data
2ae0: 62 61 73 65 20 44 42 2e 20 20 44 69 73 63 61 72  base DB.  Discar
2af0: 64 0a 2a 2a 20 61 6c 6c 20 72 65 73 75 6c 74 73  d.** all results
2b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2b10: 65 73 74 5f 65 78 65 63 5f 6e 72 28 0a 20 20 76  est_exec_nr(.  v
2b20: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2b30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2b40: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2b50: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2b60: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2b70: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2b80: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2b90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ba0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2bb0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2bc0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2bd0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2be0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2bf0: 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
2c00: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
2c10: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
2c20: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2c30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2c40: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
2c50: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
2c60: 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20  v[0], .       " 
2c70: 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20  DB SQL", 0);.   
2c80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c90: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2ca0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2cb0: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
2cc0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2cd0: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
2ce0: 65 33 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76  e3_exec(db, argv
2cf0: 5b 32 5d 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  [2], 0, 0, &zErr
2d00: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2d10: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
2d20: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
2d30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2d40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
2d60: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
2d70: 66 5f 7a 5f 74 65 73 74 20 20 53 45 50 41 52 41  f_z_test  SEPARA
2d80: 54 4f 52 20 20 41 52 47 30 20 20 41 52 47 31 20  TOR  ARG0  ARG1 
2d90: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  ....**.** Test t
2da0: 68 65 20 25 7a 20 66 6f 72 6d 61 74 20 6f 66 20  he %z format of 
2db0: 73 71 6c 69 74 65 4d 50 72 69 6e 74 66 28 29 2e  sqliteMPrintf().
2dc0: 20 20 55 73 65 20 6d 75 6c 74 69 70 6c 65 20 6d    Use multiple m
2dd0: 70 72 69 6e 74 66 28 29 20 63 61 6c 6c 73 20 74  printf() calls t
2de0: 6f 20 0a 2a 2a 20 63 6f 6e 63 61 74 65 6e 61 74  o .** concatenat
2df0: 65 20 61 72 67 30 20 74 68 72 6f 75 67 68 20 61  e arg0 through a
2e00: 72 67 6e 20 75 73 69 6e 67 20 73 65 70 61 72 61  rgn using separa
2e10: 74 6f 72 20 61 73 20 74 68 65 20 73 65 70 61 72  tor as the separ
2e20: 61 74 6f 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  ator..** Return 
2e30: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  the result..*/.s
2e40: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d  tatic int test_m
2e50: 70 72 69 6e 74 66 5f 7a 28 0a 20 20 76 6f 69 64  printf_z(.  void
2e60: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
2e70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2e80: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2e90: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2ea0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2eb0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
2ec0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
2ed0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2ee0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
2ef0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
2f00: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
2f10: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
2f20: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75  ){.  char *zResu
2f30: 6c 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  lt = 0;.  int i;
2f40: 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 61  ..  for(i=2; i<a
2f50: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  rgc; i++){.    z
2f60: 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
2f70: 4d 50 72 69 6e 74 66 28 30 2c 20 22 25 7a 25 73  MPrintf(0, "%z%s
2f80: 25 73 22 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72  %s", zResult, ar
2f90: 67 76 5b 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b  gv[1], argv[i]);
2fa0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e  .  }.  Tcl_Appen
2fb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2fc0: 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73  zResult, 0);.  s
2fd0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 73  qlite3_free(zRes
2fe0: 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ult);.  return T
2ff0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
3000: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
3010: 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20  mprintf_n_test  
3020: 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73  STRING.**.** Tes
3030: 74 20 74 68 65 20 25 6e 20 66 6f 72 6d 61 74 20  t the %n format 
3040: 6f 66 20 73 71 6c 69 74 65 4d 50 72 69 6e 74 66  of sqliteMPrintf
3050: 28 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ().  Return the 
3060: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 2a 2a  length of the.**
3070: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a   input string..*
3080: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
3090: 74 5f 6d 70 72 69 6e 74 66 5f 6e 28 0a 20 20 76  t_mprintf_n(.  v
30a0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
30b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
30c0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
30d0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
30e0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
30f0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
3100: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
3110: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3120: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
3130: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
3140: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
3150: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
3160: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53  */.){.  char *zS
3170: 74 72 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  tr;.  int n = 0;
3180: 0a 20 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65  .  zStr = sqlite
3190: 33 4d 50 72 69 6e 74 66 28 30 2c 20 22 25 73 25  3MPrintf(0, "%s%
31a0: 6e 22 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29  n", argv[1], &n)
31b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
31c0: 28 7a 53 74 72 29 3b 0a 20 20 54 63 6c 5f 53 65  (zStr);.  Tcl_Se
31d0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
31e0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
31f0: 28 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (n));.  return T
3200: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
3210: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
3220: 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 53 49  snprintf_int  SI
3230: 5a 45 20 46 4f 52 4d 41 54 20 20 49 4e 54 0a 2a  ZE FORMAT  INT.*
3240: 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 6f 66  *.** Test the of
3250: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3260: 66 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 49  f() routine.  SI
3270: 5a 45 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ZE is the size o
3280: 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  f the.** output 
3290: 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 2e  buffer in bytes.
32a0: 20 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69    The maximum si
32b0: 7a 65 20 69 73 20 31 30 30 2e 20 20 46 4f 52 4d  ze is 100.  FORM
32c0: 41 54 20 69 73 20 74 68 65 0a 2a 2a 20 66 6f 72  AT is the.** for
32d0: 6d 61 74 20 73 74 72 69 6e 67 2e 20 20 49 4e 54  mat string.  INT
32e0: 20 69 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74   is a single int
32f0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20 20  eger argument.  
3300: 54 68 65 20 46 4f 52 4d 41 54 0a 2a 2a 20 73 74  The FORMAT.** st
3310: 72 69 6e 67 20 6d 75 73 74 20 72 65 71 75 69 72  ring must requir
3320: 65 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 74  e no more than t
3330: 68 69 73 20 6f 6e 65 20 69 6e 74 65 67 65 72 20  his one integer 
3340: 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 0a 2a 2a  argument.  If.**
3350: 20 59 6f 75 20 70 61 73 73 20 69 6e 20 61 20 66   You pass in a f
3360: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 74 68 61  ormat string tha
3370: 74 20 72 65 71 75 69 72 65 73 20 6d 6f 72 65 20  t requires more 
3380: 74 68 61 6e 20 6f 6e 65 20 61 72 67 75 6d 65 6e  than one argumen
3390: 74 2c 0a 2a 2a 20 62 61 64 20 74 68 69 6e 67 73  t,.** bad things
33a0: 20 77 69 6c 6c 20 68 61 70 70 65 6e 2e 0a 2a 2f   will happen..*/
33b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
33c0: 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20  _snprintf_int(. 
33d0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
33e0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
33f0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
3400: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
3410: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
3420: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
3430: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
3440: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3450: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
3460: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
3470: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
3480: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
3490: 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  t */.){.  char z
34a0: 53 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e 74 20  Str[100];.  int 
34b0: 6e 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 31 5d  n = atoi(argv[1]
34c0: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
34d0: 2a 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67 76 5b  *zFormat = argv[
34e0: 32 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d 20 61  2];.  int a1 = a
34f0: 74 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20  toi(argv[3]);.  
3500: 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a 53 74  if( n>sizeof(zSt
3510: 72 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f 66 28  r) ) n = sizeof(
3520: 7a 53 74 72 29 3b 0a 20 20 73 74 72 63 70 79 28  zStr);.  strcpy(
3530: 7a 53 74 72 2c 20 22 61 62 63 64 65 66 67 68 69  zStr, "abcdefghi
3540: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
3550: 7a 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  z");.  sqlite3_s
3560: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 72 2c  nprintf(n, zStr,
3570: 20 7a 46 6f 72 6d 61 74 2c 20 61 31 29 3b 0a 20   zFormat, a1);. 
3580: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
3590: 74 28 69 6e 74 65 72 70 2c 20 7a 53 74 72 2c 20  t(interp, zStr, 
35a0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
35b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
35c0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 67 65  age:  sqlite3_ge
35d0: 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 20 20  t_table_printf  
35e0: 44 42 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49  DB  FORMAT  STRI
35f0: 4e 47 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  NG.**.** Invoke 
3600: 74 68 65 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  the sqlite3_get_
3610: 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 29 20 69  table_printf() i
3620: 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67 20 74  nterface using t
3630: 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
3640: 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20 53 51 4c  .** DB.  The SQL
3650: 20 69 73 20 74 68 65 20 73 74 72 69 6e 67 20 46   is the string F
3660: 4f 52 4d 41 54 2e 20 20 54 68 65 20 66 6f 72 6d  ORMAT.  The form
3670: 61 74 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64  at string should
3680: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e 65 20   contain.** one 
3690: 25 73 20 6f 72 20 25 71 2e 20 20 53 54 52 49 4e  %s or %q.  STRIN
36a0: 47 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69  G is the value i
36b0: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25 73 20  nserted into %s 
36c0: 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74 69 63  or %q..*/.static
36d0: 20 69 6e 74 20 74 65 73 74 5f 67 65 74 5f 74 61   int test_get_ta
36e0: 62 6c 65 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f  ble_printf(.  vo
36f0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
3700: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3710: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
3720: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
3730: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
3740: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3750: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3760: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3770: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3780: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3790: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
37a0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
37b0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
37c0: 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  db;.  Tcl_DStrin
37d0: 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b  g str;.  int rc;
37e0: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
37f0: 30 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 2c 20 6e  0;.  int nRow, n
3800: 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a 61 52  Col;.  char **aR
3810: 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  esult;.  int i;.
3820: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
3830: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
3840: 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b 0a   if( argc!=4 ){.
3850: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3860: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
3870: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
3880: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
3890: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
38a0: 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22 2c   FORMAT STRING",
38b0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
38c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
38d0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
38e0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
38f0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
3900: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
3910: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
3920: 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  tr);.  zSql = sq
3930: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
3940: 67 76 5b 32 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a  gv[2],argv[3]);.
3950: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
3960: 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71  et_table(db, zSq
3970: 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 26 6e 52  l, &aResult, &nR
3980: 6f 77 2c 20 26 6e 43 6f 6c 2c 20 26 7a 45 72 72  ow, &nCol, &zErr
3990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
39a0: 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e  e(zSql);.  sprin
39b0: 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 72  tf(zBuf, "%d", r
39c0: 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  c);.  Tcl_Append
39d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
39e0: 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d  zBuf);.  if( rc=
39f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3a00: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
3a10: 22 25 64 22 2c 20 6e 52 6f 77 29 3b 0a 20 20 20  "%d", nRow);.   
3a20: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
3a30: 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29  nt(interp, zBuf)
3a40: 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  ;.    sprintf(zB
3a50: 75 66 2c 20 22 25 64 22 2c 20 6e 43 6f 6c 29 3b  uf, "%d", nCol);
3a60: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  .    Tcl_AppendE
3a70: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
3a80: 42 75 66 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Buf);.    for(i=
3a90: 30 3b 20 69 3c 28 6e 52 6f 77 2b 31 29 2a 6e 43  0; i<(nRow+1)*nC
3aa0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
3ab0: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
3ac0: 74 28 69 6e 74 65 72 70 2c 20 61 52 65 73 75 6c  t(interp, aResul
3ad0: 74 5b 69 5d 20 3f 20 61 52 65 73 75 6c 74 5b 69  t[i] ? aResult[i
3ae0: 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  ] : "NULL");.   
3af0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
3b00: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
3b10: 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 29 3b  t(interp, zErr);
3b20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
3b30: 72 65 65 5f 74 61 62 6c 65 28 61 52 65 73 75 6c  ree_table(aResul
3b40: 74 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29  t);.  if( zErr )
3b50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
3b60: 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rr);.  if( sqlit
3b70: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
3b80: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
3b90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3ba0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
3bb0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
3bc0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73  ge:  sqlite3_las
3bd0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44  t_insert_rowid D
3be0: 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
3bf0: 74 68 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49  the integer ROWI
3c00: 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  D of the most re
3c10: 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a  cent insert..*/.
3c20: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
3c30: 6c 61 73 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f  last_rowid(.  vo
3c40: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
3c50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3c60: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
3c70: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
3c80: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
3c90: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3ca0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3cb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3cc0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3cd0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3ce0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3cf0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3d00: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
3d10: 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  db;.  char zBuf[
3d20: 33 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  30];..  if( argc
3d30: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
3d40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3d50: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
3d60: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
3d70: 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c  , argv[0], " DB\
3d80: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
3d90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3da0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
3db0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
3dc0: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
3dd0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3de0: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
3df0: 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c  %lld", sqlite3_l
3e00: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
3e10: 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70  (db));.  Tcl_App
3e20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3e30: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
3e40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
3e60: 20 73 71 6c 69 74 65 33 5f 6b 65 79 20 44 42 20   sqlite3_key DB 
3e70: 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  KEY.**.** Set th
3e80: 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a  e codec key..*/.
3e90: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
3ea0: 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  key(.  void *Not
3eb0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
3ec0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
3ed0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
3ee0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
3ef0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
3f00: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3f20: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
3f30: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
3f40: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
3f50: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
3f60: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
3f70: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
3f80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b  onst char *zKey;
3f90: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
3fa0: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
3fb0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
3fc0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
3fd0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
3fe0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
3ff0: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
4000: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
4010: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4020: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
4030: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
4040: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
4050: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4060: 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76  R;.  zKey = argv
4070: 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74  [2];.  nKey = st
4080: 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23 69 66 64  rlen(zKey);.#ifd
4090: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
40a0: 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65  DEC.  sqlite3_ke
40b0: 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  y(db, zKey, nKey
40c0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
40d0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
40e0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
40f0: 74 65 33 5f 72 65 6b 65 79 20 44 42 20 4b 45 59  te3_rekey DB KEY
4100: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  .**.** Change th
4110: 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a  e codec key..*/.
4120: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
4130: 72 65 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e  rekey(.  void *N
4140: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
4150: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
4160: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
4170: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
4180: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
4190: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41b0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
41c0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
41d0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
41e0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
41f0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
4200: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
4210: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65   const char *zKe
4220: 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  y;.  int nKey;. 
4230: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
4240: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4250: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
4260: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
4270: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
4280: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
4290: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
42a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
42b0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
42c0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
42d0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
42e0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
42f0: 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72  ROR;.  zKey = ar
4300: 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20  gv[2];.  nKey = 
4310: 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23 69  strlen(zKey);.#i
4320: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
4330: 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f  CODEC.  sqlite3_
4340: 72 65 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20  rekey(db, zKey, 
4350: 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nKey);.#endif.  
4360: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
4370: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
4380: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 44 42  sqlite3_close DB
4390: 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68  .**.** Closes th
43a0: 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
43b0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6f 70 65  d by sqlite3_ope
43c0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
43d0: 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f   sqlite_test_clo
43e0: 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  se(.  void *NotU
43f0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4400: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4410: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4420: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4430: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4440: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4460: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4470: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
4480: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4490: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
44a0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
44b0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
44c0: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
44d0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
44e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
44f0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
4500: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
4510: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
4520: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
4530: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4540: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4550: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
4560: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
4570: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
4580: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
4590: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65   = sqlite3_close
45a0: 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  (db);.  Tcl_SetR
45b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
45c0: 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
45d0: 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
45e0: 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
45f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  _OK;.}../*.** Im
4600: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
4610: 74 68 65 20 78 5f 63 6f 61 6c 65 73 63 65 28 29  the x_coalesce()
4620: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65   function..** Re
4630: 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 61  turn the first a
4640: 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c  rgument non-NULL
4650: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
4660: 61 74 69 63 20 76 6f 69 64 20 74 31 5f 69 66 6e  atic void t1_ifn
4670: 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ullFunc(.  sqlit
4680: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
4690: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
46a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
46b0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
46c0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
46d0: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
46e0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c   if( SQLITE_NULL
46f0: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
4700: 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20 29 7b  type(argv[i]) ){
4710: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
4720: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
4730: 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  es(argv[i]);.   
4740: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4750: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
4760: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
4770: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
4780: 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 2c  ]),.          n,
4790: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
47a0: 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  T);.      break;
47b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
47c0: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 65  .** These are te
47d0: 73 74 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 20  st functions.   
47e0: 20 68 65 78 38 28 29 20 69 6e 74 65 72 70 72 65   hex8() interpre
47f0: 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20  ts its argument 
4800: 61 73 0a 2a 2a 20 55 54 46 38 20 61 6e 64 20 72  as.** UTF8 and r
4810: 65 74 75 72 6e 73 20 61 20 68 65 78 20 65 6e 63  eturns a hex enc
4820: 6f 64 69 6e 67 2e 20 20 68 65 78 31 36 6c 65 28  oding.  hex16le(
4830: 29 20 69 6e 74 65 72 70 72 65 74 73 20 69 74 73  ) interprets its
4840: 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 61 73 20   argument.** as 
4850: 55 54 46 31 36 6c 65 20 61 6e 64 20 72 65 74 75  UTF16le and retu
4860: 72 6e 73 20 61 20 68 65 78 20 65 6e 63 6f 64 69  rns a hex encodi
4870: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
4880: 69 64 20 68 65 78 38 46 75 6e 63 28 73 71 6c 69  id hex8Func(sqli
4890: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c 20  te3_context *p, 
48a0: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
48b0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
48c0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
48d0: 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  d char *z;.  int
48e0: 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   i;.  char zBuf[
48f0: 32 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  200];.  z = sqli
4900: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
4910: 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28 69  rgv[0]);.  for(i
4920: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42 75  =0; i<sizeof(zBu
4930: 66 29 2f 32 20 2d 20 32 20 26 26 20 7a 5b 69 5d  f)/2 - 2 && z[i]
4940: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69  ; i++){.    spri
4950: 6e 74 66 28 26 7a 42 75 66 5b 69 2a 32 5d 2c 20  ntf(&zBuf[i*2], 
4960: 22 25 30 32 78 22 2c 20 7a 5b 69 5d 26 30 78 66  "%02x", z[i]&0xf
4970: 66 29 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69  f);.  }.  zBuf[i
4980: 2a 32 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  *2] = 0;.  sqlit
4990: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
49a0: 2c 20 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d  , (char*)zBuf, -
49b0: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
49c0: 45 4e 54 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20  ENT);.}.#ifndef 
49d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
49e0: 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  6.static void he
49f0: 78 31 36 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  x16Func(sqlite3_
4a00: 63 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20  context *p, int 
4a10: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
4a20: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  lue **argv){.  c
4a30: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 73 68  onst unsigned sh
4a40: 6f 72 74 20 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e  ort int *z;.  in
4a50: 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  t i;.  char zBuf
4a60: 5b 34 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c  [400];.  z = sql
4a70: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
4a80: 36 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f  6(argv[0]);.  fo
4a90: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
4aa0: 7a 42 75 66 29 2f 34 20 2d 20 34 20 26 26 20 7a  zBuf)/4 - 4 && z
4ab0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  [i]; i++){.    s
4ac0: 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69 2a 34  printf(&zBuf[i*4
4ad0: 5d 2c 20 22 25 30 34 78 22 2c 20 7a 5b 69 5d 26  ], "%04x", z[i]&
4ae0: 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20 7a 42 75  0xff);.  }.  zBu
4af0: 66 5b 69 2a 34 5d 20 3d 20 30 3b 0a 20 20 73 71  f[i*4] = 0;.  sq
4b00: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4b10: 74 28 70 2c 20 28 63 68 61 72 2a 29 7a 42 75 66  t(p, (char*)zBuf
4b20: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
4b30: 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69  NSIENT);.}.#endi
4b40: 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63  f../*.** A struc
4b50: 74 75 72 65 20 69 6e 74 6f 20 77 68 69 63 68 20  ture into which 
4b60: 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 74 65  to accumulate te
4b70: 78 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 64 73  xt..*/.struct ds
4b80: 74 72 20 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  tr {.  int nAllo
4b90: 63 3b 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c  c;  /* Space all
4ba0: 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ocated */.  int 
4bb0: 6e 55 73 65 64 3b 20 20 20 2f 2a 20 53 70 61 63  nUsed;   /* Spac
4bc0: 65 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72  e used */.  char
4bd0: 20 2a 7a 3b 20 20 20 20 20 2f 2a 20 54 68 65 20   *z;     /* The 
4be0: 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  space */.};../*.
4bf0: 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20 74  ** Append text t
4c00: 6f 20 61 20 64 73 74 72 0a 2a 2f 0a 73 74 61 74  o a dstr.*/.stat
4c10: 69 63 20 76 6f 69 64 20 64 73 74 72 41 70 70 65  ic void dstrAppe
4c20: 6e 64 28 73 74 72 75 63 74 20 64 73 74 72 20 2a  nd(struct dstr *
4c30: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
4c40: 2c 20 69 6e 74 20 64 69 76 69 64 65 72 29 7b 0a  , int divider){.
4c50: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
4c60: 28 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55  (z);.  if( p->nU
4c70: 73 65 64 20 2b 20 6e 20 2b 20 32 20 3e 20 70 2d  sed + n + 2 > p-
4c80: 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 63  >nAlloc ){.    c
4c90: 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 70  har *zNew;.    p
4ca0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41  ->nAlloc = p->nA
4cb0: 6c 6c 6f 63 2a 32 20 2b 20 6e 20 2b 20 32 30 30  lloc*2 + n + 200
4cc0: 3b 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c  ;.    zNew = sql
4cd0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e  ite3_realloc(p->
4ce0: 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20  z, p->nAlloc);. 
4cf0: 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29     if( zNew==0 )
4d00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4d10: 66 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 20 20  free(p->z);.    
4d20: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
4d30: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 20 20  izeof(*p));.    
4d40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
4d50: 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b      p->z = zNew;
4d60: 0a 20 20 7d 0a 20 20 69 66 28 20 64 69 76 69 64  .  }.  if( divid
4d70: 65 72 20 26 26 20 70 2d 3e 6e 55 73 65 64 3e 30  er && p->nUsed>0
4d80: 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e   ){.    p->z[p->
4d90: 6e 55 73 65 64 2b 2b 5d 20 3d 20 64 69 76 69 64  nUsed++] = divid
4da0: 65 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  er;.  }.  memcpy
4db0: 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d  (&p->z[p->nUsed]
4dc0: 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d 3e  , z, n+1);.  p->
4dd0: 6e 55 73 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a 2f  nUsed += n;.}../
4de0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 64 20 66 6f 72  *.** Invoked for
4df0: 20 65 61 63 68 20 63 61 6c 6c 62 61 63 6b 20 66   each callback f
4e00: 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 65 63 46  rom sqlite3ExecF
4e10: 75 6e 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  unc.*/.static in
4e20: 74 20 65 78 65 63 46 75 6e 63 43 61 6c 6c 62 61  t execFuncCallba
4e30: 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  ck(void *pData, 
4e40: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
4e50: 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f  *argv, char **No
4e60: 74 55 73 65 64 29 7b 0a 20 20 73 74 72 75 63 74  tUsed){.  struct
4e70: 20 64 73 74 72 20 2a 70 20 3d 20 28 73 74 72 75   dstr *p = (stru
4e80: 63 74 20 64 73 74 72 2a 29 70 44 61 74 61 3b 0a  ct dstr*)pData;.
4e90: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
4ea0: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
4eb0: 7b 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b 69  {.    if( argv[i
4ec0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 73  ]==0 ){.      ds
4ed0: 74 72 41 70 70 65 6e 64 28 70 2c 20 22 4e 55 4c  trAppend(p, "NUL
4ee0: 4c 22 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 65  L", ' ');.    }e
4ef0: 6c 73 65 7b 0a 20 20 20 20 20 20 64 73 74 72 41  lse{.      dstrA
4f00: 70 70 65 6e 64 28 70 2c 20 61 72 67 76 5b 69 5d  ppend(p, argv[i]
4f10: 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 0a 20 20  , ' ');.    }.  
4f20: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
4f30: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
4f40: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 73  ation of the x_s
4f50: 71 6c 69 74 65 5f 65 78 65 63 28 29 20 66 75 6e  qlite_exec() fun
4f60: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
4f70: 63 74 69 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20 61  ction takes.** a
4f80: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
4f90: 20 61 6e 64 20 61 74 74 65 6d 70 74 73 20 74 6f   and attempts to
4fa0: 20 65 78 65 63 75 74 65 20 74 68 61 74 20 61 72   execute that ar
4fb0: 67 75 6d 65 6e 74 20 61 73 20 53 51 4c 20 63 6f  gument as SQL co
4fc0: 64 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 69  de..** This is i
4fd0: 6c 6c 65 67 61 6c 20 61 6e 64 20 73 68 6f 75 6c  llegal and shoul
4fe0: 64 20 73 65 74 20 74 68 65 20 53 51 4c 49 54 45  d set the SQLITE
4ff0: 5f 4d 49 53 55 53 45 20 66 6c 61 67 20 6f 6e 20  _MISUSE flag on 
5000: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
5010: 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 30 37 3a  .** 2004-Jan-07:
5020: 20 20 57 65 20 68 61 76 65 20 63 68 61 6e 67 65    We have change
5030: 64 20 74 68 69 73 20 74 6f 20 6d 61 6b 65 20 69  d this to make i
5040: 74 20 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  t legal to call 
5050: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a  sqlite3_exec().*
5060: 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20  * from within a 
5070: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 20 20  function call.  
5080: 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
5090: 74 69 6e 65 20 73 69 6d 75 6c 61 74 65 73 20 74  tine simulates t
50a0: 68 65 20 65 66 66 65 63 74 20 6f 66 20 68 61 76  he effect of hav
50b0: 69 6e 67 20 74 77 6f 20 74 68 72 65 61 64 73 20  ing two threads 
50c0: 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 75 73  attempt to.** us
50d0: 65 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  e the same datab
50e0: 61 73 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ase at the same 
50f0: 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  time..*/.static 
5100: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 65 63  void sqlite3Exec
5110: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
5120: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
5130: 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  , .  int argc,  
5140: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5150: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74 72   **argv.){.  str
5160: 75 63 74 20 64 73 74 72 20 78 3b 0a 20 20 6d 65  uct dstr x;.  me
5170: 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65  mset(&x, 0, size
5180: 6f 66 28 78 29 29 3b 0a 20 20 28 76 6f 69 64 29  of(x));.  (void)
5190: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 28 73 71  sqlite3_exec((sq
51a0: 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 5f 75  lite3*)sqlite3_u
51b0: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
51c0: 29 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ),.      (char*)
51d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
51e0: 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a 20 20 20  xt(argv[0]),.   
51f0: 20 20 20 65 78 65 63 46 75 6e 63 43 61 6c 6c 62     execFuncCallb
5200: 61 63 6b 2c 20 26 78 2c 20 30 29 3b 0a 20 20 73  ack, &x, 0);.  s
5210: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
5220: 78 74 28 63 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c  xt(context, x.z,
5230: 20 78 2e 6e 55 73 65 64 2c 20 53 51 4c 49 54 45   x.nUsed, SQLITE
5240: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
5250: 71 6c 69 74 65 33 5f 66 72 65 65 28 78 2e 7a 29  qlite3_free(x.z)
5260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
5270: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 6b 74  mentation of tkt
5280: 32 32 31 33 66 75 6e 63 28 29 2c 20 61 20 73 63  2213func(), a sc
5290: 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 74 68  alar function th
52a0: 61 74 20 74 61 6b 65 73 20 65 78 61 63 74 6c 79  at takes exactly
52b0: 0a 2a 2a 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74  .** one argument
52c0: 2e 20 49 74 20 68 61 73 20 74 77 6f 20 69 6e 74  . It has two int
52d0: 65 72 65 73 74 69 6e 67 20 66 65 61 74 75 72 65  eresting feature
52e0: 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63 61  s:.**.** * It ca
52f0: 6c 6c 73 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  lls sqlite3_valu
5300: 65 5f 74 65 78 74 28 29 20 33 20 74 69 6d 65 73  e_text() 3 times
5310: 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   on the argument
5320: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2e   sqlite3_value*.
5330: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 74 68 72  .**   If the thr
5340: 65 65 20 70 6f 69 6e 74 65 72 73 20 72 65 74 75  ee pointers retu
5350: 72 6e 65 64 20 61 72 65 20 6e 6f 74 20 74 68 65  rned are not the
5360: 20 73 61 6d 65 20 61 6e 20 53 51 4c 20 65 72 72   same an SQL err
5370: 6f 72 20 69 73 20 72 61 69 73 65 64 2e 0a 2a 2a  or is raised..**
5380: 0a 2a 2a 20 2a 20 4f 74 68 65 72 77 69 73 65 20  .** * Otherwise 
5390: 69 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70  it returns a cop
53a0: 79 20 6f 66 20 74 68 65 20 74 65 78 74 20 72 65  y of the text re
53b0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
53c0: 69 74 27 73 20 0a 2a 2a 20 20 20 61 72 67 75 6d  it's .**   argum
53d0: 65 6e 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  ent in such a wa
53e0: 79 20 61 73 20 74 68 65 20 56 44 42 45 20 72 65  y as the VDBE re
53f0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 20  presentation is 
5400: 61 20 4d 65 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20  a Mem* cell .** 
5410: 20 20 77 69 74 68 20 74 68 65 20 4d 45 4d 5f 54    with the MEM_T
5420: 65 72 6d 20 66 6c 61 67 20 63 6c 65 61 72 2e 20  erm flag clear. 
5430: 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 32  .**.** Ticket #2
5440: 32 31 33 20 63 61 6e 20 74 68 65 72 65 66 6f 72  213 can therefor
5450: 65 20 62 65 20 74 65 73 74 65 64 20 62 79 20 65  e be tested by e
5460: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 66 6f  valuating the fo
5470: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 53 51 4c 20 65  llowing.** SQL e
5480: 78 70 72 65 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a  xpression:.**.**
5490: 20 20 20 74 6b 74 32 32 31 33 66 75 6e 63 28 74     tkt2213func(t
54a0: 6b 74 32 32 31 33 66 75 6e 63 28 27 61 20 73 74  kt2213func('a st
54b0: 72 69 6e 67 27 29 29 3b 0a 2a 2f 0a 73 74 61 74  ring'));.*/.stat
54c0: 69 63 20 76 6f 69 64 20 74 6b 74 32 32 31 33 46  ic void tkt2213F
54d0: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
54e0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
54f0: 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63  ext, .  int argc
5500: 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ,  .  sqlite3_va
5510: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5520: 69 6e 74 20 6e 54 65 78 74 3b 0a 20 20 75 6e 73  int nText;.  uns
5530: 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74  igned char const
5540: 20 2a 7a 54 65 78 74 31 3b 0a 20 20 75 6e 73 69   *zText1;.  unsi
5550: 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20  gned char const 
5560: 2a 7a 54 65 78 74 32 3b 0a 20 20 75 6e 73 69 67  *zText2;.  unsig
5570: 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ned char const *
5580: 7a 54 65 78 74 33 3b 0a 0a 20 20 6e 54 65 78 74  zText3;..  nText
5590: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
55a0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
55b0: 0a 20 20 7a 54 65 78 74 31 20 3d 20 73 71 6c 69  .  zText1 = sqli
55c0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
55d0: 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74  rgv[0]);.  zText
55e0: 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  2 = sqlite3_valu
55f0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5600: 0a 20 20 7a 54 65 78 74 33 20 3d 20 73 71 6c 69  .  zText3 = sqli
5610: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5620: 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 69 66 28 20  rgv[0]);..  if( 
5630: 7a 54 65 78 74 31 21 3d 7a 54 65 78 74 32 20 7c  zText1!=zText2 |
5640: 7c 20 7a 54 65 78 74 32 21 3d 7a 54 65 78 74 33  | zText2!=zText3
5650: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5660: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
5670: 74 65 78 74 2c 20 22 74 6b 74 32 32 31 33 20 69  text, "tkt2213 i
5680: 73 20 6e 6f 74 20 66 69 78 65 64 22 2c 20 2d 31  s not fixed", -1
5690: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
56a0: 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 28 63  char *zCopy = (c
56b0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
56c0: 6c 6c 6f 63 28 6e 54 65 78 74 29 3b 0a 20 20 20  lloc(nText);.   
56d0: 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a   memcpy(zCopy, z
56e0: 54 65 78 74 31 2c 20 6e 54 65 78 74 29 3b 0a 20  Text1, nText);. 
56f0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5700: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
5710: 7a 43 6f 70 79 2c 20 6e 54 65 78 74 2c 20 73 71  zCopy, nText, sq
5720: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
5730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
5740: 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 66 75 6e 63  llowing SQL func
5750: 74 69 6f 6e 20 74 61 6b 65 73 20 34 20 61 72 67  tion takes 4 arg
5760: 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 32 6e 64  uments.  The 2nd
5770: 20 61 6e 64 0a 2a 2a 20 34 74 68 20 61 72 67 75   and.** 4th argu
5780: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 6f 6e 65  ment must be one
5790: 20 6f 66 20 74 68 65 73 65 20 73 74 72 69 6e 67   of these string
57a0: 73 3a 20 20 27 74 65 78 74 27 2c 20 27 74 65 78  s:  'text', 'tex
57b0: 74 31 36 27 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f  t16',.** or 'blo
57c0: 62 27 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  b' corresponding
57d0: 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e   to API function
57e0: 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  s.**.**      sql
57f0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5800: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
5810: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29  3_value_text16()
5820: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
5830: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a  _value_blob().**
5840: 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72  .** The third ar
5850: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 74 72 69  gument is a stri
5860: 6e 67 2c 20 65 69 74 68 65 72 20 27 62 79 74 65  ng, either 'byte
5870: 73 27 20 6f 72 20 27 62 79 74 65 73 31 36 27 20  s' or 'bytes16' 
5880: 6f 72 20 27 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f  or 'noop',.** co
5890: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 41  rresponding to A
58a0: 50 49 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  PIs:.**.**      
58b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
58c0: 74 65 73 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  tes().**      sq
58d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
58e0: 73 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 6e 6f  s16().**      no
58f0: 6f 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 41 50 49  op.**.** The API
5900: 73 20 64 65 73 69 67 6e 61 74 65 64 20 62 79 20  s designated by 
5910: 74 68 65 20 32 6e 64 20 74 68 72 6f 75 67 68 20  the 2nd through 
5920: 34 74 68 20 61 72 67 75 6d 65 6e 74 73 20 61 72  4th arguments ar
5930: 65 20 61 70 70 6c 69 65 64 0a 2a 2a 20 74 6f 20  e applied.** to 
5940: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
5950: 6e 74 20 69 6e 20 6f 72 64 65 72 2e 20 20 49 66  nt in order.  If
5960: 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 72 65   the pointers re
5970: 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
5980: 20 73 65 63 6f 6e 64 20 61 6e 64 20 66 6f 75 72   second and four
5990: 74 68 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  th are different
59a0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
59b0: 65 74 75 72 6e 73 20 31 2e 20 20 4f 74 68 65 72  eturns 1.  Other
59c0: 77 69 73 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  wise,.** this ro
59d0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e  utine returns 0.
59e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
59f0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
5a00: 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 6e  test to see when
5a10: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
5a20: 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f  rs from.** the _
5a30: 74 65 78 74 28 29 2c 20 5f 74 65 78 74 31 36 28  text(), _text16(
5a40: 29 20 61 6e 64 20 5f 62 6c 6f 62 28 29 20 41 50  ) and _blob() AP
5a50: 49 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  Is become invali
5a60: 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dated..*/.static
5a70: 20 76 6f 69 64 20 70 74 72 43 68 6e 67 46 75 6e   void ptrChngFun
5a80: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
5a90: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
5aa0: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
5ab0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
5ac0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
5ad0: 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 2a 70  nst void *p1, *p
5ae0: 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2;.  const char 
5af0: 2a 7a 43 6d 64 3b 0a 20 20 69 66 28 20 61 72 67  *zCmd;.  if( arg
5b00: 63 21 3d 34 20 29 20 72 65 74 75 72 6e 3b 0a 20  c!=4 ) return;. 
5b10: 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63   zCmd = (const c
5b20: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5b30: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
5b40: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
5b50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5b60: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78  strcmp(zCmd,"tex
5b70: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31  t")==0 ){.    p1
5b80: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
5b90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
5ba0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66  xt(argv[0]);.#if
5bb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5bc0: 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69  _UTF16.  }else i
5bd0: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
5be0: 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a  "text16")==0 ){.
5bf0: 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20      p1 = (const 
5c00: 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61  void*)sqlite3_va
5c10: 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b  lue_text16(argv[
5c20: 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  0]);.#endif.  }e
5c30: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
5c40: 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20  Cmd, "blob")==0 
5c50: 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e  ){.    p1 = (con
5c60: 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  st void*)sqlite3
5c70: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
5c80: 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  [0]);.  }else{. 
5c90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
5ca0: 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63   zCmd = (const c
5cb0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5cc0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29  ue_text(argv[2])
5cd0: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
5ce0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5cf0: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 62 79 74  strcmp(zCmd,"byt
5d00: 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  es")==0 ){.    s
5d10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
5d20: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66  es(argv[0]);.#if
5d30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5d40: 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69  _UTF16.  }else i
5d50: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
5d60: 22 62 79 74 65 73 31 36 22 29 3d 3d 30 20 29 7b  "bytes16")==0 ){
5d70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
5d80: 75 65 5f 62 79 74 65 73 31 36 28 61 72 67 76 5b  ue_bytes16(argv[
5d90: 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  0]);.#endif.  }e
5da0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
5db0: 43 6d 64 2c 20 22 6e 6f 6f 70 22 29 3d 3d 30 20  Cmd, "noop")==0 
5dc0: 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 20 6e 6f 74  ){.    /* do not
5dd0: 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  hing */.  }else{
5de0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
5df0: 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74  .  zCmd = (const
5e00: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
5e10: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 33  alue_text(argv[3
5e20: 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  ]);.  if( zCmd==
5e30: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
5e40: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74  ( strcmp(zCmd,"t
5e50: 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ext")==0 ){.    
5e60: 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p2 = (const void
5e70: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5e80: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23  text(argv[0]);.#
5e90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5ea0: 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65  IT_UTF16.  }else
5eb0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
5ec0: 2c 20 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29  , "text16")==0 )
5ed0: 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73  {.    p2 = (cons
5ee0: 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  t void*)sqlite3_
5ef0: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67  value_text16(arg
5f00: 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  v[0]);.#endif.  
5f10: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
5f20: 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d  (zCmd, "blob")==
5f30: 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63  0 ){.    p2 = (c
5f40: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
5f50: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
5f60: 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  gv[0]);.  }else{
5f70: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
5f80: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5f90: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
5fa0: 31 21 3d 70 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  1!=p2);.}.../*.*
5fb0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
5fc0: 5f 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e  _test_create_fun
5fd0: 63 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20 43  ction DB.**.** C
5fe0: 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f  all the sqlite3_
5ff0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
6000: 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  API on the given
6010: 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64   database in ord
6020: 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20  er.** to create 
6030: 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  a function named
6040: 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e 20 20   "x_coalesce".  
6050: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
6060: 65 73 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  es the same thin
6070: 67 0a 2a 2a 20 61 73 20 74 68 65 20 22 63 6f 61  g.** as the "coa
6080: 6c 65 73 63 65 22 20 66 75 6e 63 74 69 6f 6e 2e  lesce" function.
6090: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
60a0: 61 6c 73 6f 20 72 65 67 69 73 74 65 72 73 20 61  also registers a
60b0: 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a  n SQL function.*
60c0: 2a 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c 69 74  * named "x_sqlit
60d0: 65 5f 65 78 65 63 22 20 74 68 61 74 20 69 6e 76  e_exec" that inv
60e0: 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 65 78 65  okes sqlite3_exe
60f0: 63 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67 20 73  c().  Invoking s
6100: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a  qlite3_exec().**
6110: 20 69 6e 20 74 68 69 73 20 77 61 79 20 69 73 20   in this way is 
6120: 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73 69 6f  illegal recursio
6130: 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 61 69  n and should rai
6140: 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53  se an SQLITE_MIS
6150: 55 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68  USE error..** Th
6160: 65 20 65 66 66 65 63 74 20 69 73 20 73 69 6d 69  e effect is simi
6170: 6c 61 72 20 74 6f 20 74 72 79 69 6e 67 20 74 6f  lar to trying to
6180: 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 61   use the same da
6190: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
61a0: 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74 68  n from.** two th
61b0: 72 65 61 64 73 20 61 74 20 74 68 65 20 73 61 6d  reads at the sam
61c0: 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e time..**.** Th
61d0: 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76  e original motiv
61e0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72  ation for this r
61f0: 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65  outine was to be
6200: 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68   able to call th
6210: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65  e.** sqlite3_cre
6220: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e  ate_function fun
6230: 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75  ction while a qu
6240: 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65  ery is in progre
6250: 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74  ss in order.** t
6260: 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54  o test the SQLIT
6270: 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69  E_MISUSE detecti
6280: 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61  on logic..*/.sta
6290: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65  tic int test_cre
62a0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
62b0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
62c0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
62d0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
62e0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
62f0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
6300: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
6310: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
6320: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6330: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
6340: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
6350: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
6360: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
6370: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
6380: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
6390: 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 4d 64    extern void Md
63a0: 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c 69 74  5_Register(sqlit
63b0: 65 33 2a 29 3b 0a 0a 20 20 69 66 28 20 61 72 67  e3*);..  if( arg
63c0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
63d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
63e0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
63f0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
6400: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
6410: 20 20 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a     " DB\"", 0);.
6420: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6430: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
6440: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
6450: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
6460: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
6470: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
6480: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6490: 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 61  ction(db, "x_coa
64a0: 6c 65 73 63 65 22 2c 20 2d 31 2c 20 53 51 4c 49  lesce", -1, SQLI
64b0: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
64c0: 20 20 20 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e      t1_ifnullFun
64d0: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  c, 0, 0);.  if( 
64e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
64f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6500: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
6510: 6e 28 64 62 2c 20 22 68 65 78 38 22 2c 20 31 2c  n(db, "hex8", 1,
6520: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
6530: 0a 20 20 20 20 20 20 20 20 20 20 68 65 78 38 46  .          hex8F
6540: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
6550: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6560: 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28 20  MIT_UTF16.  if( 
6570: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6580: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6590: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
65a0: 6e 28 64 62 2c 20 22 68 65 78 31 36 22 2c 20 31  n(db, "hex16", 1
65b0: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
65c0: 20 0a 20 20 20 20 20 20 20 20 20 20 68 65 78 31   .          hex1
65d0: 36 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  6Func, 0, 0);.  
65e0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
65f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6600: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6610: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
6620: 28 64 62 2c 20 22 74 6b 74 32 32 31 33 66 75 6e  (db, "tkt2213fun
6630: 63 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e  c", 1, SQLITE_AN
6640: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  Y, 0, .         
6650: 20 74 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e   tkt2213Function
6660: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
6670: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6680: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
6690: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
66a0: 74 69 6f 6e 28 64 62 2c 20 22 70 6f 69 6e 74 65  tion(db, "pointe
66b0: 72 5f 63 68 61 6e 67 65 22 2c 20 34 2c 20 53 51  r_change", 4, SQ
66c0: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20  LITE_ANY, 0, .  
66d0: 20 20 20 20 20 20 20 20 70 74 72 43 68 6e 67 46          ptrChngF
66e0: 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a  unction, 0, 0);.
66f0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
6700: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
6710: 20 2f 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69   /* Use the sqli
6720: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
6730: 69 6f 6e 31 36 28 29 20 41 50 49 20 68 65 72 65  ion16() API here
6740: 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20 66 75 6e  . Mainly for fun
6750: 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20 20 2a 2a  , but also .  **
6760: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
6770: 6f 74 20 74 65 73 74 65 64 20 61 6e 79 77 68 65  ot tested anywhe
6780: 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 69 66  re else. */.  if
6790: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
67a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
67b0: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 23 69 66 20  alue *pVal;.#if 
67c0: 30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  0.    if( sqlite
67d0: 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20  3_iMallocFail>0 
67e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
67f0: 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a  _iMallocFail++;.
6800: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 20 20      }.#endif .  
6810: 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
6820: 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 20  ValueNew(0);.   
6830: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
6840: 53 74 72 28 30 2c 70 56 61 6c 2c 20 2d 31 2c 20  Str(0,pVal, -1, 
6850: 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 2c  "x_sqlite_exec",
6860: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
6870: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
6880: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
6890: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
68a0: 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
68b0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
68c0: 54 65 78 74 28 30 2c 20 70 56 61 6c 2c 20 53 51  Text(0, pVal, SQ
68d0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
68e0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
68f0: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36   1, SQLITE_UTF16
6900: 2c 20 64 62 2c 20 73 71 6c 69 74 65 33 45 78 65  , db, sqlite3Exe
6910: 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  cFunc, 0, 0);.  
6920: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
6930: 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 23 65  ee(pVal);.  }.#e
6940: 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69  ndif..  if( sqli
6950: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
6960: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
6970: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6980: 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  R;.  Tcl_SetResu
6990: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
69a0: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
69b0: 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
69c0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
69d0: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d  * Routines to im
69e0: 70 6c 65 6d 65 6e 74 20 74 68 65 20 78 5f 63 6f  plement the x_co
69f0: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
6a00: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
6a10: 78 5f 63 6f 75 6e 74 28 29 20 63 6f 75 6e 74 73  x_count() counts
6a20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
6a30: 6f 6e 2d 6e 75 6c 6c 20 61 72 67 75 6d 65 6e 74  on-null argument
6a40: 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  s.  But there ar
6a50: 65 0a 2a 2a 20 73 6f 6d 65 20 74 77 69 73 74 73  e.** some twists
6a60: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
6a70: 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  poses..**.** If 
6a80: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
6a90: 78 5f 63 6f 75 6e 74 28 29 20 69 73 20 34 30 20  x_count() is 40 
6aa0: 74 68 65 6e 20 61 20 55 54 46 2d 38 20 65 72 72  then a UTF-8 err
6ab0: 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 2a  or is reported.*
6ac0: 2a 20 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75  * on the step fu
6ad0: 6e 63 74 69 6f 6e 2e 20 20 49 66 20 78 5f 63 6f  nction.  If x_co
6ae0: 75 6e 74 28 34 31 29 20 69 73 20 73 65 65 6e 2c  unt(41) is seen,
6af0: 20 74 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65   then a UTF-16 e
6b00: 72 72 6f 72 0a 2a 2a 20 69 73 20 72 65 70 6f 72  rror.** is repor
6b10: 74 65 64 20 6f 6e 20 74 68 65 20 73 74 65 70 20  ted on the step 
6b20: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  function.  If th
6b30: 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20 69 73  e total count is
6b40: 20 34 32 2c 20 74 68 65 6e 0a 2a 2a 20 61 20 55   42, then.** a U
6b50: 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65  TF-8 error is re
6b60: 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 66 69  ported on the fi
6b70: 6e 61 6c 69 7a 65 20 66 75 6e 63 74 69 6f 6e 2e  nalize function.
6b80: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
6b90: 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20 74 31  ct t1CountCtx t1
6ba0: 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74  CountCtx;.struct
6bb0: 20 74 31 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20   t1CountCtx {.  
6bc0: 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63  int n;.};.static
6bd0: 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 53 74 65   void t1CountSte
6be0: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p(.  sqlite3_con
6bf0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
6c00: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
6c10: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6c20: 76 0a 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74  v.){.  t1CountCt
6c30: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
6c40: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
6c50: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
6c60: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
6c70: 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51  ( (argc==0 || SQ
6c80: 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74  LITE_NULL!=sqlit
6c90: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
6ca0: 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20 29 7b  gv[0]) ) && p ){
6cb0: 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d  .    p->n++;.  }
6cc0: 0a 20 20 69 66 28 20 61 72 67 63 3e 30 20 29 7b  .  if( argc>0 ){
6cd0: 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 73 71 6c  .    int v = sql
6ce0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
6cf0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[0]);.    if(
6d00: 20 76 3d 3d 34 30 20 29 7b 0a 20 20 20 20 20 20   v==40 ){.      
6d10: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
6d20: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 76  rror(context, "v
6d30: 61 6c 75 65 20 6f 66 20 34 30 20 68 61 6e 64 65  alue of 40 hande
6d40: 64 20 74 6f 20 78 5f 63 6f 75 6e 74 22 2c 20 2d  d to x_count", -
6d50: 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  1);.#ifndef SQLI
6d60: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
6d70: 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3d 3d 34    }else if( v==4
6d80: 31 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  1 ){.      const
6d90: 20 63 68 61 72 20 7a 55 74 66 31 36 45 72 72 4d   char zUtf16ErrM
6da0: 73 67 5b 5d 20 3d 20 7b 20 30 2c 20 30 78 36 31  sg[] = { 0, 0x61
6db0: 2c 20 30 2c 20 30 78 36 32 2c 20 30 2c 20 30 78  , 0, 0x62, 0, 0x
6dc0: 36 33 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 20 20  63, 0, 0, 0};.  
6dd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6de0: 6c 74 5f 65 72 72 6f 72 31 36 28 63 6f 6e 74 65  lt_error16(conte
6df0: 78 74 2c 20 26 7a 55 74 66 31 36 45 72 72 4d 73  xt, &zUtf16ErrMs
6e00: 67 5b 31 2d 53 51 4c 49 54 45 5f 42 49 47 45 4e  g[1-SQLITE_BIGEN
6e10: 44 49 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64  DIAN], -1);.#end
6e20: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 20  if.    }.  }.}  
6e30: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31   .static void t1
6e40: 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71  CountFinalize(sq
6e50: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6e60: 6f 6e 74 65 78 74 29 7b 0a 20 20 74 31 43 6f 75  ontext){.  t1Cou
6e70: 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ntCtx *p;.  p = 
6e80: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
6e90: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
6ea0: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
6eb0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
6ec0: 66 28 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20  f( p->n==42 ){. 
6ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6ee0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
6ef0: 74 2c 20 22 78 5f 63 6f 75 6e 74 20 74 6f 74 61  t, "x_count tota
6f00: 6c 73 20 74 6f 20 34 32 22 2c 20 2d 31 29 3b 0a  ls to 42", -1);.
6f10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6f20: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6f30: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f  int(context, p ?
6f40: 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20 20 20   p->n : 0);.    
6f50: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  }.  }.}../*.** U
6f60: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 74 65  sage:  sqlite_te
6f70: 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67  st_create_aggreg
6f80: 61 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c  ate DB.**.** Cal
6f90: 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72  l the sqlite3_cr
6fa0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50  eate_function AP
6fb0: 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 64  I on the given d
6fc0: 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65 72  atabase in order
6fd0: 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61 20  .** to create a 
6fe0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
6ff0: 78 5f 63 6f 75 6e 74 22 2e 20 20 54 68 69 73 20  x_count".  This 
7000: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68  function does th
7010: 65 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20  e same thing.** 
7020: 61 73 20 74 68 65 20 22 6d 64 35 73 75 6d 22 20  as the "md5sum" 
7030: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
7040: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74  The original mot
7050: 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  ivation for this
7060: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20   routine was to 
7070: 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20  be able to call 
7080: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63  the.** sqlite3_c
7090: 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 20  reate_aggregate 
70a0: 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61  function while a
70b0: 20 71 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f   query is in pro
70c0: 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a  gress in order.*
70d0: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 53 51  * to test the SQ
70e0: 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65  LITE_MISUSE dete
70f0: 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 53 65  ction logic.  Se
7100: 65 20 6d 69 73 75 73 65 2e 74 65 73 74 2e 0a 2a  e misuse.test..*
7110: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7120: 65 20 77 61 73 20 6c 61 74 65 72 20 65 78 74 65  e was later exte
7130: 6e 64 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  nded to test the
7140: 20 75 73 65 20 6f 66 20 73 71 6c 69 74 65 33 5f   use of sqlite3_
7150: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 0a 2a  result_error().*
7160: 2a 20 77 69 74 68 69 6e 20 61 67 67 72 65 67 61  * within aggrega
7170: 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  te functions..*/
7180: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
7190: 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74  _create_aggregat
71a0: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
71b0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
71c0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
71d0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
71e0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
71f0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
7200: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
7210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7220: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
7230: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
7240: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
7250: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
7260: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
7270: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
7280: 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21   rc;.  if( argc!
7290: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
72a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
72b0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
72c0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
72d0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
72e0: 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20   " FILENAME\"", 
72f0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
7300: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
7310: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
7320: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
7330: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
7340: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
7350: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
7360: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78  _function(db, "x
7370: 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49  _count", 0, SQLI
7380: 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20  TE_UTF8, 0, 0,. 
7390: 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65 70       t1CountStep
73a0: 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65  ,t1CountFinalize
73b0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
73c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
73d0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
73e0: 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75  ction(db, "x_cou
73f0: 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  nt", 1, SQLITE_U
7400: 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  TF8, 0, 0,.     
7410: 20 20 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74     t1CountStep,t
7420: 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b  1CountFinalize);
7430: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
7440: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
7450: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
7460: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7470: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
7480: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
7490: 67 65 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54  ge:  printf TEXT
74a0: 0a 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70  .**.** Send outp
74b0: 75 74 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55  ut to printf.  U
74c0: 73 65 20 74 68 69 73 20 72 61 74 68 65 72 20 74  se this rather t
74d0: 68 61 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67  han puts to merg
74e0: 65 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  e the output.** 
74f0: 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  in the correct s
7500: 65 71 75 65 6e 63 65 20 77 69 74 68 20 64 65 62  equence with deb
7510: 75 67 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69  ugging printfs i
7520: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63  nserted into C c
7530: 6f 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65  ode..** Puts use
7540: 73 20 61 20 73 65 70 61 72 61 74 65 20 62 75 66  s a separate buf
7550: 66 65 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e  fer and debuggin
7560: 67 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c  g statements wil
7570: 6c 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73  l be out of.** s
7580: 65 71 75 65 6e 63 65 20 69 66 20 69 74 20 69 73  equence if it is
7590: 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63   used..*/.static
75a0: 20 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 66   int test_printf
75b0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
75c0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
75d0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
75e0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
75f0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
7600: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
7610: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
7620: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7630: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
7640: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
7650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7660: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
7670: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ment */.){.  if(
7680: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
7690: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
76a0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
76b0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
76c0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
76d0: 20 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22         " TEXT\""
76e0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
76f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
7700: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
7710: 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74   argv[1]);.  ret
7720: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
7730: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
7740: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
7750: 6e 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  nt FORMAT INTEGE
7760: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
7770: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
7780: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
7790: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
77a0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
77b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
77c0: 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
77d0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
77e0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
77f0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
7800: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
7810: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
7820: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
7830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7840: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
7850: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
7860: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
7870: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
7880: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
7890: 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63  int a[3], i;.  c
78a0: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
78b0: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
78c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
78d0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
78e0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
78f0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
7900: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54      " FORMAT INT
7910: 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b   INT INT\"", 0);
7920: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7930: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
7940: 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b  (i=2; i<5; i++){
7950: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
7960: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
7970: 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20  [i], &a[i-2]) ) 
7980: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7990: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
79a0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
79b0: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
79c0: 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70   a[2]);.  Tcl_Ap
79d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
79e0: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
79f0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
7a00: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
7a10: 0a 2f 2a 0a 2a 2a 20 49 66 20 7a 4e 75 6d 20 72  ./*.** If zNum r
7a20: 65 70 72 65 73 65 6e 74 73 20 61 6e 20 69 6e 74  epresents an int
7a30: 65 67 65 72 20 74 68 61 74 20 77 69 6c 6c 20 66  eger that will f
7a40: 69 74 20 69 6e 20 36 34 2d 62 69 74 73 2c 20 74  it in 64-bits, t
7a50: 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 56 61 6c  hen set.** *pVal
7a60: 75 65 20 74 6f 20 74 68 61 74 20 69 6e 74 65 67  ue to that integ
7a70: 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 72  er and return tr
7a80: 75 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72  ue.  Otherwise r
7a90: 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a  eturn false..*/.
7aa0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
7ab0: 65 33 47 65 74 49 6e 74 36 34 28 63 6f 6e 73 74  e3GetInt64(const
7ac0: 20 63 68 61 72 20 2a 7a 4e 75 6d 2c 20 69 36 34   char *zNum, i64
7ad0: 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 66 28   *pValue){.  if(
7ae0: 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34   sqlite3FitsIn64
7af0: 42 69 74 73 28 7a 4e 75 6d 29 20 29 7b 0a 20 20  Bits(zNum) ){.  
7b00: 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28    sqlite3Atoi64(
7b10: 7a 4e 75 6d 2c 20 70 56 61 6c 75 65 29 3b 0a 20  zNum, pValue);. 
7b20: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
7b30: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7b40: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
7b50: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
7b60: 74 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  t64 FORMAT INTEG
7b70: 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  ER INTEGER INTEG
7b80: 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  ER.**.** Call mp
7b90: 72 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65  rintf with three
7ba0: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
7bb0: 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  arguments.*/.sta
7bc0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
7bd0: 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20  mprintf_int64(. 
7be0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
7bf0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
7c00: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
7c10: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
7c20: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
7c30: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
7c40: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
7c50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7c60: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
7c70: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
7c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
7c90: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
7ca0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
7cb0: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
7cc0: 61 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  a[3];.  char *z;
7cd0: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
7ce0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
7cf0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7d00: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
7d10: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
7d20: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
7d30: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e  ORMAT INT INT IN
7d40: 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T\"", 0);.    re
7d50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7d60: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
7d70: 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <5; i++){.    if
7d80: 28 20 21 73 71 6c 69 74 65 33 47 65 74 49 6e 74  ( !sqlite3GetInt
7d90: 36 34 28 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69  64(argv[i], &a[i
7da0: 2d 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 54 63  -2]) ){.      Tc
7db0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7dc0: 6e 74 65 72 70 2c 20 22 61 72 67 75 6d 65 6e 74  nterp, "argument
7dd0: 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
7de0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 22 2c  64-bit integer",
7df0: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
7e00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7e10: 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c   }.  }.  z = sql
7e20: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
7e30: 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[1], a[0], a[1]
7e40: 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[2]);.  Tcl_A
7e50: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7e60: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
7e70: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
7e80: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
7e90: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
7ea0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
7eb0: 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  str FORMAT INTEG
7ec0: 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e  ER INTEGER STRIN
7ed0: 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  G.**.** Call mpr
7ee0: 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e  intf with two in
7ef0: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20  teger arguments 
7f00: 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61  and one string a
7f10: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  rgument.*/.stati
7f20: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
7f30: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
7f40: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
7f50: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
7f60: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
7f70: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
7f80: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
7f90: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
7fa0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
7fb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
7fc0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
7fd0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
7fe0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
7ff0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
8000: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
8010: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
8020: 69 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72  if( argc<4 || ar
8030: 67 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  gc>5 ){.    Tcl_
8040: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8050: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
8060: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
8070: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
8080: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
8090: 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c  INT ?STRING?\"",
80a0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
80b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
80c0: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
80d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
80e0: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
80f0: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
8100: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
8110: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
8120: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8130: 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61  argv[1], a[0], a
8140: 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72  [1], argc>4 ? ar
8150: 67 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20  gv[4] : NULL);. 
8160: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8170: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
8180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
8190: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
81a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
81b0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e  age:  sqlite3_sn
81c0: 70 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47  printf_str INTEG
81d0: 45 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ER FORMAT INTEGE
81e0: 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47  R INTEGER STRING
81f0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
8200: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
8210: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
8220: 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72  nd one string ar
8230: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
8240: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 70   int sqlite3_snp
8250: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
8260: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
8270: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8280: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
8290: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
82a0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
82b0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
82c0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
82d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
82e0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
82f0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
8300: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
8310: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
8320: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
8330: 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68  i;.  int n;.  ch
8340: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
8350: 63 3c 35 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b  c<5 || argc>6 ){
8360: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
8370: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
8380: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
8390: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
83a0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 4e  [0],.       " IN
83b0: 54 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  T FORMAT INT INT
83c0: 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29   ?STRING?\"", 0)
83d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
83e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
83f0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
8400: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e  erp, argv[1], &n
8410: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
8420: 52 52 4f 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20  RROR;.  if( n<0 
8430: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
8440: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8450: 22 4e 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e  "N must be non-n
8460: 65 67 61 74 69 76 65 22 2c 20 30 29 3b 0a 20 20  egative", 0);.  
8470: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8480: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
8490: 33 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20  3; i<5; i++){.  
84a0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
84b0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
84c0: 2c 20 26 61 5b 69 2d 33 5d 29 20 29 20 72 65 74  , &a[i-3]) ) ret
84d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
84e0: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
84f0: 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a  _malloc( n+1 );.
8500: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8510: 74 66 28 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d  tf(n, z, argv[2]
8520: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72  , a[0], a[1], ar
8530: 67 63 3e 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a  gc>4 ? argv[5] :
8540: 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70   NULL);.  Tcl_Ap
8550: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8560: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
8570: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
8580: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
8590: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
85a0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
85b0: 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54  ouble FORMAT INT
85c0: 45 47 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55  EGER INTEGER DOU
85d0: 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  BLE.**.** Call m
85e0: 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20  printf with two 
85f0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
8600: 73 20 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65  s and one double
8610: 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61   argument.*/.sta
8620: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
8630: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a  mprintf_double(.
8640: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
8650: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
8660: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
8670: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
8680: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
8690: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
86a0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
86b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
86c0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
86d0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
86e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
86f0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
8700: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
8710: 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65  [3], i;.  double
8720: 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   r;.  char *z;. 
8730: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
8740: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8750: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
8760: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
8770: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
8780: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
8790: 4d 41 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42  MAT INT INT DOUB
87a0: 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  LE\"", 0);.    r
87b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
87c0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
87d0: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
87e0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
87f0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
8800: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
8810: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
8820: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75    if( Tcl_GetDou
8830: 62 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ble(interp, argv
8840: 5b 34 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72  [4], &r) ) retur
8850: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
8860: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
8870: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
8880: 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63  , a[1], r);.  Tc
8890: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
88a0: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
88b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
88c0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
88d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
88e0: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
88f0: 74 66 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54  tf_scaled FORMAT
8900: 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a   DOUBLE DOUBLE.*
8910: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
8920: 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  f with a single 
8930: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20  double argument 
8940: 77 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f  which is the pro
8950: 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  duct of the.** t
8960: 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76  wo arguments giv
8970: 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20  en above.  This 
8980: 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  is used to gener
8990: 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64  ate overflow and
89a0: 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f   underflow.** do
89b0: 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68  ubles to test th
89c0: 61 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76  at they are conv
89d0: 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a  erted properly..
89e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
89f0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
8a00: 61 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  aled(.  void *No
8a10: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
8a20: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
8a30: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
8a40: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
8a50: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
8a60: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a80: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
8a90: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
8aa0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
8ab0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
8ac0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
8ad0: 20 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65   int i;.  double
8ae0: 20 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a   r[2];.  char *z
8af0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ;.  if( argc!=4 
8b00: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
8b10: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8b20: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
8b30: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
8b40: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
8b50: 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f  FORMAT DOUBLE DO
8b60: 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  UBLE\"", 0);.   
8b70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8b80: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
8b90: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
8ba0: 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
8bb0: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
8bc0: 69 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72  i], &r[i-2]) ) r
8bd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8be0: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
8bf0: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
8c00: 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a  1], r[0]*r[1]);.
8c10: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8c20: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
8c30: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
8c40: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
8c50: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
8c60: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
8c70: 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46  printf_stronly F
8c80: 4f 52 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a  ORMAT STRING.**.
8c90: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
8ca0: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f  with a single do
8cb0: 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  uble argument wh
8cc0: 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75  ich is the produ
8cd0: 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ct of the.** two
8ce0: 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e   arguments given
8cf0: 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73   above.  This is
8d00: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
8d10: 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75  e overflow and u
8d20: 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62  nderflow.** doub
8d30: 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74  les to test that
8d40: 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72   they are conver
8d50: 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  ted properly..*/
8d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
8d70: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
8d80: 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  nly(.  void *Not
8d90: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
8da0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
8db0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
8dc0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
8dd0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
8de0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8e00: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
8e10: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
8e20: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
8e30: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
8e40: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
8e50: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
8e60: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
8e70: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8e80: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
8e90: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
8ea0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
8eb0: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54       " FORMAT ST
8ec0: 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20  RING\"", 0);.   
8ed0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8ee0: 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  R;.  }.  z = sql
8ef0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
8f00: 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  v[1], argv[2]);.
8f10: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8f20: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
8f30: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
8f40: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
8f50: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
8f60: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
8f70: 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
8f80: 20 46 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a   FORMAT HEX.**.*
8f90: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
8fa0: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75  ith a single dou
8fb0: 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  ble argument whi
8fc0: 63 68 20 69 73 20 64 65 72 69 76 65 64 20 66 72  ch is derived fr
8fd0: 6f 6d 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65  om the.** hexade
8fe0: 63 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f  cimal encoding o
8ff0: 66 20 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65  f an IEEE double
9000: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9010: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
9020: 68 65 78 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  hexdouble(.  voi
9030: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9040: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9050: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9060: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9070: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9080: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9090: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
90a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
90b0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
90c0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
90d0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
90e0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
90f0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
9100: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73   double r;.  uns
9110: 69 67 6e 65 64 20 20 78 31 2c 20 78 32 3b 0a 20  igned  x1, x2;. 
9120: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 75 6e 73 69 67   long long unsig
9130: 6e 65 64 20 64 3b 0a 20 20 69 66 28 20 61 72 67  ned d;.  if( arg
9140: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
9150: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9160: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
9170: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
9180: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
9190: 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49     " FORMAT STRI
91a0: 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NG\"", 0);.    r
91b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
91c0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 73 63 61 6e  .  }.  if( sscan
91d0: 66 28 61 72 67 76 5b 32 5d 2c 20 22 25 30 38 78  f(argv[2], "%08x
91e0: 25 30 38 78 22 2c 20 26 78 32 2c 20 26 78 31 29  %08x", &x2, &x1)
91f0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
9200: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9210: 72 70 2c 20 22 32 6e 64 20 61 72 67 75 6d 65 6e  rp, "2nd argumen
9220: 74 20 73 68 6f 75 6c 64 20 62 65 20 31 36 2d 63  t should be 16-c
9230: 68 61 72 61 63 74 65 72 73 20 6f 66 20 68 65 78  haracters of hex
9240: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9250: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9260: 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20 64 20 3d  .  d = x2;.  d =
9270: 20 28 64 3c 3c 33 32 29 20 2b 20 78 31 3b 0a 20   (d<<32) + x1;. 
9280: 20 6d 65 6d 63 70 79 28 26 72 2c 20 26 64 2c 20   memcpy(&r, &d, 
9290: 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 7a 20  sizeof(r));.  z 
92a0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
92b0: 66 28 61 72 67 76 5b 31 5d 2c 20 72 29 3b 0a 20  f(argv[1], r);. 
92c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
92d0: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
92e0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
92f0: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
9300: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
9310: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61  age: sqlite3_ena
9320: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
9330: 20 20 20 20 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a        BOOLEAN.**
9340: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
9350: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
9360: 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74 69  RED_CACHE).stati
9370: 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c  c int test_enabl
9380: 65 5f 73 68 61 72 65 64 28 0a 20 20 43 6c 69 65  e_shared(.  Clie
9390: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
93a0: 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
93b0: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
93c0: 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
93d0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
93e0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
93f0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
9400: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
9410: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
9420: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
9430: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9440: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
9450: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
9460: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
9470: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
9480: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
9490: 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69 6e  int enable;.  in
94a0: 74 20 72 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66  t ret = 0;..  if
94b0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
94c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
94d0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
94e0: 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20  v, "BOOLEAN");. 
94f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9500: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
9510: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
9520: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
9530: 76 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29  v[1], &enable) )
9540: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
9550: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
9560: 74 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  t = sqlite3Threa
9570: 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d  dDataReadOnly()-
9580: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 3b 0a  >useSharedData;.
9590: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
95a0: 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
95b0: 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20 20 69 66  he(enable);.  if
95c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
95d0: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
95e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
95f0: 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53  ar *)sqlite3ErrS
9600: 74 72 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  tr(rc), TCL_STAT
9610: 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  IC);.    return 
9620: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9630: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
9640: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
9650: 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29  wBooleanObj(ret)
9660: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
9670: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a  OK;.}.#endif....
9680: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
9690: 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
96a0: 73 75 6c 74 5f 63 6f 64 65 73 20 20 20 44 42 20  sult_codes   DB 
96b0: 20 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f     BOOLEAN.**.*/
96c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
96d0: 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
96e0: 5f 63 6f 64 65 73 28 0a 20 20 43 6c 69 65 6e 74  _codes(.  Client
96f0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
9700: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
9710: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
9720: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
9730: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
9740: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
9750: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
9760: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
9770: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
9780: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
9790: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
97a0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
97b0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
97c0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
97d0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
97e0: 7b 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a  {.  int enable;.
97f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
9800: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
9810: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
9820: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
9830: 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45   objv, "DB BOOLE
9840: 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  AN");.    return
9850: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9860: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
9870: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
9880: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
9890: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
98a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
98b0: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
98c0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
98d0: 6f 62 6a 76 5b 32 5d 2c 20 26 65 6e 61 62 6c 65  objv[2], &enable
98e0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
98f0: 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
9900: 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
9910: 63 6f 64 65 73 28 64 62 2c 20 65 6e 61 62 6c 65  codes(db, enable
9920: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
9930: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
9940: 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  ge: sqlite3_libv
9950: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 0a 2a 2a  ersion_number.**
9960: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
9970: 65 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  est_libversion_n
9980: 75 6d 62 65 72 28 0a 20 20 43 6c 69 65 6e 74 44  umber(.  ClientD
9990: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
99a0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
99b0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
99c0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
99d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
99e0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
99f0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
9a00: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
9a10: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
9a20: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
9a30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9a40: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
9a50: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
9a60: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
9a70: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
9a80: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
9a90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
9aa0: 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
9ab0: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  3_libversion_num
9ac0: 62 65 72 28 29 29 29 3b 0a 20 20 72 65 74 75 72  ber()));.  retur
9ad0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
9ae0: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
9af0: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
9b00: 65 74 61 64 61 74 61 20 44 42 20 64 62 6e 61 6d  etadata DB dbnam
9b10: 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d  e tblname colnam
9b20: 65 0a 2a 2a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  e.**.*/.#ifdef S
9b30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
9b40: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 73 74 61  UMN_METADATA.sta
9b50: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 61 62  tic int test_tab
9b60: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
9b70: 74 61 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ta(.  ClientData
9b80: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
9b90: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
9ba0: 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
9bb0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
9bc0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
9bd0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
9be0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
9bf0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
9c00: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
9c10: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
9c20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
9c30: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
9c40: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
9c50: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
9c60: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
9c70: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
9c80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a  onst char *zDb;.
9c90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
9ca0: 62 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  bl;.  const char
9cb0: 20 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 63   *zCol;.  int rc
9cc0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65  ;.  Tcl_Obj *pRe
9cd0: 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t;..  const char
9ce0: 20 2a 7a 44 61 74 61 74 79 70 65 3b 0a 20 20 63   *zDatatype;.  c
9cf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
9d00: 73 65 71 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75  seq;.  int notnu
9d10: 6c 6c 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72  ll;.  int primar
9d20: 79 6b 65 79 3b 0a 20 20 69 6e 74 20 61 75 74 6f  ykey;.  int auto
9d30: 69 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20 20 69 66  increment;..  if
9d40: 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
9d50: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
9d60: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
9d70: 76 2c 20 22 44 42 20 64 62 6e 61 6d 65 20 74 62  v, "DB dbname tb
9d80: 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65 22 29 3b  lname colname");
9d90: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9da0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
9db0: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
9dc0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
9dd0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
9de0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
9df0: 45 52 52 4f 52 3b 0a 20 20 7a 44 62 20 3d 20 54  ERROR;.  zDb = T
9e00: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
9e10: 76 5b 32 5d 29 3b 0a 20 20 7a 54 62 6c 20 3d 20  v[2]);.  zTbl = 
9e20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
9e30: 6a 76 5b 33 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d  jv[3]);.  zCol =
9e40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
9e50: 62 6a 76 5b 34 5d 29 3b 0a 0a 20 20 69 66 28 20  bjv[4]);..  if( 
9e60: 73 74 72 6c 65 6e 28 7a 44 62 29 3d 3d 30 20 29  strlen(zDb)==0 )
9e70: 20 7a 44 62 20 3d 20 30 3b 0a 0a 20 20 72 63 20   zDb = 0;..  rc 
9e80: 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  = sqlite3_table_
9e90: 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
9ea0: 64 62 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 7a  db, zDb, zTbl, z
9eb0: 43 6f 6c 2c 20 0a 20 20 20 20 20 20 26 7a 44 61  Col, .      &zDa
9ec0: 74 61 74 79 70 65 2c 20 26 7a 43 6f 6c 6c 73 65  tatype, &zCollse
9ed0: 71 2c 20 26 6e 6f 74 6e 75 6c 6c 2c 20 26 70 72  q, &notnull, &pr
9ee0: 69 6d 61 72 79 6b 65 79 2c 20 26 61 75 74 6f 69  imarykey, &autoi
9ef0: 6e 63 72 65 6d 65 6e 74 29 3b 0a 0a 20 20 69 66  ncrement);..  if
9f00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9f10: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
9f20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9f30: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
9f40: 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  b), 0);.    retu
9f50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9f60: 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f  }..  pRet = Tcl_
9f70: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f  NewObj();.  Tcl_
9f80: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
9f90: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
9fa0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
9fb0: 44 61 74 61 74 79 70 65 2c 20 2d 31 29 29 3b 0a  Datatype, -1));.
9fc0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
9fd0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
9fe0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
9ff0: 67 4f 62 6a 28 7a 43 6f 6c 6c 73 65 71 2c 20 2d  gObj(zCollseq, -
a000: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
a010: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
a020: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
a030: 49 6e 74 4f 62 6a 28 6e 6f 74 6e 75 6c 6c 29 29  IntObj(notnull))
a040: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
a050: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
a060: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
a070: 4f 62 6a 28 70 72 69 6d 61 72 79 6b 65 79 29 29  Obj(primarykey))
a080: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
a090: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
a0a0: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
a0b0: 4f 62 6a 28 61 75 74 6f 69 6e 63 72 65 6d 65 6e  Obj(autoincremen
a0c0: 74 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  t));.  Tcl_SetOb
a0d0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
a0e0: 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pRet);..  return
a0f0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
a100: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
a110: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
a120: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62  ./*.** sqlite3_b
a130: 6c 6f 62 5f 72 65 61 64 20 20 43 48 41 4e 4e 45  lob_read  CHANNE
a140: 4c 20 4f 46 46 53 45 54 20 4e 0a 2a 2a 0a 2a 2a  L OFFSET N.**.**
a150: 20 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20     This command 
a160: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
a170: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  the sqlite3_blob
a180: 5f 72 65 61 64 28 29 20 69 6e 20 77 61 79 73 20  _read() in ways 
a190: 74 68 61 74 0a 2a 2a 20 20 20 74 68 65 20 54 63  that.**   the Tc
a1a0: 6c 20 63 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66  l channel interf
a1b0: 61 63 65 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68  ace does not. Th
a1c0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
a1d0: 20 73 68 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20   should.**   be 
a1e0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61  the name of a va
a1f0: 6c 69 64 20 63 68 61 6e 6e 65 6c 20 63 72 65 61  lid channel crea
a200: 74 65 64 20 62 79 20 74 68 65 20 5b 69 6e 63 72  ted by the [incr
a210: 62 6c 6f 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20  blob] method.** 
a220: 20 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20    of a database 
a230: 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 66 75 6e  handle. This fun
a240: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69  ction calls sqli
a250: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a  te3_blob_read().
a260: 2a 2a 20 20 20 74 6f 20 72 65 61 64 20 4e 20 62  **   to read N b
a270: 79 74 65 73 20 66 72 6f 6d 20 6f 66 66 73 65 74  ytes from offset
a280: 20 4f 46 46 53 45 54 20 66 72 6f 6d 20 74 68 65   OFFSET from the
a290: 20 75 6e 64 65 72 6c 79 69 6e 67 20 53 51 4c 69   underlying SQLi
a2a0: 74 65 0a 2a 2a 20 20 20 62 6c 6f 62 20 68 61 6e  te.**   blob han
a2b0: 64 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20  dle..**.**   On 
a2c0: 73 75 63 63 65 73 73 2c 20 61 20 62 79 74 65 2d  success, a byte-
a2d0: 61 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e  array object con
a2e0: 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65 61 64  taining the read
a2f0: 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 20 20 72   data is .**   r
a300: 65 74 75 72 6e 65 64 2e 20 4f 6e 20 66 61 69 6c  eturned. On fail
a310: 75 72 65 2c 20 74 68 65 20 69 6e 74 65 72 70 72  ure, the interpr
a320: 65 74 65 72 20 72 65 73 75 6c 74 20 69 73 20 73  eter result is s
a330: 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 74  et to the.**   t
a340: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
a350: 6f 6e 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  on of the return
a360: 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69  ed error code (i
a370: 2e 65 2e 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45  .e. "SQLITE_NOME
a380: 4d 22 29 0a 2a 2a 20 20 20 61 6e 64 20 61 20 54  M").**   and a T
a390: 63 6c 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  cl exception is 
a3a0: 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69  thrown..*/.stati
a3b0: 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f  c int test_blob_
a3c0: 72 65 61 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  read(.  ClientDa
a3d0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
a3e0: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
a3f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
a400: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
a410: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
a420: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
a430: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
a440: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
a450: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a460: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
a470: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
a480: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
a490: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
a4a0: 7b 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20  {.  Tcl_Channel 
a4b0: 63 68 61 6e 6e 65 6c 3b 0a 20 20 43 6c 69 65 6e  channel;.  Clien
a4c0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
a4d0: 74 61 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  ta;.  sqlite3_bl
a4e0: 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ob *pBlob;.  int
a4f0: 20 6e 6f 74 55 73 65 64 3b 0a 20 20 69 6e 74 20   notUsed;.  int 
a500: 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 4f 66  nByte;.  int iOf
a510: 66 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  fset;.  unsigned
a520: 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 69   char *zBuf;.  i
a530: 6e 74 20 72 63 3b 0a 20 20 0a 20 20 69 66 28 20  nt rc;.  .  if( 
a540: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
a550: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
a560: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
a570: 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54   "CHANNEL OFFSET
a580: 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   N");.    return
a590: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a5a0: 0a 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c  .  channel = Tcl
a5b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
a5c0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
a5d0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 6e 6f 74  g(objv[1]), &not
a5e0: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 21 63 68  Used);.  if( !ch
a5f0: 61 6e 6e 65 6c 0a 20 20 20 7c 7c 20 54 43 4c 5f  annel.   || TCL_
a600: 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
a610: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
a620: 6a 76 5b 32 5d 2c 20 26 69 4f 66 66 73 65 74 29  jv[2], &iOffset)
a630: 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54  .   || TCL_OK!=T
a640: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
a650: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
a660: 2c 20 26 6e 42 79 74 65 29 0a 20 20 20 7c 7c 20  , &nByte).   || 
a670: 6e 42 79 74 65 3c 30 20 7c 7c 20 69 4f 66 66 73  nByte<0 || iOffs
a680: 65 74 3c 30 0a 20 20 29 7b 20 0a 20 20 20 20 72  et<0.  ){ .    r
a690: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a6a0: 0a 20 20 7d 0a 0a 20 20 69 6e 73 74 61 6e 63 65  .  }..  instance
a6b0: 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 43 68  Data = Tcl_GetCh
a6c0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
a6d0: 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 70 42  a(channel);.  pB
a6e0: 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69 74 65 33  lob = *((sqlite3
a6f0: 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74 61 6e 63  _blob **)instanc
a700: 65 44 61 74 61 29 3b 0a 0a 20 20 7a 42 75 66 20  eData);..  zBuf 
a710: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
a720: 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79   *)Tcl_Alloc(nBy
a730: 74 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  te);.  rc = sqli
a740: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 42  te3_blob_read(pB
a750: 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42 79 74 65  lob, zBuf, nByte
a760: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69 66  , iOffset);.  if
a770: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a780: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
a790: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
a7a0: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
a7b0: 4f 62 6a 28 7a 42 75 66 2c 20 6e 42 79 74 65 29  Obj(zBuf, nByte)
a7c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a7d0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
a7e0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
a7f0: 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61  lite3TestErrorNa
a800: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41  me(rc), TCL_VOLA
a810: 54 49 4c 45 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  TILE);.  }.  Tcl
a820: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 7a 42  _Free((char *)zB
a830: 75 66 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28  uf);..  return (
a840: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
a850: 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52  TCL_OK : TCL_ERR
a860: 4f 52 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71  OR);.}../*.** sq
a870: 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
a880: 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20   CHANNEL OFFSET 
a890: 44 41 54 41 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  DATA.**.**   Thi
a8a0: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  s command is use
a8b0: 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 71  d to test the sq
a8c0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
a8d0: 28 29 20 69 6e 20 77 61 79 73 20 74 68 61 74 0a  () in ways that.
a8e0: 2a 2a 20 20 20 74 68 65 20 54 63 6c 20 63 68 61  **   the Tcl cha
a8f0: 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63 65 20 64  nnel interface d
a900: 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20 66 69 72  oes not. The fir
a910: 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  st argument shou
a920: 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68 65 20 6e  ld.**   be the n
a930: 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 20 63  ame of a valid c
a940: 68 61 6e 6e 65 6c 20 63 72 65 61 74 65 64 20 62  hannel created b
a950: 79 20 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d  y the [incrblob]
a960: 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20   method.**   of 
a970: 61 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  a database handl
a980: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
a990: 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62   calls sqlite3_b
a9a0: 6c 6f 62 5f 77 72 69 74 65 28 29 0a 2a 2a 20 20  lob_write().**  
a9b0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 44 41   to write the DA
a9c0: 54 41 20 62 79 74 65 2d 61 72 72 61 79 20 74 6f  TA byte-array to
a9d0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
a9e0: 53 51 4c 69 74 65 20 62 6c 6f 62 20 68 61 6e 64  SQLite blob hand
a9f0: 6c 65 2e 0a 2a 2a 20 20 20 61 74 20 6f 66 66 73  le..**   at offs
aa00: 65 74 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a  et OFFSET..**.**
aa10: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61     On success, a
aa20: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
aa30: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e 20 66  s returned. On f
aa40: 61 69 6c 75 72 65 2c 20 74 68 65 20 69 6e 74 65  ailure, the inte
aa50: 72 70 72 65 74 65 72 0a 2a 2a 20 20 20 72 65 73  rpreter.**   res
aa60: 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  ult is set to th
aa70: 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74  e text represent
aa80: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 74  ation of the ret
aa90: 75 72 6e 65 64 20 65 72 72 6f 72 20 63 6f 64 65  urned error code
aaa0: 20 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 22 53 51   .**   (i.e. "SQ
aab0: 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 20 61 6e 64  LITE_NOMEM") and
aac0: 20 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e   a Tcl exception
aad0: 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73   is thrown..*/.s
aae0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
aaf0: 6c 6f 62 5f 77 72 69 74 65 28 0a 20 20 43 6c 69  lob_write(.  Cli
ab00: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
ab10: 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  ta, /* Not used 
ab20: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
ab30: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
ab40: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
ab50: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
ab60: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
ab70: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
ab80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ab90: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
aba0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
abb0: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
abc0: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
abd0: 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 68 61   */.){.  Tcl_Cha
abe0: 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20  nnel channel;.  
abf0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
ac00: 6e 63 65 44 61 74 61 3b 0a 20 20 73 71 6c 69 74  nceData;.  sqlit
ac10: 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a  e3_blob *pBlob;.
ac20: 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20    int notUsed;. 
ac30: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
ac40: 69 6e 74 20 72 63 3b 0a 0a 20 20 75 6e 73 69 67  int rc;..  unsig
ac50: 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a  ned char *zBuf;.
ac60: 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20 0a 20    int nBuf;.  . 
ac70: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
ac80: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
ac90: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
aca0: 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 20 4f  objv, "CHANNEL O
acb0: 46 46 53 45 54 20 44 41 54 41 22 29 3b 0a 20 20  FFSET DATA");.  
acc0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
acd0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 63 68 61 6e 6e  OR;.  }..  chann
ace0: 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  el = Tcl_GetChan
acf0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
ad00: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
ad10: 5d 29 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20  ]), &notUsed);. 
ad20: 20 69 66 28 20 21 63 68 61 6e 6e 65 6c 0a 20 20   if( !channel.  
ad30: 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f   || TCL_OK!=Tcl_
ad40: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
ad50: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
ad60: 69 4f 66 66 73 65 74 29 0a 20 20 20 7c 7c 20 69  iOffset).   || i
ad70: 4f 66 66 73 65 74 3c 30 0a 20 20 29 7b 20 0a 20  Offset<0.  ){ . 
ad80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ad90: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 73 74  ROR;.  }..  inst
ada0: 61 6e 63 65 44 61 74 61 20 3d 20 54 63 6c 5f 47  anceData = Tcl_G
adb0: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
adc0: 65 44 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a  eData(channel);.
add0: 20 20 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c    pBlob = *((sql
ade0: 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73  ite3_blob **)ins
adf0: 74 61 6e 63 65 44 61 74 61 29 3b 0a 0a 20 20 7a  tanceData);..  z
ae00: 42 75 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Buf = Tcl_GetByt
ae10: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
ae20: 6a 76 5b 33 5d 2c 20 26 6e 42 75 66 29 3b 0a 20  jv[3], &nBuf);. 
ae30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
ae40: 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20  ob_write(pBlob, 
ae50: 7a 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66  zBuf, nBuf, iOff
ae60: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  set);.  if( rc!=
ae70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ae80: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
ae90: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
aea0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
aeb0: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c  ame(rc), TCL_VOL
aec0: 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a 20 20 72  ATILE);.  }..  r
aed0: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
aee0: 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20  E_OK ? TCL_OK : 
aef0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 23 65  TCL_ERROR);.}.#e
af00: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ndif../*.** Usag
af10: 65 3a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  e: sqlite3_creat
af20: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20 44  e_collation_v2 D
af30: 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20 43 4d  B-HANDLE NAME CM
af40: 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f 43 0a  P-PROC DEL-PROC.
af50: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 54 63 6c  **.**   This Tcl
af60: 20 70 72 6f 63 20 69 73 20 75 73 65 64 20 66 6f   proc is used fo
af70: 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 65 78  r testing the ex
af80: 70 65 72 69 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20  perimental.**   
af90: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
afa0: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 29 20 69 6e  ollation_v2() in
afb0: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 72 75  terface..*/.stru
afc0: 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  ct TestCollation
afd0: 58 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  X {.  Tcl_Interp
afe0: 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
aff0: 4f 62 6a 20 2a 70 43 6d 70 3b 0a 20 20 54 63 6c  Obj *pCmp;.  Tcl
b000: 5f 4f 62 6a 20 2a 70 44 65 6c 3b 0a 7d 3b 0a 74  _Obj *pDel;.};.t
b010: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54 65  ypedef struct Te
b020: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 54 65 73  stCollationX Tes
b030: 74 43 6f 6c 6c 61 74 69 6f 6e 58 3b 0a 73 74 61  tCollationX;.sta
b040: 74 69 63 20 76 6f 69 64 20 74 65 73 74 43 72 65  tic void testCre
b050: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 28  ateCollationDel(
b060: 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20 54  void *pCtx){.  T
b070: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70  estCollationX *p
b080: 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f   = (TestCollatio
b090: 6e 58 20 2a 29 70 43 74 78 3b 0a 0a 20 20 69 6e  nX *)pCtx;..  in
b0a0: 74 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  t rc = Tcl_EvalO
b0b0: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
b0c0: 70 2d 3e 70 44 65 6c 2c 20 54 43 4c 5f 45 56 41  p->pDel, TCL_EVA
b0d0: 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45 56 41  L_DIRECT|TCL_EVA
b0e0: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 69 66 28  L_GLOBAL);.  if(
b0f0: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc!=TCL_OK ){. 
b100: 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e     Tcl_Backgroun
b110: 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70  dError(p->interp
b120: 29 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65  );.  }..  Tcl_De
b130: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43  crRefCount(p->pC
b140: 6d 70 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  mp);.  Tcl_DecrR
b150: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29  efCount(p->pDel)
b160: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
b170: 28 28 76 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a 73  ((void *)p);.}.s
b180: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 43 72  tatic int testCr
b190: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70  eateCollationCmp
b1a0: 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a  (.  void *pCtx,.
b1b0: 20 20 69 6e 74 20 6e 4c 65 66 74 2c 0a 20 20 63    int nLeft,.  c
b1c0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4c 65 66 74  onst void *zLeft
b1d0: 2c 0a 20 20 69 6e 74 20 6e 52 69 67 68 74 2c 0a  ,.  int nRight,.
b1e0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 52    const void *zR
b1f0: 69 67 68 74 0a 29 7b 0a 20 20 54 65 73 74 43 6f  ight.){.  TestCo
b200: 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54  llationX *p = (T
b210: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29  estCollationX *)
b220: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
b230: 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44  *pScript = Tcl_D
b240: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70  uplicateObj(p->p
b250: 43 6d 70 29 3b 0a 20 20 69 6e 74 20 69 52 65 73  Cmp);.  int iRes
b260: 20 3d 20 30 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63   = 0;..  Tcl_Inc
b270: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
b280: 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  t);.  Tcl_ListOb
b290: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
b2a0: 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e  , pScript, Tcl_N
b2b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
b2c0: 72 20 2a 29 7a 4c 65 66 74 2c 20 6e 4c 65 66 74  r *)zLeft, nLeft
b2d0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
b2e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
b2f0: 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e  , pScript, Tcl_N
b300: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
b310: 72 20 2a 29 7a 52 69 67 68 74 2c 6e 52 69 67 68  r *)zRight,nRigh
b320: 74 29 29 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f  t));..  if( TCL_
b330: 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  OK!=Tcl_EvalObjE
b340: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63  x(p->interp, pSc
b350: 72 69 70 74 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  ript, TCL_EVAL_D
b360: 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47  IRECT|TCL_EVAL_G
b370: 4c 4f 42 41 4c 29 0a 20 20 20 7c 7c 20 54 43 4c  LOBAL).   || TCL
b380: 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46  _OK!=Tcl_GetIntF
b390: 72 6f 6d 4f 62 6a 28 70 2d 3e 69 6e 74 65 72 70  romObj(p->interp
b3a0: 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  , Tcl_GetObjResu
b3b0: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 26  lt(p->interp), &
b3c0: 69 52 65 73 29 0a 20 20 29 7b 0a 20 20 20 20 54  iRes).  ){.    T
b3d0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
b3e0: 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  or(p->interp);. 
b3f0: 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66   }.  Tcl_DecrRef
b400: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
b410: 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73 3b 0a  .  return iRes;.
b420: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  }.static int tes
b430: 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  t_create_collati
b440: 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44  on_v2(.  ClientD
b450: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
b460: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
b470: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
b480: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
b490: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
b4a0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
b4b0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
b4c0: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
b4d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b4e0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
b4f0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
b500: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
b510: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
b520: 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69  ){.  TestCollati
b530: 6f 6e 58 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  onX *p;.  sqlite
b540: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 6f 62  3 *db;..  if( ob
b550: 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
b560: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
b570: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
b580: 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20 43  DB-HANDLE NAME C
b590: 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f 43  MP-PROC DEL-PROC
b5a0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
b5b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
b5c0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
b5d0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
b5e0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
b5f0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
b600: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 20 3d  CL_ERROR;..  p =
b610: 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58   (TestCollationX
b620: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
b630: 63 28 73 69 7a 65 6f 66 28 54 65 73 74 43 6f 6c  c(sizeof(TestCol
b640: 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20 70 2d 3e  lationX));.  p->
b650: 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  pCmp = objv[3];.
b660: 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f 62 6a 76    p->pDel = objv
b670: 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70  [4];.  p->interp
b680: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c   = interp;.  Tcl
b690: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _IncrRefCount(p-
b6a0: 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 49 6e  >pCmp);.  Tcl_In
b6b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44  crRefCount(p->pD
b6c0: 65 6c 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  el);..  sqlite3_
b6d0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
b6e0: 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47 65 74 53  _v2(db, Tcl_GetS
b6f0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
b700: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20  SQLITE_UTF8, .  
b710: 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20 74      (void *)p, t
b720: 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69  estCreateCollati
b730: 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61 74  onCmp, testCreat
b740: 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20  eCollationDel.  
b750: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
b760: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
b770: 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  ge: sqlite3_load
b780: 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41  _extension DB-HA
b790: 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f  NDLE FILE ?PROC?
b7a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
b7b0: 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  est_load_extensi
b7c0: 6f 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  on(.  ClientData
b7d0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
b7e0: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63  Not used */.  Tc
b7f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b800: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
b810: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
b820: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
b830: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
b840: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
b850: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
b860: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
b870: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b880: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
b890: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
b8a0: 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d    Tcl_CmdInfo cm
b8b0: 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33  dInfo;.  sqlite3
b8c0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
b8d0: 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63    char *zDb;.  c
b8e0: 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68  har *zFile;.  ch
b8f0: 61 72 20 2a 7a 50 72 6f 63 20 3d 20 30 3b 0a 20  ar *zProc = 0;. 
b900: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
b910: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
b920: 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  && objc!=3 ){.  
b930: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
b940: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
b950: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 46  jv, "DB-HANDLE F
b960: 49 4c 45 20 3f 50 52 4f 43 3f 22 29 3b 0a 20 20  ILE ?PROC?");.  
b970: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b980: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20  OR;.  }.  zDb = 
b990: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b9a0: 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46 69 6c 65 20  jv[1]);.  zFile 
b9b0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
b9c0: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
b9d0: 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a  objc==4 ){.    z
b9e0: 50 72 6f 63 20 3d 20 54 63 6c 5f 47 65 74 53 74  Proc = Tcl_GetSt
b9f0: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
ba00: 20 7d 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74   }..  /* Extract
ba10: 20 74 68 65 20 43 20 64 61 74 61 62 61 73 65 20   the C database 
ba20: 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20  handle from the 
ba30: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  Tcl command name
ba40: 20 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f 47   */.  if( !Tcl_G
ba50: 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e  etCommandInfo(in
ba60: 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49  terp, zDb, &cmdI
ba70: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  nfo) ){.    Tcl_
ba80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ba90: 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f  erp, "command no
baa0: 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c  t found: ", zDb,
bab0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
bac0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bad0: 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28 73  ;.  }.  db = ((s
bae0: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29  truct SqliteDb*)
baf0: 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e  cmdInfo.objClien
bb00: 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73  tData)->db;.  as
bb10: 73 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  sert(db);..  /* 
bb20: 43 61 6c 6c 20 74 68 65 20 75 6e 64 65 72 6c 79  Call the underly
bb30: 69 6e 67 20 43 20 66 75 6e 63 74 69 6f 6e 2e 20  ing C function. 
bb40: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
bb50: 72 73 2c 20 73 65 74 20 72 63 20 74 6f 20 0a 20  rs, set rc to . 
bb60: 20 2a 2a 20 54 43 4c 5f 45 52 52 4f 52 20 61 6e   ** TCL_ERROR an
bb70: 64 20 6c 6f 61 64 20 61 6e 79 20 65 72 72 6f 72  d load any error
bb80: 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 74 68 65   string into the
bb90: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 49 66   interpreter. If
bba0: 20 6e 6f 20 0a 20 20 2a 2a 20 65 72 72 6f 72 20   no .  ** error 
bbb0: 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74  occurs, set rc t
bbc0: 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20 2a 2f 0a 23  o TCL_OK..  */.#
bbd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
bbe0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
bbf0: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  .  rc = SQLITE_E
bc00: 52 52 4f 52 3b 0a 20 20 7a 45 72 72 20 3d 20 73  RROR;.  zErr = s
bc10: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
bc20: 74 68 69 73 20 62 75 69 6c 64 20 6f 6d 69 74 73  this build omits
bc30: 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78   sqlite3_load_ex
bc40: 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 23 65 6c  tension()");.#el
bc50: 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  se.  rc = sqlite
bc60: 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
bc70: 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f  (db, zFile, zPro
bc80: 63 2c 20 26 7a 45 72 72 29 3b 0a 23 65 6e 64 69  c, &zErr);.#endi
bc90: 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  f.  if( rc!=SQLI
bca0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
bcb0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
bcc0: 70 2c 20 7a 45 72 72 20 3f 20 7a 45 72 72 20 3a  p, zErr ? zErr :
bcd0: 20 22 22 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c   "", TCL_VOLATIL
bce0: 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c  E);.    rc = TCL
bcf0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
bd00: 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b  .    rc = TCL_OK
bd10: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
bd20: 66 72 65 65 28 7a 45 72 72 29 3b 0a 0a 20 20 72  free(zErr);..  r
bd30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
bd40: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
bd50: 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
bd60: 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c  tension DB-HANDL
bd70: 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61 74 69  E ONOFF.*/.stati
bd80: 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c  c int test_enabl
bd90: 65 5f 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74  e_load(.  Client
bda0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
bdb0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
bdc0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
bdd0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
bde0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
bdf0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
be00: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
be10: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
be20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
be30: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
be40: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
be50: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
be60: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
be70: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
be80: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
be90: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
bea0: 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f   *zDb;.  int ono
beb0: 66 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ff;..  if( objc!
bec0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
bed0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
bee0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d  p, 1, objv, "DB-
bef0: 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a  HANDLE ONOFF");.
bf00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
bf10: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
bf20: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
bf30: 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  objv[1]);..  /* 
bf40: 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64 61  Extract the C da
bf50: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72  tabase handle fr
bf60: 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61  om the Tcl comma
bf70: 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28  nd name */.  if(
bf80: 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
bf90: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62  Info(interp, zDb
bfa0: 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
bfb0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
bfc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
bfd0: 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
bfe0: 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30  ", zDb, (char*)0
bff0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c000: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64  L_ERROR;.  }.  d
c010: 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c  b = ((struct Sql
c020: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
c030: 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64  bjClientData)->d
c040: 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b  b;.  assert(db);
c050: 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6f  ..  /* Get the o
c060: 6e 6f 66 66 20 70 61 72 61 6d 65 74 65 72 20 2a  noff parameter *
c070: 2f 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  /.  if( Tcl_GetB
c080: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
c090: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
c0a0: 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 72 65  onoff) ){.    re
c0b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c0c0: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
c0d0: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
c0e0: 45 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70  ENSION.  Tcl_App
c0f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
c100: 2c 20 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d  , "this build om
c110: 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  its sqlite3_load
c120: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a  _extension()");.
c130: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c140: 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69  OR;.#else.  sqli
c150: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
c160: 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e  extension(db, on
c170: 6f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  off);.  return T
c180: 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a  CL_OK;.#endif.}.
c190: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
c1a0: 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a  qlite_abort.**.*
c1b0: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
c1c0: 72 6f 63 65 73 73 20 69 6d 6d 65 64 69 61 74 65  rocess immediate
c1d0: 6c 79 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74  ly.  This is not
c1e0: 20 61 20 63 6c 65 61 6e 20 73 68 75 74 64 6f 77   a clean shutdow
c1f0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  n..** This comma
c200: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  nd is used to te
c210: 73 74 20 74 68 65 20 72 65 63 6f 76 65 72 61 62  st the recoverab
c220: 69 6c 69 74 79 20 6f 66 20 61 20 64 61 74 61 62  ility of a datab
c230: 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76  ase in.** the ev
c240: 65 6e 74 20 6f 66 20 61 20 70 72 6f 67 72 61 6d  ent of a program
c250: 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69   crash..*/.stati
c260: 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 61 62 6f  c int sqlite_abo
c270: 72 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  rt(.  void *NotU
c280: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
c290: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
c2a0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
c2b0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
c2c0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
c2d0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
c2e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c2f0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
c300: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
c310: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
c320: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
c330: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 61  gument */.){.  a
c340: 73 73 65 72 74 28 20 69 6e 74 65 72 70 3d 3d 30  ssert( interp==0
c350: 20 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 77 69   );   /* This wi
c360: 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 2a  ll always fail *
c370: 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
c380: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
c390: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
c3a0: 65 20 69 73 20 61 20 75 73 65 72 2d 64 65 66 69  e is a user-defi
c3b0: 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ned SQL function
c3c0: 20 77 68 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a   whose purpose.*
c3d0: 2a 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 65  * is to test the
c3e0: 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75   sqlite_set_resu
c3f0: 6c 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61  lt() API..*/.sta
c400: 74 69 63 20 76 6f 69 64 20 74 65 73 74 46 75 6e  tic void testFun
c410: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
c420: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
c430: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
c440: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77  lue **argv){.  w
c450: 68 69 6c 65 28 20 61 72 67 63 3e 3d 32 20 29 7b  hile( argc>=2 ){
c460: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c470: 2a 7a 41 72 67 30 20 3d 20 28 63 68 61 72 2a 29  *zArg0 = (char*)
c480: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
c490: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  xt(argv[0]);.   
c4a0: 20 69 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20   if( zArg0 ){.  
c4b0: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
c4c0: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
c4d0: 20 22 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20   "int") ){.     
c4e0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
c4f0: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
c500: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
c510: 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20  (argv[1]));.    
c520: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
c530: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
c540: 2c 22 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a  ,"int64")==0 ){.
c550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c560: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
c570: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
c580: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31  lue_int64(argv[1
c590: 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ]));.      }else
c5a0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
c5b0: 43 6d 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e  Cmp(zArg0,"strin
c5c0: 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  g")==0 ){.      
c5d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
c5e0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28  _text(context, (
c5f0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
c600: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
c610: 29 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  ), -1,.         
c620: 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49     SQLITE_TRANSI
c630: 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ENT);.      }els
c640: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
c650: 49 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62  ICmp(zArg0,"doub
c660: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
c670: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
c680: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
c690: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
c6a0: 64 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29  double(argv[1]))
c6b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
c6c0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
c6d0: 28 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d  (zArg0,"null")==
c6e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
c6f0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
c700: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
c710: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
c720: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
c730: 22 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20  "value")==0 ){. 
c740: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
c750: 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74  esult_value(cont
c760: 65 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65  ext, argv[sqlite
c770: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
c780: 5b 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65  [1])]);.      }e
c790: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  lse{.        got
c7a0: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
c7b0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
c7c0: 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
c7d0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
c7e0: 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61  argc -= 2;.    a
c7f0: 72 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  rgv += 2;.  }.  
c800: 72 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f  return;..error_o
c810: 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ut:.  sqlite3_re
c820: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
c830: 78 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65  xt,"first argume
c840: 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65  nt should be one
c850: 20 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e   of: ".      "in
c860: 74 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64  t int64 string d
c870: 6f 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65  ouble null value
c880: 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ", -1);.}../*.**
c890: 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
c8a0: 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66  _register_test_f
c8b0: 75 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d  unction  DB  NAM
c8c0: 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  E.**.** Register
c8d0: 20 74 68 65 20 74 65 73 74 20 53 51 4c 20 66 75   the test SQL fu
c8e0: 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61  nction on the da
c8f0: 74 61 62 61 73 65 20 44 42 20 75 6e 64 65 72 20  tabase DB under 
c900: 74 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a  the name NAME..*
c910: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
c920: 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63 28  t_register_func(
c930: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
c940: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
c950: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
c960: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
c970: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
c980: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
c990: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
c9a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c9b0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
c9c0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
c9d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
c9e0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
c9f0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
ca00: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
ca10: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  c;.  if( argc!=3
ca20: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
ca30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ca40: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
ca50: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
ca60: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
ca70: 22 20 44 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41  " DB FUNCTION-NA
ca80: 4d 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ME", 0);.    ret
ca90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
caa0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
cab0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
cac0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
cad0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
cae0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
caf0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
cb00: 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20  b, argv[2], -1, 
cb10: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
cb20: 0a 20 20 20 20 20 20 74 65 73 74 46 75 6e 63 2c  .      testFunc,
cb30: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
cb40: 21 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=0 ){.    Tcl_A
cb50: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
cb60: 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  rp, sqlite3ErrSt
cb70: 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  r(rc), 0);.    r
cb80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cb90: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
cba0: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
cbb0: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
cbc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cbd0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
cbe0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
cbf0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  e:  sqlite3_fina
cc00: 6c 69 7a 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a  lize  STMT .**.*
cc10: 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20 73 74 61  * Finalize a sta
cc20: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a  tement handle..*
cc30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
cc40: 74 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20 76 6f  t_finalize(.  vo
cc50: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
cc60: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
cc70: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
cc80: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
cc90: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
cca0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
ccb0: 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tmt;.  int rc;. 
ccc0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30   sqlite3 *db = 0
ccd0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
cce0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
ccf0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
cd00: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
cd10: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
cd20: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
cd30: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
cd40: 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
cd50: 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  >", 0);.    retu
cd60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cd70: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
cd80: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
cd90: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
cda0: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
cdb0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
cdc0: 4f 52 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74  OR;..  if( pStmt
cdd0: 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 53 74 6d   ){.    db = Stm
cde0: 74 54 6f 44 62 28 70 53 74 6d 74 29 3b 0a 20 20  tToDb(pStmt);.  
cdf0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
ce00: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
ce10: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
ce20: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
ce30: 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
ce40: 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
ce50: 20 20 69 66 28 20 64 62 20 26 26 20 73 71 6c 69    if( db && sqli
ce60: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
ce70: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
ce80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ce90: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
cea0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
ceb0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ge:  sqlite3_res
cec0: 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  et  STMT .**.** 
ced0: 52 65 73 65 74 20 61 20 73 74 61 74 65 6d 65 6e  Reset a statemen
cee0: 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  t handle..*/.sta
cef0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 73  tic int test_res
cf00: 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  et(.  void * cli
cf10: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
cf20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
cf30: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
cf40: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
cf50: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
cf60: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
cf70: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
cf80: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
cf90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
cfa0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
cfb0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
cfc0: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
cfd0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
cfe0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
cff0: 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20  <STMT>", 0);.   
d000: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d010: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
d020: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
d030: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
d040: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
d050: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
d060: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
d070: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
d080: 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74  Stmt);.  if( pSt
d090: 6d 74 20 26 26 20 73 71 6c 69 74 65 33 54 65 73  mt && sqlite3Tes
d0a0: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
d0b0: 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
d0c0: 2c 20 72 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , rc) ){.    ret
d0d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d0e0: 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75   }.  Tcl_SetResu
d0f0: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
d100: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
d110: 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
d120: 0a 2f 2a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ./*.  if( rc ){.
d130: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d140: 52 52 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 72  RROR;.  }.*/.  r
d150: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
d160: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
d170: 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 20 53  qlite3_expired S
d180: 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
d190: 6e 20 54 52 55 45 20 69 66 20 61 20 72 65 63 6f  n TRUE if a reco
d1a0: 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
d1b0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
d1c0: 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74  commended..*/.st
d1d0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78  atic int test_ex
d1e0: 70 69 72 65 64 28 0a 20 20 76 6f 69 64 20 2a 20  pired(.  void * 
d1f0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
d200: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
d210: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
d220: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
d230: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
d240: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
d250: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
d260: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
d270: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
d280: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
d290: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
d2a0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
d2b0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
d2c0: 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c  , 0), " <STMT>",
d2d0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
d2e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
d2f0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
d300: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
d310: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
d320: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
d330: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d340: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
d350: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
d360: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 73 71 6c  ewBooleanObj(sql
d370: 69 74 65 33 5f 65 78 70 69 72 65 64 28 70 53 74  ite3_expired(pSt
d380: 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
d390: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
d3a0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
d3b0: 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e  _transfer_bindin
d3c0: 67 73 20 46 52 4f 4d 53 54 4d 54 20 54 4f 53 54  gs FROMSTMT TOST
d3d0: 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  MT.**.** Transfe
d3e0: 72 20 61 6c 6c 20 62 69 6e 64 69 6e 67 73 20 66  r all bindings f
d3f0: 72 6f 6d 20 46 52 4f 4d 53 54 4d 54 20 6f 76 65  rom FROMSTMT ove
d400: 72 20 74 6f 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73  r to TOSTMT.*/.s
d410: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74  tatic int test_t
d420: 72 61 6e 73 66 65 72 5f 62 69 6e 64 28 0a 20 20  ransfer_bind(.  
d430: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
d440: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
d450: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
d460: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
d470: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
d480: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
d490: 70 53 74 6d 74 31 2c 20 2a 70 53 74 6d 74 32 3b  pStmt1, *pStmt2;
d4a0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
d4b0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
d4c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d4d0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
d4e0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
d4f0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
d500: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
d510: 5d 2c 20 30 29 2c 20 22 20 46 52 4f 4d 2d 53 54  ], 0), " FROM-ST
d520: 4d 54 20 54 4f 2d 53 54 4d 54 22 2c 20 30 29 3b  MT TO-STMT", 0);
d530: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
d540: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
d550: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
d560: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
d570: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
d580: 26 70 53 74 6d 74 31 29 29 20 72 65 74 75 72 6e  &pStmt1)) return
d590: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
d5a0: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
d5b0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
d5c0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
d5d0: 20 26 70 53 74 6d 74 32 29 29 20 72 65 74 75 72   &pStmt2)) retur
d5e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
d5f0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
d600: 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
d610: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
d620: 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e  te3_transfer_bin
d630: 64 69 6e 67 73 28 70 53 74 6d 74 31 2c 70 53 74  dings(pStmt1,pSt
d640: 6d 74 32 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  mt2)));.  return
d650: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
d660: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
d670: 33 5f 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a 0a  3_changes DB.**.
d680: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
d690: 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20  mber of changes 
d6a0: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
d6b0: 62 61 73 65 20 62 79 20 74 68 65 20 6c 61 73 74  base by the last
d6c0: 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69 6f   SQL.** executio
d6d0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
d6e0: 20 74 65 73 74 5f 63 68 61 6e 67 65 73 28 0a 20   test_changes(. 
d6f0: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
d700: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
d710: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
d720: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
d730: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
d740: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
d750: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
d760: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
d770: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
d780: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
d790: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
d7a0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
d7b0: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22  (objv[0]), " DB"
d7c0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
d7d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d7e0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
d7f0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
d800: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
d810: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
d820: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
d830: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
d840: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
d850: 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 68 61  tObj(sqlite3_cha
d860: 6e 67 65 73 28 64 62 29 29 29 3b 0a 20 20 72 65  nges(db)));.  re
d870: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
d880: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
d890: 65 20 22 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  e "static_bind_v
d8a0: 61 6c 75 65 22 20 74 68 61 74 20 76 61 72 69 61  alue" that varia
d8b0: 62 6c 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74  bles are bound t
d8c0: 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46 4c  o when.** the FL
d8d0: 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71 6c  AG option of sql
d8e0: 69 74 65 33 5f 62 69 6e 64 20 69 73 20 22 73 74  ite3_bind is "st
d8f0: 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20  atic".*/.static 
d900: 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 73 74 61  char *sqlite_sta
d910: 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20 3d  tic_bind_value =
d920: 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73   0;.static int s
d930: 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
d940: 64 5f 6e 62 79 74 65 20 3d 20 30 3b 0a 0a 2f 2a  d_nbyte = 0;../*
d950: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
d960: 74 65 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44  te3_bind  VM  ID
d970: 58 20 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a  X  VALUE  FLAGS.
d980: 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76  **.** Sets the v
d990: 61 6c 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d  alue of the IDX-
d9a0: 74 68 20 6f 63 63 75 72 61 6e 63 65 20 6f 66 20  th occurance of 
d9b0: 22 3f 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69  "?" in the origi
d9c0: 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e  nal SQL.** strin
d9d0: 67 2e 20 20 56 41 4c 55 45 20 69 73 20 74 68 65  g.  VALUE is the
d9e0: 20 6e 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20   new value.  If 
d9f0: 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68  FLAGS=="null" th
da00: 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69  en VALUE is.** i
da10: 67 6e 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76  gnored and the v
da20: 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e  alue is set to N
da30: 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d  ULL.  If FLAGS==
da40: 22 73 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a  "static" then.**
da50: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65   the value is se
da60: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f  t to the value o
da70: 66 20 61 20 73 74 61 74 69 63 20 76 61 72 69 61  f a static varia
da80: 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71  ble named.** "sq
da90: 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
daa0: 5f 76 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41  _value".  If FLA
dab0: 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65  GS=="normal" the
dac0: 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74  n a copy.** of t
dad0: 68 65 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65  he VALUE is made
dae0: 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 62 6c  .  If FLAGS=="bl
daf0: 6f 62 31 30 22 20 74 68 65 6e 20 61 20 56 41 4c  ob10" then a VAL
db00: 55 45 20 69 73 20 69 67 6e 6f 72 65 64 0a 2a 2a  UE is ignored.**
db10: 20 61 6e 20 61 20 31 30 2d 62 79 74 65 20 62 6c   an a 10-byte bl
db20: 6f 62 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30  ob "abc\000xyz\0
db30: 30 30 70 71 22 20 69 73 20 69 6e 73 65 72 74 65  00pq" is inserte
db40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
db50: 20 74 65 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f   test_bind(.  vo
db60: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
db70: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
db80: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
db90: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
dba0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
dbb0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
dbc0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
dbd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
dbe0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
dbf0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
dc00: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
dc10: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
dc20: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
dc30: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
dc40: 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
dc50: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
dc60: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
dc70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
dc80: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
dc90: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
dca0: 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20  v[0], .       " 
dcb0: 56 4d 20 49 44 58 20 56 41 4c 55 45 20 28 6e 75  VM IDX VALUE (nu
dcc0: 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c  ll|static|normal
dcd0: 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  )\"", 0);.    re
dce0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
dcf0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
dd00: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
dd10: 20 61 72 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74   argv[1], &pStmt
dd20: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
dd30: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
dd40: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
dd50: 72 67 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  rgv[2], &idx) ) 
dd60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
dd70: 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 61  ;.  if( strcmp(a
dd80: 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d  rgv[4],"null")==
dd90: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
dda0: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
ddb0: 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d  pStmt, idx);.  }
ddc0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
ddd0: 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 22  argv[4],"static"
dde0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
ddf0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
de00: 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73  xt(pStmt, idx, s
de10: 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
de20: 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b  d_value, -1, 0);
de30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
de40: 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61  cmp(argv[4],"sta
de50: 74 69 63 2d 6e 62 79 74 65 73 22 29 3d 3d 30 20  tic-nbytes")==0 
de60: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
de70: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
de80: 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65  tmt, idx, sqlite
de90: 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
dea0: 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue,.            
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ded0: 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62  e_static_bind_nb
dee0: 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  yte, 0);.  }else
def0: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
df00: 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30  [4],"normal")==0
df10: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
df20: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
df30: 53 74 6d 74 2c 20 69 64 78 2c 20 61 72 67 76 5b  Stmt, idx, argv[
df40: 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  3], -1, SQLITE_T
df50: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c  RANSIENT);.  }el
df60: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
df70: 67 76 5b 34 5d 2c 22 62 6c 6f 62 31 30 22 29 3d  gv[4],"blob10")=
df80: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
df90: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
dfa0: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 22 61 62  (pStmt, idx, "ab
dfb0: 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22 2c  c\000xyz\000pq",
dfc0: 20 31 30 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   10, SQLITE_STAT
dfd0: 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IC);.  }else{.  
dfe0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
dff0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 34 74 68 20  lt(interp, "4th 
e000: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
e010: 62 65 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22  be ".        "\"
e020: 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74  null\" or \"stat
e030: 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c  ic\" or \"normal
e040: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
e050: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e060: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
e070: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
e080: 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
e090: 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
e0a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
e0b0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 68 61  f( rc ){.    cha
e0c0: 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20  r zBuf[50];.    
e0d0: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28  sprintf(zBuf, "(
e0e0: 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
e0f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e100: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
e110: 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
e120: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
e130: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
e140: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
e150: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
e160: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
e170: 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74  .** Usage: add_t
e180: 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20  est_collate <db 
e190: 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  ptr> <utf8> <utf
e1a0: 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a  16le> <utf16be>.
e1b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
e1c0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74  ion is used to t
e1d0: 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
e1e0: 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72  selects the corr
e1f0: 65 63 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a  ect collation.**
e200: 20 73 65 71 75 65 6e 63 65 20 63 61 6c 6c 62 61   sequence callba
e210: 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ck when multiple
e220: 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64   versions (for d
e230: 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e  ifferent text en
e240: 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20  codings).** are 
e250: 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
e260: 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
e270: 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20  utine registers 
e280: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
e290: 71 75 65 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c  quence "test_col
e2a0: 6c 61 74 65 22 0a 2a 2a 20 77 69 74 68 20 64 61  late".** with da
e2b0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64  tabase handle <d
e2c0: 62 3e 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  b>. The second a
e2d0: 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
e2e0: 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 0a  a list of three.
e2f0: 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65  ** boolean value
e300: 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20  s. If the first 
e310: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20  is true, then a 
e320: 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f  version of test_
e330: 63 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65  collate is.** re
e340: 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
e350: 2d 38 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  -8, if the secon
e360: 64 20 69 73 20 74 72 75 65 2c 20 61 20 76 65 72  d is true, a ver
e370: 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72  sion is register
e380: 65 64 20 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36  ed for.** UTF-16
e390: 6c 65 2c 20 69 66 20 74 68 65 20 74 68 69 72 64  le, if the third
e3a0: 20 69 73 20 74 72 75 65 2c 20 61 20 55 54 46 2d   is true, a UTF-
e3b0: 31 36 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20  16be version is 
e3c0: 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72  available..** Pr
e3d0: 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20  evious versions 
e3e0: 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  of test_collate 
e3f0: 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a  are deleted..**.
e400: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ** The collation
e410: 20 73 65 71 75 65 6e 63 65 20 74 65 73 74 5f 63   sequence test_c
e420: 6f 6c 6c 61 74 65 20 69 73 20 69 6d 70 6c 65 6d  ollate is implem
e430: 65 6e 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ented by calling
e440: 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
e450: 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a  g TCL script:.**
e460: 0a 2a 2a 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c  .**   "test_coll
e470: 61 74 65 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20  ate <enc> <lhs> 
e480: 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65  <rhs>".**.** The
e490: 20 3c 6c 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e   <lhs> and <rhs>
e4a0: 20 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c   are the two val
e4b0: 75 65 73 20 62 65 69 6e 67 20 63 6f 6d 70 61 72  ues being compar
e4c0: 65 64 2c 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ed, encoded in U
e4d0: 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e  TF-8..** The <en
e4e0: 63 3e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  c> parameter is 
e4f0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  the encoding of 
e500: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
e510: 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53  nction that.** S
e520: 51 4c 69 74 65 20 73 65 6c 65 63 74 65 64 20 74  QLite selected t
e530: 6f 20 63 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20  o call. The TCL 
e540: 74 65 73 74 20 73 63 72 69 70 74 20 69 6d 70 6c  test script impl
e550: 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74  ements the.** "t
e560: 65 73 74 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f  est_collate" pro
e570: 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  c..**.** Note th
e580: 61 74 20 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c  at this will onl
e590: 79 20 77 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20  y work with one 
e5a0: 69 6e 74 65 70 72 65 74 65 72 20 61 74 20 61 20  intepreter at a 
e5b0: 74 69 6d 65 2c 20 61 73 20 74 68 65 0a 2a 2a 20  time, as the.** 
e5c0: 69 6e 74 65 72 70 20 70 6f 69 6e 74 65 72 20 74  interp pointer t
e5d0: 6f 20 75 73 65 20 77 68 65 6e 20 65 76 61 6c 75  o use when evalu
e5e0: 61 74 69 6e 67 20 74 68 65 20 54 43 4c 20 73 63  ating the TCL sc
e5f0: 72 69 70 74 20 69 73 20 73 74 6f 72 65 64 20 69  ript is stored i
e600: 6e 0a 2a 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74  n.** pTestCollat
e610: 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61 74  eInterp..*/.stat
e620: 69 63 20 54 63 6c 5f 49 6e 74 65 72 70 2a 20 70  ic Tcl_Interp* p
e630: 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72  TestCollateInter
e640: 70 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  p;.static int te
e650: 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28  st_collate_func(
e660: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a  .  void *pCtx, .
e670: 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20    int nA, const 
e680: 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20  void *zA,.  int 
e690: 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  nB, const void *
e6a0: 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  zB.){.  Tcl_Inte
e6b0: 72 70 20 2a 69 20 3d 20 70 54 65 73 74 43 6f 6c  rp *i = pTestCol
e6c0: 6c 61 74 65 49 6e 74 65 72 70 3b 0a 20 20 69 6e  lateInterp;.  in
e6d0: 74 20 65 6e 63 69 6e 20 3d 20 28 69 6e 74 29 70  t encin = (int)p
e6e0: 43 74 78 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  Ctx;.  int res;.
e6f0: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71 6c 69    int n;..  sqli
e700: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
e710: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a  .  Tcl_Obj *pX;.
e720: 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53  .  pX = Tcl_NewS
e730: 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 63  tringObj("test_c
e740: 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a 20 20  ollate", -1);.  
e750: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
e760: 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  (pX);..  switch(
e770: 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20 63 61   encin ){.    ca
e780: 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a  se SQLITE_UTF8:.
e790: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
e7a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
e7b0: 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ,pX,Tcl_NewStrin
e7c0: 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d 31 29  gObj("UTF-8",-1)
e7d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e7e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
e7f0: 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20 54  UTF16LE:.      T
e800: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
e810: 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
e820: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
e830: 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b 0a 20  TF-16LE",-1));. 
e840: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e850: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31  case SQLITE_UTF1
e860: 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c  6BE:.      Tcl_L
e870: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
e880: 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77  ent(i,pX,Tcl_New
e890: 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31  StringObj("UTF-1
e8a0: 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20  6BE",-1));.     
e8b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
e8c0: 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
e8d0: 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 56 61  t(0);.  }..  pVa
e8e0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
e8f0: 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  New(0);.  sqlite
e900: 33 56 61 6c 75 65 53 65 74 53 74 72 28 30 2c 20  3ValueSetStr(0, 
e910: 70 56 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e  pVal, nA, zA, en
e920: 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  cin, SQLITE_STAT
e930: 49 43 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  IC);.  n = sqlit
e940: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
e950: 56 61 6c 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Val);.  Tcl_List
e960: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
e970: 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 54 63 6c  (i,pX,.      Tcl
e980: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
e990: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
e9a0: 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29  ue_text(pVal),n)
e9b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
e9c0: 65 53 65 74 53 74 72 28 30 2c 20 70 56 61 6c 2c  eSetStr(0, pVal,
e9d0: 20 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20   nB, zB, encin, 
e9e0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
e9f0: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
ea00: 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b  lue_bytes(pVal);
ea10: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
ea20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
ea30: 2c 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53  ,.      Tcl_NewS
ea40: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
ea50: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
ea60: 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20  xt(pVal),n));.  
ea70: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
ea80: 28 70 56 61 6c 29 3b 0a 0a 20 20 54 63 6c 5f 45  (pVal);..  Tcl_E
ea90: 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c 20  valObjEx(i, pX, 
eaa0: 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
eab0: 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63  fCount(pX);.  Tc
eac0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
ead0: 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  i, Tcl_GetObjRes
eae0: 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a 20  ult(i), &res);. 
eaf0: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73   return res;.}.s
eb00: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
eb10: 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a  ollate(.  void *
eb20: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
eb30: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
eb40: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
eb50: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
eb60: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
eb70: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76  te3 *db;.  int v
eb80: 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  al;.  sqlite3_va
eb90: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
eba0: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
ebb0: 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=5 ) goto bad_a
ebc0: 72 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c  rgs;.  pTestColl
ebd0: 61 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65  ateInterp = inte
ebe0: 72 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50  rp;.  if( getDbP
ebf0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
ec00: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
ec10: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
ec20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ec30: 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
ec40: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
ec50: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
ec60: 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[2], &val) ) re
ec70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ec80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
ec90: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
eca0: 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74  db, "test_collat
ecb0: 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  e", SQLITE_UTF8,
ecc0: 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69   .          (voi
ecd0: 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c  d *)SQLITE_UTF8,
ece0: 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74   val?test_collat
ecf0: 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28  e_func:0);.  if(
ed00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ed10: 7b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b  {.    if( TCL_OK
ed20: 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
ed30: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
ed40: 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
ed50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ed60: 52 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  R;.    rc = sqli
ed70: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
ed80: 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63  tion(db, "test_c
ed90: 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
eda0: 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20  UTF16LE, .      
edb0: 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51        (void *)SQ
edc0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 76 61  LITE_UTF16LE, va
edd0: 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  l?test_collate_f
ede0: 75 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66 28 20  unc:0);.    if( 
edf0: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
ee00: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
ee10: 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
ee20: 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
ee30: 4c 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 64 65 66  L_ERROR;..#ifdef
ee40: 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
ee50: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
ee60: 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20 29  _iMallocFail>0 )
ee70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ee80: 69 4d 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20  iMallocFail++;. 
ee90: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
eea0: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
eeb0: 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 20 20 73  lueNew(0);.    s
eec0: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
eed0: 72 28 30 2c 20 70 56 61 6c 2c 20 2d 31 2c 20 22  r(0, pVal, -1, "
eee0: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53  test_collate", S
eef0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
ef00: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
ef10: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
ef20: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28  ate_collation16(
ef30: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  db, .          s
ef40: 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
ef50: 30 2c 20 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f  0, pVal, SQLITE_
ef60: 55 54 46 31 36 4e 41 54 49 56 45 29 2c 20 53 51  UTF16NATIVE), SQ
ef70: 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20  LITE_UTF16BE, . 
ef80: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a           (void *
ef90: 29 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c  )SQLITE_UTF16BE,
efa0: 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74   val?test_collat
efb0: 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 73  e_func:0);.    s
efc0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
efd0: 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pVal);.  }.  if(
efe0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
eff0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
f000: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
f010: 5f 45 52 52 4f 52 3b 0a 20 20 0a 20 20 69 66 28  _ERROR;.  .  if(
f020: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f030: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
f040: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
f050: 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
f060: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
f070: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f080: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
f090: 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67  TCL_OK;..bad_arg
f0a0: 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  s:.  Tcl_AppendR
f0b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
f0c0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
f0d0: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
f0e0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
f0f0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
f100: 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38  0), " <DB> <utf8
f110: 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
f120: 31 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65  16be>", 0);.  re
f130: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f140: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
f150: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  e collation need
f160: 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  ed callback is i
f170: 6e 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64 20 74  nvoked, record t
f180: 68 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74  he name of .** t
f190: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
f1a0: 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
f1b0: 68 65 72 65 2e 20 20 54 68 65 20 72 65 63 6f 72  here.  The recor
f1c0: 64 65 64 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b  ded name is link
f1d0: 65 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76  ed.** to a TCL v
f1e0: 61 72 69 61 62 6c 65 20 61 6e 64 20 75 73 65 64  ariable and used
f1f0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
f200: 61 74 20 74 68 65 20 72 65 71 75 65 73 74 65 64  at the requested
f210: 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61   collation.** na
f220: 6d 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  me is correct..*
f230: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e  /.static char zN
f240: 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32  eededCollation[2
f250: 30 30 5d 3b 0a 73 74 61 74 69 63 20 63 68 61 72  00];.static char
f260: 20 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74   *pzNeededCollat
f270: 69 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c  ion = zNeededCol
f280: 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  lation;.../*.** 
f290: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f  Called when a co
f2a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f2b0: 20 69 73 20 6e 65 65 64 65 64 2e 20 20 52 65 67   is needed.  Reg
f2c0: 69 73 74 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a  istered using.**
f2d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
f2e0: 6f 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a  on_needed16()..*
f2f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
f300: 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
f310: 64 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70 43  d_cb(.  void *pC
f320: 74 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  tx, .  sqlite3 *
f330: 64 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52  db,.  int eTextR
f340: 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ep,.  const void
f350: 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74   *pName.){.  int
f360: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
f370: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
f380: 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63  *z;.  for(z = (c
f390: 68 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b  har*)pName, i=0;
f3a0: 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b   *z || z[1]; z++
f3b0: 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20 29 20  ){.    if( *z ) 
f3c0: 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
f3d0: 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a  [i++] = *z;.  }.
f3e0: 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69    zNeededCollati
f3f0: 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  on[i] = 0;.  sql
f400: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
f410: 61 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c  ation(.      db,
f420: 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
f430: 20 45 4e 43 28 64 62 29 2c 20 28 76 6f 69 64 20   ENC(db), (void 
f440: 2a 29 65 6e 63 2c 20 74 65 73 74 5f 63 6f 6c 6c  *)enc, test_coll
f450: 61 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a  ate_func);.}../*
f460: 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74  .** Usage: add_t
f470: 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
f480: 65 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20  ed DB.*/.static 
f490: 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  int test_collate
f4a0: 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20  _needed(.  void 
f4b0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
f4c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
f4d0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
f4e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
f4f0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
f500: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
f510: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
f520: 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72  =2 ) goto bad_ar
f530: 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50  gs;.  if( getDbP
f540: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
f550: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f560: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
f570: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f580: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
f590: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
f5a0: 36 28 64 62 2c 20 30 2c 20 74 65 73 74 5f 63 6f  6(db, 0, test_co
f5b0: 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 29  llate_needed_cb)
f5c0: 3b 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  ;.  zNeededColla
f5d0: 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 69  tion[0] = 0;.  i
f5e0: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
f5f0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
f600: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
f610: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
f620: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f  rn TCL_OK;..bad_
f630: 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e  args:.  Tcl_Wron
f640: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
f650: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
f660: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
f670: 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  ROR;.}../*.** tc
f680: 6c 63 6d 64 3a 20 20 20 61 64 64 5f 61 6c 69 67  lcmd:   add_alig
f690: 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
f6a0: 74 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20  tions  DB.**.** 
f6b0: 41 64 64 20 74 77 6f 20 6e 65 77 20 63 6f 6c 6c  Add two new coll
f6c0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
f6d0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
f6e0: 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20 75 74 66  DB.**.**     utf
f6f0: 31 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a 20 20 20  16_aligned.**   
f700: 20 20 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65    utf16_unaligne
f710: 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c  d.**.** Both col
f720: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
f730: 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 73 6f   use the same so
f740: 72 74 20 6f 72 64 65 72 20 61 73 20 42 49 4e 41  rt order as BINA
f750: 52 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  RY..** The only 
f760: 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 74 68  difference is th
f770: 61 74 20 74 68 65 20 75 74 66 31 36 5f 61 6c 69  at the utf16_ali
f780: 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  gned collating.*
f790: 2a 20 73 65 71 75 65 6e 63 65 20 69 73 20 64 65  * sequence is de
f7a0: 63 6c 61 72 65 64 20 77 69 74 68 20 74 68 65 20  clared with the 
f7b0: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
f7c0: 47 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a 20 42 6f  GNED flag..** Bo
f7d0: 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  th collating fun
f7e0: 63 74 69 6f 6e 73 20 69 6e 63 72 65 6d 65 6e 74  ctions increment
f7f0: 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 75   the unaligned u
f800: 74 66 31 36 20 63 6f 75 6e 74 65 72 0a 2a 2a 20  tf16 counter.** 
f810: 77 68 65 6e 65 76 65 72 20 74 68 65 79 20 73 65  whenever they se
f820: 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
f830: 62 65 67 69 6e 73 20 6f 6e 20 61 6e 20 6f 64 64  begins on an odd
f840: 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a   byte boundary..
f850: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
f860: 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
f870: 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 73 74 61 74  ounter = 0;.stat
f880: 69 63 20 69 6e 74 20 61 6c 69 67 6e 6d 65 6e 74  ic int alignment
f890: 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64  CollFunc(.  void
f8a0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74   *NotUsed,.  int
f8b0: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
f8c0: 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74  id *pKey1,.  int
f8d0: 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
f8e0: 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69  id *pKey2.){.  i
f8f0: 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20  nt rc, n;.  n = 
f900: 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b  nKey1<nKey2 ? nK
f910: 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 69  ey1 : nKey2;.  i
f920: 66 28 20 6e 4b 65 79 31 3e 30 20 26 26 20 31 3d  f( nKey1>0 && 1=
f930: 3d 28 31 26 28 69 6e 74 29 70 4b 65 79 31 29 20  =(1&(int)pKey1) 
f940: 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69  ) unaligned_stri
f950: 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ng_counter++;.  
f960: 69 66 28 20 6e 4b 65 79 32 3e 30 20 26 26 20 31  if( nKey2>0 && 1
f970: 3d 3d 28 31 26 28 69 6e 74 29 70 4b 65 79 32 29  ==(1&(int)pKey2)
f980: 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72   ) unaligned_str
f990: 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  ing_counter++;. 
f9a0: 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65   rc = memcmp(pKe
f9b0: 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20  y1, pKey2, n);. 
f9c0: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
f9d0: 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e    rc = nKey1 - n
f9e0: 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key2;.  }.  retu
f9f0: 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
fa00: 69 6e 74 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e  int add_alignmen
fa10: 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
fa20: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
fa30: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
fa40: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
fa50: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
fa60: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
fa70: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
fa80: 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d  db;.  if( objc>=
fa90: 32 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  2 ){.    if( get
faa0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
fab0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
fac0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
fad0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fae0: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  R;.    sqlite3_c
faf0: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
fb00: 64 62 2c 20 22 75 74 66 31 36 5f 75 6e 61 6c 69  db, "utf16_unali
fb10: 67 6e 65 64 22 2c 0a 20 20 20 20 20 20 20 20 53  gned",.        S
fb20: 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a 20 20  QLITE_UTF16, .  
fb30: 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65        0, alignme
fb40: 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 20  ntCollFunc);.   
fb50: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
fb60: 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75  collation(db, "u
fb70: 74 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c 0a 20  tf16_aligned",. 
fb80: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54         SQLITE_UT
fb90: 46 31 36 20 7c 20 53 51 4c 49 54 45 5f 55 54 46  F16 | SQLITE_UTF
fba0: 31 36 5f 41 4c 49 47 4e 45 44 2c 20 0a 20 20 20  16_ALIGNED, .   
fbb0: 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65 6e       0, alignmen
fbc0: 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 7d 0a  tCollFunc);.  }.
fbd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fbe0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
fbf0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
fc00: 4f 4d 49 54 5f 55 54 46 31 36 29 20 2a 2f 0a 0a  OMIT_UTF16) */..
fc10: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64  /*.** Usage: add
fc20: 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c  _test_function <
fc30: 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c  db ptr> <utf8> <
fc40: 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62  utf16le> <utf16b
fc50: 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  e>.**.** This fu
fc60: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
fc70: 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
fc80: 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20 63  te selects the c
fc90: 6f 72 72 65 63 74 20 75 73 65 72 0a 2a 2a 20 66  orrect user.** f
fca0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  unction callback
fcb0: 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76   when multiple v
fcc0: 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69 66  ersions (for dif
fcd0: 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63 6f  ferent text enco
fce0: 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61 76  dings).** are av
fcf0: 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43  ailable..**.** C
fd00: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
fd10: 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 75 70  ine registers up
fd20: 20 74 6f 20 74 68 72 65 65 20 76 65 72 73 69 6f   to three versio
fd30: 6e 73 20 6f 66 20 74 68 65 20 75 73 65 72 20 66  ns of the user f
fd40: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74 65 73 74  unction.** "test
fd50: 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69 74 68 20  _function" with 
fd60: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
fd70: 3c 64 62 3e 2e 20 20 49 66 20 74 68 65 20 73 65  <db>.  If the se
fd80: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
fd90: 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20 61  .** true, then a
fda0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73 74   version of test
fdb0: 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 67  _function is reg
fdc0: 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d  istered for UTF-
fdd0: 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20 74 68 69  8, if the.** thi
fde0: 72 64 20 69 73 20 74 72 75 65 2c 20 61 20 76 65  rd is true, a ve
fdf0: 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65  rsion is registe
fe00: 72 65 64 20 66 6f 72 20 55 54 46 2d 31 36 6c 65  red for UTF-16le
fe10: 2c 20 69 66 20 74 68 65 20 66 6f 75 72 74 68 20  , if the fourth 
fe20: 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61 20 55 54  is.** true, a UT
fe30: 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20 69  F-16be version i
fe40: 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 50 72  s available.  Pr
fe50: 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20  evious versions 
fe60: 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75 6e 63 74  of.** test_funct
fe70: 69 6f 6e 20 61 72 65 20 64 65 6c 65 74 65 64 2e  ion are deleted.
fe80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73 65 72 20  .**.** The user 
fe90: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  function is impl
fea0: 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c 69  emented by calli
feb0: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
fec0: 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a   TCL script:.**.
fed0: 2a 2a 20 20 20 22 74 65 73 74 5f 66 75 6e 63 74  **   "test_funct
fee0: 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72 67 3e 22  ion <enc> <arg>"
fef0: 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 3c 65 6e  .**.** Where <en
ff00: 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 54 46  c> is one of UTF
ff10: 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20 6f 72 20  -8, UTF-16LE or 
ff20: 55 54 46 31 36 42 45 2c 20 61 6e 64 20 3c 61 72  UTF16BE, and <ar
ff30: 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20 73 69 6e  g> is the.** sin
ff40: 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 70 61 73  gle argument pas
ff50: 73 65 64 20 74 6f 20 74 68 65 20 53 51 4c 20 66  sed to the SQL f
ff60: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c  unction. The val
ff70: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 0a 2a  ue returned by.*
ff80: 2a 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74  * the TCL script
ff90: 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
ffa0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
ffb0: 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  the SQL function
ffc0: 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61 73 73 65  . It.** is passe
ffd0: 64 20 74 6f 20 53 51 4c 69 74 65 20 75 73 69 6e  d to SQLite usin
ffe0: 67 20 55 54 46 2d 31 36 42 45 20 66 6f 72 20 61  g UTF-16BE for a
fff0: 20 55 54 46 2d 38 20 74 65 73 74 5f 66 75 6e 63   UTF-8 test_func
10000 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38 0a 2a 2a  tion(), UTF-8.**
10010 20 66 6f 72 20 61 20 55 54 46 2d 31 36 4c 45 20   for a UTF-16LE 
10020 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  test_function(),
10030 20 61 6e 64 20 55 54 46 2d 31 36 4c 45 20 66 6f   and UTF-16LE fo
10040 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  r an implementat
10050 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70 72 65 66  ion that.** pref
10060 65 72 73 20 55 54 46 2d 31 36 42 45 2e 0a 2a 2f  ers UTF-16BE..*/
10070 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10080 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69  OMIT_UTF16.stati
10090 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63  c void test_func
100a0 74 69 6f 6e 5f 75 74 66 38 28 0a 20 20 73 71 6c  tion_utf8(.  sql
100b0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
100c0 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
100d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
100e0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c   **argv.){.  Tcl
100f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
10100 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a  .  Tcl_Obj *pX;.
10110 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
10120 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20  *pVal;.  interp 
10130 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  = (Tcl_Interp *)
10140 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
10150 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20  a(pCtx);.  pX = 
10160 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10170 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  ("test_function"
10180 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
10190 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
101a0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
101b0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
101c0 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72  , pX, Tcl_NewStr
101d0 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 20  ingObj("UTF-8", 
101e0 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
101f0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10200 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20  (interp, pX, .  
10210 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
10220 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69  gObj((char*)sqli
10230 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
10240 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20  rgv[0]), -1));. 
10250 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
10260 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20  nterp, pX, 0);. 
10270 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
10280 74 28 70 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  t(pX);.  sqlite3
10290 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
102a0 78 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  x, Tcl_GetString
102b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
102c0 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
102d0 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c 20 3d 20  IENT);.  pVal = 
102e0 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
102f0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  0);.  sqlite3Val
10300 75 65 53 65 74 53 74 72 28 30 2c 20 70 56 61 6c  ueSetStr(0, pVal
10310 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
10320 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
10330 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
10340 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
10350 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
10360 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65  _result_text16be
10370 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
10380 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70 56  alue_text16be(pV
10390 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
103a0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
103b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
103c0 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74  Free(pVal);.}.st
103d0 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66  atic void test_f
103e0 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28  unction_utf16le(
103f0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
10400 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
10410 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
10420 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
10430 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
10440 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
10450 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *pX;.  sqlite3_
10460 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
10470 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74  nterp = (Tcl_Int
10480 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73  erp *)sqlite3_us
10490 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
104a0 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72   pX = Tcl_NewStr
104b0 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e  ingObj("test_fun
104c0 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54  ction", -1);.  T
104d0 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
104e0 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pX);.  Tcl_ListO
104f0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10500 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f  interp, pX, Tcl_
10510 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
10520 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20  F-16LE", -1));. 
10530 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10540 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10550 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
10560 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
10570 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
10580 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
10590 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
105a0 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
105b0 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pX, 0);.  Tcl_De
105c0 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
105d0 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
105e0 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
105f0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
10600 72 28 30 2c 20 70 56 61 6c 2c 20 2d 31 2c 20 54  r(0, pVal, -1, T
10610 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
10620 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
10630 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
10640 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
10650 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
10660 5f 74 65 78 74 28 70 43 74 78 2c 28 63 68 61 72  _text(pCtx,(char
10670 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
10680 74 65 78 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51  text(pVal),-1,SQ
10690 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
106a0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
106b0 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61  ree(pVal);.}.sta
106c0 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75  tic void test_fu
106d0 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a  nction_utf16be(.
106e0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
106f0 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
10700 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
10710 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
10720 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10730 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
10740 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *pX;.  sqlite3_v
10750 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
10760 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65  terp = (Tcl_Inte
10770 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  rp *)sqlite3_use
10780 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
10790 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  pX = Tcl_NewStri
107a0 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63  ngObj("test_func
107b0 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63  tion", -1);.  Tc
107c0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
107d0 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  X);.  Tcl_ListOb
107e0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
107f0 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e  nterp, pX, Tcl_N
10800 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
10810 2d 31 36 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20  -16BE", -1));.  
10820 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10830 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10840 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f   pX, .      Tcl_
10850 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
10860 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
10870 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c  e_text(argv[0]),
10880 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   -1));.  Tcl_Eva
10890 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
108a0 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  X, 0);.  Tcl_Dec
108b0 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
108c0 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
108d0 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71  alueNew(0);.  sq
108e0 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
108f0 28 30 2c 20 70 56 61 6c 2c 20 2d 31 2c 20 54 63  (0, pVal, -1, Tc
10900 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
10910 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20  t(interp), .    
10920 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
10930 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
10940 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
10950 74 65 78 74 31 36 6c 65 28 70 43 74 78 2c 20 73  text16le(pCtx, s
10960 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
10970 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20  t16le(pVal),.   
10980 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52     -1, SQLITE_TR
10990 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
109a0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
109b0 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
109c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
109d0 36 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  6 */.static int 
109e0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  test_function(. 
109f0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
10a00 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
10a10 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
10a20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
10a30 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
10a40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10a50 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
10a60 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
10a70 76 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  val;..  if( objc
10a80 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=5 ) goto bad_a
10a90 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62  rgs;.  if( getDb
10aa0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
10ab0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10ac0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
10ad0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10ae0 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ..  if( TCL_OK!=
10af0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
10b00 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
10b10 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[2], &val) ) r
10b20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10b30 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20  .  if( val ){.  
10b40 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
10b50 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
10b60 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31  est_function", 1
10b70 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a  , SQLITE_UTF8, .
10b80 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
10b90 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
10ba0 66 38 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  f8, 0, 0);.  }. 
10bb0 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
10bc0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
10bd0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
10be0 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  3], &val) ) retu
10bf0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10c00 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73  if( val ){.    s
10c10 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
10c20 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  nction(db, "test
10c30 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53  _function", 1, S
10c40 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a  QLITE_UTF16LE, .
10c50 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
10c60 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
10c70 66 31 36 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20  f16le, 0, 0);.  
10c80 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  }.  if( TCL_OK!=
10c90 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
10ca0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
10cb0 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[4], &val) ) r
10cc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10cd0 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20  .  if( val ){.  
10ce0 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
10cf0 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
10d00 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31  est_function", 1
10d10 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
10d20 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72  , .        inter
10d30 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  p, test_function
10d40 5f 75 74 66 31 36 62 65 2c 20 30 2c 20 30 29 3b  _utf16be, 0, 0);
10d50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
10d60 43 4c 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67 73 3a  CL_OK;.bad_args:
10d70 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
10d80 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
10d90 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
10da0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
10db0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10dc0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
10dd0 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20  , " <DB> <utf8> 
10de0 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
10df0 62 65 3e 22 2c 20 30 29 3b 0a 23 65 6e 64 69 66  be>", 0);.#endif
10e00 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10e10 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
10e20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
10e30 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20  /*.** Usage:    
10e40 20 20 20 20 20 74 65 73 74 5f 65 72 72 73 74 72       test_errstr
10e50 20 3c 65 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a   <err code>.**.*
10e60 2a 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20  * Test that the 
10e70 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  english language
10e80 20 73 74 72 69 6e 67 20 65 71 75 69 76 61 6c 65   string equivale
10e90 6e 74 73 20 66 6f 72 20 73 71 6c 69 74 65 20 65  nts for sqlite e
10ea0 72 72 6f 72 20 63 6f 64 65 73 0a 2a 2a 20 61 72  rror codes.** ar
10eb0 65 20 73 61 6e 65 2e 20 54 68 65 20 70 61 72 61  e sane. The para
10ec0 6d 65 74 65 72 20 69 73 20 61 6e 20 69 6e 74 65  meter is an inte
10ed0 67 65 72 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ger representing
10ee0 20 61 6e 20 73 71 6c 69 74 65 20 65 72 72 6f 72   an sqlite error
10ef0 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 72 65   code..** The re
10f00 73 75 6c 74 20 69 73 20 61 20 6c 69 73 74 20 6f  sult is a list o
10f10 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20  f two elements, 
10f20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
10f30 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
10f40 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61  .** error code a
10f50 6e 64 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c  nd the english l
10f60 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
10f70 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
10f80 6e 74 20 74 65 73 74 5f 65 72 72 73 74 72 28 0a  nt test_errstr(.
10f90 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
10fa0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
10fb0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
10fc0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
10fd0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
10fe0 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b  {.  char *zCode;
10ff0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
11000 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
11010 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
11020 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
11030 20 22 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22 29   "<error code>")
11040 3b 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d  ;.  }..  zCode =
11050 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11060 62 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[1]);.  for(i
11070 3d 30 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29 7b  =0; i<200; i++){
11080 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63  .    if( 0==strc
11090 6d 70 28 74 31 45 72 72 6f 72 4e 61 6d 65 28 69  mp(t1ErrorName(i
110a0 29 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61  ), zCode) ) brea
110b0 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  k;.  }.  Tcl_Set
110c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
110d0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
110e0 72 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72  rStr(i), 0);.  r
110f0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
11100 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
11110 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a   breakpoint.**.*
11120 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
11130 78 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75  xists for one pu
11140 72 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69  rpose - to provi
11150 64 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75  de a place to pu
11160 74 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e  t a.** breakpoin
11170 74 20 77 69 74 68 20 47 44 42 20 74 68 61 74 20  t with GDB that 
11180 63 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 64  can be triggered
11190 20 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e   using TCL code.
111a0 20 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72    The use.** for
111b0 20 74 68 69 73 20 69 73 20 77 68 65 6e 20 61 20   this is when a 
111c0 70 61 72 74 69 63 75 6c 61 72 20 74 65 73 74 20  particular test 
111d0 66 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74  fails on (say) t
111e0 68 65 20 31 34 38 35 74 68 20 69 74 65 72 61 74  he 1485th iterat
111f0 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54  ion..** In the T
11200 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c 20  CL test script, 
11210 77 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20  we can add code 
11220 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
11230 20 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38       if {$i==148
11240 35 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a  5} breakpoint.**
11250 0a 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73  .** Then run tes
11260 74 66 69 78 74 75 72 65 20 69 6e 20 74 68 65 20  tfixture in the 
11270 64 65 62 75 67 67 65 72 20 61 6e 64 20 77 61 69  debugger and wai
11280 74 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70  t for the breakp
11290 6f 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e  oint to.** fire.
112a0 20 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61    Then additiona
112b0 6c 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61  l breakpoints ca
112c0 6e 20 62 65 20 73 65 74 20 74 6f 20 74 72 61 63  n be set to trac
112d0 65 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a  e down the bug..
112e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
112f0 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20  st_breakpoint(. 
11300 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
11310 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
11320 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
11330 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
11340 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
11350 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
11360 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
11370 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11380 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
11390 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
113a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
113b0 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
113c0 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  t */.){.  return
113d0 20 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20   TCL_OK;        
113e0 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
113f0 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  /.}../*.** Usage
11400 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
11410 5f 7a 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54 20  _zeroblob  STMT 
11420 49 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  IDX N.**.** Test
11430 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
11440 64 5f 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65 72  d_zeroblob inter
11450 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
11460 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
11470 65 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74  ent..** IDX is t
11480 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
11490 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
114a0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
114b0 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
114c0 2a 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74  ** binds a N-byt
114d0 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c  e zero-filled BL
114e0 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  OB to the wildca
114f0 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
11500 74 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f  t test_bind_zero
11510 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63  blob(.  void * c
11520 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
11530 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
11540 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
11550 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
11560 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
11570 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
11580 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
11590 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  n;.  int rc;..  
115a0 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
115b0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
115c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
115d0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
115e0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
115f0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
11600 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
11610 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c  0), " STMT N VAL
11620 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  UE", 0);.    ret
11630 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11640 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
11650 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
11660 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11670 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
11680 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11690 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
116a0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
116b0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
116c0 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
116d0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
116e0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
116f0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
11700 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &n) ) return TC
11710 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
11720 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
11730 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64  roblob(pStmt, id
11740 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c  x, n);.  if( sql
11750 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
11760 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
11770 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
11780 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11790 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
117a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
117b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
117c0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
117d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
117e0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
117f0 6e 64 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20 56  nd_int  STMT N V
11800 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
11810 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
11820 5f 69 6e 74 20 69 6e 74 65 72 66 61 63 65 2e 20  _int interface. 
11830 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
11840 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
11850 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
11860 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
11870 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
11880 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
11890 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
118a0 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
118b0 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20  r VALUE to that 
118c0 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
118d0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
118e0 64 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  d_int(.  void * 
118f0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
11900 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
11910 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
11920 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
11930 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
11940 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
11950 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
11960 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63   value;.  int rc
11970 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
11980 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
11990 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
119a0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
119b0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
119c0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
119d0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
119e0 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
119f0 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  N VALUE", 0);.  
11a00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11a10 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
11a20 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
11a30 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
11a40 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
11a50 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
11a60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
11a70 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
11a80 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
11a90 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
11aa0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
11ab0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
11ac0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
11ad0 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20  v[3], &value) ) 
11ae0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11af0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
11b00 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
11b10 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20  , idx, value);. 
11b20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
11b30 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
11b40 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
11b50 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
11b60 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
11b70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11b80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11b90 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
11ba0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
11bb0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
11bc0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
11bd0 34 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  4  STMT N VALUE.
11be0 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
11bf0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
11c00 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  4 interface.  ST
11c10 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
11c20 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
11c30 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
11c40 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
11c50 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
11c60 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
11c70 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
11c80 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56  64-bit integer V
11c90 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c  ALUE to that wil
11ca0 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
11cb0 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69   int test_bind_i
11cc0 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  nt64(.  void * c
11cd0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
11ce0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
11cf0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
11d00 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
11d10 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
11d20 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
11d30 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 36 34 20   int idx;.  i64 
11d40 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
11d50 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
11d60 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
11d70 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11d80 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
11d90 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
11da0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
11db0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
11dc0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
11dd0 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
11de0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11df0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
11e00 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
11e10 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
11e20 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
11e30 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
11e40 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
11e50 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
11e60 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
11e70 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
11e80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
11e90 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ( Tcl_GetWideInt
11ea0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
11eb0 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29  objv[3], &value)
11ec0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11ed0 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
11ee0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
11ef0 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
11f00 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
11f10 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
11f20 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
11f30 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
11f40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11f50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11f60 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
11f70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
11f80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
11f90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
11fa0 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
11fb0 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20  _double  STMT N 
11fc0 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74  VALUE.**.** Test
11fd0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
11fe0 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61  d_double interfa
11ff0 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
12000 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
12010 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
12020 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
12030 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
12040 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
12050 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
12060 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e  inds a 64-bit in
12070 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
12080 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
12090 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
120a0 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20  _bind_double(.  
120b0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
120c0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
120d0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
120e0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
120f0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
12100 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
12110 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
12120 3b 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65  ;.  double value
12130 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
12140 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
12150 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12160 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
12170 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
12180 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
12190 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
121a0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
121b0 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
121c0 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
121d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
121e0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
121f0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
12200 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
12210 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
12220 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12230 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
12240 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
12250 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
12260 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
12270 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
12280 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
12290 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
122a0 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65 74  ], &value) ) ret
122b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
122c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
122d0 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  ind_double(pStmt
122e0 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20  , idx, value);. 
122f0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
12300 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
12310 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
12320 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
12330 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
12340 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12350 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12360 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
12370 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
12380 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
12390 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20  lite3_bind_null 
123a0 20 53 54 4d 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65   STMT N.**.** Te
123b0 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
123c0 69 6e 64 5f 6e 75 6c 6c 20 69 6e 74 65 72 66 61  ind_null interfa
123d0 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
123e0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
123f0 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
12400 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
12410 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
12420 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
12430 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
12440 69 6e 64 73 20 61 20 4e 55 4c 4c 20 74 6f 20 74  inds a NULL to t
12450 68 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  he wildcard..*/.
12460 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
12470 62 69 6e 64 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69  bind_null(.  voi
12480 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
12490 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
124a0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
124b0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
124c0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
124d0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
124e0 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
124f0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
12500 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
12510 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12520 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
12530 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
12540 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
12550 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
12560 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
12570 22 20 53 54 4d 54 20 4e 22 2c 20 30 29 3b 0a 20  " STMT N", 0);. 
12580 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12590 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
125a0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
125b0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
125c0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
125d0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
125e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
125f0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
12600 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
12610 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
12620 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
12630 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
12640 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
12650 64 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  dx);.  if( sqlit
12660 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
12670 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
12680 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
12690 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
126a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
126b0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
126c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
126d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
126e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
126f0 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
12700 5f 74 65 78 74 20 20 53 54 4d 54 20 4e 20 53 54  _text  STMT N ST
12710 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a  RING BYTES.**.**
12720 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
12730 33 5f 62 69 6e 64 5f 74 65 78 74 20 69 6e 74 65  3_bind_text inte
12740 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
12750 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
12760 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
12770 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
12780 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
12790 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
127a0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
127b0 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d 38 20  * binds a UTF-8 
127c0 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74 6f  string STRING to
127d0 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20   the wildcard.  
127e0 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 42 59  The string is BY
127f0 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e  TES bytes.** lon
12800 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
12810 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 28   test_bind_text(
12820 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
12830 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
12840 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
12850 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
12860 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
12870 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
12880 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
12890 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  idx;.  int bytes
128a0 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b  ;.  char *value;
128b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
128c0 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
128d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
128e0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
128f0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
12900 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
12910 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12920 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
12930 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
12940 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20   BYTES", 0);.   
12950 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12960 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
12970 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
12980 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
12990 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
129a0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
129b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
129c0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
129d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
129e0 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
129f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61   TCL_ERROR;.  va
12a00 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  lue = Tcl_GetStr
12a10 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
12a20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
12a30 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12a40 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[4], &bytes) )
12a50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12a60 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
12a70 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
12a80 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20  mt, idx, value, 
12a90 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 54 52  bytes, SQLITE_TR
12aa0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28 20  ANSIENT);.  if( 
12ab0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
12ac0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
12ad0 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
12ae0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12af0 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
12b00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
12b10 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12b20 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 54  interp, sqlite3T
12b30 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  estErrorName(rc)
12b40 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
12b50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
12b60 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
12b70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
12b80 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
12b90 5f 74 65 78 74 31 36 20 3f 2d 73 74 61 74 69 63  _text16 ?-static
12ba0 3f 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20  ? STMT N STRING 
12bb0 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74  BYTES.**.** Test
12bc0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
12bd0 64 5f 74 65 78 74 31 36 20 69 6e 74 65 72 66 61  d_text16 interfa
12be0 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
12bf0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
12c00 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
12c10 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
12c20 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
12c30 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
12c40 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
12c50 69 6e 64 73 20 61 20 55 54 46 2d 31 36 20 73 74  inds a UTF-16 st
12c60 72 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74  ring STRING to t
12c70 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68  he wildcard.  Th
12c80 65 20 73 74 72 69 6e 67 20 69 73 20 42 59 54 45  e string is BYTE
12c90 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e  S bytes.** long.
12ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
12cb0 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 28  est_bind_text16(
12cc0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
12cd0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
12ce0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
12cf0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
12d00 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
12d10 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
12d20 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
12d30 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
12d40 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
12d50 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68   int bytes;.  ch
12d60 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ar *value;.  int
12d70 20 72 63 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78   rc;..  void (*x
12d80 44 65 6c 29 28 29 20 3d 20 28 6f 62 6a 63 3d 3d  Del)() = (objc==
12d90 36 3f 53 51 4c 49 54 45 5f 53 54 41 54 49 43 3a  6?SQLITE_STATIC:
12da0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
12db0 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53  );.  Tcl_Obj *oS
12dc0 74 6d 74 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62  tmt    = objv[ob
12dd0 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a  jc-4];.  Tcl_Obj
12de0 20 2a 6f 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a   *oN       = obj
12df0 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c  v[objc-3];.  Tcl
12e00 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d  _Obj *oString  =
12e10 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20   objv[objc-2];. 
12e20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73   Tcl_Obj *oBytes
12e30 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31     = objv[objc-1
12e40 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
12e50 35 20 26 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20  5 && objc!=6){. 
12e60 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12e70 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
12e80 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
12e90 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
12ea0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
12eb0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
12ec0 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c  0), " STMT N VAL
12ed0 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  UE BYTES", 0);. 
12ee0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12ef0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
12f00 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
12f10 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
12f20 72 69 6e 67 28 6f 53 74 6d 74 29 2c 20 26 70 53  ring(oStmt), &pS
12f30 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
12f40 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
12f50 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
12f60 28 69 6e 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64  (interp, oN, &id
12f70 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
12f80 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d  ERROR;.  value =
12f90 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42   (char*)Tcl_GetB
12fa0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
12fb0 6f 53 74 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69  oString, 0);.  i
12fc0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
12fd0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79  mObj(interp, oBy
12fe0 74 65 73 2c 20 26 62 79 74 65 73 29 20 29 20 72  tes, &bytes) ) r
12ff0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13000 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
13010 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 70 53 74  _bind_text16(pSt
13020 6d 74 2c 20 69 64 78 2c 20 28 76 6f 69 64 20 2a  mt, idx, (void *
13030 29 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78  )value, bytes, x
13040 44 65 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Del);.  if( sqli
13050 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
13060 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
13070 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
13080 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13090 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
130a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
130b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
130c0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
130d0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
130e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
130f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
13100 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
13110 5f 62 6c 6f 62 20 3f 2d 73 74 61 74 69 63 3f 20  _blob ?-static? 
13120 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45  STMT N DATA BYTE
13130 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  S.**.** Test the
13140 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
13150 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  ob interface.  S
13160 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
13170 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
13180 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
13190 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
131a0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
131b0 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
131c0 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
131d0 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c   BLOB to the wil
131e0 64 63 61 72 64 2e 20 20 54 68 65 20 42 4c 4f 42  dcard.  The BLOB
131f0 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73 20   is BYTES bytes 
13200 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
13210 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
13220 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20  _blob(.  void * 
13230 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
13240 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
13250 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
13260 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
13270 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
13280 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
13290 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
132a0 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a   bytes;.  char *
132b0 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
132c0 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 73 74 72  .  sqlite3_destr
132d0 75 63 74 6f 72 5f 74 79 70 65 20 78 44 65 73 74  uctor_type xDest
132e0 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f  ructor = SQLITE_
132f0 54 52 41 4e 53 49 45 4e 54 3b 0a 0a 20 20 69 66  TRANSIENT;..  if
13300 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
13310 63 21 3d 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=6 ){.    Tcl_
13320 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13330 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
13340 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
13350 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
13360 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
13370 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
13380 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45 53  TMT N DATA BYTES
13390 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
133a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
133b0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20  ..  if( objc==6 
133c0 29 7b 0a 20 20 20 20 78 44 65 73 74 72 75 63 74  ){.    xDestruct
133d0 6f 72 20 3d 20 53 51 4c 49 54 45 5f 53 54 41 54  or = SQLITE_STAT
133e0 49 43 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a  IC;.    objv++;.
133f0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
13400 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
13410 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
13420 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
13430 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13440 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
13450 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
13460 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
13470 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
13480 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65  L_ERROR;.  value
13490 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
134a0 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28  (objv[3]);.  if(
134b0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
134c0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
134d0 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  4], &bytes) ) re
134e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
134f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
13500 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
13510 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74   idx, value, byt
13520 65 73 2c 20 78 44 65 73 74 72 75 63 74 6f 72 29  es, xDestructor)
13530 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
13540 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
13550 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
13560 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
13570 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
13580 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13590 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
135a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
135b0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
135c0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
135d0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
135e0 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 20 20 53  rameter_count  S
135f0 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TMT.**.** Return
13600 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
13610 69 6c 64 63 61 72 64 73 20 69 6e 20 74 68 65 20  ildcards in the 
13620 67 69 76 65 6e 20 73 74 61 74 65 6d 65 6e 74 2e  given statement.
13630 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
13640 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
13650 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  er_count(.  void
13660 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
13670 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
13680 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
13690 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
136a0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
136b0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
136c0 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
136d0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
136e0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
136f0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
13700 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
13710 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
13720 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
13730 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
13740 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
13750 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
13760 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13770 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
13780 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
13790 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
137a0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
137b0 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20  ount(pStmt)));. 
137c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
137d0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
137e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
137f0 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 20 20 53  arameter_name  S
13800 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65 74  TMT  N.**.** Ret
13810 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
13820 74 68 65 20 4e 74 68 20 77 69 6c 64 63 61 72 64  the Nth wildcard
13830 2e 20 20 54 68 65 20 66 69 72 73 74 20 77 69 6c  .  The first wil
13840 64 63 61 72 64 20 69 73 20 31 2e 0a 2a 2a 20 41  dcard is 1..** A
13850 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
13860 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 4e 20  s returned if N 
13870 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  is out of range 
13880 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61  or if the wildca
13890 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65 6c 65 73  rd.** is nameles
138a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
138b0 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
138c0 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20 76 6f 69  eter_name(.  voi
138d0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
138e0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
138f0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
13900 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
13910 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
13920 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
13930 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  mt;.  int i;..  
13940 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
13950 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
13960 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
13970 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22 29 3b 0a  bjv, "STMT N");.
13980 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13990 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
139a0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
139b0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
139c0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
139d0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
139e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
139f0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
13a00 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
13a10 32 5d 2c 20 26 69 29 20 29 20 72 65 74 75 72 6e  2], &i) ) return
13a20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
13a30 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
13a40 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c  nterp, .     Tcl
13a50 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
13a60 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
13a70 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  eter_name(pStmt,
13a80 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20 20 72 65  i),-1).  );.  re
13a90 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
13aa0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
13ab0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
13ac0 6d 65 74 65 72 5f 69 6e 64 65 78 20 20 53 54 4d  meter_index  STM
13ad0 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65  T  NAME.**.** Re
13ae0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
13af0 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63  f the wildcard c
13b00 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 52 65 74  alled NAME.  Ret
13b10 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 69  urn 0 if there i
13b20 73 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 77 69 6c  s.** no such wil
13b30 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
13b40 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70   int test_bind_p
13b50 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 0a  arameter_index(.
13b60 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
13b70 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
13b80 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
13b90 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
13ba0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
13bb0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
13bc0 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
13bd0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
13be0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
13bf0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
13c00 20 22 53 54 4d 54 20 4e 41 4d 45 22 29 3b 0a 20   "STMT NAME");. 
13c10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13c20 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
13c30 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
13c40 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
13c50 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
13c60 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
13c70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
13c80 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
13c90 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e  erp, .     Tcl_N
13ca0 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20  ewIntObj(.      
13cb0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
13cc0 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53  rameter_index(pS
13cd0 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74 72 69 6e  tmt,Tcl_GetStrin
13ce0 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20 20 20 20  g(objv[2])).    
13cf0 20 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e   ).  );.  return
13d00 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
13d10 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
13d20 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
13d30 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73 74 61  s STMT.**.*/.sta
13d40 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6c 65  tic int test_cle
13d50 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a 20 20 76  ar_bindings(.  v
13d60 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
13d70 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
13d80 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
13d90 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
13da0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
13db0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
13dc0 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
13dd0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
13de0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
13df0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
13e00 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
13e10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
13e20 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
13e30 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
13e40 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
13e50 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
13e60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13e70 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
13e80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
13e90 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
13ea0 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
13eb0 73 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  s(pStmt)));.  re
13ec0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
13ed0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
13ee0 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d 49 4c  qlite3_sleep MIL
13ef0 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74 61  LISECONDS.*/.sta
13f00 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6c 65  tic int test_sle
13f10 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ep(.  void * cli
13f20 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
13f30 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
13f40 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
13f50 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
13f60 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a  [].){.  int ms;.
13f70 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
13f80 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
13f90 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
13fa0 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
13fb0 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 72 65 74  CONDS");.    ret
13fc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13fd0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
13fe0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
13ff0 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29  p, objv[1], &ms)
14000 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
14010 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
14020 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
14030 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
14040 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73  IntObj(sqlite3_s
14050 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20 20 72 65  leep(ms)));.  re
14060 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
14070 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
14080 69 74 65 33 5f 65 72 72 63 6f 64 65 20 44 42 0a  ite3_errcode DB.
14090 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
140a0 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
140b0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  tation of the mo
140c0 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
140d0 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72  3_* API.** error
140e0 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c   code. e.g. "SQL
140f0 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73  ITE_ERROR"..*/.s
14100 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
14110 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a  rrcode(.  void *
14120 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
14130 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
14140 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
14150 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
14160 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
14170 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
14180 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33  c;.  char zBuf[3
14190 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
141a0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
141b0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
141c0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
141d0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
141e0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
141f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
14200 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
14210 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14220 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
14230 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
14240 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
14250 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
14260 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14270 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
14280 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
14290 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 72  if( (rc&0xff)==r
142a0 63 20 29 7b 0a 20 20 20 20 7a 42 75 66 5b 30 5d  c ){.    zBuf[0]
142b0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
142c0 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
142d0 22 2b 25 64 22 2c 20 72 63 3e 3e 38 29 3b 0a 20  "+%d", rc>>8);. 
142e0 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52   }.  Tcl_AppendR
142f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
14300 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
14310 65 28 72 63 29 2c 20 7a 42 75 66 2c 20 30 29 3b  e(rc), zBuf, 0);
14320 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
14330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
14340 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20  :   test_errmsg 
14350 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  DB.**.** Returns
14360 20 74 68 65 20 55 54 46 2d 38 20 72 65 70 72 65   the UTF-8 repre
14370 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
14380 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
14390 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a  tring for the.**
143a0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
143b0 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e  ite3_* API call.
143c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
143d0 65 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f  est_errmsg(.  vo
143e0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
143f0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
14400 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
14410 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
14420 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
14430 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
14440 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
14450 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
14460 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
14470 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14480 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
14490 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
144a0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
144b0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
144c0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
144d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
144e0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
144f0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
14500 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
14510 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
14520 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
14530 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
14540 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54  _errmsg(db);.  T
14550 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
14560 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
14570 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d  tringObj(zErr, -
14580 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1));.  return TC
14590 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
145a0 73 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72  sage:   test_err
145b0 6d 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52  msg16 DB.**.** R
145c0 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31  eturns the UTF-1
145d0 36 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  6 representation
145e0 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   of the error me
145f0 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72  ssage string for
14600 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
14610 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50  ent sqlite3_* AP
14620 49 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20  I call. This is 
14630 61 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a  a byte array obj
14640 65 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a  ect at the TCL .
14650 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74  ** level, and it
14660 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78   includes the 0x
14670 30 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74  00 0x00 terminat
14680 6f 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20  or bytes at the 
14690 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54  end of the.** UT
146a0 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  F-16 string..*/.
146b0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
146c0 65 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64  errmsg16(.  void
146d0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
146e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
146f0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
14700 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
14710 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
14720 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14730 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20  UTF16.  sqlite3 
14740 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db;.  const voi
14750 64 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 62  d *zErr;.  int b
14760 79 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28  ytes = 0;..  if(
14770 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
14780 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
14790 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
147a0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
147b0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
147c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
147d0 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
147e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
147f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
14800 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
14810 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
14820 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
14830 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
14840 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20  _ERROR;..  zErr 
14850 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
14860 31 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a 45  16(db);.  if( zE
14870 72 72 20 29 7b 0a 20 20 20 20 62 79 74 65 73 20  rr ){.    bytes 
14880 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 42 79  = sqlite3Utf16By
14890 74 65 4c 65 6e 28 7a 45 72 72 2c 20 2d 31 29 3b  teLen(zErr, -1);
148a0 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
148b0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
148c0 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
148d0 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74 65 73 29  Obj(zErr, bytes)
148e0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
148f0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
14900 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
14910 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
14920 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
14930 72 65 20 44 42 20 73 71 6c 20 62 79 74 65 73 20  re DB sql bytes 
14940 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f  tailvar.**.** Co
14950 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74  mpile up to <byt
14960 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65  es> bytes of the
14970 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74   supplied SQL st
14980 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67  ring <sql> using
14990 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
149a0 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61  dle <DB>. The pa
149b0 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c  rameter <tailval
149c0 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  > is the name of
149d0 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72   a global.** var
149e0 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65  iable that is se
149f0 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20  t to the unused 
14a00 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e  portion of <sql>
14a10 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20   (if any). A.** 
14a20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72  STMT handle is r
14a30 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
14a40 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70  ic int test_prep
14a50 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  are(.  void * cl
14a60 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
14a70 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
14a80 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
14a90 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
14aa0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
14ab0 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
14ac0 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
14ad0 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63  bytes;.  const c
14ae0 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  har *zTail = 0;.
14af0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
14b00 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
14b10 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e  r zBuf[50];.  in
14b20 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
14b30 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
14b40 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
14b50 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
14b60 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
14b70 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
14b80 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
14b90 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
14ba0 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a  s tailvar", 0);.
14bb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14bc0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
14bd0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
14be0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
14bf0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
14c00 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
14c10 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
14c20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
14c30 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c  v[2]);.  if( Tcl
14c40 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
14c50 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
14c60 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
14c70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
14c80 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
14c90 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79  are(db, zSql, by
14ca0 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54  tes, &pStmt, &zT
14cb0 61 69 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ail);.  if( sqli
14cc0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
14cd0 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
14ce0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14cf0 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 29  R;.  if( zTail )
14d00 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65 73 3e  {.    if( bytes>
14d10 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65  =0 ){.      byte
14d20 73 20 3d 20 62 79 74 65 73 20 2d 20 28 7a 54 61  s = bytes - (zTa
14d30 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  il-zSql);.    }.
14d40 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
14d50 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  r2(interp, objv[
14d60 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74  4], 0, Tcl_NewSt
14d70 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62  ringObj(zTail, b
14d80 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20  ytes), 0);.  }. 
14d90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14da0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
14db0 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ( pStmt==0 );.  
14dc0 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
14dd0 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20  "(%d) ", rc);.  
14de0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14df0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
14e00 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
14e10 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  db), 0);.    ret
14e20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14e30 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
14e40 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
14e50 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
14e60 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
14e70 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
14e80 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14e90 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14ea0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
14eb0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
14ec0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
14ed0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
14ee0 33 5f 70 72 65 70 61 72 65 5f 76 32 20 44 42 20  3_prepare_v2 DB 
14ef0 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
14f00 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  r.**.** Compile 
14f10 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
14f20 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
14f30 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
14f40 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
14f50 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
14f60 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
14f70 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
14f80 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
14f90 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
14fa0 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
14fb0 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
14fc0 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
14fd0 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
14fe0 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
14ff0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15000 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32   test_prepare_v2
15010 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
15020 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
15030 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
15040 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
15050 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
15060 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
15070 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
15080 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74  *zSql;.  int byt
15090 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  es;.  const char
150a0 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73   *zTail = 0;.  s
150b0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
150c0 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  mt = 0;.  char z
150d0 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72  Buf[50];.  int r
150e0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
150f0 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
15100 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15110 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
15120 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
15130 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
15140 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
15150 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  " DB sql bytes t
15160 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20  ailvar", 0);.   
15170 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15180 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
15190 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
151a0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
151b0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
151c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
151d0 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
151e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
151f0 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
15200 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
15210 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  rp, objv[3], &by
15220 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
15230 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
15240 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
15250 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79  _v2(db, zSql, by
15260 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54  tes, &pStmt, &zT
15270 61 69 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 72  ail);.  assert(r
15280 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
15290 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69 66 28  pStmt==0);.  if(
152a0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
152b0 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
152c0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
152d0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54  _ERROR;.  if( zT
152e0 61 69 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 62  ail ){.    if( b
152f0 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ytes>=0 ){.     
15300 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d   bytes = bytes -
15310 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20   (zTail-zSql);. 
15320 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a     }.    Tcl_Obj
15330 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
15340 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f  objv[4], 0, Tcl_
15350 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61  NewStringObj(zTa
15360 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a  il, bytes), 0);.
15370 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
15380 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
15390 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20  ssert( pStmt==0 
153a0 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
153b0 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63  Buf, "(%d) ", rc
153c0 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
153d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
153e0 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72  zBuf, sqlite3_er
153f0 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
15400 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15410 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
15420 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
15430 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
15440 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
15450 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
15460 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15470 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
15480 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15490 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
154a0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
154b0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
154c0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
154d0 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
154e0 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  ilvar.**.** Comp
154f0 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73  ile up to <bytes
15500 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73  > bytes of the s
15510 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69  upplied SQL stri
15520 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a  ng <sql> using.*
15530 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
15540 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61  e <DB>. The para
15550 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20  meter <tailval> 
15560 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
15570 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61   global.** varia
15580 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20  ble that is set 
15590 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f  to the unused po
155a0 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28  rtion of <sql> (
155b0 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54  if any). A.** ST
155c0 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74  MT handle is ret
155d0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
155e0 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72   int test_prepar
155f0 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  e16(.  void * cl
15600 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
15610 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
15620 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
15630 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
15640 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
15650 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
15660 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
15670 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53    const void *zS
15680 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ql;.  const void
15690 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54   *zTail = 0;.  T
156a0 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20  cl_Obj *pTail = 
156b0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
156c0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
156d0 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a  char zBuf[50]; .
156e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
156f0 62 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20  bytes;          
15700 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
15710 65 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61  eger specified a
15720 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74  s arg 3 */.  int
15730 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20   objlen;        
15740 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79         /* The by
15750 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20  te-array length 
15760 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69  of arg 2 */..  i
15770 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
15780 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
15790 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
157a0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
157b0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
157c0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
157d0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
157e0 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22  l bytes tailvar"
157f0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
15800 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
15810 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
15820 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
15830 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
15840 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
15850 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
15860 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ql = Tcl_GetByte
15870 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
15880 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a  v[2], &objlen);.
15890 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
158a0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
158b0 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
158c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
158d0 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
158e0 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 64  ite3_prepare16(d
158f0 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
15900 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b  &pStmt, &zTail);
15910 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
15920 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
15930 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
15940 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15950 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
15960 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15970 20 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61 69 6c    }..  if( zTail
15980 20 29 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d   ){.    objlen =
15990 20 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20 2a   objlen - ((u8 *
159a0 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71  )zTail-(u8 *)zSq
159b0 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
159c0 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d   objlen = 0;.  }
159d0 0a 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e  .  pTail = Tcl_N
159e0 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
159f0 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c  u8 *)zTail, objl
15a00 65 6e 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  en);.  Tcl_IncrR
15a10 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a  efCount(pTail);.
15a20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
15a30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
15a40 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a  , 0, pTail, 0);.
15a50 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
15a60 6e 74 28 70 54 61 69 6c 29 3b 0a 0a 20 20 69 66  nt(pTail);..  if
15a70 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
15a80 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
15a90 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
15aa0 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
15ab0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15ac0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
15ad0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
15ae0 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23  erp, zBuf, 0);.#
15af0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15b00 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
15b10 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
15b20 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
15b30 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
15b40 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65 73  _v2 DB sql bytes
15b50 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43   tailvar.**.** C
15b60 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
15b70 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
15b80 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
15b90 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
15ba0 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
15bb0 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
15bc0 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
15bd0 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
15be0 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
15bf0 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
15c00 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
15c10 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
15c20 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
15c30 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
15c40 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
15c50 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
15c60 70 61 72 65 31 36 5f 76 32 28 0a 20 20 76 6f 69  pare16_v2(.  voi
15c70 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
15c80 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15c90 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
15ca0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
15cb0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
15cc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15cd0 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
15ce0 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   *db;.  const vo
15cf0 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73  id *zSql;.  cons
15d00 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20  t void *zTail = 
15d10 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54  0;.  Tcl_Obj *pT
15d20 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
15d30 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
15d40 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
15d50 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a  50]; .  int rc;.
15d60 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20    int bytes;    
15d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15d80 68 65 20 69 6e 74 65 67 65 72 20 73 70 65 63 69  he integer speci
15d90 66 69 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f  fied as arg 3 */
15da0 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20  .  int objlen;  
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15dc0 54 68 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c  The byte-array l
15dd0 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a  ength of arg 2 *
15de0 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  /..  if( objc!=5
15df0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
15e00 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
15e10 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
15e20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
15e30 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
15e40 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
15e50 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
15e60 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20  ilvar", 0);.    
15e70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15e80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
15e90 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
15ea0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15eb0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
15ec0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15ed0 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
15ee0 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
15ef0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a  bj(objv[2], &obj
15f00 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  len);.  if( Tcl_
15f10 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
15f20 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
15f30 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
15f40 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
15f50 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
15f60 72 65 31 36 5f 76 32 28 64 62 2c 20 7a 53 71 6c  re16_v2(db, zSql
15f70 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
15f80 20 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28 20   &zTail);.  if( 
15f90 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
15fa0 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
15fb0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
15fc0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20  ERROR;.  if( rc 
15fd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
15fe0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
15ff0 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20  if( zTail ){.   
16000 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e   objlen = objlen
16010 20 2d 20 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d   - ((u8 *)zTail-
16020 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 7d  (u8 *)zSql);.  }
16030 65 6c 73 65 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e  else{.    objlen
16040 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 69   = 0;.  }.  pTai
16050 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
16060 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54  rrayObj((u8 *)zT
16070 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20  ail, objlen);.  
16080 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
16090 28 70 54 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 4f  (pTail);.  Tcl_O
160a0 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
160b0 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54  , objv[4], 0, pT
160c0 61 69 6c 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44  ail, 0);.  Tcl_D
160d0 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ecrRefCount(pTai
160e0 6c 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74  l);..  if( pStmt
160f0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
16100 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
16110 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
16120 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
16130 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16140 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52   }.  Tcl_AppendR
16150 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
16160 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  uf, 0);.#endif /
16170 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
16180 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
16190 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
161a0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
161b0 6f 70 65 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f  open filename ?o
161c0 70 74 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a  ptions-list?.*/.
161d0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
161e0 6f 70 65 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  open(.  void * c
161f0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
16200 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16210 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
16220 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
16230 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  jv[].){.  const 
16240 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
16250 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
16260 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
16270 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69   zBuf[100];..  i
16280 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62  f( objc!=3 && ob
16290 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
162a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
162b0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
162c0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
162d0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
162e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
162f0 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f  ]), " filename o
16300 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29  ptions-list", 0)
16310 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
16320 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a  _ERROR;.  }..  z
16330 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47  Filename = Tcl_G
16340 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
16350 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
16360 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  3_open(zFilename
16370 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28  , &db);.  .  if(
16380 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
16390 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
163a0 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72  p, zBuf, db) ) r
163b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
163c0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
163d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
163e0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
163f0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
16400 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f  Usage: sqlite3_o
16410 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f  pen16 filename o
16420 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63  ptions.*/.static
16430 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 31 36   int test_open16
16440 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
16450 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
16460 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
16470 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
16480 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
16490 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
164a0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
164b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c  const void *zFil
164c0 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  ename;.  sqlite3
164d0 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
164e0 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
164f0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
16500 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
16510 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16520 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
16530 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
16540 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
16550 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
16560 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
16570 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  s-list", 0);.   
16580 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16590 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e  R;.  }..  zFilen
165a0 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ame = Tcl_GetByt
165b0 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
165c0 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 72 63 20  jv[1], 0);.  rc 
165d0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  = sqlite3_open16
165e0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29  (zFilename, &db)
165f0 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74  ;.  .  if( sqlit
16600 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
16610 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
16620 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e 20  f, db) ) return 
16630 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
16640 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16650 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
16660 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16670 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
16680 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
16690 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
166a0 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
166b0 31 36 20 3c 55 54 46 2d 31 36 20 73 74 72 69 6e  16 <UTF-16 strin
166c0 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  g>.**.** Return 
166d0 31 20 69 66 20 74 68 65 20 73 75 70 70 6c 69 65  1 if the supplie
166e0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
166f0 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
16700 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a  tement, or zero.
16710 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
16720 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
16730 5f 63 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20 76  _complete16(.  v
16740 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16750 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16760 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16770 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16780 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
16790 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
167a0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45  TE_OMIT_COMPLETE
167b0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
167c0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29  LITE_OMIT_UTF16)
167d0 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a  .  char *zBuf;..
167e0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
167f0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
16800 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
16810 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20   objv, "<utf-16 
16820 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72 65 74 75  sql>");.    retu
16830 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16840 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 28 63 68 61  }..  zBuf = (cha
16850 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72  r*)Tcl_GetByteAr
16860 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
16870 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65  1], 0);.  Tcl_Se
16880 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
16890 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
168a0 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74  (sqlite3_complet
168b0 65 31 36 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e  e16(zBuf)));.#en
168c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
168d0 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26 26 20 53  IT_COMPLETE && S
168e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
168f0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
16900 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
16910 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 74 65  age: sqlite3_ste
16920 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76  p STMT.**.** Adv
16930 61 6e 63 65 20 74 68 65 20 73 74 61 74 65 6d 65  ance the stateme
16940 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  nt to the next r
16950 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
16960 74 20 74 65 73 74 5f 73 74 65 70 28 0a 20 20 76  t test_step(.  v
16970 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16980 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16990 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
169a0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
169b0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
169c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
169d0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
169e0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
169f0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
16a00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
16a10 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
16a20 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
16a30 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
16a40 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
16a50 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
16a60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16a70 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
16a80 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
16a90 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
16aa0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
16ab0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16ac0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
16ad0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
16ae0 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63 21 3d  ;..  /* if( rc!=
16af0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72  SQLITE_DONE && r
16b00 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20  c!=SQLITE_ROW ) 
16b10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16b20 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65  ; */.  Tcl_SetRe
16b30 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
16b40 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
16b50 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
16b60 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
16b70 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
16b80 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20  e3_column_count 
16b90 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75  STMT .**.** Retu
16ba0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
16bb0 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
16bc0 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61  d by the sql sta
16bd0 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a  tement STMT..*/.
16be0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
16bf0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20  column_count(.  
16c00 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
16c10 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
16c20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
16c30 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
16c40 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
16c50 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
16c60 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
16c70 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
16c80 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16c90 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
16ca0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
16cb0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
16cc0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
16cd0 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
16ce0 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
16cf0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16d00 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
16d10 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
16d20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
16d30 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
16d40 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16d50 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  OR;..  Tcl_SetOb
16d60 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
16d70 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
16d80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
16d90 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72  nt(pStmt)));.  r
16da0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
16db0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
16dc0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
16dd0 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
16de0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
16df0 79 70 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  ype of the data 
16e00 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
16e10 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
16e20 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t row..*/.static
16e30 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
16e40 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20  _type(.  void * 
16e50 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
16e60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16e70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
16e80 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
16e90 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
16ea0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
16eb0 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74    int col;.  int
16ec0 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   tp;..  if( objc
16ed0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
16ee0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16ef0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
16f00 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
16f10 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
16f20 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
16f30 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
16f40 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
16f50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
16f60 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
16f70 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
16f80 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
16f90 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
16fa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16fb0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
16fc0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
16fd0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
16fe0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16ff0 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c  ROR;..  tp = sql
17000 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
17010 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
17020 73 77 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20  switch( tp ){.  
17030 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
17040 54 45 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63  TEGER: .      Tc
17050 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
17060 72 70 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54  rp, "INTEGER", T
17070 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
17080 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
17090 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a  se SQLITE_NULL:.
170a0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
170b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c  ult(interp, "NUL
170c0 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  L", TCL_STATIC);
170d0 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
170e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
170f0 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f  LOAT:.      Tcl_
17100 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
17110 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53  , "FLOAT", TCL_S
17120 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
17130 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
17140 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20  QLITE_TEXT:.    
17150 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
17160 69 6e 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20  interp, "TEXT", 
17170 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
17180 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
17190 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
171a0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
171b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c  sult(interp, "BL
171c0 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  OB", TCL_STATIC)
171d0 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
171e0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
171f0 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
17200 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
17210 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
17220 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
17230 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f  mn_int64 STMT co
17240 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lumn.**.** Retur
17250 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f  n the data in co
17260 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66  lumn 'column' of
17270 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
17280 20 63 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77   cast as an.** w
17290 69 64 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74  ide (64-bit) int
172a0 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
172b0 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
172c0 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  int64(.  void * 
172d0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
172e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
172f0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
17300 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
17310 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
17320 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
17330 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34    int col;.  i64
17340 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62   iVal;..  if( ob
17350 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
17360 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
17370 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
17380 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
17390 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
173a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
173b0 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
173c0 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
173d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
173e0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
173f0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
17400 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
17410 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
17420 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17430 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
17440 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
17450 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
17460 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
17470 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d  ERROR;..  iVal =
17480 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
17490 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c  int64(pStmt, col
174a0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
174b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
174c0 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
174d0 69 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  iVal));.  return
174e0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
174f0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
17500 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d  _column_blob STM
17510 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74  T column.*/.stat
17520 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
17530 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20  mn_blob(.  void 
17540 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
17550 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17560 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
17570 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
17580 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
17590 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
175a0 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20  ;.  int col;..  
175b0 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74  int len;.  const
175c0 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20   void *pBlob;.. 
175d0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
175e0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
175f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
17600 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
17610 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
17620 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
17630 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
17640 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
17650 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17660 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
17670 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
17680 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
17690 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
176a0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
176b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
176c0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
176d0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
176e0 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
176f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
17700 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63   len = sqlite3_c
17710 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
17720 74 2c 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62  t, col);.  pBlob
17730 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
17740 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f  n_blob(pStmt, co
17750 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
17760 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
17770 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
17780 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b  bj(pBlob, len));
17790 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
177a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
177b0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
177c0 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c  _double STMT col
177d0 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  umn.**.** Return
177e0 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c   the data in col
177f0 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20  umn 'column' of 
17800 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
17810 63 61 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65  cast as a double
17820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17830 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  test_column_doub
17840 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  le(.  void * cli
17850 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17860 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17870 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17880 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17890 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
178a0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
178b0 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65  nt col;.  double
178c0 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62   rVal;..  if( ob
178d0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
178e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
178f0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
17900 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
17910 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
17920 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
17930 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
17940 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
17950 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17960 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
17970 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
17980 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
17990 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
179a0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
179b0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
179c0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
179d0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
179e0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
179f0 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d  ERROR;..  rVal =
17a00 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
17a10 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f  double(pStmt, co
17a20 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
17a30 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
17a40 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28  cl_NewDoubleObj(
17a50 72 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  rVal));.  return
17a60 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
17a70 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
17a80 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54  _data_count STMT
17a90 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74   .**.** Return t
17aa0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
17ab0 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
17ac0 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65   the sql stateme
17ad0 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74  nt STMT..*/.stat
17ae0 69 63 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61  ic int test_data
17af0 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a  _count(.  void *
17b00 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
17b10 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17b20 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
17b30 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
17b40 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
17b50 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
17b60 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
17b70 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
17b80 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
17b90 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
17ba0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
17bb0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
17bc0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
17bd0 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
17be0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
17bf0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
17c00 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
17c10 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
17c20 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
17c30 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
17c40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
17c50 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
17c60 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
17c70 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
17c80 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74  data_count(pStmt
17c90 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
17ca0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
17cb0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
17cc0 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63  lumn_text STMT c
17cd0 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
17ce0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
17cf0 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20  n_decltype STMT 
17d00 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
17d10 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
17d20 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c  mn_name STMT col
17d30 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
17d40 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  t test_stmt_utf8
17d50 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
17d60 74 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a  tData,        /*
17d70 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69   Pointer to SQLi
17d80 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  te API function 
17d90 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a  to be invoke */.
17da0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
17db0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
17dc0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
17dd0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
17de0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
17df0 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
17e00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78   const char *(*x
17e10 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
17e20 6d 74 2a 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65  mt*, int) = clie
17e30 6e 74 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20  ntData;.  const 
17e40 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 69  char *zRet;..  i
17e50 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
17e60 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
17e70 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
17e80 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
17e90 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
17ea0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
17eb0 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
17ec0 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
17ed0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17ee0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
17ef0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
17f00 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
17f10 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
17f20 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
17f30 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
17f40 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
17f50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
17f60 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
17f70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52   TCL_ERROR;.  zR
17f80 65 74 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74  et = xFunc(pStmt
17f90 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52  , col);.  if( zR
17fa0 65 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  et ){.    Tcl_Se
17fb0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
17fc0 28 63 68 61 72 20 2a 29 7a 52 65 74 2c 20 30 29  (char *)zRet, 0)
17fd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
17fe0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  CL_OK;.}..static
17ff0 20 69 6e 74 20 74 65 73 74 5f 67 6c 6f 62 61 6c   int test_global
18000 5f 72 65 63 6f 76 65 72 28 0a 20 20 76 6f 69 64  _recover(.  void
18010 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18020 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18030 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18040 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18050 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
18060 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18070 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a 20 20  GLOBALRECOVER.  
18080 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62  int rc;.  if( ob
18090 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
180a0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
180b0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
180c0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
180d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
180e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c 6f  rc = sqlite3_glo
180f0 62 61 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a 20  bal_recover();. 
18100 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
18110 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
18120 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
18130 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e  TCL_STATIC);.#en
18140 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
18150 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18160 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
18170 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f  umn_text STMT co
18180 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
18190 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
181a0 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63  _decltype STMT c
181b0 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
181c0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
181d0 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75  n_name STMT colu
181e0 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  mn.*/.static int
181f0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
18200 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
18210 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f  tData,     /* Po
18220 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20  inter to SQLite 
18230 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  API function to 
18240 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20  be invoked */.  
18250 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18260 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18270 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18280 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
18290 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
182a0 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73  TF16.  sqlite3_s
182b0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
182c0 74 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a  t col;.  Tcl_Obj
182d0 20 2a 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20   *pRet;.  const 
182e0 76 6f 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20  void *zName16;. 
182f0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78   const void *(*x
18300 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
18310 6d 74 2a 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65  mt*, int) = clie
18320 6e 74 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 6f  ntData;..  if( o
18330 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
18340 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18350 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
18360 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
18370 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
18380 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18390 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
183a0 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
183b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
183c0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
183d0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
183e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
183f0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
18400 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18410 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
18420 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
18430 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
18440 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
18450 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65  _ERROR;..  zName
18460 31 36 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74  16 = xFunc(pStmt
18470 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e  , col);.  if( zN
18480 61 6d 65 31 36 20 29 7b 0a 20 20 20 20 70 52 65  ame16 ){.    pRe
18490 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  t = Tcl_NewByteA
184a0 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c  rrayObj(zName16,
184b0 20 73 71 6c 69 74 65 33 55 74 66 31 36 42 79 74   sqlite3Utf16Byt
184c0 65 4c 65 6e 28 7a 4e 61 6d 65 31 36 2c 20 2d 31  eLen(zName16, -1
184d0 29 2b 32 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  )+2);.    Tcl_Se
184e0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
184f0 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65  p, pRet);.  }.#e
18500 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
18510 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 20 20  MIT_UTF16 */..  
18520 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
18530 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
18540 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
18550 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  t STMT column.**
18560 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
18570 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20  e3_column_bytes 
18580 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
18590 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
185a0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20  _column_bytes16 
185b0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
185c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
185d0 74 5f 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f  t_stmt_int(.  vo
185e0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
185f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
18600 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e  o SQLite API fun
18610 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
18620 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ked */.  Tcl_Int
18630 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
18640 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
18650 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
18660 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
18670 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
18680 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46   col;.  int (*xF
18690 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  unc)(sqlite3_stm
186a0 74 2a 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e  t*, int) = clien
186b0 74 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 6f 62  tData;..  if( ob
186c0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
186d0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
186e0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
186f0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
18700 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
18710 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
18720 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
18730 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
18740 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18750 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
18760 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
18770 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18780 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
18790 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
187a0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
187b0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
187c0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
187d0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
187e0 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65  ERROR;..  Tcl_Se
187f0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
18800 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
18810 28 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f  (xFunc(pStmt, co
18820 6c 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  l)));.  return T
18830 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  CL_OK;.}..#ifnde
18840 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
18850 53 4b 49 4f 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  SKIO./*.** Usage
18860 3a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  :  sqlite3OsOpen
18870 52 65 61 64 57 72 69 74 65 20 3c 66 69 6c 65 6e  ReadWrite <filen
18880 61 6d 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame>.*/.static i
18890 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f  nt test_sqlite3O
188a0 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a  sOpenReadWrite(.
188b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
188c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
188d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
188e0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
188f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18900 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
18910 20 2a 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72   *pFile;.  int r
18920 63 3b 0a 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a  c;.  int dummy;.
18930 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
18940 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
18950 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
18960 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18970 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
18980 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
18990 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
189a0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
189b0 20 66 69 6c 65 6e 61 6d 65 22 2c 20 30 29 3b 0a   filename", 0);.
189c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
189d0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  RROR;.  }..  rc 
189e0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
189f0 65 61 64 57 72 69 74 65 28 54 63 6c 5f 47 65 74  eadWrite(Tcl_Get
18a00 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
18a10 20 26 70 46 69 6c 65 2c 20 26 64 75 6d 6d 79 29   &pFile, &dummy)
18a20 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18a30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
18a40 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
18a50 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
18a60 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
18a70 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
18a80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18a90 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 65 73 74   }.  sqlite3Test
18aa0 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
18ab0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 46 69  nterp, zBuf, pFi
18ac0 6c 65 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  le);.  Tcl_SetRe
18ad0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
18ae0 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
18af0 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
18b00 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
18b10 74 65 33 4f 73 43 6c 6f 73 65 20 3c 66 69 6c 65  te3OsClose <file
18b20 20 68 61 6e 64 6c 65 3e 0a 2a 2f 0a 73 74 61 74   handle>.*/.stat
18b30 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69  ic int test_sqli
18b40 74 65 33 4f 73 43 6c 6f 73 65 28 0a 20 20 76 6f  te3OsClose(.  vo
18b50 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
18b60 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
18b70 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
18b80 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
18b90 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
18ba0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
18bb0 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ile;.  int rc;..
18bc0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
18bd0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
18be0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
18bf0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
18c00 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
18c10 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
18c20 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69  g(objv[0]), " fi
18c30 6c 65 68 61 6e 64 6c 65 22 2c 20 30 29 3b 0a 20  lehandle", 0);. 
18c40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18c50 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
18c60 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 69  getFilePointer(i
18c70 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
18c80 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
18c90 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  pFile) ){.    re
18ca0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18cb0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
18cc0 65 33 4f 73 43 6c 6f 73 65 28 26 70 46 69 6c 65  e3OsClose(&pFile
18cd0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18ce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
18cf0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
18d00 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
18d10 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
18d20 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
18d30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18d40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
18d50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18d60 61 67 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 4c  age:  sqlite3OsL
18d70 6f 63 6b 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65  ock <file handle
18d80 3e 20 3c 6c 6f 63 6b 74 79 70 65 3e 0a 2a 2f 0a  > <locktype>.*/.
18d90 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
18da0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 0a 20  sqlite3OsLock(. 
18db0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
18dc0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
18dd0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
18de0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
18df0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
18e00 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
18e10 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  * pFile;.  int r
18e20 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
18e30 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
18e40 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
18e50 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
18e60 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
18e70 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
18e80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
18e90 20 0a 20 20 20 20 20 20 20 20 22 20 66 69 6c 65   .        " file
18ea0 68 61 6e 64 6c 65 20 28 53 48 41 52 45 44 7c 52  handle (SHARED|R
18eb0 45 53 45 52 56 45 44 7c 50 45 4e 44 49 4e 47 7c  ESERVED|PENDING|
18ec0 45 58 43 4c 55 53 49 56 45 29 22 2c 20 30 29 3b  EXCLUSIVE)", 0);
18ed0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18ee0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
18ef0 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  ( getFilePointer
18f00 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
18f10 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
18f20 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20   &pFile) ){.    
18f30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18f40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 30 3d 3d  ;.  }..  if( 0==
18f50 73 74 72 63 6d 70 28 22 53 48 41 52 45 44 22 2c  strcmp("SHARED",
18f60 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18f70 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20  bjv[2])) ){.    
18f80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
18f90 63 6b 28 70 46 69 6c 65 2c 20 53 48 41 52 45 44  ck(pFile, SHARED
18fa0 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c  _LOCK);.  }.  el
18fb0 73 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70  se if( 0==strcmp
18fc0 28 22 52 45 53 45 52 56 45 44 22 2c 20 54 63 6c  ("RESERVED", Tcl
18fd0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18fe0 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  2])) ){.    rc =
18ff0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
19000 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 4c  File, RESERVED_L
19010 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  OCK);.  }.  else
19020 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22   if( 0==strcmp("
19030 50 45 4e 44 49 4e 47 22 2c 20 54 63 6c 5f 47 65  PENDING", Tcl_Ge
19040 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
19050 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
19060 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c  lite3OsLock(pFil
19070 65 2c 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  e, PENDING_LOCK)
19080 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
19090 20 30 3d 3d 73 74 72 63 6d 70 28 22 45 58 43 4c   0==strcmp("EXCL
190a0 55 53 49 56 45 22 2c 20 54 63 6c 5f 47 65 74 53  USIVE", Tcl_GetS
190b0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20  tring(objv[2])) 
190c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
190d0 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c  te3OsLock(pFile,
190e0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
190f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
19100 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19110 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
19120 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
19130 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 54   \"", .        T
19140 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19150 76 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20  v[0]), .        
19160 22 20 66 69 6c 65 68 61 6e 64 6c 65 20 28 53 48  " filehandle (SH
19170 41 52 45 44 7c 52 45 53 45 52 56 45 44 7c 50 45  ARED|RESERVED|PE
19180 4e 44 49 4e 47 7c 45 58 43 4c 55 53 49 56 45 29  NDING|EXCLUSIVE)
19190 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
191a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
191b0 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
191c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
191d0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
191e0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
191f0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
19200 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
19210 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19220 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
19230 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
19240 67 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e  ge:  sqlite3OsUn
19250 6c 6f 63 6b 20 3c 66 69 6c 65 20 68 61 6e 64 6c  lock <file handl
19260 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e>.*/.static int
19270 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 55   test_sqlite3OsU
19280 6e 6c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20  nlock(.  void * 
19290 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
192a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
192b0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
192c0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
192d0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
192e0 65 33 5f 66 69 6c 65 20 2a 20 70 46 69 6c 65 3b  e3_file * pFile;
192f0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
19300 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
19310 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19320 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
19330 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
19340 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
19350 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19360 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 68 61  jv[0]), " fileha
19370 6e 64 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  ndle", 0);.    r
19380 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19390 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 46  .  }..  if( getF
193a0 69 6c 65 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  ilePointer(inter
193b0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
193c0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 46 69 6c  (objv[1]), &pFil
193d0 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
193e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
193f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19400 55 6e 6c 6f 63 6b 28 70 46 69 6c 65 2c 20 4e 4f  Unlock(pFile, NO
19410 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
19420 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19430 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
19440 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
19450 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
19460 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
19470 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
19480 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
19490 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
194a0 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
194b0 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
194c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
194d0 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 54 65 6d  est_sqlite3OsTem
194e0 70 46 69 6c 65 4e 61 6d 65 28 0a 20 20 76 6f 69  pFileName(.  voi
194f0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
19500 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
19510 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
19520 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
19530 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
19540 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c 49 54 45  har zFile[SQLITE
19550 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
19560 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
19570 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70   = sqlite3OsTemp
19580 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b  FileName(zFile);
19590 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
195a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
195b0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
195c0 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
195d0 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
195e0 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
195f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19600 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
19610 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 46 69  sult(interp, zFi
19620 6c 65 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  le, 0);.  return
19630 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
19640 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  f../*.** Usage: 
19650 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69   sqlite_set_magi
19660 63 20 20 44 42 20 20 4d 41 47 49 43 2d 4e 55 4d  c  DB  MAGIC-NUM
19670 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  BER.**.** Set th
19680 65 20 64 62 2d 3e 6d 61 67 69 63 20 76 61 6c 75  e db->magic valu
19690 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
196a0 20 74 6f 20 74 65 73 74 20 65 72 72 6f 72 20 72   to test error r
196b0 65 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0a 2a  ecovery logic..*
196c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
196d0 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 28 0a 20  ite_set_magic(. 
196e0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
196f0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
19700 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
19710 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
19720 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
19730 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
19740 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
19750 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19760 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
19770 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
19780 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
19790 20 20 20 20 22 20 44 42 20 4d 41 47 49 43 22 2c      " DB MAGIC",
197a0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
197b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
197c0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
197d0 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
197e0 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
197f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
19800 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d  ( strcmp(argv[2]
19810 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  , "SQLITE_MAGIC_
19820 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  OPEN")==0 ){.   
19830 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
19840 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
19850 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
19860 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
19870 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
19880 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
19890 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
198a0 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
198b0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
198c0 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54  (argv[2], "SQLIT
198d0 45 5f 4d 41 47 49 43 5f 42 55 53 59 22 29 3d 3d  E_MAGIC_BUSY")==
198e0 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
198f0 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
19900 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 20  C_BUSY;.  }else 
19910 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
19920 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
19930 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20 29 7b 0a  C_ERROR")==0 ){.
19940 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
19950 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
19960 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OR;.  }else if( 
19970 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
19980 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 64 62 2d  p, argv[2], &db-
19990 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20 20 20 72  >magic) ){.    r
199a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
199b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
199c0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
199d0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 69  sage:  sqlite3_i
199e0 6e 74 65 72 72 75 70 74 20 20 44 42 20 0a 2a 2a  nterrupt  DB .**
199f0 0a 2a 2a 20 54 72 69 67 67 65 72 20 61 6e 20 69  .** Trigger an i
19a00 6e 74 65 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a  nterrupt on DB.*
19a10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
19a20 74 5f 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76  t_interrupt(.  v
19a30 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
19a40 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
19a50 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
19a60 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
19a70 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  v.){.  sqlite3 *
19a80 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
19a90 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
19aa0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19ab0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
19ac0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
19ad0 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20  argv[0], " DB", 
19ae0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
19af0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
19b00 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
19b10 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
19b20 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
19b30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
19b40 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64  ite3_interrupt(d
19b50 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  b);.  return TCL
19b60 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  _OK;.}..static u
19b70 38 20 2a 73 71 6c 69 74 65 33 5f 73 74 61 63 6b  8 *sqlite3_stack
19b80 5f 62 61 73 65 6c 69 6e 65 20 3d 20 30 3b 0a 0a  _baseline = 0;..
19b90 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 73  /*.** Fill the s
19ba0 74 61 63 6b 20 77 69 74 68 20 61 20 6b 6e 6f 77  tack with a know
19bb0 6e 20 62 69 74 70 61 74 74 65 72 6e 2e 0a 2a 2f  n bitpattern..*/
19bc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 65  .static void pre
19bd0 70 53 74 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20  pStack(void){.  
19be0 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 62 69 67  int i;.  u32 big
19bf0 42 75 66 5b 36 35 35 33 36 5d 3b 0a 20 20 66 6f  Buf[65536];.  fo
19c00 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
19c10 62 69 67 42 75 66 29 3b 20 69 2b 2b 29 20 62 69  bigBuf); i++) bi
19c20 67 42 75 66 5b 69 5d 20 3d 20 30 78 64 65 61 64  gBuf[i] = 0xdead
19c30 62 65 65 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  beef;.  sqlite3_
19c40 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d  stack_baseline =
19c50 20 28 75 38 2a 29 26 62 69 67 42 75 66 5b 36 35   (u8*)&bigBuf[65
19c60 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  536];.}../*.** G
19c70 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  et the current s
19c80 74 61 63 6b 20 64 65 70 74 68 2e 20 20 55 73 65  tack depth.  Use
19c90 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
19ca0 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c  only..*/.u64 sql
19cb0 69 74 65 33 53 74 61 63 6b 44 65 70 74 68 28 76  ite3StackDepth(v
19cc0 6f 69 64 29 7b 0a 20 20 75 38 20 78 3b 0a 20 20  oid){.  u8 x;.  
19cd0 72 65 74 75 72 6e 20 28 75 36 34 29 28 73 71 6c  return (u64)(sql
19ce0 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c  ite3_stack_basel
19cf0 69 6e 65 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a  ine - &x);.}../*
19d00 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
19d10 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 20 44  te3_stack_used D
19d20 42 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20  B SQL.**.** Try 
19d30 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20 61  to measure the a
19d40 6d 6f 75 6e 74 20 6f 66 20 73 74 61 63 6b 20 73  mount of stack s
19d50 70 61 63 65 20 75 73 65 64 20 62 79 20 61 20 63  pace used by a c
19d60 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
19d70 78 65 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  xec.*/.static in
19d80 74 20 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65  t test_stack_use
19d90 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
19da0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
19db0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
19dc0 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
19dd0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
19de0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
19df0 69 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  i;.  if( argc!=3
19e00 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
19e10 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
19e20 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
19e30 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
19e40 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
19e50 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a   " DB SQL", 0);.
19e60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19e70 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
19e80 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
19e90 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
19ea0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
19eb0 45 52 52 4f 52 3b 0a 20 20 70 72 65 70 53 74 61  ERROR;.  prepSta
19ec0 63 6b 28 29 3b 0a 20 20 28 76 6f 69 64 29 73 71  ck();.  (void)sq
19ed0 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61  lite3_exec(db, a
19ee0 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 30 29  rgv[2], 0, 0, 0)
19ef0 3b 0a 20 20 66 6f 72 28 69 3d 36 35 35 33 35 3b  ;.  for(i=65535;
19f00 20 69 3e 3d 30 20 26 26 20 28 28 75 33 32 2a 29   i>=0 && ((u32*)
19f10 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
19f20 73 65 6c 69 6e 65 29 5b 2d 69 5d 3d 3d 30 78 64  seline)[-i]==0xd
19f30 65 61 64 62 65 65 66 3b 20 69 2d 2d 29 7b 7d 0a  eadbeef; i--){}.
19f40 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
19f50 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
19f60 65 77 49 6e 74 4f 62 6a 28 69 2a 34 29 29 3b 0a  ewIntObj(i*4));.
19f70 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
19f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
19f90 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66   sqlite_delete_f
19fa0 75 6e 63 74 69 6f 6e 20 44 42 20 66 75 6e 63 74  unction DB funct
19fb0 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44  ion-name.**.** D
19fc0 65 6c 65 74 65 20 74 68 65 20 75 73 65 72 20 66  elete the user f
19fd0 75 6e 63 74 69 6f 6e 20 27 66 75 6e 63 74 69 6f  unction 'functio
19fe0 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74  n-name' from dat
19ff0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 44 42 2e  abase handle DB.
1a000 20 49 74 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65   It.** is assume
1a010 64 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20  d that the user 
1a020 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 72 65  function was cre
1a030 61 74 65 64 20 61 73 20 55 54 46 38 2c 20 61 6e  ated as UTF8, an
1a040 79 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61  y number of.** a
1a050 72 67 75 6d 65 6e 74 73 20 28 74 68 65 20 77 61  rguments (the wa
1a060 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66  y the TCL interf
1a070 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f  ace does it)..*/
1a080 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65  .static int dele
1a090 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  te_function(.  v
1a0a0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1a0b0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1a0c0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1a0d0 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1a0e0 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  v.){.  int rc;. 
1a0f0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1a100 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1a110 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a120 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1a130 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1a140 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1a150 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1a160 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c   function-name",
1a170 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a180 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1a190 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1a1a0 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1a1b0 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1a1c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1a1d0 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1a1e0 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  e_function(db, a
1a1f0 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[2], -1, SQLI
1a200 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 30  TE_UTF8, 0, 0, 0
1a210 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  , 0);.  Tcl_SetR
1a220 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1a230 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
1a240 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
1a250 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
1a260 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1a270 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65  age: sqlite_dele
1a280 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44 42 20  te_collation DB 
1a290 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a  collation-name.*
1a2a0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
1a2b0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1a2c0 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61  ce 'collation-na
1a2d0 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73  me' from databas
1a2e0 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e  e handle .** DB.
1a2f0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
1a300 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  hat the collatio
1a310 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73 20 63  n sequence was c
1a320 72 65 61 74 65 64 20 61 73 20 55 54 46 38 20 28  reated as UTF8 (
1a330 74 68 65 20 0a 2a 2a 20 77 61 79 20 74 68 65 20  the .** way the 
1a340 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f  TCL interface do
1a350 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69  es it)..*/.stati
1a360 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 63 6f 6c  c int delete_col
1a370 6c 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  lation(.  void *
1a380 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1a390 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1a3a0 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1a3b0 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1a3c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1a3d0 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1a3e0 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1a3f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a400 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1a410 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1a420 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1a430 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63         " DB func
1a440 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a  tion-name", 0);.
1a450 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a460 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1a470 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1a480 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1a490 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1a4a0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1a4b0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
1a4c0 6c 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b  lation(db, argv[
1a4d0 32 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  2], SQLITE_UTF8,
1a4e0 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65   0, 0);.  Tcl_Se
1a4f0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1a500 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1a510 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
1a520 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
1a530 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1a540 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 67  Usage: sqlite3_g
1a550 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42  et_autocommit DB
1a560 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1a570 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ue if the databa
1a580 73 65 20 44 42 20 69 73 20 63 75 72 72 65 6e 74  se DB is current
1a590 6c 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69  ly in auto-commi
1a5a0 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72  t mode..** Retur
1a5b0 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  n false if not..
1a5c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1a5d0 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20  t_autocommit(.  
1a5e0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1a5f0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1a600 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1a610 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1a620 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42 75  gv.){.  char zBu
1a630 66 5b 33 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  f[30];.  sqlite3
1a640 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1a650 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1a660 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a670 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1a680 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1a690 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1a6a0 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20      " DB", 0);. 
1a6b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a6c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1a6d0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1a6e0 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1a6f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a700 52 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28  RROR;.  sprintf(
1a710 7a 42 75 66 2c 20 22 25 64 22 2c 20 73 71 6c 69  zBuf, "%d", sqli
1a720 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
1a730 69 74 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41  it(db));.  Tcl_A
1a740 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a750 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
1a760 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1a770 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1a780 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
1a790 6f 75 74 20 44 42 20 4d 53 0a 2a 2a 0a 2a 2a 20  out DB MS.**.** 
1a7a0 53 65 74 20 74 68 65 20 62 75 73 79 20 74 69 6d  Set the busy tim
1a7b0 65 6f 75 74 2e 20 20 54 68 69 73 20 69 73 20 6d  eout.  This is m
1a7c0 6f 72 65 20 65 61 73 69 6c 79 20 64 6f 6e 65 20  ore easily done 
1a7d0 75 73 69 6e 67 20 74 68 65 20 74 69 6d 65 6f 75  using the timeou
1a7e0 74 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  t.** method of t
1a7f0 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65  he TCL interface
1a800 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 61  .  But we need a
1a810 20 77 61 79 20 74 6f 20 74 65 73 74 20 74 68 65   way to test the
1a820 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20 69   case.** where i
1a830 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1a840 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73 74 61 74  _MISUSE..*/.stat
1a850 69 63 20 69 6e 74 20 74 65 73 74 5f 62 75 73 79  ic int test_busy
1a860 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76 6f 69 64  _timeout(.  void
1a870 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1a880 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1a890 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1a8a0 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1a8b0 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d 73 3b 0a  {.  int rc, ms;.
1a8c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1a8d0 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
1a8e0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a8f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1a900 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1a910 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1a920 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
1a930 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
1a940 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a950 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1a960 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1a970 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1a980 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a990 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
1a9a0 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
1a9b0 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54   &ms) ) return T
1a9c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1a9d0 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
1a9e0 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29 3b 0a 20  meout(db, ms);. 
1a9f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1aa00 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
1aa10 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72  3TestErrorName(r
1aa20 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
1aa30 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1aa40 2a 20 55 73 61 67 65 3a 20 20 74 63 6c 5f 76 61  * Usage:  tcl_va
1aa50 72 69 61 62 6c 65 5f 74 79 70 65 20 56 41 52 49  riable_type VARI
1aa60 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  ABLENAME.**.** R
1aa70 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
1aa80 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72  f the internal r
1aa90 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f  epresentation fo
1aaa0 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  r the.** value o
1aab0 66 20 74 68 65 20 67 69 76 65 6e 20 76 61 72 69  f the given vari
1aac0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1aad0 69 6e 74 20 74 63 6c 5f 76 61 72 69 61 62 6c 65  int tcl_variable
1aae0 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20  _type(.  void * 
1aaf0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1ab00 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ab10 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1ab20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1ab30 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f  bjv[].){.  Tcl_O
1ab40 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69 66 28 20  bj *pVar;.  if( 
1ab50 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1ab60 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1ab70 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1ab80 20 22 56 41 52 49 41 42 4c 45 22 29 3b 0a 20 20   "VARIABLE");.  
1ab90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1aba0 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20 3d  OR;.  }.  pVar =
1abb0 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69   Tcl_GetVar2Ex(i
1abc0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1abd0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 30  ring(objv[1]), 0
1abe0 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f  , TCL_LEAVE_ERR_
1abf0 4d 53 47 29 3b 0a 20 20 69 66 28 20 70 56 61 72  MSG);.  if( pVar
1ac00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
1ac10 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70 56  _ERROR;.  if( pV
1ac20 61 72 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a 20  ar->typePtr ){. 
1ac30 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
1ac40 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1ac50 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 61  NewStringObj(pVa
1ac60 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
1ac70 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65  , -1));.  }.  re
1ac80 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1ac90 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1aca0 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
1acb0 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41  mory ?N?.**.** A
1acc0 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73  ttempt to releas
1acd0 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74  e memory current
1ace0 6c 79 20 68 65 6c 64 20 62 75 74 20 6e 6f 74 20  ly held but not 
1acf0 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65  actually require
1ad00 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65  d..** The intege
1ad10 72 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  r N is the numbe
1ad20 72 20 6f 66 20 62 79 74 65 73 20 77 65 20 61 72  r of bytes we ar
1ad30 65 20 74 72 79 69 6e 67 20 74 6f 20 72 65 6c 65  e trying to rele
1ad40 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65  ase.  The .** re
1ad50 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
1ad60 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f  e amount of memo
1ad70 72 79 20 61 63 74 75 61 6c 6c 79 20 72 65 6c 65  ry actually rele
1ad80 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ased..*/.static 
1ad90 69 6e 74 20 74 65 73 74 5f 72 65 6c 65 61 73 65  int test_release
1ada0 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20  _memory(.  void 
1adb0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1adc0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1add0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1ade0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1adf0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64   objv[].){.#if d
1ae00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1ae10 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
1ae20 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69  GEMENT) && !defi
1ae30 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1ae40 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74 20 4e 3b  DISKIO).  int N;
1ae50 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66  .  int amt;.  if
1ae60 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a  ( objc!=1 && obj
1ae70 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1ae80 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1ae90 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
1aea0 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  N?");.    return
1aeb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1aec0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
1aed0 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
1aee0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1aef0 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20  p, objv[1], &N) 
1af00 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1af10 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
1af20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 61   N = -1;.  }.  a
1af30 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6c  mt = sqlite3_rel
1af40 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a  ease_memory(N);.
1af50 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1af60 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1af70 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a  ewIntObj(amt));.
1af80 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1af90 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1afa0 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
1afb0 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
1afc0 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79   ?N?.**.** Query
1afd0 20 6f 72 20 73 65 74 20 74 68 65 20 73 6f 66 74   or set the soft
1afe0 20 68 65 61 70 20 6c 69 6d 69 74 20 66 6f 72 20   heap limit for 
1aff0 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
1b000 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c 69 6d 69  ad.  The.** limi
1b010 74 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  t is only change
1b020 64 20 69 66 20 74 68 65 20 4e 20 69 73 20 70 72  d if the N is pr
1b030 65 73 65 6e 74 2e 20 20 54 68 65 20 70 72 65 76  esent.  The prev
1b040 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a 20 69 73  ious limit.** is
1b050 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1b060 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6f  atic int test_so
1b070 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a 20  ft_heap_limit(. 
1b080 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1b090 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1b0a0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b0b0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1b0c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1b0d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1b0e0 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
1b0f0 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20 26 26  Y_MANAGEMENT) &&
1b100 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b110 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
1b120 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f  int amt;.  if( o
1b130 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d  bjc!=1 && objc!=
1b140 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1b150 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1b160 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22  , 1, objv, "?N?"
1b170 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1b180 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  L_ERROR;.  }.  a
1b190 6d 74 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  mt = sqlite3Thre
1b1a0 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
1b1b0 2d 3e 6e 53 6f 66 74 48 65 61 70 4c 69 6d 69 74  ->nSoftHeapLimit
1b1c0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  ;.  if( objc==2 
1b1d0 29 7b 0a 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20  ){.    int N;.  
1b1e0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1b1f0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1b200 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72  objv[1], &N) ) r
1b210 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b220 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6f 66  .    sqlite3_sof
1b230 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 4e 29 3b  t_heap_limit(N);
1b240 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
1b250 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1b260 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6d  Tcl_NewIntObj(am
1b270 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  t));.#endif.  re
1b280 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1b290 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
1b2a0 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 74 73 64  qlite3_clear_tsd
1b2b0 5f 6d 65 6d 64 65 62 75 67 0a 2a 2a 0a 2a 2a 20  _memdebug.**.** 
1b2c0 43 6c 65 61 72 20 61 6c 6c 20 6f 66 20 74 68 65  Clear all of the
1b2d0 20 4d 45 4d 44 45 42 55 47 20 69 6e 66 6f 72 6d   MEMDEBUG inform
1b2e0 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 74 68 72  ation out of thr
1b2f0 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
1b300 61 2e 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  a..** This will 
1b310 61 6c 6c 6f 77 20 69 74 20 74 6f 20 62 65 20 64  allow it to be d
1b320 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 73  eallocated..*/.s
1b330 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1b340 6c 65 61 72 5f 74 73 64 5f 6d 65 6d 64 65 62 75  lear_tsd_memdebu
1b350 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  g(.  void * clie
1b360 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1b370 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1b380 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1b390 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1b3a0 5d 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43  ].){.  return TC
1b3b0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1b3c0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1b3d0 74 73 64 5f 72 65 6c 65 61 73 65 0a 2a 2a 0a 2a  tsd_release.**.*
1b3e0 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 52 65  * Call sqlite3Re
1b3f0 6c 65 61 73 65 54 68 72 65 61 64 44 61 74 61 2e  leaseThreadData.
1b400 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1b410 65 73 74 5f 74 73 64 5f 72 65 6c 65 61 73 65 28  est_tsd_release(
1b420 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1b430 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1b440 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b450 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1b460 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1b470 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
1b480 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 29 0a  QLITE_MEMDEBUG).
1b490 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1b4a0 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 23 65  ThreadData();.#e
1b4b0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
1b4c0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1b4d0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1b4e0 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 0a 2a  thread_cleanup.*
1b4f0 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
1b500 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
1b510 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a 73 74 61  anup API..*/.sta
1b520 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 68 72  tic int test_thr
1b530 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a 20 20 76  ead_cleanup(.  v
1b540 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1b550 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1b560 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1b570 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1b580 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1b590 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
1b5a0 63 6c 65 61 6e 75 70 28 29 3b 0a 20 20 72 65 74  cleanup();.  ret
1b5b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
1b5c0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
1b5d0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66  qlite3_pager_ref
1b5e0 63 6f 75 6e 74 73 20 20 44 42 0a 2a 2a 0a 2a 2a  counts  DB.**.**
1b5f0 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f   Return a list o
1b600 66 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20  f numbers which 
1b610 61 72 65 20 74 68 65 20 50 61 67 65 72 52 65 66  are the PagerRef
1b620 63 6f 75 6e 74 20 66 6f 72 20 61 6c 6c 0a 2a 2a  count for all.**
1b630 20 70 61 67 65 72 73 20 6f 6e 20 65 61 63 68 20   pagers on each 
1b640 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1b650 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1b660 6e 74 20 74 65 73 74 5f 70 61 67 65 72 5f 72 65  nt test_pager_re
1b670 66 63 6f 75 6e 74 73 28 0a 20 20 76 6f 69 64 20  fcounts(.  void 
1b680 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1b690 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1b6a0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1b6b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1b6c0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1b6d0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
1b6e0 69 3b 0a 20 20 69 6e 74 20 76 2c 20 2a 61 3b 0a  i;.  int v, *a;.
1b6f0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
1b700 6c 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  lt;..  if( objc!
1b710 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1b720 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1b730 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1b740 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1b750 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
1b760 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
1b770 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22  jv[0], 0), " DB"
1b780 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1b790 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1b7a0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1b7b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1b7c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1b7d0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1b7e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 52   TCL_ERROR;.  pR
1b7f0 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  esult = Tcl_NewO
1b800 62 6a 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  bj();.  for(i=0;
1b810 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1b820 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44  {.    if( db->aD
1b830 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 7b 0a 20  b[i].pBt==0 ){. 
1b840 20 20 20 20 20 76 20 3d 20 2d 31 3b 0a 20 20 20       v = -1;.   
1b850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 20   }else{.      a 
1b860 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
1b870 61 74 73 28 73 71 6c 69 74 65 33 42 74 72 65 65  ats(sqlite3Btree
1b880 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d  Pager(db->aDb[i]
1b890 2e 70 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20  .pBt));.      v 
1b8a0 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20 20  = a[0];.    }.  
1b8b0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1b8c0 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
1b8d0 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65 77 49 6e  esult, Tcl_NewIn
1b8e0 74 4f 62 6a 28 76 29 29 3b 0a 20 20 7d 0a 20 20  tObj(v));.  }.  
1b8f0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1b900 28 69 6e 74 65 72 70 2c 20 70 52 65 73 75 6c 74  (interp, pResult
1b910 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1b920 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  OK;.}.../*.** tc
1b930 6c 63 6d 64 3a 20 20 20 77 6f 72 6b 69 6e 67 5f  lcmd:   working_
1b940 36 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a 20  64bit_int.**.** 
1b950 53 6f 6d 65 20 54 43 4c 20 62 75 69 6c 64 73 20  Some TCL builds 
1b960 28 65 78 3a 20 63 79 67 77 69 6e 29 20 64 6f 20  (ex: cygwin) do 
1b970 6e 6f 74 20 73 75 70 70 6f 72 74 20 36 34 2d 62  not support 64-b
1b980 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68  it integers.  Th
1b990 69 73 0a 2a 2a 20 6c 65 61 64 73 20 74 6f 20 61  is.** leads to a
1b9a0 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 73 74 20   number of test 
1b9b0 66 61 69 6c 75 72 65 73 2e 20 20 54 68 65 20 70  failures.  The p
1b9c0 72 65 73 65 6e 74 20 63 6f 6d 6d 61 6e 64 20 63  resent command c
1b9d0 68 65 63 6b 73 20 74 68 65 0a 2a 2a 20 54 43 4c  hecks the.** TCL
1b9e0 20 62 75 69 6c 64 20 74 6f 20 73 65 65 20 77 68   build to see wh
1b9f0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20  ether or not it 
1ba00 73 75 70 70 6f 72 74 73 20 36 34 2d 62 69 74 20  supports 64-bit 
1ba10 69 6e 74 65 67 65 72 73 2e 20 20 49 74 0a 2a 2a  integers.  It.**
1ba20 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 69 66   returns TRUE if
1ba30 20 69 74 20 64 6f 65 73 20 61 6e 64 20 46 41 4c   it does and FAL
1ba40 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  SE if not..**.**
1ba50 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73   This command is
1ba60 20 75 73 65 64 20 74 6f 20 77 61 72 6e 20 75 73   used to warn us
1ba70 65 72 73 20 74 68 61 74 20 74 68 65 69 72 20 54  ers that their T
1ba80 43 4c 20 62 75 69 6c 64 20 69 73 20 64 65 66 65  CL build is defe
1ba90 63 74 69 76 65 0a 2a 2a 20 61 6e 64 20 74 68 61  ctive.** and tha
1baa0 74 20 74 68 65 20 65 72 72 6f 72 73 20 74 68 65  t the errors the
1bab0 79 20 61 72 65 20 73 65 65 69 6e 67 20 69 6e 20  y are seeing in 
1bac0 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73  the test scripts
1bad0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 72   might be.** a r
1bae0 65 73 75 6c 74 20 6f 66 20 74 68 65 69 72 20 64  esult of their d
1baf0 65 66 65 63 74 69 76 65 20 54 43 4c 20 72 61 74  efective TCL rat
1bb00 68 65 72 20 74 68 61 6e 20 70 72 6f 62 6c 65 6d  her than problem
1bb10 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  s in SQLite..*/.
1bb20 73 74 61 74 69 63 20 69 6e 74 20 77 6f 72 6b 69  static int worki
1bb30 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28 0a 20 20  ng_64bit_int(.  
1bb40 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
1bb50 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
1bb60 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
1bb70 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
1bb80 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
1bb90 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
1bba0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
1bbb0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
1bbc0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
1bbd0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
1bbe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1bbf0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
1bc00 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
1bc10 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
1bc20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
1bc30 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62  s */.){.  Tcl_Ob
1bc40 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a 20 20 69  j *pTestObj;.  i
1bc50 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20 30 3b 0a  nt working = 0;.
1bc60 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d 20 54 63  .  pTestObj = Tc
1bc70 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
1bc80 31 30 30 30 30 30 30 2a 28 69 36 34 29 31 32 33  1000000*(i64)123
1bc90 34 35 36 37 38 39 30 29 3b 0a 20 20 77 6f 72 6b  4567890);.  work
1bca0 69 6e 67 20 3d 20 73 74 72 63 6d 70 28 54 63 6c  ing = strcmp(Tcl
1bcb0 5f 47 65 74 53 74 72 69 6e 67 28 70 54 65 73 74  _GetString(pTest
1bcc0 4f 62 6a 29 2c 20 22 31 32 33 34 35 36 37 38 39  Obj), "123456789
1bcd0 30 30 30 30 30 30 30 22 29 3d 3d 30 3b 0a 20 20  0000000")==0;.  
1bce0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
1bcf0 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20 20 54 63  (pTestObj);.  Tc
1bd00 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1bd10 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
1bd20 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b 69 6e 67  oleanObj(working
1bd30 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1bd40 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  _OK;.}.../*.** R
1bd50 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73  egister commands
1bd60 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e   with the TCL in
1bd70 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e  terpreter..*/.in
1bd80 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e  t Sqlitetest1_In
1bd90 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
1bda0 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e  nterp){.  extern
1bdb0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
1bdc0 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  rch_count;.  ext
1bdd0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1bde0 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b  interrupt_count;
1bdf0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
1be00 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f  lite3_open_file_
1be10 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
1be20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74  int sqlite3_sort
1be30 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
1be40 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72   int sqlite3_cur
1be50 72 65 6e 74 5f 74 69 6d 65 3b 0a 20 20 65 78 74  rent_time;.  ext
1be60 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1be70 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20  max_blobsize;.  
1be80 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1be90 65 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63  e3BtreeSharedCac
1bea0 68 65 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a  heReport(void*,.
1beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bed0 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
1bee0 74 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62  terp*,int,Tcl_Ob
1bef0 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61  j*CONST*);.  sta
1bf00 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
1bf10 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
1bf20 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20      Tcl_CmdProc 
1bf30 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64  *xProc;.  } aCmd
1bf40 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73  [] = {.     { "s
1bf50 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
1bf60 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  nt",           (
1bf70 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1bf80 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
1bf90 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1bfa0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
1bfb0 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 28  nt64",         (
1bfc0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1bfd0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
1bfe0 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  64  },.     { "s
1bff0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
1c000 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  tr",           (
1c010 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1c020 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
1c030 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1c040 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
1c050 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  str",          (
1c060 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1c070 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74  ite3_snprintf_st
1c080 72 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  r   },.     { "s
1c090 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
1c0a0 74 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28  tronly",       (
1c0b0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1c0c0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
1c0d0 6f 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73  only},.     { "s
1c0e0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
1c0f0 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28  ouble",        (
1c100 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1c110 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
1c120 62 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ble },.     { "s
1c130 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
1c140 63 61 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28  caled",        (
1c150 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1c160 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
1c170 6c 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  led },.     { "s
1c180 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68  qlite3_mprintf_h
1c190 65 78 64 6f 75 62 6c 65 22 2c 20 20 20 28 54 63  exdouble",   (Tc
1c1a0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
1c1b0 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f  e3_mprintf_hexdo
1c1c0 75 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73  uble},.     { "s
1c1d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a  qlite3_mprintf_z
1c1e0 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28  _test",        (
1c1f0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
1c200 74 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20  t_mprintf_z     
1c210 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1c220 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f  lite3_mprintf_n_
1c230 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54  test",        (T
1c240 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
1c250 5f 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20 20 20  _mprintf_n      
1c260 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1c270 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e  ite3_snprintf_in
1c280 74 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  t",          (Tc
1c290 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
1c2a0 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20  snprintf_int    
1c2b0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1c2c0 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
1c2d0 72 6f 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c  rowid",     (Tcl
1c2e0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c  _CmdProc*)test_l
1c2f0 61 73 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20  ast_rowid       
1c300 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1c310 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c  e3_exec_printf",
1c320 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
1c330 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78  CmdProc*)test_ex
1c340 65 63 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d  ec_printf      }
1c350 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1c360 33 5f 65 78 65 63 22 2c 20 20 20 20 20 20 20 20  3_exec",        
1c370 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
1c380 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
1c390 63 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  c             },
1c3a0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1c3b0 5f 65 78 65 63 5f 6e 72 22 2c 20 20 20 20 20 20  _exec_nr",      
1c3c0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
1c3d0 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
1c3e0 5f 6e 72 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  _nr          },.
1c3f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1c400 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
1c410 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ",      (Tcl_Cmd
1c420 50 72 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f 74  Proc*)test_get_t
1c430 61 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 20  able_printf },. 
1c440 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
1c450 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20  lose",          
1c460 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1c470 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74  roc*)sqlite_test
1c480 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20  _close     },.  
1c490 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72     { "sqlite3_cr
1c4a0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  eate_function", 
1c4b0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
1c4c0 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f  oc*)test_create_
1c4d0 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20  function  },.   
1c4e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
1c4f0 61 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20  ate_aggregate", 
1c500 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
1c510 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61  c*)test_create_a
1c520 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20  ggregate },.    
1c530 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73   { "sqlite_regis
1c540 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  ter_test_functio
1c550 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  n", (Tcl_CmdProc
1c560 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  *)test_register_
1c570 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20  func    },.     
1c580 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22  { "sqlite_abort"
1c590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c5a0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
1c5b0 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20  )sqlite_abort   
1c5c0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
1c5d0 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20   "sqlite_bind", 
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5f0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1c600 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20  test_bind       
1c610 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
1c620 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20  "breakpoint",   
1c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c640 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
1c650 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20  est_breakpoint  
1c660 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
1c670 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20 20  sqlite3_key",   
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c690 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
1c6a0 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20  st_key          
1c6b0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1c6c0 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20 20  qlite3_rekey",  
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1c6e0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
1c6f0 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20 20  t_rekey         
1c700 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1c710 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c  lite_set_magic",
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
1c730 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
1c740 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20 20  te_set_magic    
1c750 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1c760 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22 2c  ite3_interrupt",
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
1c780 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
1c790 69 6e 74 65 72 72 75 70 74 20 20 20 20 20 20 20  interrupt       
1c7a0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1c7b0 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69  te_delete_functi
1c7c0 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  on",        (Tcl
1c7d0 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65  _CmdProc*)delete
1c7e0 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20 20  _function       
1c7f0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1c800 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69  e_delete_collati
1c810 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  on",       (Tcl_
1c820 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f  CmdProc*)delete_
1c830 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d  collation      }
1c840 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1c850 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
1c860 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
1c870 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f  mdProc*)get_auto
1c880 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d 2c  commit        },
1c890 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1c8a0 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20 20 20  _stack_used",   
1c8b0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
1c8c0 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74 61 63  dProc*)test_stac
1c8d0 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d 2c 0a  k_used       },.
1c8e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1c8f0 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20  busy_timeout",  
1c900 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1c910 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79 5f  Proc*)test_busy_
1c920 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20  timeout     },. 
1c930 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c 20      { "printf", 
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c950 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1c960 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74 66  roc*)test_printf
1c970 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1c980 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 69 6f     { "sqlite3_io
1c990 5f 74 72 61 63 65 22 2c 20 20 20 20 20 20 20 20  _trace",        
1c9a0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
1c9b0 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63  oc*)test_io_trac
1c9c0 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d  e         },.  }
1c9d0 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
1c9e0 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
1c9f0 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f  Name;.     Tcl_O
1ca00 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  bjCmdProc *xProc
1ca10 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69  ;.     void *cli
1ca20 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62  entData;.  } aOb
1ca30 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  jCmd[] = {.     
1ca40 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65  { "sqlite3_conne
1ca50 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20  ction_pointer", 
1ca60 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f     get_sqlite_po
1ca70 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20  inter, 0 },.    
1ca80 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
1ca90 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
1caa0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
1cab0 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  t,      0 },.   
1cac0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
1cad0 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20  d_zeroblob",    
1cae0 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a       test_bind_z
1caf0 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20  eroblob, 0 },.  
1cb00 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
1cb10 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20  nd_int64",      
1cb20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
1cb30 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20  int64,    0 },. 
1cb40 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
1cb50 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  ind_double",    
1cb60 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
1cb70 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a  _double,   0 },.
1cb80 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1cb90 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20  bind_null",     
1cba0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
1cbb0 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c  d_null     ,0 },
1cbc0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1cbd0 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20  _bind_text",    
1cbe0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
1cbf0 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d  nd_text     ,0 }
1cc00 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1cc10 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20  3_bind_text16", 
1cc20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
1cc30 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20  ind_text16   ,0 
1cc40 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1cc50 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20  e3_bind_blob",  
1cc60 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
1cc70 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30  bind_blob     ,0
1cc80 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1cc90 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
1cca0 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74  er_count",  test
1ccb0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
1ccc0 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20  count, 0},.     
1ccd0 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
1cce0 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c  parameter_name",
1ccf0 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72     test_bind_par
1cd00 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d  ameter_name,  0}
1cd10 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1cd20 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
1cd30 5f 69 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62  _index",  test_b
1cd40 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
1cd50 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  dex, 0},.     { 
1cd60 22 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62  "sqlite3_clear_b
1cd70 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20  indings",       
1cd80 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64   test_clear_bind
1cd90 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  ings, 0},.     {
1cda0 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22   "sqlite3_sleep"
1cdb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1cdc0 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20    test_sleep,   
1cdd0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
1cde0 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  { "sqlite3_errco
1cdf0 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  de",            
1ce00 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20     test_errcode 
1ce10 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
1ce20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d   { "sqlite3_errm
1ce30 73 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sg",            
1ce40 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20      test_errmsg 
1ce50 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
1ce60 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
1ce70 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20 20 20  msg16",         
1ce80 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67       test_errmsg
1ce90 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  16      ,0 },.  
1cea0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
1ceb0 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  en",            
1cec0 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20        test_open 
1ced0 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
1cee0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
1cef0 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20  pen16",         
1cf00 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
1cf10 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  16        ,0 },.
1cf20 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1cf30 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20  complete16",    
1cf40 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d          test_com
1cf50 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c  plete16    ,0 },
1cf60 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ..     { "sqlite
1cf70 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20 20  3_prepare",     
1cf80 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
1cf90 72 65 70 61 72 65 20 20 20 20 20 20 20 2c 30 20  repare       ,0 
1cfa0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1cfb0 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20  e3_prepare16",  
1cfc0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
1cfd0 70 72 65 70 61 72 65 31 36 20 20 20 20 20 2c 30  prepare16     ,0
1cfe0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1cff0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22 2c  te3_prepare_v2",
1d000 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1d010 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20 20 2c  _prepare_v2    ,
1d020 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
1d030 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76  ite3_prepare16_v
1d040 32 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  2",          tes
1d050 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 20  t_prepare16_v2  
1d060 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
1d070 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22 2c  lite3_finalize",
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1d090 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20 20  st_finalize     
1d0a0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
1d0b0 71 6c 69 74 65 33 5f 72 65 73 65 74 22 2c 20 20  qlite3_reset",  
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1d0d0 65 73 74 5f 72 65 73 65 74 20 20 20 20 20 20 20  est_reset       
1d0e0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
1d0f0 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 22  sqlite3_expired"
1d100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d110 74 65 73 74 5f 65 78 70 69 72 65 64 20 20 20 20  test_expired    
1d120 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
1d130 22 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65  "sqlite3_transfe
1d140 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20  r_bindings",    
1d150 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f 62   test_transfer_b
1d160 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  ind ,0 },.     {
1d170 20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65   "sqlite3_change
1d180 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  s",             
1d190 20 20 74 65 73 74 5f 63 68 61 6e 67 65 73 20 20    test_changes  
1d1a0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
1d1b0 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 65 70 22  { "sqlite3_step"
1d1c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d1d0 20 20 20 74 65 73 74 5f 73 74 65 70 20 20 20 20     test_step    
1d1e0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20 20        ,0 },..   
1d1f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6c    { "sqlite3_rel
1d200 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20  ease_memory",   
1d210 20 20 20 20 20 74 65 73 74 5f 72 65 6c 65 61 73       test_releas
1d220 65 5f 6d 65 6d 6f 72 79 2c 20 20 20 20 20 30 7d  e_memory,     0}
1d230 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1d240 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
1d250 74 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73  t",       test_s
1d260 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 2c 20  oft_heap_limit, 
1d270 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
1d280 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 74 73 64  qlite3_clear_tsd
1d290 5f 6d 65 6d 64 65 62 75 67 22 2c 20 20 20 20 74  _memdebug",    t
1d2a0 65 73 74 5f 63 6c 65 61 72 5f 74 73 64 5f 6d 65  est_clear_tsd_me
1d2b0 6d 64 65 62 75 67 2c 20 30 7d 2c 0a 20 20 20 20  mdebug, 0},.    
1d2c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 73 64 5f   { "sqlite3_tsd_
1d2d0 72 65 6c 65 61 73 65 22 2c 20 20 20 20 20 20 20  release",       
1d2e0 20 20 20 20 74 65 73 74 5f 74 73 64 5f 72 65 6c      test_tsd_rel
1d2f0 65 61 73 65 2c 20 20 20 20 20 20 20 20 30 7d 2c  ease,        0},
1d300 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1d310 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 22  _thread_cleanup"
1d320 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 74 68  ,        test_th
1d330 72 65 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20  read_cleanup,   
1d340 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
1d350 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63  lite3_pager_refc
1d360 6f 75 6e 74 73 22 2c 20 20 20 20 20 20 20 74 65  ounts",       te
1d370 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  st_pager_refcoun
1d380 74 73 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20  ts,    0},..    
1d390 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64   { "sqlite3_load
1d3a0 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20  _extension",    
1d3b0 20 20 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78      test_load_ex
1d3c0 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c  tension,     0},
1d3d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1d3e0 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
1d3f0 65 6e 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e  ension", test_en
1d400 61 62 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20  able_load,      
1d410 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
1d420 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
1d430 65 73 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65  esult_codes", te
1d440 73 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  st_extended_resu
1d450 6c 74 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 0a 20  lt_codes, 0},.. 
1d460 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63      /* sqlite3_c
1d470 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49 20 2a 2f  olumn_*() API */
1d480 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1d490 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22 2c 20  _column_count", 
1d4a0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
1d4b0 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30 20 7d  lumn_count  ,0 }
1d4c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1d4d0 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22 2c 20 20  3_data_count",  
1d4e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64            test_d
1d4f0 61 74 61 5f 63 6f 75 6e 74 20 20 20 20 2c 30 20  ata_count    ,0 
1d500 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1d510 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 22 2c  e3_column_type",
1d520 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
1d530 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20 20 2c 30  column_type   ,0
1d540 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1d550 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 22  te3_column_blob"
1d560 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
1d570 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20 20 2c  _column_blob   ,
1d580 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
1d590 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
1d5a0 6c 65 22 2c 20 20 20 20 20 20 20 20 20 74 65 73  le",         tes
1d5b0 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20  t_column_double 
1d5c0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
1d5d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1d5e0 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  64",          te
1d5f0 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20  st_column_int64 
1d600 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
1d610 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1d620 78 74 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  xt",       test_
1d630 73 74 6d 74 5f 75 74 66 38 2c 20 20 73 71 6c 69  stmt_utf8,  sqli
1d640 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20  te3_column_text 
1d650 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
1d660 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1d670 65 63 6c 74 79 70 65 22 2c 20 20 20 74 65 73 74  ecltype",   test
1d680 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 73 71 6c  _stmt_utf8,  sql
1d690 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
1d6a0 74 79 70 65 20 20 7d 2c 0a 20 20 20 20 20 7b 20  type  },.     { 
1d6b0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
1d6c0 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 74 65 73  name",       tes
1d6d0 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 73 71  t_stmt_utf8,  sq
1d6e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
1d6f0 65 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  e      },.     {
1d700 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
1d710 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 74 65  _int",        te
1d720 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 73  st_stmt_int,   s
1d730 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
1d740 74 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  t       },.     
1d750 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
1d760 6e 5f 62 79 74 65 73 22 2c 20 20 20 20 20 20 74  n_bytes",      t
1d770 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20  est_stmt_int,   
1d780 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1d790 79 74 65 73 20 20 20 20 20 7d 2c 0a 23 69 66 64  ytes     },.#ifd
1d7a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1d7b0 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
1d7c0 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75  .{ "sqlite3_colu
1d7d0 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65  mn_database_name
1d7e0 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ", test_stmt_utf
1d7f0 38 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  8, sqlite3_colum
1d800 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 7d  n_database_name}
1d810 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c  ,.{ "sqlite3_col
1d820 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 22 2c  umn_table_name",
1d830 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c   test_stmt_utf8,
1d840 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d850 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22  table_name},.{ "
1d860 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f  sqlite3_column_o
1d870 72 69 67 69 6e 5f 6e 61 6d 65 22 2c 20 74 65 73  rigin_name", tes
1d880 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 73 71 6c  t_stmt_utf8, sql
1d890 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
1d8a0 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69 66  in_name},.#endif
1d8b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1d8c0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
1d8d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
1d8e0 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 20 20 20  mn_bytes16",    
1d8f0 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
1d900 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d910 62 79 74 65 73 31 36 20 20 20 7d 2c 0a 20 20 20  bytes16   },.   
1d920 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
1d930 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20 20 20  umn_text16",    
1d940 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
1d950 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
1d960 5f 74 65 78 74 31 36 20 20 20 20 7d 2c 0a 20 20  _text16    },.  
1d970 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
1d980 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 22  lumn_decltype16"
1d990 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  , test_stmt_utf1
1d9a0 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  6, sqlite3_colum
1d9b0 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a 20  n_decltype16},. 
1d9c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
1d9d0 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20  olumn_name16",  
1d9e0 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66     test_stmt_utf
1d9f0 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  16, sqlite3_colu
1da00 6d 6e 5f 6e 61 6d 65 31 36 20 20 20 20 7d 2c 0a  mn_name16    },.
1da10 20 20 20 20 20 7b 20 22 61 64 64 5f 61 6c 69 67       { "add_alig
1da20 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
1da30 74 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69 67  tions", add_alig
1da40 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
1da50 74 69 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d 2c  tions, 0      },
1da60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1da70 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
1da80 41 44 41 54 41 0a 7b 22 73 71 6c 69 74 65 33 5f  ADATA.{"sqlite3_
1da90 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f  column_database_
1daa0 6e 61 6d 65 31 36 22 2c 0a 20 20 74 65 73 74 5f  name16",.  test_
1dab0 73 74 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69  stmt_utf16, sqli
1dac0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62  te3_column_datab
1dad0 61 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73  ase_name16},.{"s
1dae0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61  qlite3_column_ta
1daf0 62 6c 65 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73  ble_name16", tes
1db00 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 73 71  t_stmt_utf16, sq
1db10 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
1db20 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71  le_name16},.{"sq
1db30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
1db40 67 69 6e 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73  gin_name16", tes
1db50 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 73 71  t_stmt_utf16, sq
1db60 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
1db70 67 69 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e  gin_name16},.#en
1db80 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  dif.#endif.     
1db90 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
1dba0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c  e_collation_v2",
1dbb0 20 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c   test_create_col
1dbc0 6c 61 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a  lation_v2, 0 },.
1dbd0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1dbe0 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 22 2c  global_recover",
1dbf0 20 20 20 20 20 74 65 73 74 5f 67 6c 6f 62 61 6c       test_global
1dc00 5f 72 65 63 6f 76 65 72 2c 20 30 20 20 20 7d 2c  _recover, 0   },
1dc10 0a 20 20 20 20 20 7b 20 22 77 6f 72 6b 69 6e 67  .     { "working
1dc20 5f 36 34 62 69 74 5f 69 6e 74 22 2c 20 20 20 20  _64bit_int",    
1dc30 20 20 20 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34        working_64
1dc40 62 69 74 5f 69 6e 74 2c 20 20 20 30 20 20 20 7d  bit_int,   0   }
1dc50 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63 74  ,..     /* Funct
1dc60 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20 2a  ions from os.h *
1dc70 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1dc80 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 20  _OMIT_DISKIO.   
1dc90 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73 4f 70    { "sqlite3OsOp
1dca0 65 6e 52 65 61 64 57 72 69 74 65 22 2c 74 65 73  enReadWrite",tes
1dcb0 74 5f 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  t_sqlite3OsOpenR
1dcc0 65 61 64 57 72 69 74 65 2c 20 30 20 7d 2c 0a 20  eadWrite, 0 },. 
1dcd0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73      { "sqlite3Os
1dce0 43 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 74  Close",        t
1dcf0 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 43 6c 6f  est_sqlite3OsClo
1dd00 73 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  se, 0 },.     { 
1dd10 22 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 22 2c  "sqlite3OsLock",
1dd20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71           test_sq
1dd30 6c 69 74 65 33 4f 73 4c 6f 63 6b 2c 20 30 20 7d  lite3OsLock, 0 }
1dd40 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1dd50 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 22  3OsTempFileName"
1dd60 2c 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73  , test_sqlite3Os
1dd70 54 65 6d 70 46 69 6c 65 4e 61 6d 65 2c 20 30 20  TempFileName, 0 
1dd80 7d 2c 0a 20 20 20 0a 20 20 20 20 20 2f 2a 20 43  },.   .     /* C
1dd90 75 73 74 6f 6d 20 74 65 73 74 20 69 6e 74 65 72  ustom test inter
1dda0 66 61 63 65 73 20 2a 2f 0a 20 20 20 20 20 7b 20  faces */.     { 
1ddb0 22 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b  "sqlite3OsUnlock
1ddc0 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
1ddd0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 2c  sqlite3OsUnlock,
1dde0 20 30 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a   0    },.#endif.
1ddf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1de00 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b  MIT_UTF16.     {
1de10 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61   "add_test_colla
1de20 74 65 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  te",        test
1de30 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20  _collate, 0     
1de40 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
1de50 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61   "add_test_colla
1de60 74 65 5f 6e 65 65 64 65 64 22 2c 20 74 65 73 74  te_needed", test
1de70 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c  _collate_needed,
1de80 20 30 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b   0     },.     {
1de90 20 22 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74   "add_test_funct
1dea0 69 6f 6e 22 2c 20 20 20 20 20 20 20 74 65 73 74  ion",       test
1deb0 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20  _function, 0    
1dec0 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66         },.#endif
1ded0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1dee0 5f 74 65 73 74 5f 65 72 72 73 74 72 22 2c 20 20  _test_errstr",  
1def0 20 20 20 74 65 73 74 5f 65 72 72 73 74 72 2c 20     test_errstr, 
1df00 30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  0             },
1df10 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 76 61 72  .     { "tcl_var
1df20 69 61 62 6c 65 5f 74 79 70 65 22 2c 20 20 20 20  iable_type",    
1df30 20 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f     tcl_variable_
1df40 74 79 70 65 2c 20 30 20 20 20 20 20 20 20 7d 2c  type, 0       },
1df50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1df60 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1df70 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
1df80 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
1df90 63 61 63 68 65 22 2c 20 74 65 73 74 5f 65 6e 61  cache", test_ena
1dfa0 62 6c 65 5f 73 68 61 72 65 64 2c 20 30 20 20 7d  ble_shared, 0  }
1dfb0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1dfc0 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72  3_shared_cache_r
1dfd0 65 70 6f 72 74 22 2c 20 73 71 6c 69 74 65 33 42  eport", sqlite3B
1dfe0 74 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52  treeSharedCacheR
1dff0 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e 64 69  eport, 0},.#endi
1e000 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
1e010 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  3_libversion_num
1e020 62 65 72 22 2c 20 74 65 73 74 5f 6c 69 62 76 65  ber", test_libve
1e030 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30 20  rsion_number, 0 
1e040 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54   },.#ifdef SQLIT
1e050 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
1e060 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 7b 20  METADATA.     { 
1e070 22 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63  "sqlite3_table_c
1e080 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 22 2c  olumn_metadata",
1e090 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75   test_table_colu
1e0a0 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30 20 20  mn_metadata, 0  
1e0b0 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  },.#endif.#ifnde
1e0c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1e0d0 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73  CRBLOB.     { "s
1e0e0 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
1e0f0 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65  ",  test_blob_re
1e100 61 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  ad, 0  },.     {
1e110 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77   "sqlite3_blob_w
1e120 72 69 74 65 22 2c 20 74 65 73 74 5f 62 6c 6f 62  rite", test_blob
1e130 5f 77 72 69 74 65 2c 20 30 20 20 7d 2c 0a 23 65  _write, 0  },.#e
1e140 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 73 74 61 74  ndif.  };.  stat
1e150 69 63 20 69 6e 74 20 62 69 74 6d 61 73 6b 5f 73  ic int bitmask_s
1e160 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42 69 74  ize = sizeof(Bit
1e170 6d 61 73 6b 29 2a 38 3b 0a 20 20 69 6e 74 20 69  mask)*8;.  int i
1e180 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
1e190 71 6c 69 74 65 33 5f 77 68 65 72 65 5f 74 72 61  qlite3_where_tra
1e1a0 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  ce;.  extern int
1e1b0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
1e1c0 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f 66 75 6c  unt, sqlite3_ful
1e1d0 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20 65  lsync_count;.  e
1e1e0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1e1f0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
1e200 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
1e210 71 6c 69 74 65 33 5f 6d 65 6d 55 73 65 64 3b 0a  qlite3_memUsed;.
1e220 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
1e230 69 74 65 33 5f 6d 65 6d 4d 61 78 3b 0a 20 20 65  ite3_memMax;.  e
1e240 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1e250 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20  3_like_count;.  
1e260 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1e270 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74  e3_xferopt_count
1e280 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
1e290 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
1e2a0 64 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ddb_count;.  ext
1e2b0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1e2c0 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
1e2d0 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
1e2e0 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
1e2f0 77 72 69 74 65 6a 5f 63 6f 75 6e 74 3b 0a 20 20  writej_count;.  
1e300 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1e310 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
1e320 63 6f 75 6e 74 3b 0a 23 69 66 20 4f 53 5f 55 4e  count;.#if OS_UN
1e330 49 58 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  IX && defined(SQ
1e340 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65  LITE_TEST) && de
1e350 66 69 6e 65 64 28 54 48 52 45 41 44 53 41 46 45  fined(THREADSAFE
1e360 29 20 26 26 20 54 48 52 45 41 44 53 41 46 45 0a  ) && THREADSAFE.
1e370 20 20 65 78 74 65 72 6e 20 69 6e 74 20 74 68 72    extern int thr
1e380 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
1e390 4f 74 68 65 72 73 4c 6f 63 6b 73 3b 0a 23 65 6e  OthersLocks;.#en
1e3a0 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20  dif.#if OS_WIN. 
1e3b0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
1e3c0 74 65 33 5f 6f 73 5f 74 79 70 65 3b 0a 23 65 6e  te3_os_type;.#en
1e3d0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1e3e0 45 5f 44 45 42 55 47 0a 20 20 65 78 74 65 72 6e  E_DEBUG.  extern
1e3f0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f   int sqlite3_os_
1e400 74 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20  trace;.  extern 
1e410 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65  int sqlite3_vdbe
1e420 5f 61 64 64 6f 70 5f 74 72 61 63 65 3b 0a 23 65  _addop_trace;.#e
1e430 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1e440 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e  TE_TEST.  extern
1e450 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75   char sqlite3_qu
1e460 65 72 79 5f 70 6c 61 6e 5b 5d 3b 0a 20 20 73 74  ery_plan[];.  st
1e470 61 74 69 63 20 63 68 61 72 20 2a 71 75 65 72 79  atic char *query
1e480 5f 70 6c 61 6e 20 3d 20 73 71 6c 69 74 65 33 5f  _plan = sqlite3_
1e490 71 75 65 72 79 5f 70 6c 61 6e 3b 0a 23 65 6e 64  query_plan;.#end
1e4a0 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  if..  for(i=0; i
1e4b0 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69  <sizeof(aCmd)/si
1e4c0 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69  zeof(aCmd[0]); i
1e4d0 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  ++){.    Tcl_Cre
1e4e0 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
1e4f0 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65  p, aCmd[i].zName
1e500 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c  , aCmd[i].xProc,
1e510 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f   0, 0);.  }.  fo
1e520 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
1e530 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28  aObjCmd)/sizeof(
1e540 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b  aObjCmd[0]); i++
1e550 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ){.    Tcl_Creat
1e560 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
1e570 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a  rp, aObjCmd[i].z
1e580 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 61  Name, .        a
1e590 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c  ObjCmd[i].xProc,
1e5a0 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65   aObjCmd[i].clie
1e5b0 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a  ntData, 0);.  }.
1e5c0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
1e5d0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 65  terp, "sqlite_se
1e5e0 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  arch_count", .  
1e5f0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
1e600 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
1e610 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
1e620 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
1e630 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
1e640 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  ort_count", .   
1e650 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
1e660 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20 54  e3_sort_count, T
1e670 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
1e680 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
1e690 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61 78  rp, "sqlite3_max
1e6a0 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a 20 20 20  _blobsize", .   
1e6b0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
1e6c0 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 2c  e3_max_blobsize,
1e6d0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
1e6e0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
1e6f0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 69  terp, "sqlite_li
1e700 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  ke_count", .    
1e710 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
1e720 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20 54 43  3_like_count, TC
1e730 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
1e740 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
1e750 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65 72  p, "sqlite_inter
1e760 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  rupt_count", .  
1e770 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
1e780 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
1e790 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
1e7a0 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
1e7b0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
1e7c0 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  e_open_file_coun
1e7d0 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
1e7e0 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  *)&sqlite3_open_
1e7f0 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  file_count, TCL_
1e800 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
1e810 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
1e820 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74   "sqlite_current
1e830 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 28  _time", .      (
1e840 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 63  char*)&sqlite3_c
1e850 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c  urrent_time, TCL
1e860 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
1e870 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
1e880 2c 20 22 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  , "sqlite3_xfero
1e890 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  pt_count",.     
1e8a0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
1e8b0 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20  _xferopt_count, 
1e8c0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
1e8d0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1e8e0 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
1e8f0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1e900 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
1e910 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  &sqlite3_pager_r
1e920 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c  eaddb_count, TCL
1e930 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
1e940 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
1e950 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  , "sqlite3_pager
1e960 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c  _writedb_count",
1e970 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
1e980 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
1e990 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  tedb_count, TCL_
1e9a0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
1e9b0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
1e9c0 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
1e9d0 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20  writej_count",. 
1e9e0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
1e9f0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
1ea00 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  j_count, TCL_LIN
1ea10 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
1ea20 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
1ea30 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
1ea40 72 65 65 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  ree_count",.    
1ea50 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
1ea60 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
1ea70 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
1ea80 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  NT);.#ifndef SQL
1ea90 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1eaa0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1eab0 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65 64 5f  erp, "unaligned_
1eac0 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 22 2c  string_counter",
1ead0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 75  .      (char*)&u
1eae0 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
1eaf0 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c 49 4e  counter, TCL_LIN
1eb00 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23  K_INT);.#endif.#
1eb10 69 66 20 4f 53 5f 55 4e 49 58 20 26 26 20 64 65  if OS_UNIX && de
1eb20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1eb30 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 48  T) && defined(TH
1eb40 52 45 41 44 53 41 46 45 29 20 26 26 20 54 48 52  READSAFE) && THR
1eb50 45 41 44 53 41 46 45 0a 20 20 54 63 6c 5f 4c 69  EADSAFE.  Tcl_Li
1eb60 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 74  nkVar(interp, "t
1eb70 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
1eb80 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 22 2c 0a  chOthersLocks",.
1eb90 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 74 68        (char*)&th
1eba0 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
1ebb0 68 4f 74 68 65 72 73 4c 6f 63 6b 73 2c 20 54 43  hOthersLocks, TC
1ebc0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e  L_LINK_INT);.#en
1ebd0 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
1ebe0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1ebf0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
1ec00 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 61 73 74  rp, "sqlite_last
1ec10 5f 6e 65 65 64 65 64 5f 63 6f 6c 6c 61 74 69 6f  _needed_collatio
1ec20 6e 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  n",.      (char*
1ec30 29 26 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74  )&pzNeededCollat
1ec40 69 6f 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54  ion, TCL_LINK_ST
1ec50 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45  RING|TCL_LINK_RE
1ec60 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  AD_ONLY);.#endif
1ec70 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 54 63  .#if OS_WIN.  Tc
1ec80 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
1ec90 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 79 70  , "sqlite_os_typ
1eca0 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
1ecb0 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  )&sqlite3_os_typ
1ecc0 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
1ecd0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
1ece0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 54 63  SQLITE_TEST.  Tc
1ecf0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
1ed00 2c 20 22 73 71 6c 69 74 65 5f 71 75 65 72 79 5f  , "sqlite_query_
1ed10 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20 28 63 68  plan",.      (ch
1ed20 61 72 2a 29 26 71 75 65 72 79 5f 70 6c 61 6e 2c  ar*)&query_plan,
1ed30 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47   TCL_LINK_STRING
1ed40 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f  |TCL_LINK_READ_O
1ed50 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  NLY);.#endif.#if
1ed60 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1ed70 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
1ed80 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 61  nterp, "sqlite_a
1ed90 64 64 6f 70 5f 74 72 61 63 65 22 2c 0a 20 20 20  ddop_trace",.   
1eda0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
1edb0 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72  e3_vdbe_addop_tr
1edc0 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
1edd0 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
1ede0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
1edf0 65 5f 77 68 65 72 65 5f 74 72 61 63 65 22 2c 0a  e_where_trace",.
1ee00 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
1ee10 6c 69 74 65 33 5f 77 68 65 72 65 5f 74 72 61 63  lite3_where_trac
1ee20 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
1ee30 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
1ee40 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
1ee50 6f 73 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20  os_trace",.     
1ee60 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
1ee70 5f 6f 73 5f 74 72 61 63 65 2c 20 54 43 4c 5f 4c  _os_trace, TCL_L
1ee80 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
1ee90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
1eea0 45 4d 44 45 42 55 47 0a 20 20 54 63 6c 5f 4c 69  EMDEBUG.  Tcl_Li
1eeb0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
1eec0 71 6c 69 74 65 5f 6d 65 6d 75 73 65 64 22 2c 0a  qlite_memused",.
1eed0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
1eee0 6c 69 74 65 33 5f 6d 65 6d 55 73 65 64 2c 20 54  lite3_memUsed, T
1eef0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 20 7c 20 54 43  CL_LINK_INT | TC
1ef00 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59  L_LINK_READ_ONLY
1ef10 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
1ef20 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
1ef30 5f 6d 65 6d 6d 61 78 22 2c 0a 20 20 20 20 20 20  _memmax",.      
1ef40 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
1ef50 6d 65 6d 4d 61 78 2c 20 54 43 4c 5f 4c 49 4e 4b  memMax, TCL_LINK
1ef60 5f 49 4e 54 20 7c 20 54 43 4c 5f 4c 49 4e 4b 5f  _INT | TCL_LINK_
1ef70 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64  READ_ONLY);.#end
1ef80 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
1ef90 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
1efa0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
1efb0 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e  rp, "sqlite_open
1efc0 74 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  temp_count",.   
1efd0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
1efe0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
1eff0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
1f000 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c  ;.#endif.  Tcl_L
1f010 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
1f020 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
1f030 6e 64 5f 76 61 6c 75 65 22 2c 0a 20 20 20 20 20  nd_value",.     
1f040 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f   (char*)&sqlite_
1f050 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
1f060 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  e, TCL_LINK_STRI
1f070 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NG);.  Tcl_LinkV
1f080 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
1f090 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e  te_static_bind_n
1f0a0 62 79 74 65 22 2c 0a 20 20 20 20 20 20 28 63 68  byte",.      (ch
1f0b0 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74  ar*)&sqlite_stat
1f0c0 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 54  ic_bind_nbyte, T
1f0d0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
1f0e0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
1f0f0 72 70 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  rp, "sqlite_temp
1f100 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20 20  _directory",.   
1f110 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
1f120 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
1f130 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  y, TCL_LINK_STRI
1f140 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NG);.  Tcl_LinkV
1f150 61 72 28 69 6e 74 65 72 70 2c 20 22 62 69 74 6d  ar(interp, "bitm
1f160 61 73 6b 5f 73 69 7a 65 22 2c 0a 20 20 20 20 20  ask_size",.     
1f170 20 28 63 68 61 72 2a 29 26 62 69 74 6d 61 73 6b   (char*)&bitmask
1f180 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  _size, TCL_LINK_
1f190 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41  INT|TCL_LINK_REA
1f1a0 44 5f 4f 4e 4c 59 29 3b 0a 23 69 66 20 4f 53 5f  D_ONLY);.#if OS_
1f1b0 55 4e 49 58 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  UNIX.  Tcl_LinkV
1f1c0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
1f1d0 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a  te_sync_count",.
1f1e0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
1f1f0 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
1f200 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
1f210 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
1f220 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66  nterp, "sqlite_f
1f230 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a  ullsync_count",.
1f240 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
1f250 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1f260 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
1f270 4e 54 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  NT);.#endif /* O
1f280 53 5f 55 4e 49 58 20 2a 2f 0a 0a 20 20 72 65 74  S_UNIX */..  ret
1f290 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a        urn TCL_OK;.}.