/ Hex Artifact Content
Login

Artifact 64912c1e65bdc3eccf3b80c5cc092b163831b367:


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 38 32 20 32 30 30 38 2f 30 31 2f 31   1.282 2008/01/1
0240: 36 20 31 37 3a 34 36 3a 33 38 20 64 72 68 20 45  6 17:46:38 drh E
0250: 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  xp $.*/.#include
0260: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0270: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
0280: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
0290: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
02a0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  ring.h>../*.** T
02b0: 68 69 73 20 69 73 20 61 20 63 6f 70 79 20 6f 66  his is a copy of
02c0: 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
02d0: 6f 66 20 74 68 65 20 53 71 6c 69 74 65 44 62 20  of the SqliteDb 
02e0: 73 74 72 75 63 74 75 72 65 20 69 6e 20 0a 2a 2a  structure in .**
02f0: 20 74 63 6c 73 71 6c 69 74 65 2e 63 2e 20 20 57   tclsqlite.c.  W
0300: 65 20 6e 65 65 64 20 69 74 20 68 65 72 65 20 73  e need it here s
0310: 6f 20 74 68 61 74 20 74 68 65 20 67 65 74 5f 73  o that the get_s
0320: 71 6c 69 74 65 5f 70 6f 69 6e 74 65 72 20 72 6f  qlite_pointer ro
0330: 75 74 69 6e 65 0a 2a 2a 20 63 61 6e 20 65 78 74  utine.** can ext
0340: 72 61 63 74 20 74 68 65 20 73 71 6c 69 74 65 33  ract the sqlite3
0350: 2a 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 61  * pointer from a
0360: 6e 20 65 78 69 73 74 69 6e 67 20 54 63 6c 20 53  n existing Tcl S
0370: 51 4c 69 74 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  QLite.** connect
0380: 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ion..*/.struct S
0390: 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69  qliteDb {.  sqli
03a0: 74 65 33 20 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 0a  te3 *db;.};../*.
03b0: 2a 2a 20 43 6f 6e 76 65 72 74 20 74 65 78 74 20  ** Convert text 
03c0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
03d0: 20 22 25 70 22 20 63 6f 6e 76 65 72 73 69 6f 6e   "%p" conversion
03e0: 20 66 6f 72 6d 61 74 20 62 61 63 6b 20 69 6e 74   format back int
03f0: 6f 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 2e 0a  o.** a pointer..
0400: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
0410: 73 74 48 65 78 54 6f 49 6e 74 28 69 6e 74 20 68  stHexToInt(int h
0420: 29 7b 0a 20 20 69 66 28 20 68 3e 3d 27 30 27 20  ){.  if( h>='0' 
0430: 26 26 20 68 3c 3d 27 39 27 20 29 7b 0a 20 20 20  && h<='9' ){.   
0440: 20 72 65 74 75 72 6e 20 68 20 2d 20 27 30 27 3b   return h - '0';
0450: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3e 3d  .  }else if( h>=
0460: 27 61 27 20 26 26 20 68 3c 3d 27 66 27 20 29 7b  'a' && h<='f' ){
0470: 0a 20 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20  .    return h - 
0480: 27 61 27 20 2b 20 31 30 3b 0a 20 20 7d 65 6c 73  'a' + 10;.  }els
0490: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 68  e{.    assert( h
04a0: 3e 3d 27 41 27 20 26 26 20 68 3c 3d 27 46 27 20  >='A' && h<='F' 
04b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 20  );.    return h 
04c0: 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 7d 0a  - 'A' + 10;.  }.
04d0: 7d 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 54  }.void *sqlite3T
04e0: 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74 20 63  extToPtr(const c
04f0: 68 61 72 20 2a 7a 29 7b 0a 20 20 76 6f 69 64 20  har *z){.  void 
0500: 2a 70 3b 0a 20 20 75 36 34 20 76 3b 0a 20 20 75  *p;.  u64 v;.  u
0510: 33 32 20 76 32 3b 0a 20 20 69 66 28 20 7a 5b 30  32 v2;.  if( z[0
0520: 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='0' && z[1]==
0530: 27 78 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  'x' ){.    z += 
0540: 32 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 30 3b 0a  2;.  }.  v = 0;.
0550: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
0560: 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20     v = (v<<4) + 
0570: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 2a 7a 29  testHexToInt(*z)
0580: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    z++;.  }. 
0590: 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d   if( sizeof(p)==
05a0: 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20 20  sizeof(v) ){.   
05b0: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76 2c 20   memcpy(&p, &v, 
05c0: 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65  sizeof(p));.  }e
05d0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
05e0: 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65   sizeof(p)==size
05f0: 6f 66 28 76 32 29 20 29 3b 0a 20 20 20 20 76 32  of(v2) );.    v2
0600: 20 3d 20 28 75 33 32 29 76 3b 0a 20 20 20 20 6d   = (u32)v;.    m
0610: 65 6d 63 70 79 28 26 70 2c 20 26 76 32 2c 20 73  emcpy(&p, &v2, s
0620: 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 0a 20  izeof(p));.  }. 
0630: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
0640: 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
0650: 6e 64 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  nd that returns 
0660: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0670: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
0680: 65 72 0a 2a 2a 20 66 6f 72 20 61 6e 20 73 71 6c  er.** for an sql
0690: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ite connection i
06a0: 6e 73 74 61 6e 63 65 2e 20 20 42 61 64 20 74 68  nstance.  Bad th
06b0: 69 6e 67 73 20 68 61 70 70 65 6e 20 69 66 20 74  ings happen if t
06c0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e  he.** input is n
06d0: 6f 74 20 61 6e 20 73 71 6c 69 74 65 20 63 6f 6e  ot an sqlite con
06e0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
06f0: 69 63 20 69 6e 74 20 67 65 74 5f 73 71 6c 69 74  ic int get_sqlit
0700: 65 5f 70 6f 69 6e 74 65 72 28 0a 20 20 76 6f 69  e_pointer(.  voi
0710: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
0720: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0730: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
0740: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
0750: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
0760: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0770: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0780: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72   cmdInfo;.  char
0790: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
07a0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
07b0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
07c0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
07d0: 76 2c 20 22 53 51 4c 49 54 45 2d 43 4f 4e 4e 45  v, "SQLITE-CONNE
07e0: 43 54 49 4f 4e 22 29 3b 0a 20 20 20 20 72 65 74  CTION");.    ret
07f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0800: 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65   }.  if( !Tcl_Ge
0810: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
0820: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
0830: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
0840: 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
0850: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0860: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
0870: 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20  not found: ",.  
0880: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
0890: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
08a0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
08b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
08c0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 73 74 72  ;.  }.  p = (str
08d0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
08e0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
08f0: 61 74 61 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ata;.  sprintf(z
0900: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
0910: 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  );.  if( strncmp
0920: 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20 29 7b  (zBuf,"0x",2) ){
0930: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
0940: 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e 64 62  f, "0x%p", p->db
0950: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
0960: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0970: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
0980: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
0990: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
09a0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
09b0: 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ite3 object..*/.
09c0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 44 62  static int getDb
09d0: 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65  Pointer(Tcl_Inte
09e0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73  rp *interp, cons
09f0: 74 20 63 68 61 72 20 2a 7a 41 2c 20 73 71 6c 69  t char *zA, sqli
0a00: 74 65 33 20 2a 2a 70 70 44 62 29 7b 0a 20 20 73  te3 **ppDb){.  s
0a10: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0a20: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0a30: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 69 66 28 20   cmdInfo;.  if( 
0a40: 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
0a50: 66 6f 28 69 6e 74 65 72 70 2c 20 7a 41 2c 20 26  fo(interp, zA, &
0a60: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
0a70: 70 20 3d 20 28 73 74 72 75 63 74 20 53 71 6c 69  p = (struct Sqli
0a80: 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62  teDb*)cmdInfo.ob
0a90: 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20  jClientData;.   
0aa0: 20 2a 70 70 44 62 20 3d 20 70 2d 3e 64 62 3b 0a   *ppDb = p->db;.
0ab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
0ac0: 44 62 20 3d 20 28 73 71 6c 69 74 65 33 2a 29 73  Db = (sqlite3*)s
0ad0: 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72 28  qlite3TextToPtr(
0ae0: 7a 41 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  zA);.  }.  retur
0af0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 63 6f  n TCL_OK;.}...co
0b00: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0b10: 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 69  3TestErrorName(i
0b20: 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20  nt rc){.  const 
0b30: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
0b40: 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 26 20  .  switch( rc & 
0b50: 30 78 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65  0xff ){.    case
0b60: 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20   SQLITE_OK:     
0b70: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0b80: 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20  ITE_OK";        
0b90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0ba0: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
0bb0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
0bc0: 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20  LITE_ERROR";    
0bd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0be0: 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20  se SQLITE_PERM: 
0bf0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
0c00: 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20  QLITE_PERM";    
0c10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0c20: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
0c30: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
0c40: 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20  SQLITE_ABORT";  
0c50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0c60: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
0c70: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
0c80: 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20  "SQLITE_BUSY";  
0c90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0ca0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43   case SQLITE_LOC
0cb0: 4b 45 44 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  KED:     zName =
0cc0: 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22   "SQLITE_LOCKED"
0cd0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
0ce0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
0cf0: 4d 45 4d 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  MEM:      zName 
0d00: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22  = "SQLITE_NOMEM"
0d10: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
0d20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
0d30: 45 41 44 4f 4e 4c 59 3a 20 20 20 7a 4e 61 6d 65  EADONLY:   zName
0d40: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
0d50: 4e 4c 59 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  NLY";    break;.
0d60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0d70: 49 4e 54 45 52 52 55 50 54 3a 20 20 7a 4e 61 6d  INTERRUPT:  zNam
0d80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45  e = "SQLITE_INTE
0d90: 52 52 55 50 54 22 3b 20 20 20 62 72 65 61 6b 3b  RRUPT";   break;
0da0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0db0: 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 7a 4e 61  _IOERR:      zNa
0dc0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
0dd0: 52 52 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  RR";       break
0de0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0df0: 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 7a 4e  E_CORRUPT:    zN
0e00: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
0e10: 52 52 55 50 54 22 3b 20 20 20 20 20 62 72 65 61  RRUPT";     brea
0e20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0e30: 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 7a  TE_FULL:       z
0e40: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
0e50: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
0e60: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0e70: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20  ITE_CANTOPEN:   
0e80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0e90: 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 62 72  CANTOPEN";    br
0ea0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0eb0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20  LITE_PROTOCOL:  
0ec0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0ed0: 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 62  _PROTOCOL";    b
0ee0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0ef0: 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20  QLITE_EMPTY:    
0f00: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0f10: 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20  E_EMPTY";       
0f20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0f30: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20  SQLITE_SCHEMA:  
0f40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0f50: 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20  TE_SCHEMA";     
0f60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0f70: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
0f80: 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  NT: zName = "SQL
0f90: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b  ITE_CONSTRAINT";
0fa0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0fb0: 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  e SQLITE_MISMATC
0fc0: 48 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  H:   zName = "SQ
0fd0: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20  LITE_MISMATCH"; 
0fe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0ff0: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  se SQLITE_MISUSE
1000: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
1010: 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20 20  QLITE_MISUSE";  
1020: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1030: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  ase SQLITE_NOLFS
1040: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
1050: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20  SQLITE_NOLFS";  
1060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1070: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48  case SQLITE_AUTH
1080: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
1090: 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20 20  "SQLITE_AUTH";  
10a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52   case SQLITE_FOR
10c0: 4d 41 54 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  MAT:     zName =
10d0: 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22   "SQLITE_FORMAT"
10e0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
10f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41    case SQLITE_RA
1100: 4e 47 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  NGE:      zName 
1110: 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45 22  = "SQLITE_RANGE"
1120: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
1130: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
1140: 4f 57 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  OW:        zName
1150: 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b   = "SQLITE_ROW";
1160: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1170: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1180: 44 4f 4e 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d  DONE:       zNam
1190: 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45  e = "SQLITE_DONE
11a0: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
11b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
11c0: 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 7a 4e 61  _NOTADB:     zNa
11d0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
11e0: 41 44 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b  ADB";      break
11f0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1200: 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20 7a 4e  E_TOOBIG:     zN
1210: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f  ame = "SQLITE_TO
1220: 4f 42 49 47 22 3b 20 20 20 20 20 20 62 72 65 61  OBIG";      brea
1230: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1250: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 55  Name = "SQLITE_U
1260: 6e 6b 6e 6f 77 6e 22 3b 20 20 20 20 20 62 72 65  nknown";     bre
1270: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
1280: 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 64 65 66 69 6e   zName;.}.#defin
1290: 65 20 74 31 45 72 72 6f 72 4e 61 6d 65 20 73 71  e t1ErrorName sq
12a0: 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61  lite3TestErrorNa
12b0: 6d 65 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  me../*.** Conver
12c0: 74 20 61 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d  t an sqlite3_stm
12d0: 74 2a 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74  t* into an sqlit
12e0: 65 33 2a 2e 20 20 54 68 69 73 20 64 65 70 65 6e  e3*.  This depen
12f0: 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 66 61 63  ds on the.** fac
1300: 74 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  t that the sqlit
1310: 65 33 2a 20 69 73 20 74 68 65 20 66 69 72 73 74  e3* is the first
1320: 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 56 64   field in the Vd
1330: 62 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  be structure..*/
1340: 0a 23 64 65 66 69 6e 65 20 53 74 6d 74 54 6f 44  .#define StmtToD
1350: 62 28 58 29 20 20 20 73 71 6c 69 74 65 33 5f 64  b(X)   sqlite3_d
1360: 62 5f 68 61 6e 64 6c 65 28 58 29 0a 0a 2f 2a 0a  b_handle(X)../*.
1370: 2a 2a 20 43 68 65 63 6b 20 61 20 72 65 74 75 72  ** Check a retur
1380: 6e 20 76 61 6c 75 65 20 74 6f 20 6d 61 6b 65 20  n value to make 
1390: 73 75 72 65 20 69 74 20 61 67 72 65 65 73 20 77  sure it agrees w
13a0: 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ith the results.
13b0: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ** from sqlite3_
13c0: 65 72 72 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  errcode..*/.int 
13d0: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
13e0: 64 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  de(Tcl_Interp *i
13f0: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 20 2a  nterp, sqlite3 *
1400: 64 62 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  db, int rc){.  i
1410: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49  f( rc!=SQLITE_MI
1420: 53 55 53 45 20 26 26 20 72 63 21 3d 53 51 4c 49  SUSE && rc!=SQLI
1430: 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33  TE_OK && sqlite3
1440: 5f 65 72 72 63 6f 64 65 28 64 62 29 21 3d 72 63  _errcode(db)!=rc
1450: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
1460: 66 5b 32 30 30 5d 3b 0a 20 20 20 20 69 6e 74 20  f[200];.    int 
1470: 72 32 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  r2 = sqlite3_err
1480: 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 73 70  code(db);.    sp
1490: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 65 72 72  rintf(zBuf, "err
14a0: 6f 72 20 63 6f 64 65 20 25 73 20 28 25 64 29 20  or code %s (%d) 
14b0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 73  does not match s
14c0: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 25  qlite3_errcode %
14d0: 73 20 28 25 64 29 22 2c 0a 20 20 20 20 20 20 20  s (%d)",.       
14e0: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
14f0: 20 72 63 2c 20 74 31 45 72 72 6f 72 4e 61 6d 65   rc, t1ErrorName
1500: 28 72 32 29 2c 20 72 32 29 3b 0a 20 20 20 20 54  (r2), r2);.    T
1510: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
1520: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
1530: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1540: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
1550: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1560: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1570: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
1580: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
1590: 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74  ite3_stmt object
15a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15b0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 0a  getStmtPointer(.
15c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15d0: 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63  terp, .  const c
15e0: 68 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20 73  har *zArg,  .  s
15f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
1600: 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d  Stmt.){.  *ppStm
1610: 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d  t = (sqlite3_stm
1620: 74 2a 29 73 71 6c 69 74 65 33 54 65 78 74 54 6f  t*)sqlite3TextTo
1630: 50 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74  Ptr(zArg);.  ret
1640: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1650: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
1660: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
1670: 69 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ion of a pointer
1680: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 6e 64   that can be und
1690: 65 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68  erstood.** by th
16a0: 65 20 67 65 74 44 62 50 6f 69 6e 74 65 72 20 61  e getDbPointer a
16b0: 6e 64 20 67 65 74 56 6d 50 6f 69 6e 74 65 72 20  nd getVmPointer 
16c0: 72 6f 75 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a  routines above..
16d0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65  **.** The proble
16e0: 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61  m is, on some ma
16f0: 63 68 69 6e 65 73 20 28 53 6f 6c 61 72 69 73 29  chines (Solaris)
1700: 20 69 66 20 79 6f 75 20 64 6f 20 61 20 70 72 69   if you do a pri
1710: 6e 74 66 20 77 69 74 68 0a 2a 2a 20 22 25 70 22  ntf with.** "%p"
1720: 20 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e   you cannot turn
1730: 20 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61   around and do a
1740: 20 73 63 61 6e 66 20 77 69 74 68 20 74 68 65 20   scanf with the 
1750: 73 61 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a  same "%p" and.**
1760: 20 67 65 74 20 79 6f 75 72 20 70 6f 69 6e 74 65   get your pointe
1770: 72 20 62 61 63 6b 2e 20 20 59 6f 75 20 68 61 76  r back.  You hav
1780: 65 20 74 6f 20 70 72 65 70 65 6e 64 20 61 20 22  e to prepend a "
1790: 30 78 22 20 62 65 66 6f 72 65 20 69 74 20 77 69  0x" before it wi
17a0: 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20  ll.** work.  Or 
17b0: 61 74 20 6c 65 61 73 74 20 74 68 61 74 20 69 73  at least that is
17c0: 20 77 68 61 74 20 69 73 20 72 65 70 6f 72 74 65   what is reporte
17d0: 64 20 74 6f 20 6d 65 20 28 64 72 68 29 2e 20 20  d to me (drh).  
17e0: 42 75 74 20 74 68 69 73 0a 2a 2a 20 62 65 68 61  But this.** beha
17f0: 76 69 6f 72 20 76 61 72 69 65 73 20 66 72 6f 6d  vior varies from
1800: 20 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61 63 68   machine to mach
1810: 69 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75 74 69  ine.  The soluti
1820: 6f 6e 20 75 73 65 64 20 68 65 72 20 69 73 0a 2a  on used her is.*
1830: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 74  * to test the st
1840: 72 69 6e 67 20 72 69 67 68 74 20 61 66 74 65 72  ring right after
1850: 20 69 74 20 69 73 20 67 65 6e 65 72 61 74 65 64   it is generated
1860: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61   to see if it ca
1870: 6e 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f  n be.** understo
1880: 6f 64 20 62 79 20 73 63 61 6e 66 2c 20 61 6e 64  od by scanf, and
1890: 20 69 66 20 6e 6f 74 2c 20 74 72 79 20 70 72 65   if not, try pre
18a0: 70 65 6e 64 69 6e 67 20 61 6e 20 22 30 78 22 20  pending an "0x" 
18b0: 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74 68 61  to see if.** tha
18c0: 74 20 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74  t helps.  If not
18d0: 68 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66 61  hing works, a fa
18e0: 74 61 6c 20 65 72 72 6f 72 20 69 73 20 67 65 6e  tal error is gen
18f0: 65 72 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  erated..*/.int s
1900: 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1910: 69 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74  interStr(Tcl_Int
1920: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61  erp *interp, cha
1930: 72 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70  r *zPtr, void *p
1940: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ){.  sqlite3_snp
1950: 72 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c  rintf(100, zPtr,
1960: 20 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74   "%p", p);.  ret
1970: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1980: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63  *.** The callbac
1990: 6b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71  k routine for sq
19a0: 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74  lite3_exec_print
19b0: 66 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f()..*/.static i
19c0: 6e 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  nt exec_printf_c
19d0: 62 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  b(void *pArg, in
19e0: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
19f0: 72 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65  rgv, char **name
1a00: 29 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  ){.  Tcl_DString
1a10: 20 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74   *str = (Tcl_DSt
1a20: 72 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e  ring*)pArg;.  in
1a30: 74 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f  t i;..  if( Tcl_
1a40: 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74  DStringLength(st
1a50: 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  r)==0 ){.    for
1a60: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
1a70: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53  +){.      Tcl_DS
1a80: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
1a90: 6e 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20  nt(str, name[i] 
1aa0: 3f 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c  ? name[i] : "NUL
1ab0: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  L");.    }.  }. 
1ac0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
1ad0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
1ae0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
1af0: 6d 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69  ment(str, argv[i
1b00: 5d 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e  ] ? argv[i] : "N
1b10: 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ULL");.  }.  ret
1b20: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1b30: 54 68 65 20 49 2f 4f 20 74 72 61 63 69 6e 67 20  The I/O tracing 
1b40: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
1b50: 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61 63  tic FILE *iotrac
1b60: 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 73 74 61 74  e_file = 0;.stat
1b70: 69 63 20 76 6f 69 64 20 69 6f 5f 74 72 61 63 65  ic void io_trace
1b80: 5f 63 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  _callback(const 
1b90: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
1ba0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
1bb0: 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
1bc0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 76 66  , zFormat);.  vf
1bd0: 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65 5f 66  printf(iotrace_f
1be0: 69 6c 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  ile, zFormat, ap
1bf0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
1c00: 0a 20 20 66 66 6c 75 73 68 28 69 6f 74 72 61 63  .  fflush(iotrac
1c10: 65 5f 66 69 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e_file);.}../*.*
1c20: 2a 20 55 73 61 67 65 3a 20 20 69 6f 5f 74 72 61  * Usage:  io_tra
1c30: 63 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a  ce FILENAME.**.*
1c40: 2a 20 54 75 72 6e 20 49 2f 4f 20 74 72 61 63 69  * Turn I/O traci
1c50: 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49  ng on or off.  I
1c60: 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20 6e 6f  f FILENAME is no
1c70: 74 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  t an empty strin
1c80: 67 2c 0a 2a 2a 20 49 2f 4f 20 74 72 61 63 69 6e  g,.** I/O tracin
1c90: 67 20 62 65 67 69 6e 73 20 67 6f 69 6e 67 20 69  g begins going i
1ca0: 6e 74 6f 20 46 49 4c 45 4e 41 4d 45 2e 20 49 66  nto FILENAME. If
1cb0: 20 46 49 4c 45 4e 41 4d 45 20 69 73 20 61 6e 20   FILENAME is an 
1cc0: 65 6d 70 74 79 0a 2a 2a 20 73 74 72 69 6e 67 2c  empty.** string,
1cd0: 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 69 73 20   I/O tracing is 
1ce0: 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73  turned off..*/.s
1cf0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 69  tatic int test_i
1d00: 6f 5f 74 72 61 63 65 28 0a 20 20 76 6f 69 64 20  o_trace(.  void 
1d10: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
1d20: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1d30: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1d40: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1d50: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1d60: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
1d70: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1d80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
1d90: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
1da0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
1db0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
1dc0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
1dd0: 7b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  {.  if( argc!=2 
1de0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1df0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1e00: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1e10: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1e20: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  gv[0],.         
1e30: 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20   " FILENAME\"", 
1e40: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1e50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1e60: 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69 6c 65  if( iotrace_file
1e70: 20 29 7b 0a 20 20 20 20 69 66 28 20 69 6f 74 72   ){.    if( iotr
1e80: 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f 75 74  ace_file!=stdout
1e90: 20 26 26 20 69 6f 74 72 61 63 65 5f 66 69 6c 65   && iotrace_file
1ea0: 21 3d 73 74 64 65 72 72 20 29 7b 0a 20 20 20 20  !=stderr ){.    
1eb0: 20 20 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65    fclose(iotrace
1ec0: 5f 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _file);.    }.  
1ed0: 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d    iotrace_file =
1ee0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
1ef0: 69 6f 5f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20  io_trace = 0;.  
1f00: 7d 0a 20 20 69 66 28 20 61 72 67 76 5b 31 5d 5b  }.  if( argv[1][
1f10: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  0] ){.    if( st
1f20: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74  rcmp(argv[1],"st
1f30: 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  dout")==0 ){.   
1f40: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
1f50: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65  = stdout;.    }e
1f60: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
1f70: 72 67 76 5b 31 5d 2c 22 73 74 64 65 72 72 22 29  rgv[1],"stderr")
1f80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74  ==0 ){.      iot
1f90: 72 61 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 65  race_file = stde
1fa0: 72 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rr;.    }else{. 
1fb0: 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c       iotrace_fil
1fc0: 65 20 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31  e = fopen(argv[1
1fd0: 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20  ], "w");.    }. 
1fe0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72     sqlite3_io_tr
1ff0: 61 63 65 20 3d 20 69 6f 5f 74 72 61 63 65 5f 63  ace = io_trace_c
2000: 61 6c 6c 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72  allback;.  }.  r
2010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2020: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
2030: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
2040: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
2050: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
2060: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
2070: 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  te3_exec_printf(
2080: 29 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  ) interface usin
2090: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
20a0: 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20  ase.** DB.  The 
20b0: 53 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e  SQL is the strin
20c0: 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66  g FORMAT.  The f
20d0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f  ormat string sho
20e0: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f  uld contain.** o
20f0: 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54  ne %s or %q.  ST
2100: 52 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75  RING is the valu
2110: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
2120: 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61  %s or %q..*/.sta
2130: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
2140: 63 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64  c_printf(.  void
2150: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
2160: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2170: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2180: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2190: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
21a0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
21b0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
21c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
21d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
21e0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
21f0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
2200: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
2210: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2220: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
2230: 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  str;.  int rc;. 
2240: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
2250: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
2260: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
2270: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
2280: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2290: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
22a0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
22b0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
22c0: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
22d0: 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22  B FORMAT STRING"
22e0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
22f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2300: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2310: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
2320: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
2330: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
2340: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
2350: 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  str);.  zSql = s
2360: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
2370: 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b 33 5d 29  rgv[2], argv[3])
2380: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2390: 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
23a0: 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20  exec_printf_cb, 
23b0: 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20  &str, &zErr);.  
23c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
23d0: 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  l);.  sprintf(zB
23e0: 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20  uf, "%d", rc);. 
23f0: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
2400: 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29  nt(interp, zBuf)
2410: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
2420: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63  ement(interp, rc
2430: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63  ==SQLITE_OK ? Tc
2440: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
2450: 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20  str) : zErr);.  
2460: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
2470: 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72  &str);.  if( zEr
2480: 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
2490: 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  (zErr);.  if( sq
24a0: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
24b0: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
24c0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
24d0: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
24e0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
24f0: 73 61 67 65 3a 20 20 64 62 5f 65 6e 74 65 72 20  sage:  db_enter 
2500: 44 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 62  DB.**         db
2510: 5f 6c 65 61 76 65 20 44 42 0a 2a 2a 0a 2a 2a 20  _leave DB.**.** 
2520: 45 6e 74 65 72 20 6f 72 20 6c 65 61 76 65 20 74  Enter or leave t
2530: 68 65 20 6d 75 74 65 78 20 6f 6e 20 61 20 64 61  he mutex on a da
2540: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2550: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2560: 20 64 62 5f 65 6e 74 65 72 28 0a 20 20 76 6f 69   db_enter(.  voi
2570: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
2580: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2590: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
25a0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
25b0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
25c0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
25d0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
25e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
25f0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
2600: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
2610: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
2620: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
2630: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
2640: 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  b;.  if( argc!=2
2650: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2660: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2670: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2680: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2690: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
26a0: 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
26b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26c0: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
26d0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
26e0: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
26f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2700: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
2710: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
2720: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  x);.  return TCL
2730: 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
2740: 74 20 64 62 5f 6c 65 61 76 65 28 0a 20 20 76 6f  t db_leave(.  vo
2750: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2760: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2770: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2780: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2790: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
27a0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
27b0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
27c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
27d0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
27e0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
27f0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2800: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2810: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2820: 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
2830: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
2840: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2850: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2860: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
2870: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
2880: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
2890: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
28b0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
28c0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
28d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28e0: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  R;.  sqlite3_mut
28f0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
2900: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ex);.  return TC
2910: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2920: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
2930: 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a  xec  DB  SQL.**.
2940: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
2950: 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72  lite3_exec inter
2960: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
2970: 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 0a  pen database DB.
2980: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
2990: 73 74 5f 65 78 65 63 28 0a 20 20 76 6f 69 64 20  st_exec(.  void 
29a0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
29b0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
29c0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
29d0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
29e0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
29f0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
2a00: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2a10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2a20: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
2a30: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
2a40: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
2a50: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
2a60: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
2a70: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
2a80: 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  tr;.  int rc;.  
2a90: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
2aa0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2ab0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72  int i, j;.  char
2ac0: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
2ad0: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
2ae0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2af0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2b00: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2b10: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2b20: 0a 20 20 20 20 20 20 20 22 20 44 42 20 53 51 4c  .       " DB SQL
2b30: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2b40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2b50: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2b60: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
2b70: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
2b80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2b90: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
2ba0: 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  &str);.  zSql = 
2bb0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2bc0: 22 25 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  "%s", argv[2]);.
2bd0: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53 71    for(i=j=0; zSq
2be0: 6c 5b 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28 20  l[i];){.    if( 
2bf0: 7a 53 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a  zSql[i]=='%' ){.
2c00: 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
2c10: 3d 20 28 74 65 73 74 48 65 78 54 6f 49 6e 74 28  = (testHexToInt(
2c20: 7a 53 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b  zSql[i+1])<<4) +
2c30: 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53   testHexToInt(zS
2c40: 71 6c 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20  ql[i+2]);.      
2c50: 69 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73  i += 3;.    }els
2c60: 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  e{.      zSql[j+
2c70: 2b 5d 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a  +] = zSql[i++];.
2c80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c      }.  }.  zSql
2c90: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  [j] = 0;.  rc = 
2ca0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
2cb0: 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e   zSql, exec_prin
2cc0: 74 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45  tf_cb, &str, &zE
2cd0: 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  rr);.  sqlite3_f
2ce0: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72  ree(zSql);.  spr
2cf0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
2d00: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
2d10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2d20: 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
2d30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2d40: 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  erp, rc==SQLITE_
2d50: 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67  OK ? Tcl_DString
2d60: 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45  Value(&str) : zE
2d70: 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  rr);.  Tcl_DStri
2d80: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
2d90: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
2da0: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
2db0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
2dc0: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
2dd0: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
2de0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
2df0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2e00: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2e10: 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 20 20 44  lite3_exec_nr  D
2e20: 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76  B  SQL.**.** Inv
2e30: 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  oke the sqlite3_
2e40: 65 78 65 63 20 69 6e 74 65 72 66 61 63 65 20 75  exec interface u
2e50: 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64 61  sing the open da
2e60: 74 61 62 61 73 65 20 44 42 2e 20 20 44 69 73 63  tabase DB.  Disc
2e70: 61 72 64 0a 2a 2a 20 61 6c 6c 20 72 65 73 75 6c  ard.** all resul
2e80: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts.*/.static int
2e90: 20 74 65 73 74 5f 65 78 65 63 5f 6e 72 28 0a 20   test_exec_nr(. 
2ea0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
2eb0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2ec0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2ed0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2ee0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2ef0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2f00: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
2f10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2f20: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2f30: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
2f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
2f50: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
2f60: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
2f70: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
2f80: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
2f90: 30 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  0;.  if( argc!=3
2fa0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2fb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2fc0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2fd0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2fe0: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2ff0: 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20  " DB SQL", 0);. 
3000: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3010: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
3020: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
3030: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
3040: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
3050: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
3060: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61 72  ite3_exec(db, ar
3070: 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 26 7a 45  gv[2], 0, 0, &zE
3080: 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rr);.  if( sqlit
3090: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
30a0: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
30b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
30c0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
30d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
30e0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
30f0: 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53 45 50 41  ntf_z_test  SEPA
3100: 52 41 54 4f 52 20 20 41 52 47 30 20 20 41 52 47  RATOR  ARG0  ARG
3110: 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  1 ....**.** Test
3120: 20 74 68 65 20 25 7a 20 66 6f 72 6d 61 74 20 6f   the %z format o
3130: 66 20 73 71 6c 69 74 65 4d 50 72 69 6e 74 66 28  f sqliteMPrintf(
3140: 29 2e 20 20 55 73 65 20 6d 75 6c 74 69 70 6c 65  ).  Use multiple
3150: 20 6d 70 72 69 6e 74 66 28 29 20 63 61 6c 6c 73   mprintf() calls
3160: 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63 61 74 65 6e   to .** concaten
3170: 61 74 65 20 61 72 67 30 20 74 68 72 6f 75 67 68  ate arg0 through
3180: 20 61 72 67 6e 20 75 73 69 6e 67 20 73 65 70 61   argn using sepa
3190: 72 61 74 6f 72 20 61 73 20 74 68 65 20 73 65 70  rator as the sep
31a0: 61 72 61 74 6f 72 2e 0a 2a 2a 20 52 65 74 75 72  arator..** Retur
31b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f  n the result..*/
31c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
31d0: 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20 76 6f  _mprintf_z(.  vo
31e0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
31f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3200: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
3210: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
3220: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
3230: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3240: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3250: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3260: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3270: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3280: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3290: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
32a0: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65  /.){.  char *zRe
32b0: 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sult = 0;.  int 
32c0: 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69  i;..  for(i=2; i
32d0: 3c 61 72 67 63 20 26 26 20 28 69 3d 3d 32 20 7c  <argc && (i==2 |
32e0: 7c 20 7a 52 65 73 75 6c 74 29 3b 20 69 2b 2b 29  | zResult); i++)
32f0: 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20  {.    zResult = 
3300: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 30  sqlite3MPrintf(0
3310: 2c 20 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73  , "%z%s%s", zRes
3320: 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72  ult, argv[1], ar
3330: 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63  gv[i]);.  }.  Tc
3340: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3350: 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20  nterp, zResult, 
3360: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
3370: 65 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72  ee(zResult);.  r
3380: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3390: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
33a0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e  qlite3_mprintf_n
33b0: 5f 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a 2a  _test  STRING.**
33c0: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e 20  .** Test the %n 
33d0: 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65  format of sqlite
33e0: 4d 50 72 69 6e 74 66 28 29 2e 20 20 52 65 74 75  MPrintf().  Retu
33f0: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
3400: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73 74   the.** input st
3410: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
3420: 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66  int test_mprintf
3430: 5f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  _n(.  void *NotU
3440: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
3450: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
3460: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
3470: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
3480: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3490: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
34a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
34b0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
34c0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
34d0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
34e0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
34f0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
3500: 68 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e 74  har *zStr;.  int
3510: 20 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20 3d   n = 0;.  zStr =
3520: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
3530: 30 2c 20 22 25 73 25 6e 22 2c 20 61 72 67 76 5b  0, "%s%n", argv[
3540: 31 5d 2c 20 26 6e 29 3b 0a 20 20 73 71 6c 69 74  1], &n);.  sqlit
3550: 65 33 5f 66 72 65 65 28 7a 53 74 72 29 3b 0a 20  e3_free(zStr);. 
3560: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
3570: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
3580: 77 49 6e 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 72  wIntObj(n));.  r
3590: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
35a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
35b0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
35c0: 69 6e 74 20 20 53 49 5a 45 20 46 4f 52 4d 41 54  int  SIZE FORMAT
35d0: 20 20 49 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73 74    INT.**.** Test
35e0: 20 74 68 65 20 6f 66 20 73 71 6c 69 74 65 33 5f   the of sqlite3_
35f0: 73 6e 70 72 69 6e 74 66 28 29 20 72 6f 75 74 69  snprintf() routi
3600: 6e 65 2e 20 20 53 49 5a 45 20 69 73 20 74 68 65  ne.  SIZE is the
3610: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
3620: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
3630: 20 62 79 74 65 73 2e 20 20 54 68 65 20 6d 61 78   bytes.  The max
3640: 69 6d 75 6d 20 73 69 7a 65 20 69 73 20 31 30 30  imum size is 100
3650: 2e 20 20 46 4f 52 4d 41 54 20 69 73 20 74 68 65  .  FORMAT is the
3660: 0a 2a 2a 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  .** format strin
3670: 67 2e 20 20 49 4e 54 20 69 73 20 61 20 73 69 6e  g.  INT is a sin
3680: 67 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  gle integer argu
3690: 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 4d 41  ment.  The FORMA
36a0: 54 0a 2a 2a 20 73 74 72 69 6e 67 20 6d 75 73 74  T.** string must
36b0: 20 72 65 71 75 69 72 65 20 6e 6f 20 6d 6f 72 65   require no more
36c0: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 20 69   than this one i
36d0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e  nteger argument.
36e0: 20 20 49 66 0a 2a 2a 20 59 6f 75 20 70 61 73 73    If.** You pass
36f0: 20 69 6e 20 61 20 66 6f 72 6d 61 74 20 73 74 72   in a format str
3700: 69 6e 67 20 74 68 61 74 20 72 65 71 75 69 72 65  ing that require
3710: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
3720: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61 64  argument,.** bad
3730: 20 74 68 69 6e 67 73 20 77 69 6c 6c 20 68 61 70   things will hap
3740: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pen..*/.static i
3750: 6e 74 20 74 65 73 74 5f 73 6e 70 72 69 6e 74 66  nt test_snprintf
3760: 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  _int(.  void *No
3770: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
3780: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
3790: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
37a0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
37b0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
37c0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37e0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
37f0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
3800: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
3810: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
3820: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
3830: 20 63 68 61 72 20 7a 53 74 72 5b 31 30 30 5d 3b   char zStr[100];
3840: 0a 20 20 69 6e 74 20 6e 20 3d 20 61 74 6f 69 28  .  int n = atoi(
3850: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 63 6f 6e 73  argv[1]);.  cons
3860: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 20  t char *zFormat 
3870: 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 69 6e 74  = argv[2];.  int
3880: 20 61 31 20 3d 20 61 74 6f 69 28 61 72 67 76 5b   a1 = atoi(argv[
3890: 33 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 73 69 7a  3]);.  if( n>siz
38a0: 65 6f 66 28 7a 53 74 72 29 20 29 20 6e 20 3d 20  eof(zStr) ) n = 
38b0: 73 69 7a 65 6f 66 28 7a 53 74 72 29 3b 0a 20 20  sizeof(zStr);.  
38c0: 73 74 72 63 70 79 28 7a 53 74 72 2c 20 22 61 62  strcpy(zStr, "ab
38d0: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
38e0: 73 74 75 76 77 78 79 7a 22 29 3b 0a 20 20 73 71  stuvwxyz");.  sq
38f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
3900: 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d 61 74 2c  , zStr, zFormat,
3910: 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   a1);.  Tcl_Appe
3920: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3930: 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20 72 65 74   zStr, 0);.  ret
3940: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
3950: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
3960: 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70  ite3_get_table_p
3970: 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d 41  rintf  DB  FORMA
3980: 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20  T  STRING.**.** 
3990: 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74  Invoke the sqlit
39a0: 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69  e3_get_table_pri
39b0: 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65 20  ntf() interface 
39c0: 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64  using the open d
39d0: 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20  atabase.** DB.  
39e0: 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20 73  The SQL is the s
39f0: 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54  tring FORMAT.  T
3a00: 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  he format string
3a10: 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
3a20: 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e  ** one %s or %q.
3a30: 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65 20    STRING is the 
3a40: 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69  value inserted i
3a50: 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f  nto %s or %q..*/
3a60: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
3a70: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
3a80: 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  f(.  void *NotUs
3a90: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
3aa0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
3ab0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
3ac0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
3ad0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
3ae0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
3af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3b00: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3b10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
3b20: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
3b30: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
3b40: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
3b50: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c  lite3 *db;.  Tcl
3b60: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
3b70: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
3b80: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zErr = 0;.  int 
3b90: 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63 68  nRow, nCol;.  ch
3ba0: 61 72 20 2a 2a 61 52 65 73 75 6c 74 3b 0a 20 20  ar **aResult;.  
3bb0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42  int i;.  char zB
3bc0: 75 66 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20 2a  uf[30];.  char *
3bd0: 7a 53 71 6c 3b 0a 20 20 69 66 28 20 61 72 67 63  zSql;.  if( argc
3be0: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
3bf0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3c00: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
3c10: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
3c20: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
3c30: 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53     " DB FORMAT S
3c40: 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20  TRING", 0);.    
3c50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3c60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
3c70: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
3c80: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
3c90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3ca0: 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  R;.  Tcl_DString
3cb0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53  Init(&str);.  zS
3cc0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
3cd0: 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 61 72 67  intf(argv[2],arg
3ce0: 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  v[3]);.  rc = sq
3cf0: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28  lite3_get_table(
3d00: 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75  db, zSql, &aResu
3d10: 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c  lt, &nRow, &nCol
3d20: 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c 69  , &zErr);.  sqli
3d30: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
3d40: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
3d50: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
3d60: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
3d70: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
3d80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3d90: 4b 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  K ){.    sprintf
3da0: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 52 6f  (zBuf, "%d", nRo
3db0: 77 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  w);.    Tcl_Appe
3dc0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3dd0: 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 73 70 72  , zBuf);.    spr
3de0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
3df0: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 54 63 6c 5f   nCol);.    Tcl_
3e00: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3e10: 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20  terp, zBuf);.   
3e20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 52 6f   for(i=0; i<(nRo
3e30: 77 2b 31 29 2a 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  w+1)*nCol; i++){
3e40: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
3e50: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3e60: 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20 61 52   aResult[i] ? aR
3e70: 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55 4c 4c  esult[i] : "NULL
3e80: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
3e90: 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  e{.    Tcl_Appen
3ea0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3eb0: 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71   zErr);.  }.  sq
3ec0: 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c 65  lite3_free_table
3ed0: 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69 66 28  (aResult);.  if(
3ee0: 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f   zErr ) sqlite3_
3ef0: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66  free(zErr);.  if
3f00: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
3f10: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
3f20: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
3f30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
3f40: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
3f50: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3f60: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
3f70: 72 6f 77 69 64 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rowid DB.**.** R
3f80: 65 74 75 72 6e 73 20 74 68 65 20 69 6e 74 65 67  eturns the integ
3f90: 65 72 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20  er ROWID of the 
3fa0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
3fb0: 72 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rt..*/.static in
3fc0: 74 20 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69  t test_last_rowi
3fd0: 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  d(.  void *NotUs
3fe0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
3ff0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
4000: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
4010: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
4020: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
4030: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
4040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4050: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
4060: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
4070: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
4080: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
4090: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
40a0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
40b0: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69  r zBuf[30];..  i
40c0: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
40d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
40e0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
40f0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
4100: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
4110: 2c 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20  , " DB\"", 0);. 
4120: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
4130: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
4140: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
4150: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
4160: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4170: 52 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28  RROR;.  sprintf(
4180: 7a 42 75 66 2c 20 22 25 6c 6c 64 22 2c 20 73 71  zBuf, "%lld", sq
4190: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
41a0: 74 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a 20 20  t_rowid(db));.  
41b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
41c0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
41d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
41e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
41f0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
4200: 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a  key DB KEY.**.**
4210: 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 6b   Set the codec k
4220: 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ey..*/.static in
4230: 74 20 74 65 73 74 5f 6b 65 79 28 0a 20 20 76 6f  t test_key(.  vo
4240: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
4250: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4260: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
4270: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
4280: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
4290: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
42a0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
42b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
42c0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
42d0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
42e0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
42f0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
4300: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
4310: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4320: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4330: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4340: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4350: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4360: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4370: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4380: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4390: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
43a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
43b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
43c0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
43d0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
43e0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
43f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
4400: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4410: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4420: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
4430: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c  _HAS_CODEC.  sql
4440: 69 74 65 33 5f 6b 65 79 28 64 62 2c 20 7a 4b 65  ite3_key(db, zKe
4450: 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66  y, nKey);.#endif
4460: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
4470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
4480: 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79  :  sqlite3_rekey
4490: 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 43 68   DB KEY.**.** Ch
44a0: 61 6e 67 65 20 74 68 65 20 63 6f 64 65 63 20 6b  ange the codec k
44b0: 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ey..*/.static in
44c0: 74 20 74 65 73 74 5f 72 65 6b 65 79 28 0a 20 20  t test_rekey(.  
44d0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
44e0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
44f0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
4500: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
4510: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
4520: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
4530: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
4540: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4550: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
4560: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
4570: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
4580: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
4590: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
45a0: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
45b0: 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20  ar *zKey;.  int 
45c0: 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63  nKey;.  if( argc
45d0: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
45e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
45f0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
4600: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
4610: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
4620: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
4630: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4640: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4650: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
4660: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
4670: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
4680: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b   TCL_ERROR;.  zK
4690: 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20  ey = argv[2];.  
46a0: 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b  nKey = strlen(zK
46b0: 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ey);.#ifdef SQLI
46c0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73  TE_HAS_CODEC.  s
46d0: 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 64 62 2c  qlite3_rekey(db,
46e0: 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65   zKey, nKey);.#e
46f0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
4700: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
4710: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63  sage:  sqlite3_c
4720: 6c 6f 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c  lose DB.**.** Cl
4730: 6f 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  oses the databas
4740: 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69  e opened by sqli
4750: 74 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61  te3_open..*/.sta
4760: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 74  tic int sqlite_t
4770: 65 73 74 5f 63 6c 6f 73 65 28 0a 20 20 76 6f 69  est_close(.  voi
4780: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
4790: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
47a0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
47b0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
47c0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
47d0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
47e0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
47f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
4800: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
4810: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
4820: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
4830: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
4840: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
4850: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
4860: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
4870: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4880: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
4890: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
48a0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
48b0: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
48c0: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
48d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
48e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
48f0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
4900: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
4910: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4920: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
4930: 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 54  3_close(db);.  T
4940: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
4950: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
4960: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
4970: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
4980: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4990: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
49a0: 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f 61  ion of the x_coa
49b0: 6c 65 73 63 65 28 29 20 66 75 6e 63 74 69 6f 6e  lesce() function
49c0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
49d0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6e  first argument n
49e0: 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
49f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4a00: 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28 0a   t1_ifnullFunc(.
4a10: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
4a20: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
4a30: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
4a40: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
4a50: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4a60: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
4a70: 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  +){.    if( SQLI
4a80: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
4a90: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
4aa0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  [i]) ){.      in
4ab0: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  t n = sqlite3_va
4ac0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 69  lue_bytes(argv[i
4ad0: 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ]);.      sqlite
4ae0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
4af0: 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73 71  ntext, (char*)sq
4b00: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
4b10: 28 61 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20 20  (argv[i]),.     
4b20: 20 20 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f 54       n, SQLITE_T
4b30: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
4b40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4b50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  }.}../*.** These
4b60: 20 61 72 65 20 74 65 73 74 20 66 75 6e 63 74 69   are test functi
4b70: 6f 6e 73 2e 20 20 20 20 68 65 78 38 28 29 20 69  ons.    hex8() i
4b80: 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61 72  nterprets its ar
4b90: 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54 46  gument as.** UTF
4ba0: 38 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  8 and returns a 
4bb0: 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20 68  hex encoding.  h
4bc0: 65 78 31 36 6c 65 28 29 20 69 6e 74 65 72 70 72  ex16le() interpr
4bd0: 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74  ets its argument
4be0: 0a 2a 2a 20 61 73 20 55 54 46 31 36 6c 65 20 61  .** as UTF16le a
4bf0: 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65 78  nd returns a hex
4c00: 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74   encoding..*/.st
4c10: 61 74 69 63 20 76 6f 69 64 20 68 65 78 38 46 75  atic void hex8Fu
4c20: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
4c30: 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63 2c  xt *p, int argc,
4c40: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4c50: 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20  *argv){.  const 
4c60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
4c70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
4c80: 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 7a  r zBuf[200];.  z
4c90: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4ca0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
4cb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4cc0: 65 6f 66 28 7a 42 75 66 29 2f 32 20 2d 20 32 20  eof(zBuf)/2 - 2 
4cd0: 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  && z[i]; i++){. 
4ce0: 20 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66     sprintf(&zBuf
4cf0: 5b 69 2a 32 5d 2c 20 22 25 30 32 78 22 2c 20 7a  [i*2], "%02x", z
4d00: 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20  [i]&0xff);.  }. 
4d10: 20 7a 42 75 66 5b 69 2a 32 5d 20 3d 20 30 3b 0a   zBuf[i*2] = 0;.
4d20: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4d30: 5f 74 65 78 74 28 70 2c 20 28 63 68 61 72 2a 29  _text(p, (char*)
4d40: 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zBuf, -1, SQLITE
4d50: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23  _TRANSIENT);.}.#
4d60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4d70: 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20  IT_UTF16.static 
4d80: 76 6f 69 64 20 68 65 78 31 36 46 75 6e 63 28 73  void hex16Func(s
4d90: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
4da0: 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  p, int argc, sql
4db0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
4dc0: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  v){.  const unsi
4dd0: 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 2a  gned short int *
4de0: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
4df0: 61 72 20 7a 42 75 66 5b 34 30 30 5d 3b 0a 20 20  ar zBuf[400];.  
4e00: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
4e10: 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d  e_text16(argv[0]
4e20: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
4e30: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 34 20 2d  sizeof(zBuf)/4 -
4e40: 20 34 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29   4 && z[i]; i++)
4e50: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a  {.    sprintf(&z
4e60: 42 75 66 5b 69 2a 34 5d 2c 20 22 25 30 34 78 22  Buf[i*4], "%04x"
4e70: 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20  , z[i]&0xff);.  
4e80: 7d 0a 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d 20  }.  zBuf[i*4] = 
4e90: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  0;.  sqlite3_res
4ea0: 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68 61  ult_text(p, (cha
4eb0: 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c  r*)zBuf, -1, SQL
4ec0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
4ed0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4ee0: 41 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f  A structure into
4ef0: 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d 75   which to accumu
4f00: 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73 74  late text..*/.st
4f10: 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69 6e  ruct dstr {.  in
4f20: 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53 70  t nAlloc;  /* Sp
4f30: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  ace allocated */
4f40: 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20 20  .  int nUsed;   
4f50: 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a 2f  /* Space used */
4f60: 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
4f70: 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f 0a  /* The space */.
4f80: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  };../*.** Append
4f90: 20 74 65 78 74 20 74 6f 20 61 20 64 73 74 72 0a   text to a dstr.
4fa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
4fb0: 73 74 72 41 70 70 65 6e 64 28 73 74 72 75 63 74  strAppend(struct
4fc0: 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74 20   dstr *p, const 
4fd0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69 76  char *z, int div
4fe0: 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  ider){.  int n =
4ff0: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 66   strlen(z);.  if
5000: 28 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20 2b  ( p->nUsed + n +
5010: 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29   2 > p->nAlloc )
5020: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77  {.    char *zNew
5030: 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20  ;.    p->nAlloc 
5040: 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  = p->nAlloc*2 + 
5050: 6e 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e 65  n + 200;.    zNe
5060: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
5070: 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c  loc(p->z, p->nAl
5080: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  loc);.    if( zN
5090: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
50a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
50b0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
50c0: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
50d0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
50e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 20  .    }.    p->z 
50f0: 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66  = zNew;.  }.  if
5100: 28 20 64 69 76 69 64 65 72 20 26 26 20 70 2d 3e  ( divider && p->
5110: 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20 70  nUsed>0 ){.    p
5120: 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20  ->z[p->nUsed++] 
5130: 3d 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a 20  = divider;.  }. 
5140: 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d   memcpy(&p->z[p-
5150: 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31 29  >nUsed], z, n+1)
5160: 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20  ;.  p->nUsed += 
5170: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  n;.}../*.** Invo
5180: 6b 65 64 20 66 6f 72 20 65 61 63 68 20 63 61 6c  ked for each cal
5190: 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74  lback from sqlit
51a0: 65 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73 74  e3ExecFunc.*/.st
51b0: 61 74 69 63 20 69 6e 74 20 65 78 65 63 46 75 6e  atic int execFun
51c0: 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  cCallback(void *
51d0: 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c  pData, int argc,
51e0: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
51f0: 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ar **NotUsed){. 
5200: 20 73 74 72 75 63 74 20 64 73 74 72 20 2a 70 20   struct dstr *p 
5210: 3d 20 28 73 74 72 75 63 74 20 64 73 74 72 2a 29  = (struct dstr*)
5220: 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a  pData;.  int i;.
5230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
5240: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
5250: 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20   argv[i]==0 ){. 
5260: 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64 28       dstrAppend(
5270: 70 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29 3b  p, "NULL", ' ');
5280: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5290: 20 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20    dstrAppend(p, 
52a0: 61 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a 20  argv[i], ' ');. 
52b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
52c0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  n 0;.}../*.** Im
52d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
52e0: 74 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78 65  the x_sqlite_exe
52f0: 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  c() function.  T
5300: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  his function tak
5310: 65 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61  es.** a single a
5320: 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74 65  rgument and atte
5330: 6d 70 74 73 20 74 6f 20 65 78 65 63 75 74 65 20  mpts to execute 
5340: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61 73  that argument as
5350: 20 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54 68   SQL code..** Th
5360: 69 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 6e  is is illegal an
5370: 64 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68 65  d should set the
5380: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 66   SQLITE_MISUSE f
5390: 6c 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61 62  lag on the datab
53a0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d  ase..**.** 2004-
53b0: 4a 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76 65  Jan-07:  We have
53c0: 20 63 68 61 6e 67 65 64 20 74 68 69 73 20 74 6f   changed this to
53d0: 20 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20 74   make it legal t
53e0: 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65  o call sqlite3_e
53f0: 78 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77 69  xec().** from wi
5400: 74 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20  thin a function 
5410: 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54  call.  .** .** T
5420: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d 75  his routine simu
5430: 6c 61 74 65 73 20 74 68 65 20 65 66 66 65 63 74  lates the effect
5440: 20 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20 74   of having two t
5450: 68 72 65 61 64 73 20 61 74 74 65 6d 70 74 20 74  hreads attempt t
5460: 6f 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61 6d  o.** use the sam
5470: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
5480: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a  e same time..*/.
5490: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
54a0: 74 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20 73  te3ExecFunc(.  s
54b0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
54c0: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
54d0: 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65  argc,  .  sqlite
54e0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
54f0: 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72 20  {.  struct dstr 
5500: 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20  x;.  memset(&x, 
5510: 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  0, sizeof(x));. 
5520: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
5530: 78 65 63 28 28 73 71 6c 69 74 65 33 2a 29 73 71  xec((sqlite3*)sq
5540: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
5550: 63 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20 20  context),.      
5560: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
5570: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
5580: 5d 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46 75  ]),.      execFu
5590: 6e 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20  ncCallback, &x, 
55a0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  0);.  sqlite3_re
55b0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
55c0: 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c  t, x.z, x.nUsed,
55d0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
55e0: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  T);.  sqlite3_fr
55f0: 65 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ee(x.z);.}../*.*
5600: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
5610: 20 6f 66 20 74 6b 74 32 32 31 33 66 75 6e 63 28   of tkt2213func(
5620: 29 2c 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63  ), a scalar func
5630: 74 69 6f 6e 20 74 68 61 74 20 74 61 6b 65 73 20  tion that takes 
5640: 65 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20 61  exactly.** one a
5650: 72 67 75 6d 65 6e 74 2e 20 49 74 20 68 61 73 20  rgument. It has 
5660: 74 77 6f 20 69 6e 74 65 72 65 73 74 69 6e 67 20  two interesting 
5670: 66 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20  features:.**.** 
5680: 2a 20 49 74 20 63 61 6c 6c 73 20 73 71 6c 69 74  * It calls sqlit
5690: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 20  e3_value_text() 
56a0: 33 20 74 69 6d 65 73 20 6f 6e 20 74 68 65 20 61  3 times on the a
56b0: 72 67 75 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f  rgument sqlite3_
56c0: 76 61 6c 75 65 2a 2e 0a 2a 2a 20 20 20 49 66 20  value*..**   If 
56d0: 74 68 65 20 74 68 72 65 65 20 70 6f 69 6e 74 65  the three pointe
56e0: 72 73 20 72 65 74 75 72 6e 65 64 20 61 72 65 20  rs returned are 
56f0: 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 6e 20  not the same an 
5700: 53 51 4c 20 65 72 72 6f 72 20 69 73 20 72 61 69  SQL error is rai
5710: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74 68  sed..**.** * Oth
5720: 65 72 77 69 73 65 20 69 74 20 72 65 74 75 72 6e  erwise it return
5730: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
5740: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
5750: 69 6f 6e 20 6f 66 20 69 74 73 20 0a 2a 2a 20 20  ion of its .**  
5760: 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 75 63   argument in suc
5770: 68 20 61 20 77 61 79 20 61 73 20 74 68 65 20 56  h a way as the V
5780: 44 42 45 20 72 65 70 72 65 73 65 6e 74 61 74 69  DBE representati
5790: 6f 6e 20 69 73 20 61 20 4d 65 6d 2a 20 63 65 6c  on is a Mem* cel
57a0: 6c 20 0a 2a 2a 20 20 20 77 69 74 68 20 74 68 65  l .**   with the
57b0: 20 4d 45 4d 5f 54 65 72 6d 20 66 6c 61 67 20 63   MEM_Term flag c
57c0: 6c 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 69 63  lear. .**.** Tic
57d0: 6b 65 74 20 23 32 32 31 33 20 63 61 6e 20 74 68  ket #2213 can th
57e0: 65 72 65 66 6f 72 65 20 62 65 20 74 65 73 74 65  erefore be teste
57f0: 64 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67 20  d by evaluating 
5800: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
5810: 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 3a   SQL expression:
5820: 0a 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32 32 31 33  .**.**   tkt2213
5830: 66 75 6e 63 28 74 6b 74 32 32 31 33 66 75 6e 63  func(tkt2213func
5840: 28 27 61 20 73 74 72 69 6e 67 27 29 29 3b 0a 2a  ('a string'));.*
5850: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6b  /.static void tk
5860: 74 32 32 31 33 46 75 6e 63 74 69 6f 6e 28 0a 20  t2213Function(. 
5870: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
5880: 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e   *context, .  in
5890: 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69  t argc,  .  sqli
58a0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
58b0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 54 65 78 74 3b  .){.  int nText;
58c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
58d0: 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 31 3b 0a   const *zText1;.
58e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
58f0: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 32 3b 0a 20  const *zText2;. 
5900: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
5910: 6f 6e 73 74 20 2a 7a 54 65 78 74 33 3b 0a 0a 20  onst *zText3;.. 
5920: 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33   nText = sqlite3
5930: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
5940: 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 31 20  v[0]);.  zText1 
5950: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
5960: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
5970: 20 7a 54 65 78 74 32 20 3d 20 73 71 6c 69 74 65   zText2 = sqlite
5980: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
5990: 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 33 20  v[0]);.  zText3 
59a0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
59b0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 0a  text(argv[0]);..
59c0: 20 20 69 66 28 20 7a 54 65 78 74 31 21 3d 7a 54    if( zText1!=zT
59d0: 65 78 74 32 20 7c 7c 20 7a 54 65 78 74 32 21 3d  ext2 || zText2!=
59e0: 7a 54 65 78 74 33 20 29 7b 0a 20 20 20 20 73 71  zText3 ){.    sq
59f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
5a00: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 74 6b 74  or(context, "tkt
5a10: 32 32 31 33 20 69 73 20 6e 6f 74 20 66 69 78 65  2213 is not fixe
5a20: 64 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  d", -1);.  }else
5a30: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70  {.    char *zCop
5a40: 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  y = (char *)sqli
5a50: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 65 78 74  te3_malloc(nText
5a60: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43  );.    memcpy(zC
5a70: 6f 70 79 2c 20 7a 54 65 78 74 31 2c 20 6e 54 65  opy, zText1, nTe
5a80: 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xt);.    sqlite3
5a90: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
5aa0: 74 65 78 74 2c 20 7a 43 6f 70 79 2c 20 6e 54 65  text, zCopy, nTe
5ab0: 78 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  xt, sqlite3_free
5ac0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5ad0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51  The following SQ
5ae0: 4c 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73  L function takes
5af0: 20 34 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54   4 arguments.  T
5b00: 68 65 20 32 6e 64 20 61 6e 64 0a 2a 2a 20 34 74  he 2nd and.** 4t
5b10: 68 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  h argument must 
5b20: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  be one of these 
5b30: 73 74 72 69 6e 67 73 3a 20 20 27 74 65 78 74 27  strings:  'text'
5b40: 2c 20 27 74 65 78 74 31 36 27 2c 0a 2a 2a 20 6f  , 'text16',.** o
5b50: 72 20 27 62 6c 6f 62 27 20 63 6f 72 72 65 73 70  r 'blob' corresp
5b60: 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 20 66 75  onding to API fu
5b70: 6e 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 20 20  nctions.**.**   
5b80: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
5b90: 5f 74 65 78 74 28 29 0a 2a 2a 20 20 20 20 20 20  _text().**      
5ba0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
5bb0: 78 74 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 73  xt16().**      s
5bc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
5bd0: 62 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68  b().**.** The th
5be0: 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ird argument is 
5bf0: 61 20 73 74 72 69 6e 67 2c 20 65 69 74 68 65 72  a string, either
5c00: 20 27 62 79 74 65 73 27 20 6f 72 20 27 62 79 74   'bytes' or 'byt
5c10: 65 73 31 36 27 20 6f 72 20 27 6e 6f 6f 70 27 2c  es16' or 'noop',
5c20: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
5c30: 67 20 74 6f 20 41 50 49 73 3a 0a 2a 2a 0a 2a 2a  g to APIs:.**.**
5c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
5c50: 6c 75 65 5f 62 79 74 65 73 28 29 0a 2a 2a 20 20  lue_bytes().**  
5c60: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
5c70: 65 5f 62 79 74 65 73 31 36 28 29 0a 2a 2a 20 20  e_bytes16().**  
5c80: 20 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20 54      noop.**.** T
5c90: 68 65 20 41 50 49 73 20 64 65 73 69 67 6e 61 74  he APIs designat
5ca0: 65 64 20 62 79 20 74 68 65 20 32 6e 64 20 74 68  ed by the 2nd th
5cb0: 72 6f 75 67 68 20 34 74 68 20 61 72 67 75 6d 65  rough 4th argume
5cc0: 6e 74 73 20 61 72 65 20 61 70 70 6c 69 65 64 0a  nts are applied.
5cd0: 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
5ce0: 61 72 67 75 6d 65 6e 74 20 69 6e 20 6f 72 64 65  argument in orde
5cf0: 72 2e 20 20 49 66 20 74 68 65 20 70 6f 69 6e 74  r.  If the point
5d00: 65 72 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ers returned by 
5d10: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 6e  the.** second an
5d20: 64 20 66 6f 75 72 74 68 20 61 72 65 20 64 69 66  d fourth are dif
5d30: 66 65 72 65 6e 74 2c 20 74 68 69 73 20 72 6f 75  ferent, this rou
5d40: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 20  tine returns 1. 
5d50: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74   Otherwise,.** t
5d60: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
5d70: 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rns 0..**.** Thi
5d80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
5d90: 65 64 20 74 6f 20 74 65 73 74 20 74 6f 20 73 65  ed to test to se
5da0: 65 20 77 68 65 6e 20 72 65 74 75 72 6e 65 64 20  e when returned 
5db0: 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d 0a 2a 2a  pointers from.**
5dc0: 20 74 68 65 20 5f 74 65 78 74 28 29 2c 20 5f 74   the _text(), _t
5dd0: 65 78 74 31 36 28 29 20 61 6e 64 20 5f 62 6c 6f  ext16() and _blo
5de0: 62 28 29 20 41 50 49 73 20 62 65 63 6f 6d 65 20  b() APIs become 
5df0: 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
5e00: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 43  static void ptrC
5e10: 68 6e 67 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  hngFunction(.  s
5e20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5e30: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
5e40: 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65  argc,  .  sqlite
5e50: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5e60: 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  {.  const void *
5e70: 70 31 2c 20 2a 70 32 3b 0a 20 20 63 6f 6e 73 74  p1, *p2;.  const
5e80: 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69   char *zCmd;.  i
5e90: 66 28 20 61 72 67 63 21 3d 34 20 29 20 72 65 74  f( argc!=4 ) ret
5ea0: 75 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d 20 28 63  urn;.  zCmd = (c
5eb0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
5ec0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5ed0: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 43  gv[1]);.  if( zC
5ee0: 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  md==0 ) return;.
5ef0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d    if( strcmp(zCm
5f00: 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a  d,"text")==0 ){.
5f10: 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20      p1 = (const 
5f20: 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61  void*)sqlite3_va
5f30: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
5f40: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
5f50: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d  E_OMIT_UTF16.  }
5f60: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
5f70: 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29 3d  zCmd, "text16")=
5f80: 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28  =0 ){.    p1 = (
5f90: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
5fa0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
5fb0: 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69  (argv[0]);.#endi
5fc0: 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  f.  }else if( st
5fd0: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62  rcmp(zCmd, "blob
5fe0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20  ")==0 ){.    p1 
5ff0: 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73  = (const void*)s
6000: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
6010: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65  b(argv[0]);.  }e
6020: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  lse{.    return;
6030: 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63  .  }.  zCmd = (c
6040: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
6050: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
6060: 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 43  gv[2]);.  if( zC
6070: 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  md==0 ) return;.
6080: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d    if( strcmp(zCm
6090: 64 2c 22 62 79 74 65 73 22 29 3d 3d 30 20 29 7b  d,"bytes")==0 ){
60a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
60b0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
60c0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
60d0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d  E_OMIT_UTF16.  }
60e0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
60f0: 7a 43 6d 64 2c 20 22 62 79 74 65 73 31 36 22 29  zCmd, "bytes16")
6100: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6110: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36  e3_value_bytes16
6120: 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69  (argv[0]);.#endi
6130: 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  f.  }else if( st
6140: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f 6f 70  rcmp(zCmd, "noop
6150: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ")==0 ){.    /* 
6160: 64 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  do nothing */.  
6170: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
6180: 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20  n;.  }.  zCmd = 
6190: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
61a0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
61b0: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  argv[3]);.  if( 
61c0: 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e  zCmd==0 ) return
61d0: 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ;.  if( strcmp(z
61e0: 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29  Cmd,"text")==0 )
61f0: 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73  {.    p2 = (cons
6200: 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  t void*)sqlite3_
6210: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6220: 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0]);.#ifndef SQL
6230: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
6240: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
6250: 70 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22  p(zCmd, "text16"
6260: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d  )==0 ){.    p2 =
6270: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
6280: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6290: 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e  16(argv[0]);.#en
62a0: 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  dif.  }else if( 
62b0: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c  strcmp(zCmd, "bl
62c0: 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ob")==0 ){.    p
62d0: 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  2 = (const void*
62e0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
62f0: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  lob(argv[0]);.  
6300: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
6310: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
6320: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
6330: 65 78 74 2c 20 70 31 21 3d 70 32 29 3b 0a 7d 0a  ext, p1!=p2);.}.
6340: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
6350: 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 72 65 61  sqlite_test_crea
6360: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 0a 2a  te_function DB.*
6370: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
6380: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6390: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
63a0: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
63b0: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
63c0: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
63d0: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 61 6c 65 73   named "x_coales
63e0: 63 65 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ce".  This funct
63f0: 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d  ion does the sam
6400: 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68  e thing.** as th
6410: 65 20 22 63 6f 61 6c 65 73 63 65 22 20 66 75 6e  e "coalesce" fun
6420: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
6430: 63 74 69 6f 6e 20 61 6c 73 6f 20 72 65 67 69 73  ction also regis
6440: 74 65 72 73 20 61 6e 20 53 51 4c 20 66 75 6e 63  ters an SQL func
6450: 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64 20 22 78  tion.** named "x
6460: 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 20 74 68  _sqlite_exec" th
6470: 61 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  at invokes sqlit
6480: 65 33 5f 65 78 65 63 28 29 2e 20 20 49 6e 76 6f  e3_exec().  Invo
6490: 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 65 78 65  king sqlite3_exe
64a0: 63 28 29 0a 2a 2a 20 69 6e 20 74 68 69 73 20 77  c().** in this w
64b0: 61 79 20 69 73 20 69 6c 6c 65 67 61 6c 20 72 65  ay is illegal re
64c0: 63 75 72 73 69 6f 6e 20 61 6e 64 20 73 68 6f 75  cursion and shou
64d0: 6c 64 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49  ld raise an SQLI
64e0: 54 45 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 2e  TE_MISUSE error.
64f0: 0a 2a 2a 20 54 68 65 20 65 66 66 65 63 74 20 69  .** The effect i
6500: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 72 79  s similar to try
6510: 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 73  ing to use the s
6520: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
6530: 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20  nection from.** 
6540: 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 20 74  two threads at t
6550: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a  he same time..**
6560: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
6570: 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20   motivation for 
6580: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
6590: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63   to be able to c
65a0: 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  all the.** sqlit
65b0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
65c0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  on function whil
65d0: 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20  e a query is in 
65e0: 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65  progress in orde
65f0: 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  r.** to test the
6600: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64   SQLITE_MISUSE d
6610: 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a  etection logic..
6620: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
6630: 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
6640: 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  on(.  void *NotU
6650: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
6660: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
6670: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
6680: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
6690: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
66a0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
66b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
66c0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
66d0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
66e0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
66f0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
6700: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
6710: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
6720: 20 2a 64 62 3b 0a 20 20 65 78 74 65 72 6e 20 76   *db;.  extern v
6730: 6f 69 64 20 4d 64 35 5f 52 65 67 69 73 74 65 72  oid Md5_Register
6740: 28 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 20 20 69  (sqlite3*);..  i
6750: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
6760: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
6770: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
6780: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
6790: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
67a0: 2c 0a 20 20 20 20 20 20 20 22 20 44 42 5c 22 22  ,.       " DB\""
67b0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
67c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
67d0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
67e0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
67f0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
6800: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
6810: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
6820: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
6830: 22 78 5f 63 6f 61 6c 65 73 63 65 22 2c 20 2d 31  "x_coalesce", -1
6840: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
6850: 20 0a 20 20 20 20 20 20 20 20 74 31 5f 69 66 6e   .        t1_ifn
6860: 75 6c 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  ullFunc, 0, 0);.
6870: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6880: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
6890: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
68a0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78  unction(db, "hex
68b0: 38 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e  8", 1, SQLITE_AN
68c0: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  Y, 0, .         
68d0: 20 68 65 78 38 46 75 6e 63 2c 20 30 2c 20 30 29   hex8Func, 0, 0)
68e0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
68f0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
6900: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6910: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
6920: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
6930: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78  unction(db, "hex
6940: 31 36 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41  16", 1, SQLITE_A
6950: 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  NY, 0, .        
6960: 20 20 68 65 78 31 36 46 75 6e 63 2c 20 30 2c 20    hex16Func, 0, 
6970: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
6980: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6990: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
69a0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
69b0: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 6b 74 32  nction(db, "tkt2
69c0: 32 31 33 66 75 6e 63 22 2c 20 31 2c 20 53 51 4c  213func", 1, SQL
69d0: 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20  ITE_ANY, 0, .   
69e0: 20 20 20 20 20 20 20 74 6b 74 32 32 31 33 46 75         tkt2213Fu
69f0: 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20  nction, 0, 0);. 
6a00: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
6a10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
6a20: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
6a30: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
6a40: 70 6f 69 6e 74 65 72 5f 63 68 61 6e 67 65 22 2c  pointer_change",
6a50: 20 34 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20   4, SQLITE_ANY, 
6a60: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 74  0, .          pt
6a70: 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e 2c 20 30  rChngFunction, 0
6a80: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  , 0);.  }..#ifnd
6a90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
6aa0: 54 46 31 36 0a 20 20 2f 2a 20 55 73 65 20 74 68  TF16.  /* Use th
6ab0: 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  e sqlite3_create
6ac0: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 29 20 41 50  _function16() AP
6ad0: 49 20 68 65 72 65 2e 20 4d 61 69 6e 6c 79 20 66  I here. Mainly f
6ae0: 6f 72 20 66 75 6e 2c 20 62 75 74 20 61 6c 73 6f  or fun, but also
6af0: 20 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69   .  ** because i
6b00: 74 20 69 73 20 6e 6f 74 20 74 65 73 74 65 64 20  t is not tested 
6b10: 61 6e 79 77 68 65 72 65 20 65 6c 73 65 2e 20 2a  anywhere else. *
6b20: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
6b30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
6b40: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
6b50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
6b60: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
6b70: 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d  tex);.    pVal =
6b80: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
6b90: 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
6ba0: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
6bb0: 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c 69 74 65  l, -1, "x_sqlite
6bc0: 5f 65 78 65 63 22 2c 20 53 51 4c 49 54 45 5f 55  _exec", SQLITE_U
6bd0: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
6be0: 49 43 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  IC);.    if( db-
6bf0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
6c00: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6c10: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
6c20: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
6c30: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
6c40: 75 6e 63 74 69 6f 6e 31 36 28 64 62 2c 20 0a 20  unction16(db, . 
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
6c60: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
6c70: 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  al, SQLITE_UTF16
6c80: 4e 41 54 49 56 45 29 2c 0a 20 20 20 20 20 20 20  NATIVE),.       
6c90: 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45         1, SQLITE
6ca0: 5f 55 54 46 31 36 2c 20 64 62 2c 20 73 71 6c 69  _UTF16, db, sqli
6cb0: 74 65 33 45 78 65 63 46 75 6e 63 2c 20 30 2c 20  te3ExecFunc, 0, 
6cc0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
6cd0: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
6ce0: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
6cf0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
6d00: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65  ->mutex);.  }.#e
6d10: 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69  ndif..  if( sqli
6d20: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
6d30: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
6d40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6d50: 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  R;.  Tcl_SetResu
6d60: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
6d70: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
6d80: 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
6d90: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
6da0: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d  * Routines to im
6db0: 70 6c 65 6d 65 6e 74 20 74 68 65 20 78 5f 63 6f  plement the x_co
6dc0: 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65 20  unt() aggregate 
6dd0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
6de0: 78 5f 63 6f 75 6e 74 28 29 20 63 6f 75 6e 74 73  x_count() counts
6df0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
6e00: 6f 6e 2d 6e 75 6c 6c 20 61 72 67 75 6d 65 6e 74  on-null argument
6e10: 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  s.  But there ar
6e20: 65 0a 2a 2a 20 73 6f 6d 65 20 74 77 69 73 74 73  e.** some twists
6e30: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
6e40: 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  poses..**.** If 
6e50: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
6e60: 78 5f 63 6f 75 6e 74 28 29 20 69 73 20 34 30 20  x_count() is 40 
6e70: 74 68 65 6e 20 61 20 55 54 46 2d 38 20 65 72 72  then a UTF-8 err
6e80: 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 2a  or is reported.*
6e90: 2a 20 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75  * on the step fu
6ea0: 6e 63 74 69 6f 6e 2e 20 20 49 66 20 78 5f 63 6f  nction.  If x_co
6eb0: 75 6e 74 28 34 31 29 20 69 73 20 73 65 65 6e 2c  unt(41) is seen,
6ec0: 20 74 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65   then a UTF-16 e
6ed0: 72 72 6f 72 0a 2a 2a 20 69 73 20 72 65 70 6f 72  rror.** is repor
6ee0: 74 65 64 20 6f 6e 20 74 68 65 20 73 74 65 70 20  ted on the step 
6ef0: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  function.  If th
6f00: 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20 69 73  e total count is
6f10: 20 34 32 2c 20 74 68 65 6e 0a 2a 2a 20 61 20 55   42, then.** a U
6f20: 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65  TF-8 error is re
6f30: 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 66 69  ported on the fi
6f40: 6e 61 6c 69 7a 65 20 66 75 6e 63 74 69 6f 6e 2e  nalize function.
6f50: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
6f60: 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20 74 31  ct t1CountCtx t1
6f70: 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74  CountCtx;.struct
6f80: 20 74 31 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20   t1CountCtx {.  
6f90: 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63  int n;.};.static
6fa0: 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 53 74 65   void t1CountSte
6fb0: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p(.  sqlite3_con
6fc0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
6fd0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
6fe0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6ff0: 76 0a 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74  v.){.  t1CountCt
7000: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
7010: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7020: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
7030: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
7040: 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51  ( (argc==0 || SQ
7050: 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74  LITE_NULL!=sqlit
7060: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
7070: 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20 29 7b  gv[0]) ) && p ){
7080: 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d  .    p->n++;.  }
7090: 0a 20 20 69 66 28 20 61 72 67 63 3e 30 20 29 7b  .  if( argc>0 ){
70a0: 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 73 71 6c  .    int v = sql
70b0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
70c0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[0]);.    if(
70d0: 20 76 3d 3d 34 30 20 29 7b 0a 20 20 20 20 20 20   v==40 ){.      
70e0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
70f0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 76  rror(context, "v
7100: 61 6c 75 65 20 6f 66 20 34 30 20 68 61 6e 64 65  alue of 40 hande
7110: 64 20 74 6f 20 78 5f 63 6f 75 6e 74 22 2c 20 2d  d to x_count", -
7120: 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  1);.#ifndef SQLI
7130: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
7140: 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3d 3d 34    }else if( v==4
7150: 31 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  1 ){.      const
7160: 20 63 68 61 72 20 7a 55 74 66 31 36 45 72 72 4d   char zUtf16ErrM
7170: 73 67 5b 5d 20 3d 20 7b 20 30 2c 20 30 78 36 31  sg[] = { 0, 0x61
7180: 2c 20 30 2c 20 30 78 36 32 2c 20 30 2c 20 30 78  , 0, 0x62, 0, 0x
7190: 36 33 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 20 20  63, 0, 0, 0};.  
71a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
71b0: 6c 74 5f 65 72 72 6f 72 31 36 28 63 6f 6e 74 65  lt_error16(conte
71c0: 78 74 2c 20 26 7a 55 74 66 31 36 45 72 72 4d 73  xt, &zUtf16ErrMs
71d0: 67 5b 31 2d 53 51 4c 49 54 45 5f 42 49 47 45 4e  g[1-SQLITE_BIGEN
71e0: 44 49 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64  DIAN], -1);.#end
71f0: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 20  if.    }.  }.}  
7200: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31   .static void t1
7210: 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71  CountFinalize(sq
7220: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7230: 6f 6e 74 65 78 74 29 7b 0a 20 20 74 31 43 6f 75  ontext){.  t1Cou
7240: 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ntCtx *p;.  p = 
7250: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
7260: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
7270: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
7280: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
7290: 66 28 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20  f( p->n==42 ){. 
72a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
72b0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
72c0: 74 2c 20 22 78 5f 63 6f 75 6e 74 20 74 6f 74 61  t, "x_count tota
72d0: 6c 73 20 74 6f 20 34 32 22 2c 20 2d 31 29 3b 0a  ls to 42", -1);.
72e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
72f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7300: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f  int(context, p ?
7310: 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20 20 20   p->n : 0);.    
7320: 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
7330: 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e 74  void legacyCount
7340: 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  Step(.  sqlite3_
7350: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
7360: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
7370: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
7380: 61 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f 2d  argv.){.  /* no-
7390: 6f 70 20 2a 2f 0a 7d 0a 73 74 61 74 69 63 20 76  op */.}.static v
73a0: 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e 74 46  oid legacyCountF
73b0: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
73c0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
73d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ){.  sqlite3_res
73e0: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
73f0: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
7400: 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74  te_count(context
7410: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  ));.}../*.** Usa
7420: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ge:  sqlite3_cre
7430: 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 44 42  ate_aggregate DB
7440: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
7450: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7460: 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74  unction API on t
7470: 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
7480: 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  e in order.** to
7490: 20 63 72 65 61 74 65 20 61 20 66 75 6e 63 74 69   create a functi
74a0: 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e  on named "x_coun
74b0: 74 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  t".  This functi
74c0: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a  on is similar.**
74d0: 20 74 6f 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   to the built-in
74e0: 20 63 6f 75 6e 74 28 29 20 66 75 6e 63 74 69 6f   count() functio
74f0: 6e 2c 20 77 69 74 68 20 61 20 66 65 77 20 73 70  n, with a few sp
7500: 65 63 69 61 6c 20 71 75 69 72 6b 73 0a 2a 2a 20  ecial quirks.** 
7510: 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20  for testing the 
7520: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7530: 72 72 6f 72 28 29 20 41 50 49 73 2e 0a 2a 2a 0a  rror() APIs..**.
7540: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
7550: 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20 74  motivation for t
7560: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
7570: 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61  to be able to ca
7580: 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ll the.** sqlite
7590: 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  3_create_aggrega
75a0: 74 65 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  te function whil
75b0: 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20  e a query is in 
75c0: 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65  progress in orde
75d0: 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  r.** to test the
75e0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64   SQLITE_MISUSE d
75f0: 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20  etection logic. 
7600: 20 53 65 65 20 6d 69 73 75 73 65 2e 74 65 73 74   See misuse.test
7610: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7620: 74 69 6e 65 20 77 61 73 20 6c 61 74 65 72 20 65  tine was later e
7630: 78 74 65 6e 64 65 64 20 74 6f 20 74 65 73 74 20  xtended to test 
7640: 74 68 65 20 75 73 65 20 6f 66 20 73 71 6c 69 74  the use of sqlit
7650: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
7660: 29 0a 2a 2a 20 77 69 74 68 69 6e 20 61 67 67 72  ).** within aggr
7670: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
7680: 0a 2a 2a 0a 2a 2a 20 4c 61 74 65 72 3a 20 49 74  .**.** Later: It
7690: 20 69 73 20 6e 6f 77 20 61 6c 73 6f 20 65 78 74   is now also ext
76a0: 65 6e 64 65 64 20 74 6f 20 72 65 67 69 73 74 65  ended to registe
76b0: 72 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  r the aggregate 
76c0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 6c 65 67  function.** "leg
76d0: 61 63 79 5f 63 6f 75 6e 74 28 29 22 20 77 69 74  acy_count()" wit
76e0: 68 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 64  h the supplied d
76f0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
7700: 54 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20  This is used.** 
7710: 74 6f 20 74 65 73 74 20 74 68 65 20 64 65 70 72  to test the depr
7720: 65 63 61 74 65 64 20 73 71 6c 69 74 65 33 5f 61  ecated sqlite3_a
7730: 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 29  ggregate_count()
7740: 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   API..*/.static 
7750: 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f  int test_create_
7760: 61 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f 69  aggregate(.  voi
7770: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
7780: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
7790: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
77a0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
77b0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
77c0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
77d0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
77e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
77f0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
7800: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
7810: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
7820: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
7830: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
7840: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
7850: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
7860: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
7870: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
7880: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
7890: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
78a0: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
78b0: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
78c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
78d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
78e0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
78f0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
7900: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7910: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
7920: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7930: 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c  n(db, "x_count",
7940: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
7950: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 74 31 43   0, 0,.      t1C
7960: 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74  ountStep,t1Count
7970: 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28  Finalize);.  if(
7980: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7990: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
79a0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
79b0: 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22  on(db, "x_count"
79c0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
79d0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
79e0: 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f  t1CountStep,t1Co
79f0: 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20  untFinalize);.  
7a00: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
7a10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
7a20: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
7a30: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c  _function(db, "l
7a40: 65 67 61 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c  egacy_count", 0,
7a50: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
7a60: 30 2c 0a 20 20 20 20 20 20 20 20 6c 65 67 61 63  0,.        legac
7a70: 79 43 6f 75 6e 74 53 74 65 70 2c 20 6c 65 67 61  yCountStep, lega
7a80: 63 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a  cyCountFinalize.
7a90: 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28      );.  }.  if(
7aa0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
7ab0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
7ac0: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
7ad0: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
7ae0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
7af0: 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
7b00: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
7b10: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
7b20: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
7b30: 70 72 69 6e 74 66 20 54 45 58 54 0a 2a 2a 0a 2a  printf TEXT.**.*
7b40: 2a 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f  * Send output to
7b50: 20 70 72 69 6e 74 66 2e 20 20 55 73 65 20 74 68   printf.  Use th
7b60: 69 73 20 72 61 74 68 65 72 20 74 68 61 6e 20 70  is rather than p
7b70: 75 74 73 20 74 6f 20 6d 65 72 67 65 20 74 68 65  uts to merge the
7b80: 20 6f 75 74 70 75 74 0a 2a 2a 20 69 6e 20 74 68   output.** in th
7b90: 65 20 63 6f 72 72 65 63 74 20 73 65 71 75 65 6e  e correct sequen
7ba0: 63 65 20 77 69 74 68 20 64 65 62 75 67 67 69 6e  ce with debuggin
7bb0: 67 20 70 72 69 6e 74 66 73 20 69 6e 73 65 72 74  g printfs insert
7bc0: 65 64 20 69 6e 74 6f 20 43 20 63 6f 64 65 2e 0a  ed into C code..
7bd0: 2a 2a 20 50 75 74 73 20 75 73 65 73 20 61 20 73  ** Puts uses a s
7be0: 65 70 61 72 61 74 65 20 62 75 66 66 65 72 20 61  eparate buffer a
7bf0: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 73 74 61  nd debugging sta
7c00: 74 65 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20  tements will be 
7c10: 6f 75 74 20 6f 66 0a 2a 2a 20 73 65 71 75 65 6e  out of.** sequen
7c20: 63 65 20 69 66 20 69 74 20 69 73 20 75 73 65 64  ce if it is used
7c30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7c40: 74 65 73 74 5f 70 72 69 6e 74 66 28 0a 20 20 76  test_printf(.  v
7c50: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
7c60: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7c70: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
7c80: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
7c90: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
7ca0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
7cb0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
7cc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7cd0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
7ce0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
7cf0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
7d00: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
7d10: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 61 72 67 63  */.){.  if( argc
7d20: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
7d30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7d40: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
7d50: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
7d60: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
7d70: 20 20 22 20 54 45 58 54 5c 22 22 2c 20 30 29 3b    " TEXT\"", 0);
7d80: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7d90: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 72 69  ERROR;.  }.  pri
7da0: 6e 74 66 28 22 25 73 5c 6e 22 2c 20 61 72 67 76  ntf("%s\n", argv
7db0: 5b 31 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  [1]);.  return T
7dc0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  CL_OK;.}..../*.*
7dd0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
7de0: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 46 4f  3_mprintf_int FO
7df0: 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54  RMAT INTEGER INT
7e00: 45 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a  EGER INTEGER.**.
7e10: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
7e20: 77 69 74 68 20 74 68 72 65 65 20 69 6e 74 65 67  with three integ
7e30: 65 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a  er arguments.*/.
7e40: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
7e50: 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 28 0a  e3_mprintf_int(.
7e60: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
7e70: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
7e80: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
7e90: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
7ea0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
7eb0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
7ec0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
7ed0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7ee0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
7ef0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
7f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
7f10: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
7f20: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
7f30: 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a  [3], i;.  char *
7f40: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  z;.  if( argc!=5
7f50: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
7f60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7f70: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
7f80: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
7f90: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
7fa0: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
7fb0: 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  INT\"", 0);.    
7fc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7fd0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
7fe0: 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<5; i++){.    
7ff0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
8000: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
8010: 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72  &a[i-2]) ) retur
8020: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8030: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
8040: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
8050: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d  a[0], a[1], a[2]
8060: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
8070: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
8080: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
8090: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
80a0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
80b0: 2a 20 49 66 20 7a 4e 75 6d 20 72 65 70 72 65 73  * If zNum repres
80c0: 65 6e 74 73 20 61 6e 20 69 6e 74 65 67 65 72 20  ents an integer 
80d0: 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e  that will fit in
80e0: 20 36 34 2d 62 69 74 73 2c 20 74 68 65 6e 20 73   64-bits, then s
80f0: 65 74 0a 2a 2a 20 2a 70 56 61 6c 75 65 20 74 6f  et.** *pValue to
8100: 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 61 6e   that integer an
8110: 64 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  d return true.  
8120: 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
8130: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69   false..*/.stati
8140: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  c int sqlite3Get
8150: 49 6e 74 36 34 28 63 6f 6e 73 74 20 63 68 61 72  Int64(const char
8160: 20 2a 7a 4e 75 6d 2c 20 69 36 34 20 2a 70 56 61   *zNum, i64 *pVa
8170: 6c 75 65 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  lue){.  if( sqli
8180: 74 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28  te3FitsIn64Bits(
8190: 7a 4e 75 6d 2c 20 30 29 20 29 7b 0a 20 20 20 20  zNum, 0) ){.    
81a0: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 4e  sqlite3Atoi64(zN
81b0: 75 6d 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  um, pValue);.   
81c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
81d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
81e0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
81f0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36  te3_mprintf_int6
8200: 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  4 FORMAT INTEGER
8210: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
8220: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
8230: 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20 36  ntf with three 6
8240: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61 72  4-bit integer ar
8250: 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  guments.*/.stati
8260: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
8270: 72 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20 20 76  rintf_int64(.  v
8280: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
8290: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
82a0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
82b0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
82c0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
82d0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
82e0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
82f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8300: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
8310: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
8320: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
8330: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
8340: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
8350: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 61 5b   sqlite_int64 a[
8360: 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  3];.  char *z;. 
8370: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
8380: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8390: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
83a0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
83b0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
83c0: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
83d0: 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c  MAT INT INT INT\
83e0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
83f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8400: 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35  }.  for(i=2; i<5
8410: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8420: 21 73 71 6c 69 74 65 33 47 65 74 49 6e 74 36 34  !sqlite3GetInt64
8430: 28 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32  (argv[i], &a[i-2
8440: 5d 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ]) ){.      Tcl_
8450: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8460: 65 72 70 2c 20 22 61 72 67 75 6d 65 6e 74 20 69  erp, "argument i
8470: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 36 34  s not a valid 64
8480: 2d 62 69 74 20 69 6e 74 65 67 65 72 22 2c 20 30  -bit integer", 0
8490: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
84a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
84b0: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
84c0: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
84d0: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
84e0: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
84f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8500: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
8510: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
8520: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8530: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8540: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
8550: 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  r FORMAT INTEGER
8560: 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a   INTEGER STRING.
8570: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
8580: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
8590: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
85a0: 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67  d one string arg
85b0: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
85c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
85d0: 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20  ntf_str(.  void 
85e0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
85f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
8600: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
8610: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
8620: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
8630: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
8640: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
8650: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
8660: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
8670: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
8680: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
8690: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
86a0: 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b  {.  int a[3], i;
86b0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
86c0: 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67 63  ( argc<4 || argc
86d0: 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  >5 ){.    Tcl_Ap
86e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
86f0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
8700: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
8710: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
8720: 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e   " FORMAT INT IN
8730: 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30  T ?STRING?\"", 0
8740: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
8750: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
8760: 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b  or(i=2; i<4; i++
8770: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
8780: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
8790: 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20  gv[i], &a[i-2]) 
87a0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
87b0: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  OR;.  }.  z = sq
87c0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
87d0: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
87e0: 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76  ], argc>4 ? argv
87f0: 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54  [4] : NULL);.  T
8800: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8810: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
8820: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
8830: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
8840: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
8850: 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  e:  sqlite3_snpr
8860: 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47 45 52  intf_str INTEGER
8870: 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20   FORMAT INTEGER 
8880: 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a 2a  INTEGER STRING.*
8890: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
88a0: 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67  f with two integ
88b0: 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64  er arguments and
88c0: 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67 75   one string argu
88d0: 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ment.*/.static i
88e0: 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  nt sqlite3_snpri
88f0: 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20  ntf_str(.  void 
8900: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
8910: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
8920: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
8930: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
8940: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
8950: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
8960: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
8970: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
8980: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
8990: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
89a0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
89b0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
89c0: 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b  {.  int a[3], i;
89d0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72  .  int n;.  char
89e0: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c   *z;.  if( argc<
89f0: 35 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a 20  5 || argc>6 ){. 
8a00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8a10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8a20: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8a30: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8a40: 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 4e 54 20  ],.       " INT 
8a50: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f  FORMAT INT INT ?
8a60: 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a  STRING?\"", 0);.
8a70: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8a80: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
8a90: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
8aa0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20  p, argv[1], &n) 
8ab0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8ac0: 4f 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b  OR;.  if( n<0 ){
8ad0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
8ae0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e  esult(interp, "N
8af0: 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67   must be non-neg
8b00: 61 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20  ative", 0);.    
8b10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8b20: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b  ;.  }.  for(i=3;
8b30: 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<5; i++){.    
8b40: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
8b50: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
8b60: 26 61 5b 69 2d 33 5d 29 20 29 20 72 65 74 75 72  &a[i-3]) ) retur
8b70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8b80: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
8b90: 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20  alloc( n+1 );.  
8ba0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8bb0: 28 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c 20  (n, z, argv[2], 
8bc0: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63  a[0], a[1], argc
8bd0: 3e 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20 4e  >4 ? argv[5] : N
8be0: 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ULL);.  Tcl_Appe
8bf0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8c00: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
8c10: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
8c20: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
8c30: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
8c40: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
8c50: 62 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  ble FORMAT INTEG
8c60: 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55 42 4c  ER INTEGER DOUBL
8c70: 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  E.**.** Call mpr
8c80: 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e  intf with two in
8c90: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20  teger arguments 
8ca0: 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61  and one double a
8cb0: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  rgument.*/.stati
8cc0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
8cd0: 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20  rintf_double(.  
8ce0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
8cf0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8d00: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
8d10: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
8d20: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
8d30: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
8d40: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
8d50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8d60: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
8d70: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
8d80: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
8d90: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
8da0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33   */.){.  int a[3
8db0: 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72  ], i;.  double r
8dc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
8dd0: 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20  f( argc!=5 ){.  
8de0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8df0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
8e00: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
8e10: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
8e20: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
8e30: 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42 4c 45  T INT INT DOUBLE
8e40: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
8e50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8e60: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
8e70: 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  4; i++){.    if(
8e80: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
8e90: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b  rp, argv[i], &a[
8ea0: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
8eb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
8ec0: 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c  if( Tcl_GetDoubl
8ed0: 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 34  e(interp, argv[4
8ee0: 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72 6e 20  ], &r) ) return 
8ef0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d  TCL_ERROR;.  z =
8f00: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8f10: 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20  (argv[1], a[0], 
8f20: 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f  a[1], r);.  Tcl_
8f30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8f40: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
8f50: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
8f60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
8f70: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
8f80: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8f90: 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54 20 44  _scaled FORMAT D
8fa0: 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a 0a  OUBLE DOUBLE.**.
8fb0: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
8fc0: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f  with a single do
8fd0: 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  uble argument wh
8fe0: 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75  ich is the produ
8ff0: 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ct of the.** two
9000: 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e   arguments given
9010: 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73   above.  This is
9020: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
9030: 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75  e overflow and u
9040: 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62  nderflow.** doub
9050: 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74  les to test that
9060: 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72   they are conver
9070: 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  ted properly..*/
9080: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9090: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
90a0: 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ed(.  void *NotU
90b0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
90c0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
90d0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
90e0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
90f0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
9100: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
9110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9120: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9130: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
9140: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
9150: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
9160: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
9170: 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72  nt i;.  double r
9180: 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  [2];.  char *z;.
9190: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
91a0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
91b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
91c0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
91d0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
91e0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
91f0: 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55 42  RMAT DOUBLE DOUB
9200: 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  LE\"", 0);.    r
9210: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9220: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
9230: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
9240: 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65  f( Tcl_GetDouble
9250: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
9260: 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72 65 74  , &r[i-2]) ) ret
9270: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9280: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
9290: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
92a0: 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a 20 20  , r[0]*r[1]);.  
92b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
92c0: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
92d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
92e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
92f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
9300: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
9310: 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46 4f 52  intf_stronly FOR
9320: 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  MAT STRING.**.**
9330: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
9340: 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62  th a single doub
9350: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
9360: 68 20 69 73 20 74 68 65 20 70 72 6f 64 75 63 74  h is the product
9370: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61   of the.** two a
9380: 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61  rguments given a
9390: 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20 75  bove.  This is u
93a0: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
93b0: 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64  overflow and und
93c0: 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65  erflow.** double
93d0: 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 74  s to test that t
93e0: 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65  hey are converte
93f0: 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73  d properly..*/.s
9400: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
9410: 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c  3_mprintf_stronl
9420: 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  y(.  void *NotUs
9430: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
9440: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
9450: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
9460: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
9470: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
9480: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
9490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
94a0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
94b0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
94c0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
94d0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
94e0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  ument */.){.  ch
94f0: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
9500: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
9510: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9520: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
9530: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
9540: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
9550: 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49     " FORMAT STRI
9560: 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NG\"", 0);.    r
9570: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9580: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
9590: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
95a0: 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20  1], argv[2]);.  
95b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
95c0: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
95d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
95e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
95f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
9600: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
9610: 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 20 46  intf_hexdouble F
9620: 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a 2a 20  ORMAT HEX.**.** 
9630: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
9640: 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c  h a single doubl
9650: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
9660: 20 69 73 20 64 65 72 69 76 65 64 20 66 72 6f 6d   is derived from
9670: 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65 63 69   the.** hexadeci
9680: 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  mal encoding of 
9690: 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65 2e 0a  an IEEE double..
96a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
96b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
96c0: 78 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20  xdouble(.  void 
96d0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
96e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
96f0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
9700: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
9710: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
9720: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
9730: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
9740: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
9750: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
9760: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
9770: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
9780: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
9790: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 64  {.  char *z;.  d
97a0: 6f 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73 69 67  ouble r;.  unsig
97b0: 6e 65 64 20 20 78 31 2c 20 78 32 3b 0a 20 20 6c  ned  x1, x2;.  l
97c0: 6f 6e 67 20 6c 6f 6e 67 20 75 6e 73 69 67 6e 65  ong long unsigne
97d0: 64 20 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21  d d;.  if( argc!
97e0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
97f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9800: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
9810: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
9820: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
9830: 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47   " FORMAT STRING
9840: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
9850: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9860: 20 7d 0a 20 20 69 66 28 20 73 73 63 61 6e 66 28   }.  if( sscanf(
9870: 61 72 67 76 5b 32 5d 2c 20 22 25 30 38 78 25 30  argv[2], "%08x%0
9880: 38 78 22 2c 20 26 78 32 2c 20 26 78 31 29 21 3d  8x", &x2, &x1)!=
9890: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
98a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
98b0: 2c 20 22 32 6e 64 20 61 72 67 75 6d 65 6e 74 20  , "2nd argument 
98c0: 73 68 6f 75 6c 64 20 62 65 20 31 36 2d 63 68 61  should be 16-cha
98d0: 72 61 63 74 65 72 73 20 6f 66 20 68 65 78 22 2c  racters of hex",
98e0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
98f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9900: 20 64 20 3d 20 78 32 3b 0a 20 20 64 20 3d 20 28   d = x2;.  d = (
9910: 64 3c 3c 33 32 29 20 2b 20 78 31 3b 0a 20 20 6d  d<<32) + x1;.  m
9920: 65 6d 63 70 79 28 26 72 2c 20 26 64 2c 20 73 69  emcpy(&r, &d, si
9930: 7a 65 6f 66 28 72 29 29 3b 0a 20 20 7a 20 3d 20  zeof(r));.  z = 
9940: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9950: 61 72 67 76 5b 31 5d 2c 20 72 29 3b 0a 20 20 54  argv[1], r);.  T
9960: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9970: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
9980: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
9990: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
99a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
99b0: 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  e: sqlite3_enabl
99c0: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 20  e_shared_cache  
99d0: 20 20 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a      BOOLEAN.**.*
99e0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
99f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
9a00: 44 5f 43 41 43 48 45 29 0a 73 74 61 74 69 63 20  D_CACHE).static 
9a10: 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  int test_enable_
9a20: 73 68 61 72 65 64 28 0a 20 20 43 6c 69 65 6e 74  shared(.  Client
9a30: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
9a40: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
9a50: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
9a60: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
9a70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
9a80: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
9a90: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
9aa0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
9ab0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
9ac0: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
9ad0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9ae0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
9af0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
9b00: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
9b10: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
9b20: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
9b30: 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20  t enable;.  int 
9b40: 72 65 74 20 3d 20 30 3b 0a 20 20 65 78 74 65 72  ret = 0;.  exter
9b50: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 53 68 61  n int sqlite3Sha
9b60: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 3b  redCacheEnabled;
9b70: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
9b80: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
9b90: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
9ba0: 31 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41  1, objv, "BOOLEA
9bb0: 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
9bc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9bd0: 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
9be0: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
9bf0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 65 6e 61  p, objv[1], &ena
9c00: 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ble) ){.    retu
9c10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9c20: 7d 0a 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65  }.  ret = sqlite
9c30: 33 53 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  3SharedCacheEnab
9c40: 6c 65 64 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  led;.  rc = sqli
9c50: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
9c60: 64 5f 63 61 63 68 65 28 65 6e 61 62 6c 65 29 3b  d_cache(enable);
9c70: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
9c80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
9c90: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
9ca0: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
9cb0: 33 45 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c  3ErrStr(rc), TCL
9cc0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
9cd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9ce0: 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
9cf0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
9d00: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
9d10: 28 72 65 74 29 29 3b 0a 20 20 72 65 74 75 72 6e  (ret));.  return
9d20: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
9d30: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  f..../*.** Usage
9d40: 3a 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  : sqlite3_extend
9d50: 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 20  ed_result_codes 
9d60: 20 20 44 42 20 20 20 20 42 4f 4f 4c 45 41 4e 0a    DB    BOOLEAN.
9d70: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
9d80: 20 74 65 73 74 5f 65 78 74 65 6e 64 65 64 5f 72   test_extended_r
9d90: 65 73 75 6c 74 5f 63 6f 64 65 73 28 0a 20 20 43  esult_codes(.  C
9da0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
9db0: 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
9dc0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
9dd0: 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
9de0: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
9df0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
9e00: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
9e10: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
9e20: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
9e30: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
9e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9e50: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
9e60: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
9e70: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
9e80: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
9e90: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 61   */.){.  int ena
9ea0: 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ble;.  sqlite3 *
9eb0: 64 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  db;..  if( objc!
9ec0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
9ed0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
9ee0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
9ef0: 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72  BOOLEAN");.    r
9f00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9f10: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
9f20: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
9f30: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
9f40: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
9f50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9f60: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f  .  if( Tcl_GetBo
9f70: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
9f80: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 65  erp, objv[2], &e
9f90: 6e 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20  nable) ) return 
9fa0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
9fb0: 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
9fc0: 73 75 6c 74 5f 63 6f 64 65 73 28 64 62 2c 20 65  sult_codes(db, e
9fd0: 6e 61 62 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e  nable);.  return
9fe0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
9ff0: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
a000: 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
a010: 65 72 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  er.**.*/.static 
a020: 69 6e 74 20 74 65 73 74 5f 6c 69 62 76 65 72 73  int test_libvers
a030: 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a 20 20 43 6c  ion_number(.  Cl
a040: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
a050: 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
a060: 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
a070: 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
a080: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
a090: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
a0a0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
a0b0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
a0c0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
a0d0: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
a0e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a0f0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
a100: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
a110: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
a120: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
a130: 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 53 65 74 4f  */.){.  Tcl_SetO
a140: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
a150: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
a160: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
a170: 6e 5f 6e 75 6d 62 65 72 28 29 29 29 3b 0a 20 20  n_number()));.  
a180: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
a190: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
a1a0: 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
a1b0: 75 6d 6e 5f 6d 65 74 61 64 61 74 61 20 44 42 20  umn_metadata DB 
a1c0: 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63  dbname tblname c
a1d0: 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f 0a 23 69 66  olname.**.*/.#if
a1e0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a1f0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
a200: 41 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  A.static int tes
a210: 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  t_table_column_m
a220: 65 74 61 64 61 74 61 28 0a 20 20 43 6c 69 65 6e  etadata(.  Clien
a230: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
a240: 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
a250: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
a260: 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
a270: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
a280: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
a290: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
a2a0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
a2b0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
a2c0: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
a2d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a2e0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
a2f0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
a300: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
a310: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
a320: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
a330: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
a340: 7a 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  zDb;.  const cha
a350: 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 6f 6e 73 74  r *zTbl;.  const
a360: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 69   char *zCol;.  i
a370: 6e 74 20 72 63 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nt rc;.  Tcl_Obj
a380: 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74   *pRet;..  const
a390: 20 63 68 61 72 20 2a 7a 44 61 74 61 74 79 70 65   char *zDatatype
a3a0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
a3b0: 7a 43 6f 6c 6c 73 65 71 3b 0a 20 20 69 6e 74 20  zCollseq;.  int 
a3c0: 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 6e 74 20 70  notnull;.  int p
a3d0: 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 6e 74  rimarykey;.  int
a3e0: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a   autoincrement;.
a3f0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
a400: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
a410: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
a420: 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62 6e 61  , objv, "DB dbna
a430: 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61  me tblname colna
a440: 6d 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me");.    return
a450: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a460: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
a470: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
a480: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
a490: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
a4a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44   TCL_ERROR;.  zD
a4b0: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
a4c0: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 54  g(objv[2]);.  zT
a4d0: 62 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  bl = Tcl_GetStri
a4e0: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7a  ng(objv[3]);.  z
a4f0: 43 6f 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Col = Tcl_GetStr
a500: 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20  ing(objv[4]);.. 
a510: 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 44 62 29   if( strlen(zDb)
a520: 3d 3d 30 20 29 20 7a 44 62 20 3d 20 30 3b 0a 0a  ==0 ) zDb = 0;..
a530: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
a540: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
a550: 64 61 74 61 28 64 62 2c 20 7a 44 62 2c 20 7a 54  data(db, zDb, zT
a560: 62 6c 2c 20 7a 43 6f 6c 2c 20 0a 20 20 20 20 20  bl, zCol, .     
a570: 20 26 7a 44 61 74 61 74 79 70 65 2c 20 26 7a 43   &zDatatype, &zC
a580: 6f 6c 6c 73 65 71 2c 20 26 6e 6f 74 6e 75 6c 6c  ollseq, &notnull
a590: 2c 20 26 70 72 69 6d 61 72 79 6b 65 79 2c 20 26  , &primarykey, &
a5a0: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3b 0a  autoincrement);.
a5b0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
a5c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
a5d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a5e0: 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
a5f0: 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
a600: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a610: 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d  R;.  }..  pRet =
a620: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
a630: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
a640: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
a650: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
a660: 4f 62 6a 28 7a 44 61 74 61 74 79 70 65 2c 20 2d  Obj(zDatatype, -
a670: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
a680: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
a690: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
a6a0: 53 74 72 69 6e 67 4f 62 6a 28 7a 43 6f 6c 6c 73  StringObj(zColls
a6b0: 65 71 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  eq, -1));.  Tcl_
a6c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
a6d0: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
a6e0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 6f 74 6e  l_NewIntObj(notn
a6f0: 75 6c 6c 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ull));.  Tcl_Lis
a700: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
a710: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
a720: 65 77 49 6e 74 4f 62 6a 28 70 72 69 6d 61 72 79  ewIntObj(primary
a730: 6b 65 79 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  key));.  Tcl_Lis
a740: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
a750: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
a760: 65 77 49 6e 74 4f 62 6a 28 61 75 74 6f 69 6e 63  ewIntObj(autoinc
a770: 72 65 6d 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f  rement));.  Tcl_
a780: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
a790: 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72  erp, pRet);..  r
a7a0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
a7b0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
a7c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
a7d0: 42 4c 4f 42 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  BLOB../*.** sqli
a7e0: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 20 43  te3_blob_read  C
a7f0: 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 4e 0a  HANNEL OFFSET N.
a800: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 63 6f 6d  **.**   This com
a810: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20  mand is used to 
a820: 74 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  test the sqlite3
a830: 5f 62 6c 6f 62 5f 72 65 61 64 28 29 20 69 6e 20  _blob_read() in 
a840: 77 61 79 73 20 74 68 61 74 0a 2a 2a 20 20 20 74  ways that.**   t
a850: 68 65 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 69  he Tcl channel i
a860: 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 6e 6f  nterface does no
a870: 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
a880: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  ument should.** 
a890: 20 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66    be the name of
a8a0: 20 61 20 76 61 6c 69 64 20 63 68 61 6e 6e 65 6c   a valid channel
a8b0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
a8c0: 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d 65 74 68 6f  [incrblob] metho
a8d0: 64 0a 2a 2a 20 20 20 6f 66 20 61 20 64 61 74 61  d.**   of a data
a8e0: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69  base handle. Thi
a8f0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  s function calls
a900: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
a910: 61 64 28 29 0a 2a 2a 20 20 20 74 6f 20 72 65 61  ad().**   to rea
a920: 64 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 6f  d N bytes from o
a930: 66 66 73 65 74 20 4f 46 46 53 45 54 20 66 72 6f  ffset OFFSET fro
a940: 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
a950: 20 53 51 4c 69 74 65 0a 2a 2a 20 20 20 62 6c 6f   SQLite.**   blo
a960: 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a 0a 2a 2a 20  b handle..**.** 
a970: 20 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20    On success, a 
a980: 62 79 74 65 2d 61 72 72 61 79 20 6f 62 6a 65 63  byte-array objec
a990: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
a9a0: 20 72 65 61 64 20 64 61 74 61 20 69 73 20 0a 2a   read data is .*
a9b0: 2a 20 20 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e  *   returned. On
a9c0: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 69 6e   failure, the in
a9d0: 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74  terpreter result
a9e0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a   is set to the.*
a9f0: 2a 20 20 20 74 65 78 74 20 72 65 70 72 65 73 65  *   text represe
aa00: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ntation of the r
aa10: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 63 6f  eturned error co
aa20: 64 65 20 28 69 2e 65 2e 20 22 53 51 4c 49 54 45  de (i.e. "SQLITE
aa30: 5f 4e 4f 4d 45 4d 22 29 0a 2a 2a 20 20 20 61 6e  _NOMEM").**   an
aa40: 64 20 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f  d a Tcl exceptio
aa50: 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a  n is thrown..*/.
aa60: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
aa70: 62 6c 6f 62 5f 72 65 61 64 28 0a 20 20 43 6c 69  blob_read(.  Cli
aa80: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
aa90: 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  ta, /* Not used 
aaa0: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
aab0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
aac0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
aad0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
aae0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
aaf0: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
ab00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ab10: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
ab20: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
ab30: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
ab40: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
ab50: 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 68 61   */.){.  Tcl_Cha
ab60: 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20  nnel channel;.  
ab70: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
ab80: 6e 63 65 44 61 74 61 3b 0a 20 20 73 71 6c 69 74  nceData;.  sqlit
ab90: 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a  e3_blob *pBlob;.
aba0: 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20    int notUsed;. 
abb0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
abc0: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73  t iOffset;.  uns
abd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66  igned char *zBuf
abe0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20  ;.  int rc;.  . 
abf0: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
ac00: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
ac10: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
ac20: 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 20 4f  objv, "CHANNEL O
ac30: 46 46 53 45 54 20 4e 22 29 3b 0a 20 20 20 20 72  FFSET N");.    r
ac40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ac50: 0a 20 20 7d 0a 0a 20 20 63 68 61 6e 6e 65 6c 20  .  }..  channel 
ac60: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
ac70: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
ac80: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
ac90: 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66   &notUsed);.  if
aca0: 28 20 21 63 68 61 6e 6e 65 6c 0a 20 20 20 7c 7c  ( !channel.   ||
acb0: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
acc0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
acd0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 4f 66  p, objv[2], &iOf
ace0: 66 73 65 74 29 0a 20 20 20 7c 7c 20 54 43 4c 5f  fset).   || TCL_
acf0: 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
ad00: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
ad10: 6a 76 5b 33 5d 2c 20 26 6e 42 79 74 65 29 0a 20  jv[3], &nByte). 
ad20: 20 20 7c 7c 20 6e 42 79 74 65 3c 30 20 7c 7c 20    || nByte<0 || 
ad30: 69 4f 66 66 73 65 74 3c 30 0a 20 20 29 7b 20 0a  iOffset<0.  ){ .
ad40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ad50: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 73  RROR;.  }..  ins
ad60: 74 61 6e 63 65 44 61 74 61 20 3d 20 54 63 6c 5f  tanceData = Tcl_
ad70: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
ad80: 63 65 44 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b  ceData(channel);
ad90: 0a 20 20 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71  .  pBlob = *((sq
ada0: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e  lite3_blob **)in
adb0: 73 74 61 6e 63 65 44 61 74 61 29 3b 0a 0a 20 20  stanceData);..  
adc0: 7a 42 75 66 20 3d 20 28 75 6e 73 69 67 6e 65 64  zBuf = (unsigned
add0: 20 63 68 61 72 20 2a 29 54 63 6c 5f 41 6c 6c 6f   char *)Tcl_Allo
ade0: 63 28 6e 42 79 74 65 29 3b 0a 20 20 72 63 20 3d  c(nByte);.  rc =
adf0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
ae00: 61 64 28 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20  ad(pBlob, zBuf, 
ae10: 6e 42 79 74 65 2c 20 69 4f 66 66 73 65 74 29 3b  nByte, iOffset);
ae20: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
ae30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
ae40: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
ae50: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  erp, Tcl_NewByte
ae60: 41 72 72 61 79 4f 62 6a 28 7a 42 75 66 2c 20 6e  ArrayObj(zBuf, n
ae70: 42 79 74 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Byte));.  }else{
ae80: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
ae90: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
aea0: 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74 45 72   *)sqlite3TestEr
aeb0: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
aec0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a  _VOLATILE);.  }.
aed0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
aee0: 20 2a 29 7a 42 75 66 29 3b 0a 0a 20 20 72 65 74   *)zBuf);..  ret
aef0: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
af00: 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43  OK ? TCL_OK : TC
af10: 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 2f 2a 0a  L_ERROR);.}../*.
af20: 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  ** sqlite3_blob_
af30: 77 72 69 74 65 20 43 48 41 4e 4e 45 4c 20 4f 46  write CHANNEL OF
af40: 46 53 45 54 20 44 41 54 41 0a 2a 2a 0a 2a 2a 20  FSET DATA.**.** 
af50: 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69    This command i
af60: 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
af70: 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  he sqlite3_blob_
af80: 77 72 69 74 65 28 29 20 69 6e 20 77 61 79 73 20  write() in ways 
af90: 74 68 61 74 0a 2a 2a 20 20 20 74 68 65 20 54 63  that.**   the Tc
afa0: 6c 20 63 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66  l channel interf
afb0: 61 63 65 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68  ace does not. Th
afc0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
afd0: 20 73 68 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20   should.**   be 
afe0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61  the name of a va
aff0: 6c 69 64 20 63 68 61 6e 6e 65 6c 20 63 72 65 61  lid channel crea
b000: 74 65 64 20 62 79 20 74 68 65 20 5b 69 6e 63 72  ted by the [incr
b010: 62 6c 6f 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20  blob] method.** 
b020: 20 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20    of a database 
b030: 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 66 75 6e  handle. This fun
b040: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69  ction calls sqli
b050: 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29  te3_blob_write()
b060: 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20 74  .**   to write t
b070: 68 65 20 44 41 54 41 20 62 79 74 65 2d 61 72 72  he DATA byte-arr
b080: 61 79 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c  ay to the underl
b090: 79 69 6e 67 20 53 51 4c 69 74 65 20 62 6c 6f 62  ying SQLite blob
b0a0: 20 68 61 6e 64 6c 65 2e 0a 2a 2a 20 20 20 61 74   handle..**   at
b0b0: 20 6f 66 66 73 65 74 20 4f 46 46 53 45 54 2e 0a   offset OFFSET..
b0c0: 2a 2a 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65  **.**   On succe
b0d0: 73 73 2c 20 61 6e 20 65 6d 70 74 79 20 73 74 72  ss, an empty str
b0e0: 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ing is returned.
b0f0: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65   On failure, the
b100: 20 69 6e 74 65 72 70 72 65 74 65 72 0a 2a 2a 20   interpreter.** 
b110: 20 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 20    result is set 
b120: 74 6f 20 74 68 65 20 74 65 78 74 20 72 65 70 72  to the text repr
b130: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
b140: 65 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  e returned error
b150: 20 63 6f 64 65 20 0a 2a 2a 20 20 20 28 69 2e 65   code .**   (i.e
b160: 2e 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22  . "SQLITE_NOMEM"
b170: 29 20 61 6e 64 20 61 20 54 63 6c 20 65 78 63 65  ) and a Tcl exce
b180: 70 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e  ption is thrown.
b190: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
b1a0: 65 73 74 5f 62 6c 6f 62 5f 77 72 69 74 65 28 0a  est_blob_write(.
b1b0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
b1c0: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20  entData, /* Not 
b1d0: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
b1e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
b1f0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
b200: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
b210: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
b220: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b240: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
b250: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
b260: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
b270: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
b280: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
b290: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65  l_Channel channe
b2a0: 6c 3b 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  l;.  ClientData 
b2b0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
b2c0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
b2d0: 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e 6f 74 55 73  lob;.  int notUs
b2e0: 65 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65  ed;.  int iOffse
b2f0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
b300: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
b310: 42 75 66 3b 0a 20 20 69 6e 74 20 6e 42 75 66 3b  Buf;.  int nBuf;
b320: 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
b330: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
b340: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
b350: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e  , 1, objv, "CHAN
b360: 4e 45 4c 20 4f 46 46 53 45 54 20 44 41 54 41 22  NEL OFFSET DATA"
b370: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
b380: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
b390: 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65  channel = Tcl_Ge
b3a0: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
b3b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
b3c0: 62 6a 76 5b 31 5d 29 2c 20 26 6e 6f 74 55 73 65  bjv[1]), &notUse
b3d0: 64 29 3b 0a 20 20 69 66 28 20 21 63 68 61 6e 6e  d);.  if( !chann
b3e0: 65 6c 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21  el.   || TCL_OK!
b3f0: 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
b400: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
b410: 32 5d 2c 20 26 69 4f 66 66 73 65 74 29 0a 20 20  2], &iOffset).  
b420: 20 7c 7c 20 69 4f 66 66 73 65 74 3c 30 0a 20 20   || iOffset<0.  
b430: 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ){ .    return T
b440: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
b450: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 20 3d 20   instanceData = 
b460: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
b470: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 6e  stanceData(chann
b480: 65 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 2a  el);.  pBlob = *
b490: 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a  ((sqlite3_blob *
b4a0: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 29 3b  *)instanceData);
b4b0: 0a 0a 20 20 7a 42 75 66 20 3d 20 54 63 6c 5f 47  ..  zBuf = Tcl_G
b4c0: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
b4d0: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 75  bj(objv[3], &nBu
b4e0: 66 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  f);.  rc = sqlit
b4f0: 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42  e3_blob_write(pB
b500: 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42 75 66 2c  lob, zBuf, nBuf,
b510: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69 66 28   iOffset);.  if(
b520: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b530: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
b540: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
b550: 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74 45  r *)sqlite3TestE
b560: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
b570: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d  L_VOLATILE);.  }
b580: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
b590: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f  SQLITE_OK ? TCL_
b5a0: 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b  OK : TCL_ERROR);
b5b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
b5c0: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
b5d0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
b5e0: 5f 76 32 20 44 42 2d 48 41 4e 44 4c 45 20 4e 41  _v2 DB-HANDLE NA
b5f0: 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d  ME CMP-PROC DEL-
b600: 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  PROC.**.**   Thi
b610: 73 20 54 63 6c 20 70 72 6f 63 20 69 73 20 75 73  s Tcl proc is us
b620: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74  ed for testing t
b630: 68 65 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a  he experimental.
b640: 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  **   sqlite3_cre
b650: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
b660: 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  () interface..*/
b670: 0a 73 74 72 75 63 74 20 54 65 73 74 43 6f 6c 6c  .struct TestColl
b680: 61 74 69 6f 6e 58 20 7b 0a 20 20 54 63 6c 5f 49  ationX {.  Tcl_I
b690: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
b6a0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 70 3b 0a   Tcl_Obj *pCmp;.
b6b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 6c 3b    Tcl_Obj *pDel;
b6c0: 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  .};.typedef stru
b6d0: 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  ct TestCollation
b6e0: 58 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58  X TestCollationX
b6f0: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  ;.static void te
b700: 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  stCreateCollatio
b710: 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43 74 78 29  nDel(void *pCtx)
b720: 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  {.  TestCollatio
b730: 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c  nX *p = (TestCol
b740: 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a  lationX *)pCtx;.
b750: 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f  .  int rc = Tcl_
b760: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
b770: 65 72 70 2c 20 70 2d 3e 70 44 65 6c 2c 20 54 43  erp, p->pDel, TC
b780: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43  L_EVAL_DIRECT|TC
b790: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a  L_EVAL_GLOBAL);.
b7a0: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
b7b0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b   ){.    Tcl_Back
b7c0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69  groundError(p->i
b7d0: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20 54  nterp);.  }..  T
b7e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
b7f0: 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f  p->pCmp);.  Tcl_
b800: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
b810: 70 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  pDel);.  sqlite3
b820: 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29 70 29  _free((void *)p)
b830: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ;.}.static int t
b840: 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69  estCreateCollati
b850: 6f 6e 43 6d 70 28 0a 20 20 76 6f 69 64 20 2a 70  onCmp(.  void *p
b860: 43 74 78 2c 0a 20 20 69 6e 74 20 6e 4c 65 66 74  Ctx,.  int nLeft
b870: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
b880: 7a 4c 65 66 74 2c 0a 20 20 69 6e 74 20 6e 52 69  zLeft,.  int nRi
b890: 67 68 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  ght,.  const voi
b8a0: 64 20 2a 7a 52 69 67 68 74 0a 29 7b 0a 20 20 54  d *zRight.){.  T
b8b0: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70  estCollationX *p
b8c0: 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f   = (TestCollatio
b8d0: 6e 58 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  nX *)pCtx;.  Tcl
b8e0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20  _Obj *pScript = 
b8f0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
b900: 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 69 6e 74  (p->pCmp);.  int
b910: 20 69 52 65 73 20 3d 20 30 3b 0a 0a 20 20 54 63   iRes = 0;..  Tc
b920: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
b930: 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c  Script);.  Tcl_L
b940: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
b950: 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20  ent(0, pScript, 
b960: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
b970: 28 28 63 68 61 72 20 2a 29 7a 4c 65 66 74 2c 20  ((char *)zLeft, 
b980: 6e 4c 65 66 74 29 29 3b 0a 20 20 54 63 6c 5f 4c  nLeft));.  Tcl_L
b990: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
b9a0: 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20  ent(0, pScript, 
b9b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
b9c0: 28 28 63 68 61 72 20 2a 29 7a 52 69 67 68 74 2c  ((char *)zRight,
b9d0: 6e 52 69 67 68 74 29 29 3b 0a 0a 20 20 69 66 28  nRight));..  if(
b9e0: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61   TCL_OK!=Tcl_Eva
b9f0: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
ba00: 2c 20 70 53 63 72 69 70 74 2c 20 54 43 4c 5f 45  , pScript, TCL_E
ba10: 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45  VAL_DIRECT|TCL_E
ba20: 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20 20 20 7c  VAL_GLOBAL).   |
ba30: 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  | TCL_OK!=Tcl_Ge
ba40: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 70 2d 3e 69  tIntFromObj(p->i
ba50: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 4f 62  nterp, Tcl_GetOb
ba60: 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  jResult(p->inter
ba70: 70 29 2c 20 26 69 52 65 73 29 0a 20 20 29 7b 0a  p), &iRes).  ){.
ba80: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
ba90: 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72  ndError(p->inter
baa0: 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65  p);.  }.  Tcl_De
bab0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
bac0: 70 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 69  pt);..  return i
bad0: 52 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  Res;.}.static in
bae0: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f  t test_create_co
baf0: 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c  llation_v2(.  Cl
bb00: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
bb10: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
bb20: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
bb30: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
bb40: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
bb50: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
bb60: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
bb70: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
bb80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
bb90: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
bba0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
bbb0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
bbc0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
bbd0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 65 73 74 43 6f  s */.){.  TestCo
bbe0: 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a 20 20 73  llationX *p;.  s
bbf0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
bc00: 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
bc10: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
bc20: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
bc30: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e  jv, "DB-HANDLE N
bc40: 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c  AME CMP-PROC DEL
bc50: 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65 74  -PROC");.    ret
bc60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
bc70: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
bc80: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
bc90: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
bca0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
bcb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
bcc0: 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61    p = (TestColla
bcd0: 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f  tionX *)sqlite3_
bce0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65  malloc(sizeof(Te
bcf0: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a  stCollationX));.
bd00: 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76    p->pCmp = objv
bd10: 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d  [3];.  p->pDel =
bd20: 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69   objv[4];.  p->i
bd30: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
bd40: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
bd50: 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54  nt(p->pCmp);.  T
bd60: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
bd70: 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 73 71 6c  p->pDel);..  sql
bd80: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
bd90: 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63 6c  ation_v2(db, Tcl
bda0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
bdb0: 32 5d 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  2]), SQLITE_UTF8
bdc0: 2c 20 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a  , .      (void *
bdd0: 29 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  )p, testCreateCo
bde0: 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74  llationCmp, test
bdf0: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44  CreateCollationD
be00: 65 6c 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  el.  );.  return
be10: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
be20: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
be30: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20  _load_extension 
be40: 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f  DB-HANDLE FILE ?
be50: 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  PROC?.*/.static 
be60: 69 6e 74 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78  int test_load_ex
be70: 74 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e  tension(.  Clien
be80: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
be90: 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f  , /* Not used */
bea0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
beb0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
bec0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
bed0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
bee0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
bef0: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
bf00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bf10: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
bf20: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
bf30: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
bf40: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
bf50: 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e  /.){.  Tcl_CmdIn
bf60: 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71  fo cmdInfo;.  sq
bf70: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
bf80: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62   rc;.  char *zDb
bf90: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  ;.  char *zFile;
bfa0: 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d  .  char *zProc =
bfb0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   0;.  char *zErr
bfc0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   = 0;..  if( obj
bfd0: 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=4 && objc!=3 
bfe0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
bff0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
c000: 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e  1, objv, "DB-HAN
c010: 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22  DLE FILE ?PROC?"
c020: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c030: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
c040: 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
c050: 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a  ng(objv[1]);.  z
c060: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
c070: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
c080: 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a   if( objc==4 ){.
c090: 20 20 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f      zProc = Tcl_
c0a0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
c0b0: 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78  ]);.  }..  /* Ex
c0c0: 74 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61  tract the C data
c0d0: 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  base handle from
c0e0: 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   the Tcl command
c0f0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21   name */.  if( !
c100: 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
c110: 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20  fo(interp, zDb, 
c120: 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20  &cmdInfo) ){.   
c130: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
c140: 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61  t(interp, "comma
c150: 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c  nd not found: ",
c160: 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b   zDb, (char*)0);
c170: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
c180: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20  ERROR;.  }.  db 
c190: 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74  = ((struct Sqlit
c1a0: 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a  eDb*)cmdInfo.obj
c1b0: 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b  ClientData)->db;
c1c0: 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a  .  assert(db);..
c1d0: 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e    /* Call the un
c1e0: 64 65 72 6c 79 69 6e 67 20 43 20 66 75 6e 63 74  derlying C funct
c1f0: 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ion. If an error
c200: 20 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20   occurs, set rc 
c210: 74 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52  to .  ** TCL_ERR
c220: 4f 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20  OR and load any 
c230: 65 72 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 74  error string int
c240: 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  o the interprete
c250: 72 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65  r. If no .  ** e
c260: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
c270: 20 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20   rc to TCL_OK.. 
c280: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
c290: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
c2a0: 4e 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c  NSION.  rc = SQL
c2b0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72  ITE_ERROR;.  zEr
c2c0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
c2d0: 6e 74 66 28 22 74 68 69 73 20 62 75 69 6c 64 20  ntf("this build 
c2e0: 6f 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f  omits sqlite3_lo
c2f0: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29  ad_extension()")
c300: 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 73  ;.#else.  rc = s
c310: 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
c320: 6e 73 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c  nsion(db, zFile,
c330: 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a   zProc, &zErr);.
c340: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21  #endif.  if( rc!
c350: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c360: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
c370: 69 6e 74 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a  interp, zErr ? z
c380: 45 72 72 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f  Err : "", TCL_VO
c390: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 63 20  LATILE);.    rc 
c3a0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  = TCL_ERROR;.  }
c3b0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 54  else{.    rc = T
c3c0: 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  CL_OK;.  }.  sql
c3d0: 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
c3e0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
c3f0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
c400: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
c410: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d  ad_extension DB-
c420: 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a  HANDLE ONOFF.*/.
c430: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
c440: 65 6e 61 62 6c 65 5f 6c 6f 61 64 28 0a 20 20 43  enable_load(.  C
c450: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
c460: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
c470: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
c480: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
c490: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
c4a0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
c4b0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
c4c0: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
c4d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c4e0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
c4f0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
c500: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
c510: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
c520: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43  ts */.){.  Tcl_C
c530: 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a  mdInfo cmdInfo;.
c540: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
c550: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 69 6e   char *zDb;.  in
c560: 74 20 6f 6e 6f 66 66 3b 0a 0a 20 20 69 66 28 20  t onoff;..  if( 
c570: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
c580: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
c590: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
c5a0: 20 22 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46   "DB-HANDLE ONOF
c5b0: 46 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  F");.    return 
c5c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
c5d0: 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
c5e0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a  ring(objv[1]);..
c5f0: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
c600: 20 43 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   C database hand
c610: 6c 65 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20  le from the Tcl 
c620: 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a  command name */.
c630: 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f    if( !Tcl_GetCo
c640: 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
c650: 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29  , zDb, &cmdInfo)
c660: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
c670: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
c680: 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f   "command not fo
c690: 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68  und: ", zDb, (ch
c6a0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
c6b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c6c0: 7d 0a 20 20 64 62 20 3d 20 28 28 73 74 72 75 63  }.  db = ((struc
c6d0: 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49  t SqliteDb*)cmdI
c6e0: 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74  nfo.objClientDat
c6f0: 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  a)->db;.  assert
c700: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  (db);..  /* Get 
c710: 74 68 65 20 6f 6e 6f 66 66 20 70 61 72 61 6d 65  the onoff parame
c720: 74 65 72 20 2a 2f 0a 20 20 69 66 28 20 54 63 6c  ter */.  if( Tcl
c730: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
c740: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
c750: 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20  2], &onoff) ){. 
c760: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
c770: 52 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ROR;.  }..#ifdef
c780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
c790: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 54 63  D_EXTENSION.  Tc
c7a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
c7b0: 6e 74 65 72 70 2c 20 22 74 68 69 73 20 62 75 69  nterp, "this bui
c7c0: 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33  ld omits sqlite3
c7d0: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
c7e0: 29 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )");.  return TC
c7f0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
c800: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
c810: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64  load_extension(d
c820: 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 72 65 74  b, onoff);.  ret
c830: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64  urn TCL_OK;.#end
c840: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  if.}../*.** Usag
c850: 65 3a 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  e:  sqlite_abort
c860: 0a 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  .**.** Shutdown 
c870: 74 68 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65  the process imme
c880: 64 69 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69  diately.  This i
c890: 73 20 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68  s not a clean sh
c8a0: 75 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20  utdown..** This 
c8b0: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
c8c0: 74 6f 20 74 65 73 74 20 74 68 65 20 72 65 63 6f  to test the reco
c8d0: 76 65 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20  verability of a 
c8e0: 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74  database in.** t
c8f0: 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72  he event of a pr
c900: 6f 67 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a  ogram crash..*/.
c910: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
c920: 65 5f 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20  e_abort(.  void 
c930: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
c940: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
c950: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
c960: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
c970: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
c980: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
c990: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c9a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
c9b0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
c9c0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
c9d0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
c9e0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
c9f0: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 74 65  {.  assert( inte
ca00: 72 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68  rp==0 );   /* Th
ca10: 69 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  is will always f
ca20: 61 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ail */.  return 
ca30: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
ca40: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
ca50: 6f 75 74 69 6e 65 20 69 73 20 61 20 75 73 65 72  outine is a user
ca60: 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e  -defined SQL fun
ca70: 63 74 69 6f 6e 20 77 68 6f 73 65 20 70 75 72 70  ction whose purp
ca80: 6f 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73  ose.** is to tes
ca90: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 74  t the sqlite_set
caa0: 5f 72 65 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a  _result() API..*
cab0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
cac0: 73 74 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  stFunc(sqlite3_c
cad0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
cae0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
caf0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
cb00: 7b 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e  {.  while( argc>
cb10: 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =2 ){.    const 
cb20: 63 68 61 72 20 2a 7a 41 72 67 30 20 3d 20 28 63  char *zArg0 = (c
cb30: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
cb40: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
cb50: 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67 30 20  ;.    if( zArg0 
cb60: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
cb70: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
cb80: 41 72 67 30 2c 20 22 69 6e 74 22 29 20 29 7b 0a  Arg0, "int") ){.
cb90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
cba0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
cbb0: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
cbc0: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 29 3b  e_int(argv[1]));
cbd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
cbe0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
cbf0: 7a 41 72 67 30 2c 22 69 6e 74 36 34 22 29 3d 3d  zArg0,"int64")==
cc00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
cc10: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
cc20: 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  4(context, sqlit
cc30: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
cc40: 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20  rgv[1]));.      
cc50: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
cc60: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
cc70: 73 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a 20  string")==0 ){. 
cc80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
cc90: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
cca0: 78 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  xt, (char*)sqlit
ccb0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
ccc0: 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20  gv[1]), -1,.    
ccd0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
cce0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
ccf0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
cd00: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
cd10: 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a  "double")==0 ){.
cd20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
cd30: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
cd40: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76  ntext, sqlite3_v
cd50: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
cd60: 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [1]));.      }el
cd70: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
cd80: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c  rICmp(zArg0,"nul
cd90: 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
cda0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
cdb0: 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a  _null(context);.
cdc0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
cdd0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
cde0: 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30  Arg0,"value")==0
cdf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ce00: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
ce10: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 73  (context, argv[s
ce20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
ce30: 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20  (argv[1])]);.   
ce40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ce50: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
ce60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
ce70: 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  lse{.      goto 
ce80: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  error_out;.    }
ce90: 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a  .    argc -= 2;.
cea0: 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20      argv += 2;. 
ceb0: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72   }.  return;..er
cec0: 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
ced0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
cee0: 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20 61  context,"first a
cef0: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
cf00: 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20  e one of: ".    
cf10: 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74 72    "int int64 str
cf20: 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20  ing double null 
cf30: 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a  value", -1);.}..
cf40: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
cf50: 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74  qlite_register_t
cf60: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42  est_function  DB
cf70: 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67    NAME.**.** Reg
cf80: 69 73 74 65 72 20 74 68 65 20 74 65 73 74 20 53  ister the test S
cf90: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  QL function on t
cfa0: 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20 75  he database DB u
cfb0: 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e 41  nder the name NA
cfc0: 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ME..*/.static in
cfd0: 74 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  t test_register_
cfe0: 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  func(.  void *No
cff0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
d000: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
d010: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
d020: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
d030: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
d040: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d060: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
d070: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
d080: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
d090: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
d0a0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
d0b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
d0c0: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
d0d0: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
d0e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d0f0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
d100: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
d110: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
d120: 20 20 20 20 20 22 20 44 42 20 46 55 4e 43 54 49       " DB FUNCTI
d130: 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20  ON-NAME", 0);.  
d140: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d150: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
d160: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
d170: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
d180: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
d190: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
d1a0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
d1b0: 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
d1c0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
d1d0: 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74  , 0, .      test
d1e0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Func, 0, 0);.  i
d1f0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
d200: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d210: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
d220: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
d230: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d240: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
d250: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
d260: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
d270: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
d280: 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
d290: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
d2a0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
d2b0: 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20  _finalize  STMT 
d2c0: 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  .**.** Finalize 
d2d0: 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  a statement hand
d2e0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
d2f0: 74 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 28  t test_finalize(
d300: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
d310: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
d320: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
d330: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
d340: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
d350: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
d360: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
d370: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
d380: 62 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62  b = 0;..  if( ob
d390: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
d3a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d3b0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
d3c0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
d3d0: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
d3e0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
d3f0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
d400: 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20  <STMT>", 0);.   
d410: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d420: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
d430: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
d440: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
d450: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
d460: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
d470: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
d480: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 64 62 20  pStmt ){.    db 
d490: 3d 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  = StmtToDb(pStmt
d4a0: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
d4b0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
d4c0: 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Stmt);.  Tcl_Set
d4d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
d4e0: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
d4f0: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
d500: 49 43 29 3b 0a 20 20 69 66 28 20 64 62 20 26 26  IC);.  if( db &&
d510: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
d520: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
d530: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
d540: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
d550: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
d560: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
d570: 33 5f 72 65 73 65 74 20 20 53 54 4d 54 20 0a 2a  3_reset  STMT .*
d580: 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 73 74 61  *.** Reset a sta
d590: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a  tement handle..*
d5a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
d5b0: 74 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20  t_reset(.  void 
d5c0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
d5d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
d5e0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
d5f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d600: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
d610: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
d620: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
d630: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
d640: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
d650: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
d660: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
d670: 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
d680: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
d690: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
d6a0: 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29  ), " <STMT>", 0)
d6b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d6c0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
d6d0: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
d6e0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
d6f0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
d700: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
d710: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
d720: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
d730: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  set(pStmt);.  if
d740: 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74  ( pStmt && sqlit
d750: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
d760: 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
d770: 53 74 6d 74 29 2c 20 72 63 29 20 29 7b 0a 20 20  Stmt), rc) ){.  
d780: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d790: 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65  OR;.  }.  Tcl_Se
d7a0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
d7b0: 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
d7c0: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
d7d0: 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 72  TIC);./*.  if( r
d7e0: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
d7f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 2a  TCL_ERROR;.  }.*
d800: 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
d810: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
d820: 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69  e:  sqlite3_expi
d830: 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  red STMT .**.** 
d840: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
d850: 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
d860: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
d870: 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a  is recommended..
d880: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
d890: 73 74 5f 65 78 70 69 72 65 64 28 0a 20 20 76 6f  st_expired(.  vo
d8a0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
d8b0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
d8c0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
d8d0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
d8e0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
d8f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
d900: 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  tmt;.  if( objc!
d910: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
d920: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d930: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
d940: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
d950: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
d960: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
d970: 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54  jv[0], 0), " <ST
d980: 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  MT>", 0);.    re
d990: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d9a0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
d9b0: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
d9c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
d9d0: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
d9e0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
d9f0: 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
da00: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
da10: 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
da20: 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65  j(sqlite3_expire
da30: 64 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  d(pStmt)));.  re
da40: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
da50: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
da60: 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62  lite3_transfer_b
da70: 69 6e 64 69 6e 67 73 20 46 52 4f 4d 53 54 4d 54  indings FROMSTMT
da80: 20 54 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 54 72   TOSTMT.**.** Tr
da90: 61 6e 73 66 65 72 20 61 6c 6c 20 62 69 6e 64 69  ansfer all bindi
daa0: 6e 67 73 20 66 72 6f 6d 20 46 52 4f 4d 53 54 4d  ngs from FROMSTM
dab0: 54 20 6f 76 65 72 20 74 6f 20 54 4f 53 54 4d 54  T over to TOSTMT
dac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
dad0: 65 73 74 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e  est_transfer_bin
dae0: 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
daf0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
db00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
db10: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
db20: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
db30: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
db40: 74 6d 74 20 2a 70 53 74 6d 74 31 2c 20 2a 70 53  tmt *pStmt1, *pS
db50: 74 6d 74 32 3b 0a 20 20 69 66 28 20 6f 62 6a 63  tmt2;.  if( objc
db60: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
db70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
db80: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
db90: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
dba0: 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
dbb0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
dbc0: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 46 52  bjv[0], 0), " FR
dbd0: 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53 54 4d 54 22  OM-STMT TO-STMT"
dbe0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
dbf0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
dc00: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
dc10: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
dc20: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
dc30: 31 5d 29 2c 20 26 70 53 74 6d 74 31 29 29 20 72  1]), &pStmt1)) r
dc40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
dc50: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
dc60: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
dc70: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
dc80: 5b 32 5d 29 2c 20 26 70 53 74 6d 74 32 29 29 20  [2]), &pStmt2)) 
dc90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
dca0: 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
dcb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
dcc0: 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a     Tcl_NewIntObj
dcd0: 28 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65  (sqlite3_transfe
dce0: 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74  r_bindings(pStmt
dcf0: 31 2c 70 53 74 6d 74 32 29 29 29 3b 0a 20 20 72  1,pStmt2)));.  r
dd00: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
dd10: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
dd20: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 20 44  qlite3_changes D
dd30: 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
dd40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
dd50: 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65  nges made to the
dd60: 20 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65   database by the
dd70: 20 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65   last SQL.** exe
dd80: 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  cution..*/.stati
dd90: 63 20 69 6e 74 20 74 65 73 74 5f 63 68 61 6e 67  c int test_chang
dda0: 65 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  es(.  void * cli
ddb0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
ddc0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
ddd0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
dde0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
ddf0: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
de00: 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  *db;.  if( objc!
de10: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
de20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
de30: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
de40: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
de50: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
de60: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
de70: 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
de80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
de90: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
dea0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
deb0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
dec0: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
ded0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
dee0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
def0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
df00: 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
df10: 33 5f 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b  3_changes(db)));
df20: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
df30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
df40: 69 73 20 74 68 65 20 22 73 74 61 74 69 63 5f 62  is the "static_b
df50: 69 6e 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20  ind_value" that 
df60: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f  variables are bo
df70: 75 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74  und to when.** t
df80: 68 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f  he FLAG option o
df90: 66 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69  f sqlite3_bind i
dfa0: 73 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74  s "static".*/.st
dfb0: 61 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74  atic char *sqlit
dfc0: 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61  e_static_bind_va
dfd0: 6c 75 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  lue = 0;.static 
dfe0: 69 6e 74 20 73 71 6c 69 74 65 5f 73 74 61 74 69  int sqlite_stati
dff0: 63 5f 62 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30  c_bind_nbyte = 0
e000: 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  ;../*.** Usage: 
e010: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56   sqlite3_bind  V
e020: 4d 20 20 49 44 58 20 20 56 41 4c 55 45 20 20 46  M  IDX  VALUE  F
e030: 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20  LAGS.**.** Sets 
e040: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
e050: 20 49 44 58 2d 74 68 20 6f 63 63 75 72 61 6e 63   IDX-th occuranc
e060: 65 20 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20  e of "?" in the 
e070: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20  original SQL.** 
e080: 73 74 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69  string.  VALUE i
e090: 73 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e  s the new value.
e0a0: 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c    If FLAGS=="nul
e0b0: 6c 22 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73  l" then VALUE is
e0c0: 0a 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20  .** ignored and 
e0d0: 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74  the value is set
e0e0: 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c   to NULL.  If FL
e0f0: 41 47 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68  AGS=="static" th
e100: 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  en.** the value 
e110: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
e120: 6c 75 65 20 6f 66 20 61 20 73 74 61 74 69 63 20  lue of a static 
e130: 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a  variable named.*
e140: 2a 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63  * "sqlite_static
e150: 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49  _bind_value".  I
e160: 66 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c  f FLAGS=="normal
e170: 22 20 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a  " then a copy.**
e180: 20 6f 66 20 74 68 65 20 56 41 4c 55 45 20 69 73   of the VALUE is
e190: 20 6d 61 64 65 2e 20 20 49 66 20 46 4c 41 47 53   made.  If FLAGS
e1a0: 3d 3d 22 62 6c 6f 62 31 30 22 20 74 68 65 6e 20  =="blob10" then 
e1b0: 61 20 56 41 4c 55 45 20 69 73 20 69 67 6e 6f 72  a VALUE is ignor
e1c0: 65 64 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79  ed.** an a 10-by
e1d0: 74 65 20 62 6c 6f 62 20 22 61 62 63 5c 30 30 30  te blob "abc\000
e1e0: 78 79 7a 5c 30 30 30 70 71 22 20 69 73 20 69 6e  xyz\000pq" is in
e1f0: 73 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  serted..*/.stati
e200: 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 28  c int test_bind(
e210: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
e220: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
e230: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
e240: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
e250: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
e260: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
e270: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
e280: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
e290: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
e2a0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
e2b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
e2c0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
e2d0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
e2e0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
e2f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
e300: 20 69 64 78 3b 0a 20 20 69 66 28 20 61 72 67 63   idx;.  if( argc
e310: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
e320: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e330: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
e340: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
e350: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
e360: 20 20 20 22 20 56 4d 20 49 44 58 20 56 41 4c 55     " VM IDX VALU
e370: 45 20 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e  E (null|static|n
e380: 6f 72 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20  ormal)\"", 0);. 
e390: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e3a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
e3b0: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
e3c0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
e3d0: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
e3e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
e3f0: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
e400: 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 64  rp, argv[2], &id
e410: 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
e420: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72  ERROR;.  if( str
e430: 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c  cmp(argv[4],"nul
e440: 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  l")==0 ){.    rc
e450: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
e460: 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29  null(pStmt, idx)
e470: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
e480: 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74  rcmp(argv[4],"st
e490: 61 74 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20  atic")==0 ){.   
e4a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
e4b0: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
e4c0: 64 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69  dx, sqlite_stati
e4d0: 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31  c_bind_value, -1
e4e0: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  , 0);.  }else if
e4f0: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
e500: 2c 22 73 74 61 74 69 63 2d 6e 62 79 74 65 73 22  ,"static-nbytes"
e510: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
e520: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
e530: 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73  xt(pStmt, idx, s
e540: 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
e550: 64 5f 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20  d_value,.       
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
e590: 6e 64 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20  nd_nbyte, 0);.  
e5a0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
e5b0: 28 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c  (argv[4],"normal
e5c0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
e5d0: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
e5e0: 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ext(pStmt, idx, 
e5f0: 61 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c  argv[3], -1, SQL
e600: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
e610: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
e620: 6d 70 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62  mp(argv[4],"blob
e630: 31 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  10")==0 ){.    r
e640: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
e650: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78  _text(pStmt, idx
e660: 2c 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30  , "abc\000xyz\00
e670: 30 70 71 22 2c 20 31 30 2c 20 53 51 4c 49 54 45  0pq", 10, SQLITE
e680: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73  _STATIC);.  }els
e690: 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  e{.    Tcl_Appen
e6a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e6b0: 22 34 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68  "4th argument sh
e6c0: 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20  ould be ".      
e6d0: 20 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c    "\"null\" or \
e6e0: 22 73 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e  "static\" or \"n
e6f0: 6f 72 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20  ormal\"", 0);.  
e700: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e710: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  OR;.  }.  if( sq
e720: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
e730: 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
e740: 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
e750: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e760: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
e770: 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
e780: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
e790: 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
e7a0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e7b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
e7c0: 75 66 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  uf, sqlite3ErrSt
e7d0: 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  r(rc), 0);.    r
e7e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e7f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
e800: 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  L_OK;.}..#ifndef
e810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
e820: 31 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  16./*.** Usage: 
e830: 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  add_test_collate
e840: 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e   <db ptr> <utf8>
e850: 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31   <utf16le> <utf1
e860: 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  6be>.**.** This 
e870: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
e880: 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
e890: 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65  Lite selects the
e8a0: 20 63 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74 69   correct collati
e8b0: 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63  on.** sequence c
e8c0: 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c  allback when mul
e8d0: 74 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28  tiple versions (
e8e0: 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74 65  for different te
e8f0: 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a  xt encodings).**
e900: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a   are available..
e910: 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  **.** Calling th
e920: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73  is routine regis
e930: 74 65 72 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  ters the collati
e940: 6f 6e 20 73 65 71 75 65 6e 63 65 20 22 74 65 73  on sequence "tes
e950: 74 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69  t_collate".** wi
e960: 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  th database hand
e970: 6c 65 20 3c 64 62 3e 2e 20 54 68 65 20 73 65 63  le <db>. The sec
e980: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  ond argument mus
e990: 74 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20 74  t be a list of t
e9a0: 68 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20  hree.** boolean 
e9b0: 76 61 6c 75 65 73 2e 20 49 66 20 74 68 65 20 66  values. If the f
e9c0: 69 72 73 74 20 69 73 20 74 72 75 65 2c 20 74 68  irst is true, th
e9d0: 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  en a version of 
e9e0: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a  test_collate is.
e9f0: 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  ** registered fo
ea00: 72 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 20  r UTF-8, if the 
ea10: 73 65 63 6f 6e 64 20 69 73 20 74 72 75 65 2c 20  second is true, 
ea20: 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67  a version is reg
ea30: 69 73 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55  istered for.** U
ea40: 54 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20  TF-16le, if the 
ea50: 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61  third is true, a
ea60: 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f   UTF-16be versio
ea70: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  n is available..
ea80: 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73  ** Previous vers
ea90: 69 6f 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c  ions of test_col
eaa0: 6c 61 74 65 20 61 72 65 20 64 65 6c 65 74 65 64  late are deleted
eab0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
eac0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
ead0: 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69  est_collate is i
eae0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61  mplemented by ca
eaf0: 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c  lling the.** fol
eb00: 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70  lowing TCL scrip
eb10: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74  t:.**.**   "test
eb20: 5f 63 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c  _collate <enc> <
eb30: 6c 68 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a  lhs> <rhs>".**.*
eb40: 2a 20 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20  * The <lhs> and 
eb50: 3c 72 68 73 3e 20 61 72 65 20 74 68 65 20 74 77  <rhs> are the tw
eb60: 6f 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 63  o values being c
eb70: 6f 6d 70 61 72 65 64 2c 20 65 6e 63 6f 64 65 64  ompared, encoded
eb80: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68   in UTF-8..** Th
eb90: 65 20 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74 65  e <enc> paramete
eba0: 72 20 69 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  r is the encodin
ebb0: 67 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  g of the collati
ebc0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  on function that
ebd0: 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 6c 65 63  .** SQLite selec
ebe0: 74 65 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65  ted to call. The
ebf0: 20 54 43 4c 20 74 65 73 74 20 73 63 72 69 70 74   TCL test script
ec00: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a   implements the.
ec10: 2a 2a 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  ** "test_collate
ec20: 22 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  " proc..**.** No
ec30: 74 65 20 74 68 61 74 20 74 68 69 73 20 77 69 6c  te that this wil
ec40: 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68  l only work with
ec50: 20 6f 6e 65 20 69 6e 74 65 70 72 65 74 65 72 20   one intepreter 
ec60: 61 74 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68  at a time, as th
ec70: 65 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e  e.** interp poin
ec80: 74 65 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ter to use when 
ec90: 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54  evaluating the T
eca0: 43 4c 20 73 63 72 69 70 74 20 69 73 20 73 74 6f  CL script is sto
ecb0: 72 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43  red in.** pTestC
ecc0: 6f 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f  ollateInterp..*/
ecd0: 0a 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65  .static Tcl_Inte
ece0: 72 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65  rp* pTestCollate
ecf0: 49 6e 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69  Interp;.static i
ed00: 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  nt test_collate_
ed10: 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43  func(.  void *pC
ed20: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63  tx, .  int nA, c
ed30: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20  onst void *zA,. 
ed40: 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76   int nB, const v
ed50: 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c  oid *zB.){.  Tcl
ed60: 5f 49 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65  _Interp *i = pTe
ed70: 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b  stCollateInterp;
ed80: 0a 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 28  .  int encin = (
ed90: 69 6e 74 29 70 43 74 78 3b 0a 20 20 69 6e 74 20  int)pCtx;.  int 
eda0: 72 65 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  res;.  int n;.. 
edb0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
edc0: 70 56 61 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pVal;.  Tcl_Obj 
edd0: 2a 70 58 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c  *pX;..  pX = Tcl
ede0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74  _NewStringObj("t
edf0: 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31  est_collate", -1
ee00: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
ee10: 43 6f 75 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77  Count(pX);..  sw
ee20: 69 74 63 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20  itch( encin ){. 
ee30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
ee40: 54 46 38 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c  TF8:.      Tcl_L
ee50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
ee60: 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77  ent(i,pX,Tcl_New
ee70: 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38  StringObj("UTF-8
ee80: 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72  ",-1));.      br
ee90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
eea0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20  LITE_UTF16LE:.  
eeb0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
eec0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
eed0: 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  X,Tcl_NewStringO
eee0: 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31  bj("UTF-16LE",-1
eef0: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
ef00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
ef10: 5f 55 54 46 31 36 42 45 3a 0a 20 20 20 20 20 20  _UTF16BE:.      
ef20: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
ef30: 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63  dElement(i,pX,Tc
ef40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
ef50: 55 54 46 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a  UTF-16BE",-1));.
ef60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ef70: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
ef80: 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a  assert(0);.  }..
ef90: 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
efa0: 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
efb0: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
efc0: 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20  r(pVal, nA, zA, 
efd0: 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54  encin, SQLITE_ST
efe0: 41 54 49 43 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  ATIC);.  n = sql
eff0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
f000: 28 70 56 61 6c 29 3b 0a 20 20 54 63 6c 5f 4c 69  (pVal);.  Tcl_Li
f010: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f020: 6e 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 54  nt(i,pX,.      T
f030: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f040: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
f050: 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c  alue_text(pVal),
f060: 6e 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  n));.  sqlite3Va
f070: 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
f080: 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53  nB, zB, encin, S
f090: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
f0a0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
f0b0: 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a  ue_bytes(pVal);.
f0c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f0d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c  endElement(i,pX,
f0e0: 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
f0f0: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
f100: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
f110: 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 73  t(pVal),n));.  s
f120: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
f130: 70 56 61 6c 29 3b 0a 0a 20 20 54 63 6c 5f 45 76  pVal);..  Tcl_Ev
f140: 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c 20 30  alObjEx(i, pX, 0
f150: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
f160: 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
f170: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
f180: 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  , Tcl_GetObjResu
f190: 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a 20 20  lt(i), &res);.  
f1a0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74  return res;.}.st
f1b0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
f1c0: 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20  llate(.  void * 
f1d0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
f1e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f1f0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
f200: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
f210: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
f220: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61  e3 *db;.  int va
f230: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l;.  sqlite3_val
f240: 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  ue *pVal;.  int 
f250: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
f260: 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72  =5 ) goto bad_ar
f270: 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c 61  gs;.  pTestColla
f280: 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  teInterp = inter
f290: 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  p;.  if( getDbPo
f2a0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
f2b0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
f2c0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
f2d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
f2e0: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
f2f0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
f300: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
f310: 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [2], &val) ) ret
f320: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f330: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
f340: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
f350: 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  b, "test_collate
f360: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
f370: 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64  .          (void
f380: 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c 20   *)SQLITE_UTF8, 
f390: 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  val?test_collate
f3a0: 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28 20  _func:0);.  if( 
f3b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f3c0: 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  .    if( TCL_OK!
f3d0: 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
f3e0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
f3f0: 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[3], &val) ) 
f400: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f410: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
f420: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
f430: 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f  ion(db, "test_co
f440: 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55  llate", SQLITE_U
f450: 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20  TF16LE, .       
f460: 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c       (void *)SQL
f470: 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c  ITE_UTF16LE, val
f480: 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75  ?test_collate_fu
f490: 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 54  nc:0);.    if( T
f4a0: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
f4b0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
f4c0: 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76  erp, objv[4], &v
f4d0: 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
f4e0: 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20 30 0a 20  _ERROR;..#if 0. 
f4f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69     if( sqlite3_i
f500: 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a  MallocFail>0 ){.
f510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d        sqlite3_iM
f520: 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20  allocFail++;.   
f530: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71   }.#endif.    sq
f540: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f550: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
f560: 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
f570: 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20  ValueNew(db);.  
f580: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
f590: 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22  tStr(pVal, -1, "
f5a0: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53  test_collate", S
f5b0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
f5c0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
f5d0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
f5e0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
f5f0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
f600: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f610: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
f620: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
f630: 36 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  6(db, .         
f640: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
f650: 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55  t(pVal, SQLITE_U
f660: 54 46 31 36 4e 41 54 49 56 45 29 2c 20 53 51 4c  TF16NATIVE), SQL
f670: 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20 20  ITE_UTF16BE, .  
f680: 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29          (void *)
f690: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
f6a0: 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  val?test_collate
f6b0: 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 7d 0a  _func:0);.    }.
f6c0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
f6d0: 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20 20  Free(pVal);.    
f6e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f6f0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f700: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
f710: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
f720: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
f730: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f740: 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 53 51  .  .  if( rc!=SQ
f750: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
f760: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f770: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 54  interp, sqlite3T
f780: 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  estErrorName(rc)
f790: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
f7a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
f7b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
f7c0: 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63  ..bad_args:.  Tc
f7d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f7e0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
f7f0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
f800: 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47  \"",.      Tcl_G
f810: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f820: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
f830: 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31  DB> <utf8> <utf1
f840: 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c  6le> <utf16be>",
f850: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
f860: 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  L_ERROR;.}../*.*
f870: 2a 20 57 68 65 6e 20 74 68 65 20 63 6f 6c 6c 61  * When the colla
f880: 74 69 6f 6e 20 6e 65 65 64 65 64 20 63 61 6c 6c  tion needed call
f890: 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 2c  back is invoked,
f8a0: 20 72 65 63 6f 72 64 20 74 68 65 20 6e 61 6d 65   record the name
f8b0: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 72 65 71 75   of .** the requ
f8c0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20  ested collating 
f8d0: 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 20  function here.  
f8e0: 54 68 65 20 72 65 63 6f 72 64 65 64 20 6e 61 6d  The recorded nam
f8f0: 65 20 69 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20 74  e is linked.** t
f900: 6f 20 61 20 54 43 4c 20 76 61 72 69 61 62 6c 65  o a TCL variable
f910: 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 6b   and used to mak
f920: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
f930: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
f940: 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20 69 73 20 63  ion.** name is c
f950: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
f960: 63 20 63 68 61 72 20 7a 4e 65 65 64 65 64 43 6f  c char zNeededCo
f970: 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d 3b 0a 73 74  llation[200];.st
f980: 61 74 69 63 20 63 68 61 72 20 2a 70 7a 4e 65 65  atic char *pzNee
f990: 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20 7a  dedCollation = z
f9a0: 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 3b  NeededCollation;
f9b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20  .../*.** Called 
f9c0: 77 68 65 6e 20 61 20 63 6f 6c 6c 61 74 69 6e 67  when a collating
f9d0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 65 65   sequence is nee
f9e0: 64 65 64 2e 20 20 52 65 67 69 73 74 65 72 65 64  ded.  Registered
f9f0: 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
fa00: 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
fa10: 65 64 31 36 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  ed16()..*/.stati
fa20: 63 20 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c 6c  c void test_coll
fa30: 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a 20  ate_needed_cb(. 
fa40: 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20   void *pCtx, .  
fa50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
fa60: 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 63  nt eTextRep,.  c
fa70: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4e 61 6d 65  onst void *pName
fa80: 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 63 20 3d 20  .){.  int enc = 
fa90: 45 4e 43 28 64 62 29 3b 0a 20 20 69 6e 74 20 69  ENC(db);.  int i
faa0: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66  ;.  char *z;.  f
fab0: 6f 72 28 7a 20 3d 20 28 63 68 61 72 2a 29 70 4e  or(z = (char*)pN
fac0: 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a 20 7c 7c 20  ame, i=0; *z || 
fad0: 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20  z[1]; z++){.    
fae0: 69 66 28 20 2a 7a 20 29 20 7a 4e 65 65 64 65 64  if( *z ) zNeeded
faf0: 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b 2b 5d 20 3d  Collation[i++] =
fb00: 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a 4e 65 65 64   *z;.  }.  zNeed
fb10: 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 5d 20 3d  edCollation[i] =
fb20: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72   0;.  sqlite3_cr
fb30: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
fb40: 20 20 20 20 20 20 64 62 2c 20 22 74 65 73 74 5f        db, "test_
fb50: 63 6f 6c 6c 61 74 65 22 2c 20 45 4e 43 28 64 62  collate", ENC(db
fb60: 29 2c 20 28 76 6f 69 64 20 2a 29 65 6e 63 2c 20  ), (void *)enc, 
fb70: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
fb80: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  c);.}../*.** Usa
fb90: 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c  ge: add_test_col
fba0: 6c 61 74 65 5f 6e 65 65 64 65 64 20 44 42 0a 2a  late_needed DB.*
fbb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
fbc0: 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64  t_collate_needed
fbd0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
fbe0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
fbf0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
fc00: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
fc10: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
fc20: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
fc30: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
fc40: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f  if( objc!=2 ) go
fc50: 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69  to bad_args;.  i
fc60: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
fc70: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
fc80: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
fc90: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
fca0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
fcb0: 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
fcc0: 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c 20 30  n_needed16(db, 0
fcd0: 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  , test_collate_n
fce0: 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a 4e 65  eeded_cb);.  zNe
fcf0: 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30 5d  ededCollation[0]
fd00: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69   = 0;.  if( sqli
fd10: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
fd20: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
fd30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fd40: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
fd50: 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20  OK;..bad_args:. 
fd60: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
fd70: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
fd80: 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74 75  v, "DB");.  retu
fd90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
fda0: 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
fdb0: 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74   add_alignment_t
fdc0: 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20 20  est_collations  
fdd0: 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 77 6f  DB.**.** Add two
fde0: 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 73   new collating s
fdf0: 65 71 75 65 6e 63 65 73 20 74 6f 20 74 68 65 20  equences to the 
fe00: 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2a 0a 2a  database DB.**.*
fe10: 2a 20 20 20 20 20 75 74 66 31 36 5f 61 6c 69 67  *     utf16_alig
fe20: 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74 66 31 36  ned.**     utf16
fe30: 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a 2a  _unaligned.**.**
fe40: 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20   Both collating 
fe50: 73 65 71 75 65 6e 63 65 73 20 75 73 65 20 74 68  sequences use th
fe60: 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72 64 65  e same sort orde
fe70: 72 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a 2a 20  r as BINARY..** 
fe80: 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65  The only differe
fe90: 6e 63 65 20 69 73 20 74 68 61 74 20 74 68 65 20  nce is that the 
fea0: 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 20 63 6f  utf16_aligned co
feb0: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
fec0: 6e 63 65 20 69 73 20 64 65 63 6c 61 72 65 64 20  nce is declared 
fed0: 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
fee0: 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 66 6c  UTF16_ALIGNED fl
fef0: 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c  ag..** Both coll
ff00: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20  ating functions 
ff10: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 75 6e  increment the un
ff20: 61 6c 69 67 6e 65 64 20 75 74 66 31 36 20 63 6f  aligned utf16 co
ff30: 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65 76 65  unter.** wheneve
ff40: 72 20 74 68 65 79 20 73 65 65 20 61 20 73 74 72  r they see a str
ff50: 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73 20  ing that begins 
ff60: 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74 65 20 62  on an odd byte b
ff70: 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  oundary..*/.stat
ff80: 69 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e 65 64  ic int unaligned
ff90: 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20  _string_counter 
ffa0: 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  = 0;.static int 
ffb0: 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e  alignmentCollFun
ffc0: 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  c(.  void *NotUs
ffd0: 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ed,.  int nKey1,
ffe0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
fff0: 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  y1,.  int nKey2,
10000 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
10010 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  y2.){.  int rc, 
10020 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e  n;.  n = nKey1<n
10030 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e  Key2 ? nKey1 : n
10040 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b 65 79  Key2;.  if( nKey
10050 31 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 69 6e  1>0 && 1==(1&(in
10060 74 29 70 4b 65 79 31 29 20 29 20 75 6e 61 6c 69  t)pKey1) ) unali
10070 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  gned_string_coun
10080 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b 65  ter++;.  if( nKe
10090 79 32 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 69  y2>0 && 1==(1&(i
100a0 6e 74 29 70 4b 65 79 32 29 20 29 20 75 6e 61 6c  nt)pKey2) ) unal
100b0 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75  igned_string_cou
100c0 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d 20 6d  nter++;.  rc = m
100d0 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65  emcmp(pKey1, pKe
100e0 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63  y2, n);.  if( rc
100f0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
10100 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20  nKey1 - nKey2;. 
10110 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10120 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  }.static int add
10130 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f  _alignment_test_
10140 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20 76 6f  collations(.  vo
10150 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
10160 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
10170 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
10180 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
10190 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
101a0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
101b0 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20 20  f( objc>=2 ){.  
101c0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
101d0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
101e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
101f0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
10200 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10210 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
10220 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74  ollation(db, "ut
10230 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22 2c 0a  f16_unaligned",.
10240 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55          SQLITE_U
10250 54 46 31 36 2c 20 0a 20 20 20 20 20 20 20 20 30  TF16, .        0
10260 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46  , alignmentCollF
10270 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  unc);.    sqlite
10280 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
10290 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 61 6c  on(db, "utf16_al
102a0 69 67 6e 65 64 22 2c 0a 20 20 20 20 20 20 20 20  igned",.        
102b0 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 20 53  SQLITE_UTF16 | S
102c0 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
102d0 4e 45 44 2c 20 0a 20 20 20 20 20 20 20 20 30 2c  NED, .        0,
102e0 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75   alignmentCollFu
102f0 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nc);.  }.  retur
10300 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
10310 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
10320 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  d(SQLITE_OMIT_UT
10330 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55  F16) */../*.** U
10340 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 66  sage: add_test_f
10350 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74 72 3e  unction <db ptr>
10360 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
10370 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a  > <utf16be>.**.*
10380 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
10390 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
103a0 74 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65  that SQLite sele
103b0 63 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  cts the correct 
103c0 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  user.** function
103d0 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d   callback when m
103e0 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e 73  ultiple versions
103f0 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20   (for different 
10400 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a  text encodings).
10410 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ** are available
10420 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20  ..**.** Calling 
10430 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67  this routine reg
10440 69 73 74 65 72 73 20 75 70 20 74 6f 20 74 68 72  isters up to thr
10450 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ee versions of t
10460 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
10470 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63 74 69  .** "test_functi
10480 6f 6e 22 20 77 69 74 68 20 64 61 74 61 62 61 73  on" with databas
10490 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 20  e handle <db>.  
104a0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
104b0 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74 72 75  gument is.** tru
104c0 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f  e, then a versio
104d0 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e 63 74 69  n of test_functi
104e0 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64  on is registered
104f0 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20 74   for UTF-8, if t
10500 68 65 0a 2a 2a 20 74 68 69 72 64 20 69 73 20 74  he.** third is t
10510 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69  rue, a version i
10520 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
10530 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74 68   UTF-16le, if th
10540 65 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a 20 74  e fourth is.** t
10550 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20  rue, a UTF-16be 
10560 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
10570 61 62 6c 65 2e 20 20 50 72 65 76 69 6f 75 73 20  able.  Previous 
10580 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a 20 74  versions of.** t
10590 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61 72 65  est_function are
105a0 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
105b0 54 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  The user functio
105c0 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
105d0 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20   by calling the 
105e0 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63  following TCL sc
105f0 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74  ript:.**.**   "t
10600 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 65 6e  est_function <en
10610 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a 2a 20  c> <arg>".**.** 
10620 57 68 65 72 65 20 3c 65 6e 63 3e 20 69 73 20 6f  Where <enc> is o
10630 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20 55 54 46  ne of UTF-8, UTF
10640 2d 31 36 4c 45 20 6f 72 20 55 54 46 31 36 42 45  -16LE or UTF16BE
10650 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69 73 20 74  , and <arg> is t
10660 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67  he.** single arg
10670 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
10680 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  the SQL function
10690 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
106a0 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 54  rned by.** the T
106b0 43 4c 20 73 63 72 69 70 74 20 69 73 20 75 73 65  CL script is use
106c0 64 20 61 73 20 74 68 65 20 72 65 74 75 72 6e 20  d as the return 
106d0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 53 51 4c  value of the SQL
106e0 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a 2a 2a   function. It.**
106f0 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 53 51   is passed to SQ
10700 4c 69 74 65 20 75 73 69 6e 67 20 55 54 46 2d 31  Lite using UTF-1
10710 36 42 45 20 66 6f 72 20 61 20 55 54 46 2d 38 20  6BE for a UTF-8 
10720 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  test_function(),
10730 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20 61 20   UTF-8.** for a 
10740 55 54 46 2d 31 36 4c 45 20 74 65 73 74 5f 66 75  UTF-16LE test_fu
10750 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20 55 54  nction(), and UT
10760 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20 69 6d  F-16LE for an im
10770 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
10780 74 0a 2a 2a 20 70 72 65 66 65 72 73 20 55 54 46  t.** prefers UTF
10790 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e 64 65  -16BE..*/.#ifnde
107a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
107b0 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20  F16.static void 
107c0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
107d0 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  f8(.  sqlite3_co
107e0 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
107f0 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
10800 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
10810 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
10820 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
10830 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  Obj *pX;.  sqlit
10840 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
10850 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f    interp = (Tcl_
10860 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33  Interp *)sqlite3
10870 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
10880 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ;.  pX = Tcl_New
10890 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
108a0 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a  function", -1);.
108b0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
108c0 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69  nt(pX);.  Tcl_Li
108d0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
108e0 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54  nt(interp, pX, T
108f0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10900 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a 20  "UTF-8", -1));. 
10910 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10920 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10930 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
10940 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
10950 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
10960 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
10970 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
10980 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
10990 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pX, 0);.  Tcl_De
109a0 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
109b0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
109c0 5f 74 65 78 74 28 70 43 74 78 2c 20 54 63 6c 5f  _text(pCtx, Tcl_
109d0 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
109e0 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53 51 4c  interp), -1, SQL
109f0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
10a00 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
10a10 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
10a20 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
10a30 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f  r(pVal, -1, Tcl_
10a40 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
10a50 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20  interp), .      
10a60 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
10a70 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
10a80 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
10a90 78 74 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c  xt16be(pCtx, sql
10aa0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
10ab0 36 62 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20  6be(pVal),.     
10ac0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
10ad0 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
10ae0 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
10af0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
10b00 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
10b10 66 31 36 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  f16le(.  sqlite3
10b20 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
10b30 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
10b40 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
10b50 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
10b60 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
10b70 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
10b80 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
10b90 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
10ba0 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
10bb0 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
10bc0 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
10bd0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
10be0 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
10bf0 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
10c00 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
10c10 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10c20 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
10c30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10c40 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 20 2d  bj("UTF-16LE", -
10c50 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
10c60 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10c70 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20  interp, pX, .   
10c80 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
10c90 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74  Obj((char*)sqlit
10ca0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
10cb0 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20  gv[0]), -1));.  
10cc0 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
10cd0 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20  terp, pX, 0);.  
10ce0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
10cf0 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73  (pX);.  pVal = s
10d00 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
10d10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
10d20 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
10d30 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
10d40 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a  esult(interp), .
10d50 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
10d60 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
10d70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
10d80 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 28 63  ult_text(pCtx,(c
10d90 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
10da0 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d 31  ue_text(pVal),-1
10db0 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  ,SQLITE_TRANSIEN
10dc0 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  T);.  sqlite3Val
10dd0 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a  ueFree(pVal);.}.
10de0 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
10df0 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62  _function_utf16b
10e00 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  e(.  sqlite3_con
10e10 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
10e20 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
10e30 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
10e40 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
10e50 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f  *interp;.  Tcl_O
10e60 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  bj *pX;.  sqlite
10e70 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
10e80 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49   interp = (Tcl_I
10e90 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f  nterp *)sqlite3_
10ea0 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
10eb0 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53  .  pX = Tcl_NewS
10ec0 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66  tringObj("test_f
10ed0 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20  unction", -1);. 
10ee0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
10ef0 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  t(pX);.  Tcl_Lis
10f00 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10f10 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63  t(interp, pX, Tc
10f20 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10f30 55 54 46 2d 31 36 42 45 22 2c 20 2d 31 29 29 3b  UTF-16BE", -1));
10f40 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
10f50 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10f60 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54  rp, pX, .      T
10f70 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10f80 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
10f90 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
10fa0 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  ]), -1));.  Tcl_
10fb0 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
10fc0 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  , pX, 0);.  Tcl_
10fd0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  DecrRefCount(pX)
10fe0 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
10ff0 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
11000 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
11010 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63  Str(pVal, -1, Tc
11020 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
11030 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20  t(interp), .    
11040 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
11050 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
11060 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
11070 74 65 78 74 31 36 6c 65 28 70 43 74 78 2c 20 73  text16le(pCtx, s
11080 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
11090 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20  t16le(pVal),.   
110a0 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52     -1, SQLITE_TR
110b0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
110c0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
110d0 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
110e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
110f0 36 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  6 */.static int 
11100 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  test_function(. 
11110 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
11120 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
11130 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
11140 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
11150 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
11160 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11170 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
11180 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
11190 76 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  val;..  if( objc
111a0 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=5 ) goto bad_a
111b0 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62  rgs;.  if( getDb
111c0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
111d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
111e0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
111f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11200 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ..  if( TCL_OK!=
11210 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
11220 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
11230 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[2], &val) ) r
11240 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11250 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20  .  if( val ){.  
11260 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11270 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
11280 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31  est_function", 1
11290 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a  , SQLITE_UTF8, .
112a0 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
112b0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
112c0 66 38 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  f8, 0, 0);.  }. 
112d0 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
112e0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
112f0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
11300 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  3], &val) ) retu
11310 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11320 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73  if( val ){.    s
11330 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
11340 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  nction(db, "test
11350 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53  _function", 1, S
11360 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a  QLITE_UTF16LE, .
11370 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
11380 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
11390 66 31 36 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20  f16le, 0, 0);.  
113a0 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  }.  if( TCL_OK!=
113b0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
113c0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
113d0 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[4], &val) ) r
113e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
113f0 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20  .  if( val ){.  
11400 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11410 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
11420 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31  est_function", 1
11430 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
11440 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72  , .        inter
11450 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  p, test_function
11460 5f 75 74 66 31 36 62 65 2c 20 30 2c 20 30 29 3b  _utf16be, 0, 0);
11470 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
11480 43 4c 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67 73 3a  CL_OK;.bad_args:
11490 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
114a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
114b0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
114c0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
114d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
114e0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
114f0 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20  , " <DB> <utf8> 
11500 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
11510 62 65 3e 22 2c 20 30 29 3b 0a 23 65 6e 64 69 66  be>", 0);.#endif
11520 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11530 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
11540 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
11550 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20  /*.** Usage:    
11560 20 20 20 20 20 74 65 73 74 5f 65 72 72 73 74 72       test_errstr
11570 20 3c 65 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a   <err code>.**.*
11580 2a 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20  * Test that the 
11590 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  english language
115a0 20 73 74 72 69 6e 67 20 65 71 75 69 76 61 6c 65   string equivale
115b0 6e 74 73 20 66 6f 72 20 73 71 6c 69 74 65 20 65  nts for sqlite e
115c0 72 72 6f 72 20 63 6f 64 65 73 0a 2a 2a 20 61 72  rror codes.** ar
115d0 65 20 73 61 6e 65 2e 20 54 68 65 20 70 61 72 61  e sane. The para
115e0 6d 65 74 65 72 20 69 73 20 61 6e 20 69 6e 74 65  meter is an inte
115f0 67 65 72 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ger representing
11600 20 61 6e 20 73 71 6c 69 74 65 20 65 72 72 6f 72   an sqlite error
11610 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 72 65   code..** The re
11620 73 75 6c 74 20 69 73 20 61 20 6c 69 73 74 20 6f  sult is a list o
11630 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20  f two elements, 
11640 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
11650 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
11660 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61  .** error code a
11670 6e 64 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c  nd the english l
11680 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
11690 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
116a0 6e 74 20 74 65 73 74 5f 65 72 72 73 74 72 28 0a  nt test_errstr(.
116b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
116c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
116d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
116e0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
116f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
11700 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b  {.  char *zCode;
11710 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
11720 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
11730 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
11740 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
11750 20 22 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22 29   "<error code>")
11760 3b 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d  ;.  }..  zCode =
11770 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11780 62 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[1]);.  for(i
11790 3d 30 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29 7b  =0; i<200; i++){
117a0 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63  .    if( 0==strc
117b0 6d 70 28 74 31 45 72 72 6f 72 4e 61 6d 65 28 69  mp(t1ErrorName(i
117c0 29 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61  ), zCode) ) brea
117d0 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  k;.  }.  Tcl_Set
117e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
117f0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
11800 72 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72  rStr(i), 0);.  r
11810 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
11820 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
11830 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a   breakpoint.**.*
11840 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
11850 78 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75  xists for one pu
11860 72 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69  rpose - to provi
11870 64 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75  de a place to pu
11880 74 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e  t a.** breakpoin
11890 74 20 77 69 74 68 20 47 44 42 20 74 68 61 74 20  t with GDB that 
118a0 63 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 64  can be triggered
118b0 20 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e   using TCL code.
118c0 20 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72    The use.** for
118d0 20 74 68 69 73 20 69 73 20 77 68 65 6e 20 61 20   this is when a 
118e0 70 61 72 74 69 63 75 6c 61 72 20 74 65 73 74 20  particular test 
118f0 66 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74  fails on (say) t
11900 68 65 20 31 34 38 35 74 68 20 69 74 65 72 61 74  he 1485th iterat
11910 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54  ion..** In the T
11920 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c 20  CL test script, 
11930 77 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20  we can add code 
11940 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
11950 20 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38       if {$i==148
11960 35 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a  5} breakpoint.**
11970 0a 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73  .** Then run tes
11980 74 66 69 78 74 75 72 65 20 69 6e 20 74 68 65 20  tfixture in the 
11990 64 65 62 75 67 67 65 72 20 61 6e 64 20 77 61 69  debugger and wai
119a0 74 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70  t for the breakp
119b0 6f 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e  oint to.** fire.
119c0 20 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61    Then additiona
119d0 6c 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61  l breakpoints ca
119e0 6e 20 62 65 20 73 65 74 20 74 6f 20 74 72 61 63  n be set to trac
119f0 65 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a  e down the bug..
11a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
11a10 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20  st_breakpoint(. 
11a20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
11a30 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
11a40 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
11a50 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
11a60 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
11a70 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
11a80 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
11a90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11aa0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
11ab0 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
11ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
11ad0 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
11ae0 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  t */.){.  return
11af0 20 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20   TCL_OK;        
11b00 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
11b10 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  /.}../*.** Usage
11b20 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
11b30 5f 7a 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54 20  _zeroblob  STMT 
11b40 49 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  IDX N.**.** Test
11b50 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
11b60 64 5f 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65 72  d_zeroblob inter
11b70 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
11b80 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
11b90 65 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74  ent..** IDX is t
11ba0 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
11bb0 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
11bc0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
11bd0 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
11be0 2a 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74  ** binds a N-byt
11bf0 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c  e zero-filled BL
11c00 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  OB to the wildca
11c10 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
11c20 74 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f  t test_bind_zero
11c30 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63  blob(.  void * c
11c40 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
11c50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
11c60 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
11c70 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
11c80 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
11c90 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
11ca0 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
11cb0 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  n;.  int rc;..  
11cc0 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
11cd0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
11ce0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
11cf0 62 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e  bjv, "STMT IDX N
11d00 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
11d10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
11d20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
11d30 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
11d40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
11d50 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
11d60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11d70 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
11d80 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
11d90 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
11da0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11db0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
11dc0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
11dd0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20  p, objv[3], &n) 
11de0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
11df0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
11e00 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
11e10 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29  b(pStmt, idx, n)
11e20 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
11e30 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
11e40 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
11e50 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
11e60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
11e70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11e80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
11e90 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
11ea0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
11eb0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
11ec0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
11ed0 74 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  t  STMT N VALUE.
11ee0 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
11ef0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
11f00 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
11f10 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
11f20 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
11f30 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
11f40 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
11f50 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
11f60 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
11f70 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32  nd.** binds a 32
11f80 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
11f90 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
11fa0 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
11fb0 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74  nt test_bind_int
11fc0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
11fd0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
11fe0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
11ff0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
12000 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
12010 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
12020 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
12030 20 69 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75   idx;.  int valu
12040 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
12050 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
12060 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12070 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
12080 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
12090 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
120a0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
120b0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
120c0 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c  0), " STMT N VAL
120d0 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  UE", 0);.    ret
120e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
120f0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
12100 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
12110 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
12120 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
12130 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12140 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
12150 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
12160 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
12170 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
12180 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
12190 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
121a0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
121b0 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72   &value) ) retur
121c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
121d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
121e0 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78  d_int(pStmt, idx
121f0 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20  , value);.  if( 
12200 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
12210 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
12220 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
12230 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12240 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
12250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
12260 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12270 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
12280 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
12290 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
122a0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54  3_bind_int64  ST
122b0 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  MT N VALUE.**.**
122c0 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
122d0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74  3_bind_int64 int
122e0 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
122f0 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
12300 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
12310 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
12320 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
12330 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
12340 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
12350 2a 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69  ** binds a 64-bi
12360 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20  t integer VALUE 
12370 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64  to that wildcard
12380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12390 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28  test_bind_int64(
123a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
123b0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
123c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
123d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
123e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
123f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
12400 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
12410 69 64 78 3b 0a 20 20 69 36 34 20 76 61 6c 75 65  idx;.  i64 value
12420 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
12430 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
12440 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12450 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
12460 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
12470 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
12480 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
12490 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
124a0 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
124b0 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
124c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
124d0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
124e0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
124f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
12500 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
12510 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12520 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
12530 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
12540 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
12550 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
12560 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
12570 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
12580 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
12590 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65  3], &value) ) re
125a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
125b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
125c0 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
125d0 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20  , idx, value);. 
125e0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
125f0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
12600 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
12610 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
12620 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
12630 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12640 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12650 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
12660 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
12670 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
12680 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
12690 6c 65 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  le  STMT N VALUE
126a0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
126b0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
126c0 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ble interface.  
126d0 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
126e0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
126f0 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
12700 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
12710 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
12720 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
12730 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
12740 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
12750 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77   VALUE to that w
12760 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
12770 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
12780 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20  _double(.  void 
12790 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
127a0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
127b0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
127c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
127d0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
127e0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
127f0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 64  ;.  int idx;.  d
12800 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 69  ouble value;.  i
12810 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
12820 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
12830 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12840 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
12850 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
12860 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
12870 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
12880 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
12890 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30  STMT N VALUE", 0
128a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
128b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
128c0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
128d0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
128e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
128f0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
12900 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12910 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
12920 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
12930 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
12940 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12950 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44  ;.  if( Tcl_GetD
12960 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  oubleFromObj(int
12970 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
12980 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54  alue) ) return T
12990 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
129a0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64  = sqlite3_bind_d
129b0 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78  ouble(pStmt, idx
129c0 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20  , value);.  if( 
129d0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
129e0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
129f0 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
12a00 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12a10 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
12a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
12a30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12a40 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
12a50 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
12a60 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
12a70 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54  _bind_null  STMT
12a80 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68   N.**.** Test th
12a90 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  e sqlite3_bind_n
12aa0 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ull interface.  
12ab0 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
12ac0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
12ad0 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
12ae0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
12af0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
12b00 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
12b10 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
12b20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69  a NULL to the wi
12b30 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
12b40 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
12b50 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  null(.  void * c
12b60 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
12b70 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
12b80 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
12b90 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
12ba0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
12bb0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
12bc0 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
12bd0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
12be0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
12bf0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12c00 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
12c10 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
12c20 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
12c30 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
12c40 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
12c50 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T N", 0);.    re
12c60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12c70 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
12c80 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
12c90 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
12ca0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
12cb0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12cc0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
12cd0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
12ce0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
12cf0 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
12d00 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
12d10 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
12d20 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a  ll(pStmt, idx);.
12d30 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
12d40 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
12d50 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
12d60 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
12d70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
12d80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12d90 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12da0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
12db0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
12dc0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
12dd0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
12de0 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20    STMT N STRING 
12df0 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74  BYTES.**.** Test
12e00 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
12e10 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63 65  d_text interface
12e20 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
12e30 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
12e40 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
12e50 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
12e60 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
12e70 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
12e80 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
12e90 64 73 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e  ds a UTF-8 strin
12ea0 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20  g STRING to the 
12eb0 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73  wildcard.  The s
12ec0 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62  tring is BYTES b
12ed0 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f  ytes.** long..*/
12ee0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
12ef0 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f  _bind_text(.  vo
12f00 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
12f10 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
12f20 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
12f30 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
12f40 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
12f50 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
12f60 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
12f70 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
12f80 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e  har *value;.  in
12f90 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
12fa0 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
12fb0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
12fc0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
12fd0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
12fe0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
12ff0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
13000 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
13010 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45  TMT N VALUE BYTE
13020 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
13030 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13040 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
13050 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
13060 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
13070 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
13080 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13090 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
130a0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
130b0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
130c0 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
130d0 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d  ERROR;.  value =
130e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
130f0 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[3]);.  if( T
13100 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
13110 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
13120 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
13130 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
13140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
13150 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
13160 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65 73  dx, value, bytes
13170 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
13180 4e 54 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  NT);.  if( sqlit
13190 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
131a0 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
131b0 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
131c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
131d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
131e0 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
131f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13200 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  p, sqlite3TestEr
13210 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
13220 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13230 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
13240 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
13250 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
13260 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
13270 31 36 20 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d  16 ?-static? STM
13280 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53  T N STRING BYTES
13290 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
132a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
132b0 74 31 36 20 69 6e 74 65 72 66 61 63 65 2e 20 20  t16 interface.  
132c0 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
132d0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
132e0 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
132f0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
13300 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
13310 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
13320 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
13330 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20  a UTF-16 string 
13340 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69  STRING to the wi
13350 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72  ldcard.  The str
13360 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74  ing is BYTES byt
13370 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73  es.** long..*/.s
13380 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
13390 69 6e 64 5f 74 65 78 74 31 36 28 0a 20 20 76 6f  ind_text16(.  vo
133a0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
133b0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
133c0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
133d0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
133e0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
133f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13400 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65  T_UTF16.  sqlite
13410 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
13420 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
13430 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76  bytes;.  char *v
13440 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
13450 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
13460 29 20 3d 20 28 6f 62 6a 63 3d 3d 36 3f 53 51 4c  ) = (objc==6?SQL
13470 49 54 45 5f 53 54 41 54 49 43 3a 53 51 4c 49 54  ITE_STATIC:SQLIT
13480 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
13490 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 6d 74 20 20  Tcl_Obj *oStmt  
134a0 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 34 5d    = objv[objc-4]
134b0 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 4e 20  ;.  Tcl_Obj *oN 
134c0 20 20 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a        = objv[obj
134d0 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  c-3];.  Tcl_Obj 
134e0 2a 6f 53 74 72 69 6e 67 20 20 3d 20 6f 62 6a 76  *oString  = objv
134f0 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20 54 63 6c 5f  [objc-2];.  Tcl_
13500 4f 62 6a 20 2a 6f 42 79 74 65 73 20 20 20 3d 20  Obj *oBytes   = 
13510 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20  objv[objc-1];.. 
13520 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
13530 6f 62 6a 63 21 3d 36 29 7b 0a 20 20 20 20 54 63  objc!=6){.    Tc
13540 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13550 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
13560 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
13570 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
13580 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
13590 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
135a0 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59   STMT N VALUE BY
135b0 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TES", 0);.    re
135c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
135d0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
135e0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
135f0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
13600 6f 53 74 6d 74 29 2c 20 26 70 53 74 6d 74 29 20  oStmt), &pStmt) 
13610 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13620 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
13630 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
13640 72 70 2c 20 6f 4e 2c 20 26 69 64 78 29 20 29 20  rp, oN, &idx) ) 
13650 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13660 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61  ;.  value = (cha
13670 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72  r*)Tcl_GetByteAr
13680 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 53 74 72 69  rayFromObj(oStri
13690 6e 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 54 63  ng, 0);.  if( Tc
136a0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
136b0 69 6e 74 65 72 70 2c 20 6f 42 79 74 65 73 2c 20  interp, oBytes, 
136c0 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
136d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
136e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
136f0 5f 74 65 78 74 31 36 28 70 53 74 6d 74 2c 20 69  _text16(pStmt, i
13700 64 78 2c 20 28 76 6f 69 64 20 2a 29 76 61 6c 75  dx, (void *)valu
13710 65 2c 20 62 79 74 65 73 2c 20 78 44 65 6c 29 3b  e, bytes, xDel);
13720 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
13730 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
13740 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
13750 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
13760 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
13770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13780 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
13790 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e  _ERROR;.  }..#en
137a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
137b0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
137c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
137d0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
137e0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
137f0 20 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20   ?-static? STMT 
13800 4e 20 44 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a  N DATA BYTES.**.
13810 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
13820 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e  te3_bind_blob in
13830 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
13840 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
13850 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
13860 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
13870 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
13880 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
13890 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
138a0 0a 2a 2a 20 62 69 6e 64 73 20 61 20 42 4c 4f 42  .** binds a BLOB
138b0 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
138c0 2e 20 20 54 68 65 20 42 4c 4f 42 20 69 73 20 42  .  The BLOB is B
138d0 59 54 45 53 20 62 79 74 65 73 20 69 6e 20 73 69  YTES bytes in si
138e0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
138f0 74 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62  t test_bind_blob
13900 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
13910 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
13920 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
13930 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
13940 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
13950 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
13960 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
13970 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65   idx;.  int byte
13980 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65  s;.  char *value
13990 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  ;.  int rc;.  sq
139a0 6c 69 74 65 33 5f 64 65 73 74 72 75 63 74 6f 72  lite3_destructor
139b0 5f 74 79 70 65 20 78 44 65 73 74 72 75 63 74 6f  _type xDestructo
139c0 72 20 3d 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  r = SQLITE_TRANS
139d0 49 45 4e 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  IENT;..  if( obj
139e0 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 20  c!=5 && objc!=6 
139f0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
13a00 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13a10 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
13a20 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
13a30 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
13a40 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
13a50 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
13a60 20 44 41 54 41 20 42 59 54 45 53 22 2c 20 30 29   DATA BYTES", 0)
13a70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
13a80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
13a90 66 28 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20  f( objc==6 ){.  
13aa0 20 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20    xDestructor = 
13ab0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 3b 0a 20  SQLITE_STATIC;. 
13ac0 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a     objv++;.  }..
13ad0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
13ae0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
13af0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13b00 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
13b10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13b20 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
13b30 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
13b40 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
13b50 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13b60 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63  OR;.  value = Tc
13b70 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
13b80 5b 33 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [3]);.  if( Tcl_
13b90 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
13ba0 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
13bb0 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
13bc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
13bd0 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
13be0 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c  blob(pStmt, idx,
13bf0 20 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78   value, bytes, x
13c00 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 69  Destructor);.  i
13c10 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
13c20 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
13c30 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
13c40 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
13c50 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
13c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13c70 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13c80 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
13c90 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
13ca0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
13cb0 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
13cc0 65 72 5f 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a  er_count  STMT.*
13cd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13ce0 6e 75 6d 62 65 72 20 6f 66 20 77 69 6c 64 63 61  number of wildca
13cf0 72 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e  rds in the given
13d00 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73   statement..*/.s
13d10 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
13d20 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
13d30 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  unt(.  void * cl
13d40 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
13d50 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
13d60 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
13d70 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
13d80 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
13d90 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
13da0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
13db0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
13dc0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
13dd0 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
13de0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13df0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
13e00 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
13e10 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
13e20 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
13e30 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
13e40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
13e50 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
13e60 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
13e70 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  bj(sqlite3_bind_
13e80 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28  parameter_count(
13e90 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75  pStmt)));.  retu
13ea0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
13eb0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
13ec0 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
13ed0 74 65 72 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20  ter_name  STMT  
13ee0 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  N.**.** Return t
13ef0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e  he name of the N
13f00 74 68 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68  th wildcard.  Th
13f10 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
13f20 20 69 73 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70   is 1..** An emp
13f30 74 79 20 73 74 72 69 6e 67 20 69 73 20 72 65 74  ty string is ret
13f40 75 72 6e 65 64 20 69 66 20 4e 20 69 73 20 6f 75  urned if N is ou
13f50 74 20 6f 66 20 72 61 6e 67 65 20 6f 72 20 69 66  t of range or if
13f60 20 74 68 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a   the wildcard.**
13f70 20 69 73 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f   is nameless..*/
13f80 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
13f90 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
13fa0 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  name(.  void * c
13fb0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
13fc0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
13fd0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
13fe0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
13ff0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
14000 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
14010 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f   int i;..  if( o
14020 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
14030 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
14040 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
14050 22 53 54 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72  "STMT N");.    r
14060 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14070 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
14080 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
14090 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
140a0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
140b0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
140c0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
140d0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
140e0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
140f0 69 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  i) ) return TCL_
14100 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
14110 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
14120 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 53  , .     Tcl_NewS
14130 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
14140 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
14150 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31  name(pStmt,i),-1
14160 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ).  );.  return 
14170 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
14180 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
14190 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
141a0 5f 69 6e 64 65 78 20 20 53 54 4d 54 20 20 4e 41  _index  STMT  NA
141b0 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ME.**.** Return 
141c0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
141d0 20 77 69 6c 64 63 61 72 64 20 63 61 6c 6c 65 64   wildcard called
141e0 20 4e 41 4d 45 2e 20 20 52 65 74 75 72 6e 20 30   NAME.  Return 0
141f0 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
14200 6e 6f 20 73 75 63 68 20 77 69 6c 64 63 61 72 64  no such wildcard
14210 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14220 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
14230 74 65 72 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69  ter_index(.  voi
14240 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
14250 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
14260 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
14270 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
14280 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
14290 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
142a0 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
142b0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
142c0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
142d0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
142e0 54 20 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65  T NAME");.    re
142f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14300 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
14310 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
14320 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
14330 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
14340 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
14350 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
14360 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
14370 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74  .     Tcl_NewInt
14380 4f 62 6a 28 0a 20 20 20 20 20 20 20 73 71 6c 69  Obj(.       sqli
14390 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
143a0 65 72 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c 54  er_index(pStmt,T
143b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
143c0 76 5b 32 5d 29 29 0a 20 20 20 20 20 29 0a 20 20  v[2])).     ).  
143d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
143e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
143f0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  ge:   sqlite3_cl
14400 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d  ear_bindings STM
14410 54 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  T.**.*/.static i
14420 6e 74 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69  nt test_clear_bi
14430 6e 64 69 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a  ndings(.  void *
14440 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
14450 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
14460 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
14470 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
14480 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
14490 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
144a0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
144b0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
144c0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
144d0 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29  1, objv, "STMT")
144e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
144f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
14500 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
14510 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
14520 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
14530 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
14540 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  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 49  interp, Tcl_NewI
14570 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c  ntObj(sqlite3_cl
14580 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74  ear_bindings(pSt
14590 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
145a0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
145b0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
145c0 33 5f 73 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43  3_sleep MILLISEC
145d0 4f 4e 44 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ONDS.*/.static i
145e0 6e 74 20 74 65 73 74 5f 73 6c 65 65 70 28 0a 20  nt test_sleep(. 
145f0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
14600 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
14610 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
14620 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
14630 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
14640 0a 20 20 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66  .  int ms;..  if
14650 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
14660 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
14670 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
14680 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53  v, "MILLISECONDS
14690 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
146a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
146b0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
146c0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
146d0 6a 76 5b 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20  jv[1], &ms) ){. 
146e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
146f0 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  ROR;.  }.  Tcl_S
14700 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
14710 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
14720 6a 28 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28  j(sqlite3_sleep(
14730 6d 73 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ms)));.  return 
14740 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
14750 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
14760 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a  errcode DB.**.**
14770 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72 69   Return the stri
14780 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
14790 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
147a0 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41  cent sqlite3_* A
147b0 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  PI.** error code
147c0 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45  . e.g. "SQLITE_E
147d0 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  RROR"..*/.static
147e0 20 69 6e 74 20 74 65 73 74 5f 65 72 72 63 6f 64   int test_errcod
147f0 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
14800 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
14810 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
14820 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
14830 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
14840 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
14850 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
14860 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a  char zBuf[30];..
14870 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
14880 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
14890 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
148a0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
148b0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
148c0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
148d0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
148e0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
148f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
14900 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
14910 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
14920 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
14930 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
14940 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
14950 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
14960 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 28  ode(db);.  if( (
14970 72 63 26 30 78 66 66 29 3d 3d 72 63 20 29 7b 0a  rc&0xff)==rc ){.
14980 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b      zBuf[0] = 0;
14990 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70  .  }else{.    sp
149a0 72 69 6e 74 66 28 7a 42 75 66 2c 22 2b 25 64 22  rintf(zBuf,"+%d"
149b0 2c 20 72 63 3e 3e 38 29 3b 0a 20 20 7d 0a 20 20  , rc>>8);.  }.  
149c0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
149d0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
149e0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
149f0 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
14a00 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
14a10 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74  /*.** Usage:   t
14a20 65 73 74 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a  est_errmsg DB.**
14a30 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20  .** Returns the 
14a40 55 54 46 2d 38 20 72 65 70 72 65 73 65 6e 74 61  UTF-8 representa
14a50 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f  tion of the erro
14a60 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67  r message string
14a70 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74   for the.** most
14a80 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
14a90 2a 20 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73  * API call..*/.s
14aa0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
14ab0 72 72 6d 73 67 28 0a 20 20 76 6f 69 64 20 2a 20  rrmsg(.  void * 
14ac0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
14ad0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14ae0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
14af0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
14b00 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
14b10 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
14b20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69  char *zErr;..  i
14b30 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
14b40 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14b50 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
14b60 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
14b70 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
14b80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
14b90 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
14ba0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
14bb0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
14bc0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
14bd0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
14be0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
14bf0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
14c00 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72  CL_ERROR;..  zEr
14c10 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  r = sqlite3_errm
14c20 73 67 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65  sg(db);.  Tcl_Se
14c30 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
14c40 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
14c50 4f 62 6a 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a  Obj(zErr, -1));.
14c60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
14c70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
14c80 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36     test_errmsg16
14c90 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
14ca0 73 20 74 68 65 20 55 54 46 2d 31 36 20 72 65 70  s the UTF-16 rep
14cb0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
14cc0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
14cd0 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a   string for the.
14ce0 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  ** most recent s
14cf0 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c  qlite3_* API cal
14d00 6c 2e 20 54 68 69 73 20 69 73 20 61 20 62 79 74  l. This is a byt
14d10 65 20 61 72 72 61 79 20 6f 62 6a 65 63 74 20 61  e array object a
14d20 74 20 74 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65  t the TCL .** le
14d30 76 65 6c 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c  vel, and it incl
14d40 75 64 65 73 20 74 68 65 20 30 78 30 30 20 30 78  udes the 0x00 0x
14d50 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  00 terminator by
14d60 74 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tes at the end o
14d70 66 20 74 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20  f the.** UTF-16 
14d80 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
14d90 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73  c int test_errms
14da0 67 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  g16(.  void * cl
14db0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
14dc0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
14dd0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
14de0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
14df0 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
14e00 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
14e10 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
14e20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 45    const void *zE
14e30 72 72 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 20  rr;.  int bytes 
14e40 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
14e50 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
14e60 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
14e70 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
14e80 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
14e90 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
14ea0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
14eb0 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
14ec0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14ed0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
14ee0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
14ef0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
14f00 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
14f10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14f20 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c  R;..  zErr = sql
14f30 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 64 62  ite3_errmsg16(db
14f40 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
14f50 0a 20 20 20 20 62 79 74 65 73 20 3d 20 73 71 6c  .    bytes = sql
14f60 69 74 65 33 55 74 66 31 36 42 79 74 65 4c 65 6e  ite3Utf16ByteLen
14f70 28 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20 7d 0a  (zErr, -1);.  }.
14f80 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
14f90 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
14fa0 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a  ewByteArrayObj(z
14fb0 45 72 72 2c 20 62 79 74 65 73 29 29 3b 0a 23 65  Err, bytes));.#e
14fc0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
14fd0 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72  MIT_UTF16 */.  r
14fe0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
14ff0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
15000 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 44 42  lite3_prepare DB
15010 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76   sql bytes tailv
15020 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  ar.**.** Compile
15030 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62   up to <bytes> b
15040 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70  ytes of the supp
15050 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20  lied SQL string 
15060 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64  <sql> using.** d
15070 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
15080 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74  DB>. The paramet
15090 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20  er <tailval> is 
150a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c  the name of a gl
150b0 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  obal.** variable
150c0 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20   that is set to 
150d0 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69  the unused porti
150e0 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20  on of <sql> (if 
150f0 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20  any). A.** STMT 
15100 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e  handle is return
15110 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
15120 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a  t test_prepare(.
15130 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
15140 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
15150 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
15160 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
15170 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
15180 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
15190 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
151a0 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  Sql;.  int bytes
151b0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
151c0 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  zTail = 0;.  sql
151d0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
151e0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
151f0 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  f[50];.  int rc;
15200 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
15210 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
15220 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15230 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
15240 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
15250 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
15260 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
15270 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69  DB sql bytes tai
15280 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72  lvar", 0);.    r
15290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
152a0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
152b0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
152c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
152d0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
152e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
152f0 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65  .  zSql = Tcl_Ge
15300 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
15310 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
15320 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
15330 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65  , objv[3], &byte
15340 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
15350 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
15360 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64  qlite3_prepare(d
15370 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
15380 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b  &pStmt, &zTail);
15390 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
153a0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
153b0 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
153c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
153d0 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20  if( zTail ){.   
153e0 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b   if( bytes>=0 ){
153f0 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62  .      bytes = b
15400 79 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53  ytes - (zTail-zS
15410 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ql);.    }.    T
15420 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
15430 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30  terp, objv[4], 0
15440 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
15450 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29  bj(zTail, bytes)
15460 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
15470 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15480 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
15490 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70 72  mt==0 );.    spr
154a0 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29  intf(zBuf, "(%d)
154b0 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c   ", rc);.    Tcl
154c0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
154d0 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69  terp, zBuf, sqli
154e0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
154f0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
15500 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
15510 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
15520 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
15530 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
15540 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
15550 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
15560 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c  L_ERROR;.    Tcl
15570 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15580 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
15590 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
155a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
155b0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
155c0 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c 20 62  pare_v2 DB sql b
155d0 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a  ytes tailvar.**.
155e0 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f  ** Compile up to
155f0 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f   <bytes> bytes o
15600 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53  f the supplied S
15610 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20  QL string <sql> 
15620 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  using.** databas
15630 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54  e handle <DB>. T
15640 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61  he parameter <ta
15650 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61  ilval> is the na
15660 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a  me of a global.*
15670 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  * variable that 
15680 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e  is set to the un
15690 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  used portion of 
156a0 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20  <sql> (if any). 
156b0 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65  A.** STMT handle
156c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
156d0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
156e0 5f 70 72 65 70 61 72 65 5f 76 32 28 0a 20 20 76  _prepare_v2(.  v
156f0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15700 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15710 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15720 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15730 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15740 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
15750 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
15760 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
15770 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
15780 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  il = 0;.  sqlite
15790 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
157a0 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
157b0 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
157c0 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
157d0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
157e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
157f0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
15800 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
15810 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
15820 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
15830 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
15840 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 0);.    retu
15850 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15860 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
15870 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
15880 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
15890 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
158a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
158b0 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
158c0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
158d0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
158e0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
158f0 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
15900 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15910 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
15920 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
15930 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
15940 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b  &pStmt, &zTail);
15950 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51  .  assert(rc==SQ
15960 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74  LITE_OK || pStmt
15970 3d 3d 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ==0);.  if( sqli
15980 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
15990 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
159a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
159b0 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 29  R;.  if( zTail )
159c0 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65 73 3e  {.    if( bytes>
159d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65  =0 ){.      byte
159e0 73 20 3d 20 62 79 74 65 73 20 2d 20 28 7a 54 61  s = bytes - (zTa
159f0 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  il-zSql);.    }.
15a00 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
15a10 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  r2(interp, objv[
15a20 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74  4], 0, Tcl_NewSt
15a30 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62  ringObj(zTail, b
15a40 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20  ytes), 0);.  }. 
15a50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15a60 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
15a70 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ( pStmt==0 );.  
15a80 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
15a90 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20  "(%d) ", rc);.  
15aa0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
15ab0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
15ac0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
15ad0 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  db), 0);.    ret
15ae0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15af0 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
15b00 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
15b10 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
15b20 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
15b30 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
15b40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15b50 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
15b60 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
15b70 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
15b80 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
15b90 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
15ba0 33 5f 70 72 65 70 61 72 65 31 36 20 44 42 20 73  3_prepare16 DB s
15bb0 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
15bc0 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
15bd0 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
15be0 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
15bf0 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
15c00 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
15c10 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
15c20 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
15c30 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
15c40 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
15c50 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
15c60 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
15c70 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
15c80 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
15c90 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
15ca0 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
15cb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15cc0 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 28 0a  test_prepare16(.
15cd0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
15ce0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
15cf0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
15d00 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
15d10 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
15d20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
15d30 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
15d40 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
15d50 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20  st void *zSql;. 
15d60 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61   const void *zTa
15d70 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62  il = 0;.  Tcl_Ob
15d80 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20  j *pTail = 0;.  
15d90 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
15da0 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
15db0 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74  zBuf[50]; .  int
15dc0 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73   rc;.  int bytes
15dd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15de0 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20   /* The integer 
15df0 73 70 65 63 69 66 69 65 64 20 61 73 20 61 72 67  specified as arg
15e00 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c   3 */.  int objl
15e10 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
15e20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72    /* The byte-ar
15e30 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72  ray length of ar
15e40 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  g 2 */..  if( ob
15e50 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
15e60 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15e70 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
15e80 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
15e90 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
15ea0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
15eb0 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
15ec0 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b  es tailvar", 0);
15ed0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
15ee0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
15ef0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
15f00 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
15f10 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
15f20 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
15f30 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
15f40 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
15f50 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
15f60 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28   &objlen);.  if(
15f70 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
15f80 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
15f90 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
15fa0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15fb0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
15fc0 70 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53  prepare16(db, zS
15fd0 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
15fe0 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66  t, &zTail);.  if
15ff0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
16000 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
16010 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
16020 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
16030 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
16040 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16050 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
16060 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c     objlen = objl
16070 65 6e 20 2d 20 28 28 75 38 20 2a 29 7a 54 61 69  en - ((u8 *)zTai
16080 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20  l-(u8 *)zSql);. 
16090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 62 6a 6c   }else{.    objl
160a0 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54  en = 0;.  }.  pT
160b0 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  ail = Tcl_NewByt
160c0 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29  eArrayObj((u8 *)
160d0 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a  zTail, objlen);.
160e0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
160f0 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 54 63 6c  nt(pTail);.  Tcl
16100 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
16110 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20  rp, objv[4], 0, 
16120 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 54 63 6c  pTail, 0);.  Tcl
16130 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _DecrRefCount(pT
16140 61 69 6c 29 3b 0a 0a 20 20 69 66 28 20 70 53 74  ail);..  if( pSt
16150 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
16160 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
16170 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
16180 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
16190 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
161a0 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e  .  }.  Tcl_Appen
161b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
161c0 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66  zBuf, 0);.#endif
161d0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
161e0 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
161f0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
16200 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
16210 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 44  3_prepare16_v2 D
16220 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
16230 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  var.**.** Compil
16240 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
16250 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
16260 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
16270 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
16280 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
16290 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
162a0 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
162b0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
162c0 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
162d0 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
162e0 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
162f0 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
16300 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
16310 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
16320 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
16330 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 31  nt test_prepare1
16340 36 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63  6_v2(.  void * c
16350 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
16360 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16370 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
16380 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
16390 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
163a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
163b0 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  6.  sqlite3 *db;
163c0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
163d0 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Sql;.  const voi
163e0 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20  d *zTail = 0;.  
163f0 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d  Tcl_Obj *pTail =
16400 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
16410 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
16420 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20   char zBuf[50]; 
16430 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
16440 20 62 79 74 65 73 3b 20 20 20 20 20 20 20 20 20   bytes;         
16450 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
16460 74 65 67 65 72 20 73 70 65 63 69 66 69 65 64 20  teger specified 
16470 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e  as arg 3 */.  in
16480 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20  t objlen;       
16490 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
164a0 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68  yte-array length
164b0 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20   of arg 2 */..  
164c0 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
164d0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
164e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
164f0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
16500 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
16510 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
16520 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73  objv[0]), " DB s
16530 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
16540 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
16550 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16560 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
16570 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
16580 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
16590 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
165a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
165b0 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Sql = Tcl_GetByt
165c0 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
165d0 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b  jv[2], &objlen);
165e0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
165f0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
16600 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73   objv[3], &bytes
16610 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16620 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
16630 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f  lite3_prepare16_
16640 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74  v2(db, zSql, byt
16650 65 73 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54 61  es, &pStmt, &zTa
16660 69 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  il);.  if( sqlit
16670 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
16680 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
16690 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
166a0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
166b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
166c0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a  OR;.  }..  if( z
166d0 54 61 69 6c 20 29 7b 0a 20 20 20 20 6f 62 6a 6c  Tail ){.    objl
166e0 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 28  en = objlen - ((
166f0 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a  u8 *)zTail-(u8 *
16700 29 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  )zSql);.  }else{
16710 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b  .    objlen = 0;
16720 0a 20 20 7d 0a 20 20 70 54 61 69 6c 20 3d 20 54  .  }.  pTail = T
16730 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
16740 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20  bj((u8 *)zTail, 
16750 6f 62 6a 6c 65 6e 29 3b 0a 20 20 54 63 6c 5f 49  objlen);.  Tcl_I
16760 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ncrRefCount(pTai
16770 6c 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 53 65 74  l);.  Tcl_ObjSet
16780 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
16790 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20  v[4], 0, pTail, 
167a0 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
167b0 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 0a  fCount(pTail);..
167c0 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
167d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
167e0 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
167f0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
16800 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
16810 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
16820 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
16830 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
16840 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
16850 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
16860 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
16870 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
16880 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20  e: sqlite3_open 
16890 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e  filename ?option
168a0 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69  s-list?.*/.stati
168b0 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28  c int test_open(
168c0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
168d0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
168e0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
168f0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
16900 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
16910 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
16920 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71  *zFilename;.  sq
16930 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
16940 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66   rc;.  char zBuf
16950 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
16960 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=3 && objc!=2
16970 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
16980 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16990 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
169a0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
169b0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
169c0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
169d0 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
169e0 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  s-list", 0);.   
169f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16a00 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e  R;.  }..  zFilen
16a10 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
16a20 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
16a30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
16a40 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62  n(zFilename, &db
16a50 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69  );.  .  if( sqli
16a60 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
16a70 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
16a80 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e  uf, db) ) return
16a90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
16aa0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16ab0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
16ac0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
16ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
16ae0 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  : sqlite3_open16
16af0 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
16b00 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
16b10 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20 76  test_open16(.  v
16b20 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16b30 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16b40 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16b50 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16b60 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
16b70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16b80 49 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73 74  IT_UTF16.  const
16b90 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
16ba0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
16bb0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
16bc0 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20  r zBuf[100];..  
16bd0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
16be0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
16bf0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
16c00 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
16c10 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
16c20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
16c30 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65  objv[0]), " file
16c40 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73  name options-lis
16c50 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  t", 0);.    retu
16c60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16c70 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  }..  zFilename =
16c80 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
16c90 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  yFromObj(objv[1]
16ca0 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
16cb0 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46 69 6c  ite3_open16(zFil
16cc0 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a  ename, &db);.  .
16cd0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
16ce0 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
16cf0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62  interp, zBuf, db
16d00 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16d10 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65  RROR;.  Tcl_Appe
16d20 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16d30 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69   zBuf, 0);.#endi
16d40 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16d50 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
16d60 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
16d70 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
16d80 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20 3c 55  e3_complete16 <U
16d90 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a 2a 2a  TF-16 string>.**
16da0 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
16db0 74 68 65 20 73 75 70 70 6c 69 65 64 20 61 72 67  the supplied arg
16dc0 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d 70 6c  ument is a compl
16dd0 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ete SQL statemen
16de0 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f 74  t, or zero.** ot
16df0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
16e00 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6d 70  ic int test_comp
16e10 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64 20 2a  lete16(.  void *
16e20 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
16e30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
16e40 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
16e50 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
16e60 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 21 64  objv[].){.#if !d
16e70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16e80 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26 26 20  IT_COMPLETE) && 
16e90 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16ea0 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20 63 68  OMIT_UTF16).  ch
16eb0 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66 28  ar *zBuf;..  if(
16ec0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
16ed0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
16ee0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
16ef0 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c 3e 22  , "<utf-16 sql>"
16f00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16f10 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
16f20 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29 54 63  zBuf = (char*)Tc
16f30 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
16f40 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
16f50 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
16f60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
16f70 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
16f80 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28 7a  te3_complete16(z
16f90 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66 20 2f  Buf)));.#endif /
16fa0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
16fb0 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49 54 45  MPLETE && SQLITE
16fc0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
16fd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
16fe0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
16ff0 73 71 6c 69 74 65 33 5f 73 74 65 70 20 53 54 4d  sqlite3_step STM
17000 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  T.**.** Advance 
17010 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
17020 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a   the next row..*
17030 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
17040 74 5f 73 74 65 70 28 0a 20 20 76 6f 69 64 20 2a  t_step(.  void *
17050 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
17060 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17070 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
17080 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
17090 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
170a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
170b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
170c0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
170d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
170e0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
170f0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
17100 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
17110 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
17120 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 22 2c  jv[0]), " STMT",
17130 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
17140 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
17150 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
17160 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
17170 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
17180 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
17190 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
171a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
171b0 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20  step(pStmt);..  
171c0 2f 2a 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  /* if( rc!=SQLIT
171d0 45 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d 53 51  E_DONE && rc!=SQ
171e0 4c 49 54 45 5f 52 4f 57 20 29 20 72 65 74 75 72  LITE_ROW ) retur
171f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f 0a  n TCL_ERROR; */.
17200 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
17210 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
17220 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
17230 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
17240 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
17250 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
17260 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d 54 20  lumn_count STMT 
17270 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
17280 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
17290 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
172a0 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
172b0 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69  t STMT..*/.stati
172c0 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d  c int test_colum
172d0 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20  n_count(.  void 
172e0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
172f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17300 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
17310 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
17320 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
17330 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
17340 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
17350 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
17360 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
17370 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
17380 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
17390 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
173a0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
173b0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
173c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
173d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
173e0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
173f0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
17400 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
17410 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
17420 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
17430 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
17440 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
17450 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
17460 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
17470 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
17480 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
17490 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
174a0 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54 4d  _column_type STM
174b0 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52  T column.**.** R
174c0 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 6f  eturn the type o
174d0 66 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f  f the data in co
174e0 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66  lumn 'column' of
174f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
17500 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17510 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  test_column_type
17520 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
17530 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
17540 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
17550 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
17560 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
17570 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
17580 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
17590 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a   col;.  int tp;.
175a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
175b0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
175c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
175d0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
175e0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
175f0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
17600 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
17610 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
17620 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17630 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
17640 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
17650 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
17660 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
17670 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
17680 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
17690 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
176a0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
176b0 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
176c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
176d0 0a 20 20 74 70 20 3d 20 73 71 6c 69 74 65 33 5f  .  tp = sqlite3_
176e0 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
176f0 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63  t, col);.  switc
17700 68 28 20 74 70 20 29 7b 0a 20 20 20 20 63 61 73  h( tp ){.    cas
17710 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
17720 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  : .      Tcl_Set
17730 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
17740 49 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f 53 54  INTEGER", TCL_ST
17750 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
17760 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
17770 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20  LITE_NULL:.     
17780 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
17790 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54  nterp, "NULL", T
177a0 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
177b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
177c0 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
177d0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
177e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 4c  sult(interp, "FL
177f0 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  OAT", TCL_STATIC
17800 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
17810 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
17820 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 54 63 6c  _TEXT:.      Tcl
17830 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
17840 70 2c 20 22 54 45 58 54 22 2c 20 54 43 4c 5f 53  p, "TEXT", TCL_S
17850 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
17860 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
17870 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20  QLITE_BLOB:.    
17880 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
17890 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20  interp, "BLOB", 
178a0 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
178b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
178c0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
178d0 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20  sert(0);.  }..  
178e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
178f0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
17900 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
17910 74 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  t64 STMT column.
17920 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
17930 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20   data in column 
17940 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20  'column' of the 
17950 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74  current row cast
17960 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28   as an.** wide (
17970 36 34 2d 62 69 74 29 20 69 6e 74 65 67 65 72 2e  64-bit) integer.
17980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
17990 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  est_column_int64
179a0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
179b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
179c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
179d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
179e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
179f0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
17a00 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
17a10 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69 56 61 6c   col;.  i64 iVal
17a20 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
17a30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
17a40 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
17a50 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
17a60 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
17a70 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
17a80 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
17a90 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
17aa0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17ab0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
17ac0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
17ad0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
17ae0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
17af0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
17b00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17b10 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17b20 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17b30 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
17b40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17b50 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73 71 6c 69  ;..  iVal = sqli
17b60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
17b70 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
17b80 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
17b90 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
17ba0 57 69 64 65 49 6e 74 4f 62 6a 28 69 56 61 6c 29  WideIntObj(iVal)
17bb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
17bc0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
17bd0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
17be0 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20 63 6f 6c  mn_blob STMT col
17bf0 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
17c00 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c  t test_column_bl
17c10 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ob(.  void * cli
17c20 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17c30 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17c40 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17c50 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17c60 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
17c70 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
17c80 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74 20 6c  nt col;..  int l
17c90 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  en;.  const void
17ca0 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69 66 28 20   *pBlob;..  if( 
17cb0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
17cc0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
17cd0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
17ce0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
17cf0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
17d00 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
17d10 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
17d20 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
17d30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17d40 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
17d50 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
17d60 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
17d70 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
17d80 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17d90 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
17da0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
17db0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
17dc0 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
17dd0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 6c 65 6e 20  L_ERROR;..  len 
17de0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
17df0 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 63 6f  _bytes(pStmt, co
17e00 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71  l);.  pBlob = sq
17e10 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
17e20 62 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  b(pStmt, col);. 
17e30 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
17e40 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
17e50 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 70 42  wByteArrayObj(pB
17e60 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20 20 72 65  lob, len));.  re
17e70 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
17e80 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
17e90 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
17ea0 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  le STMT column.*
17eb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17ec0 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27  data in column '
17ed0 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63  column' of the c
17ee0 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20  urrent row cast 
17ef0 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a  as a double..*/.
17f00 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
17f10 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 0a 20  column_double(. 
17f20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
17f30 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
17f40 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
17f50 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
17f60 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
17f70 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
17f80 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
17f90 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72 56 61 6c  l;.  double rVal
17fa0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
17fb0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
17fc0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
17fd0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
17fe0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
17ff0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
18000 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
18010 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
18020 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
18030 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
18040 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
18050 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
18060 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
18070 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
18080 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18090 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
180a0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
180b0 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
180c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
180d0 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73 71 6c 69  ;..  rVal = sqli
180e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
180f0 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  e(pStmt, col);. 
18100 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
18110 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
18120 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56 61 6c 29  wDoubleObj(rVal)
18130 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
18140 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
18150 67 65 3a 20 73 71 6c 69 74 65 33 5f 64 61 74 61  ge: sqlite3_data
18160 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a  _count STMT .**.
18170 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
18180 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
18190 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
181a0 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53 54  sql statement ST
181b0 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  MT..*/.static in
181c0 74 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e  t test_data_coun
181d0 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
181e0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
181f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
18200 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
18210 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
18220 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
18230 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
18240 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
18250 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
18260 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
18270 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
18280 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
18290 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
182a0 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
182b0 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
182c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
182d0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
182e0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
182f0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
18300 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
18310 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
18320 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f  L_ERROR;..  Tcl_
18330 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
18340 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
18350 62 6a 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  bj(sqlite3_data_
18360 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a  count(pStmt)));.
18370 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
18380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
18390 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
183a0 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  text STMT column
183b0 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
183c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
183d0 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d  ltype STMT colum
183e0 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
183f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
18400 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  me STMT column.*
18410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
18420 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a 20 20 76  t_stmt_utf8(.  v
18430 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18440 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
18450 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
18460 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
18470 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54 63 6c   invoke */.  Tcl
18480 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18490 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
184a0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
184b0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
184c0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
184d0 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e 73   int col;.  cons
184e0 74 20 63 68 61 72 20 2a 28 2a 78 46 75 6e 63 29  t char *(*xFunc)
184f0 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
18500 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44 61 74  int) = clientDat
18510 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  a;.  const char 
18520 2a 7a 52 65 74 3b 0a 0a 20 20 69 66 28 20 6f 62  *zRet;..  if( ob
18530 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
18540 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18550 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
18560 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
18570 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
18580 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
18590 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
185a0 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
185b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
185c0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
185d0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
185e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
185f0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
18600 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18610 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
18620 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
18630 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
18640 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
18650 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d 20  ERROR;.  zRet = 
18660 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c  xFunc(pStmt, col
18670 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  );.  if( zRet ){
18680 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
18690 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
186a0 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20 7d   *)zRet, 0);.  }
186b0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
186c0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
186d0 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  test_global_reco
186e0 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ver(.  void * cl
186f0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
18700 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
18710 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
18720 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
18730 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
18740 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41  QLITE_OMIT_GLOBA
18750 4c 52 45 43 4f 56 45 52 0a 20 20 69 6e 74 20 72  LRECOVER.  int r
18760 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  c;.  if( objc!=1
18770 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
18780 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
18790 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   1, objv, "");. 
187a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
187b0 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
187c0 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
187d0 65 63 6f 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f  ecover();.  Tcl_
187e0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
187f0 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
18800 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
18810 54 41 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20  TATIC);.#endif. 
18820 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
18830 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
18840 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
18850 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ext STMT column.
18860 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
18870 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
18880 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  type STMT column
18890 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
188a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
188b0 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f  e STMT column.*/
188c0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
188d0 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a 20 20 76  _stmt_utf16(.  v
188e0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
188f0 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ,     /* Pointer
18900 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66   to SQLite API f
18910 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  unction to be in
18920 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  voked */.  Tcl_I
18930 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
18940 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
18950 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
18960 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
18970 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
18980 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
18990 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
189a0 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65  ;.  Tcl_Obj *pRe
189b0 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  t;.  const void 
189c0 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73  *zName16;.  cons
189d0 74 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29  t void *(*xFunc)
189e0 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
189f0 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44 61 74  int) = clientDat
18a00 61 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  a;..  if( objc!=
18a10 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
18a20 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
18a30 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
18a40 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
18a50 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
18a60 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
18a70 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
18a80 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
18a90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
18aa0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
18ab0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
18ac0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
18ad0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
18ae0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18af0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
18b00 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
18b10 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
18b20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18b30 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20  R;..  zName16 = 
18b40 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c  xFunc(pStmt, col
18b50 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 31 36  );.  if( zName16
18b60 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 54   ){.    pRet = T
18b70 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
18b80 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 73 71 6c 69  bj(zName16, sqli
18b90 74 65 33 55 74 66 31 36 42 79 74 65 4c 65 6e 28  te3Utf16ByteLen(
18ba0 7a 4e 61 6d 65 31 36 2c 20 2d 31 29 2b 32 29 3b  zName16, -1)+2);
18bb0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
18bc0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
18bd0 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  et);.  }.#endif 
18be0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
18bf0 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74 75 72  TF16 */..  retur
18c00 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
18c10 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
18c20 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d  3_column_int STM
18c30 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
18c40 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
18c50 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54 20  lumn_bytes STMT 
18c60 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
18c70 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
18c80 6d 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54 20  mn_bytes16 STMT 
18c90 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61  column.**.*/.sta
18ca0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
18cb0 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  t_int(.  void * 
18cc0 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 2f  clientData,    /
18cd0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c  * Pointer to SQL
18ce0 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ite API function
18cf0 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a   to be invoked *
18d00 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
18d10 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18d20 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18d30 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18d40 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
18d50 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
18d60 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  .  int (*xFunc)(
18d70 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
18d80 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  nt) = clientData
18d90 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
18da0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
18db0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18dc0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
18dd0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
18de0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
18df0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
18e00 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
18e10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
18e20 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
18e30 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
18e40 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
18e50 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
18e60 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
18e70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18e80 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
18e90 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
18ea0 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
18eb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18ec0 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
18ed0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
18ee0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e  l_NewIntObj(xFun
18ef0 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b  c(pStmt, col)));
18f00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
18f10 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
18f20 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
18f30 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 55 73 61 67  #if 0./*.** Usag
18f40 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  e:  sqlite3OsOpe
18f50 6e 52 65 61 64 57 72 69 74 65 20 3c 66 69 6c 65  nReadWrite <file
18f60 6e 61 6d 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20  name>.*/.static 
18f70 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33  int test_sqlite3
18f80 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
18f90 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
18fa0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
18fb0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
18fc0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
18fd0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
18fe0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  ){.  sqlite3_fil
18ff0 65 20 2a 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20  e *pFile;.  int 
19000 72 63 3b 0a 20 20 69 6e 74 20 64 75 6d 6d 79 3b  rc;.  int dummy;
19010 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
19020 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
19030 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
19040 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19050 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
19060 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
19070 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
19080 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
19090 22 20 66 69 6c 65 6e 61 6d 65 22 2c 20 30 29 3b  " filename", 0);
190a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
190b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63  ERROR;.  }..  rc
190c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
190d0 52 65 61 64 57 72 69 74 65 28 54 63 6c 5f 47 65  ReadWrite(Tcl_Ge
190e0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
190f0 2c 20 26 70 46 69 6c 65 2c 20 26 64 75 6d 6d 79  , &pFile, &dummy
19100 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
19110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
19120 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
19130 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
19140 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
19150 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
19160 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19170 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 65 73    }.  sqlite3Tes
19180 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
19190 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 46  interp, zBuf, pF
191a0 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  ile);.  Tcl_SetR
191b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
191c0 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
191d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f   TCL_ERROR;.}../
191e0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
191f0 69 74 65 33 4f 73 43 6c 6f 73 65 20 3c 66 69 6c  ite3OsClose <fil
19200 65 20 68 61 6e 64 6c 65 3e 0a 2a 2f 0a 73 74 61  e handle>.*/.sta
19210 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c  tic int test_sql
19220 69 74 65 33 4f 73 43 6c 6f 73 65 28 0a 20 20 76  ite3OsClose(.  v
19230 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
19240 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
19250 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
19260 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
19270 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
19280 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
19290 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  File;.  int rc;.
192a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
192b0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
192c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
192d0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
192e0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
192f0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
19300 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66  ng(objv[0]), " f
19310 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30 29 3b 0a  ilehandle", 0);.
19320 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19330 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
19340 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   getFilePointer(
19350 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
19360 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
19370 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72  &pFile) ){.    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 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
193a0 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 46 69 6c  te3OsClose(&pFil
193b0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
193c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
193d0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
193e0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
193f0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
19400 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
19410 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19420 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
19430 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
19440 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 4f 73  sage:  sqlite3Os
19450 4c 6f 63 6b 20 3c 66 69 6c 65 20 68 61 6e 64 6c  Lock <file handl
19460 65 3e 20 3c 6c 6f 63 6b 74 79 70 65 3e 0a 2a 2f  e> <locktype>.*/
19470 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
19480 5f 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 0a  _sqlite3OsLock(.
19490 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
194a0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
194b0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
194c0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
194d0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
194e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
194f0 20 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   * pFile;.  int 
19500 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
19510 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
19520 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19530 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
19540 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
19550 20 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65   .        Tcl_Ge
19560 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
19570 2c 20 0a 20 20 20 20 20 20 20 20 22 20 66 69 6c  , .        " fil
19580 65 68 61 6e 64 6c 65 20 28 53 48 41 52 45 44 7c  ehandle (SHARED|
19590 52 45 53 45 52 56 45 44 7c 50 45 4e 44 49 4e 47  RESERVED|PENDING
195a0 7c 45 58 43 4c 55 53 49 56 45 29 22 2c 20 30 29  |EXCLUSIVE)", 0)
195b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
195c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
195d0 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65  f( getFilePointe
195e0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
195f0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
19600 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  , &pFile) ){.   
19610 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19620 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 30 3d  R;.  }..  if( 0=
19630 3d 73 74 72 63 6d 70 28 22 53 48 41 52 45 44 22  =strcmp("SHARED"
19640 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
19650 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20  objv[2])) ){.   
19660 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
19670 6f 63 6b 28 70 46 69 6c 65 2c 20 53 48 41 52 45  ock(pFile, SHARE
19680 44 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65  D_LOCK);.  }.  e
19690 6c 73 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d  lse if( 0==strcm
196a0 70 28 22 52 45 53 45 52 56 45 44 22 2c 20 54 63  p("RESERVED", Tc
196b0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
196c0 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20  [2])) ){.    rc 
196d0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
196e0 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
196f0 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73  LOCK);.  }.  els
19700 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28  e if( 0==strcmp(
19710 22 50 45 4e 44 49 4e 47 22 2c 20 54 63 6c 5f 47  "PENDING", Tcl_G
19720 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
19730 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  )) ){.    rc = s
19740 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69  qlite3OsLock(pFi
19750 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  le, PENDING_LOCK
19760 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
19770 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 45 58 43  ( 0==strcmp("EXC
19780 4c 55 53 49 56 45 22 2c 20 54 63 6c 5f 47 65 74  LUSIVE", Tcl_Get
19790 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29  String(objv[2]))
197a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
197b0 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65  ite3OsLock(pFile
197c0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
197d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
197e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
197f0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
19800 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
19810 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  e \"", .        
19820 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19830 6a 76 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20  jv[0]), .       
19840 20 22 20 66 69 6c 65 68 61 6e 64 6c 65 20 28 53   " filehandle (S
19850 48 41 52 45 44 7c 52 45 53 45 52 56 45 44 7c 50  HARED|RESERVED|P
19860 45 4e 44 49 4e 47 7c 45 58 43 4c 55 53 49 56 45  ENDING|EXCLUSIVE
19870 29 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  )", 0);.    retu
19880 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19890 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
198a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
198b0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
198c0 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
198d0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
198e0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
198f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19900 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
19910 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
19920 61 67 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 55  age:  sqlite3OsU
19930 6e 6c 6f 63 6b 20 3c 66 69 6c 65 20 68 61 6e 64  nlock <file hand
19940 6c 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le>.*/.static in
19950 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73  t test_sqlite3Os
19960 55 6e 6c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a  Unlock(.  void *
19970 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
19980 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19990 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
199a0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
199b0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
199c0 74 65 33 5f 66 69 6c 65 20 2a 20 70 46 69 6c 65  te3_file * pFile
199d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
199e0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
199f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19a00 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
19a10 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
19a20 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
19a30 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19a40 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 68  bjv[0]), " fileh
19a50 61 6e 64 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20  andle", 0);.    
19a60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19a70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
19a80 46 69 6c 65 50 6f 69 6e 74 65 72 28 69 6e 74 65  FilePointer(inte
19a90 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
19aa0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 46 69  g(objv[1]), &pFi
19ab0 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  le) ){.    retur
19ac0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19ad0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
19ae0 73 55 6e 6c 6f 63 6b 28 70 46 69 6c 65 2c 20 4e  sUnlock(pFile, N
19af0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  O_LOCK);.  if( r
19b00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19b10 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
19b20 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
19b30 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
19b40 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
19b50 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19b60 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
19b70 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
19b80 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
19b90 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  te3OsTempFileNam
19ba0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
19bb0 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 54 65  test_sqlite3OsTe
19bc0 6d 70 46 69 6c 65 4e 61 6d 65 28 0a 20 20 76 6f  mpFileName(.  vo
19bd0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
19be0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
19bf0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
19c00 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
19c10 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
19c20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c 49 54  char zFile[SQLIT
19c30 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
19c40 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
19c50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 65 6d  c = sqlite3OsTem
19c60 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29  pFileName(zFile)
19c70 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19c80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
19c90 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
19ca0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
19cb0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
19cc0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
19cd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19ce0 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52   }.  Tcl_AppendR
19cf0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 46  esult(interp, zF
19d00 69 6c 65 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  ile, 0);.  retur
19d10 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
19d20 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  if.#endif../*.**
19d30 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
19d40 73 65 74 5f 6d 61 67 69 63 20 20 44 42 20 20 4d  set_magic  DB  M
19d50 41 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a  AGIC-NUMBER.**.*
19d60 2a 20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d 61  * Set the db->ma
19d70 67 69 63 20 76 61 6c 75 65 2e 20 20 54 68 69 73  gic value.  This
19d80 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
19d90 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79 20   error recovery 
19da0 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  logic..*/.static
19db0 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 65 74 5f   int sqlite_set_
19dc0 6d 61 67 69 63 28 0a 20 20 76 6f 69 64 20 2a 20  magic(.  void * 
19dd0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
19de0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19df0 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
19e00 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
19e10 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
19e20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
19e30 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
19e40 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
19e50 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
19e60 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
19e70 5d 2c 0a 20 20 20 20 20 20 20 20 20 22 20 44 42  ],.         " DB
19e80 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20 20 20   MAGIC", 0);.   
19e90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19ea0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
19eb0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
19ec0 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
19ed0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19ee0 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  OR;.  if( strcmp
19ef0 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54  (argv[2], "SQLIT
19f00 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d  E_MAGIC_OPEN")==
19f10 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
19f20 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
19f30 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  C_OPEN;.  }else 
19f40 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
19f50 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
19f60 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b  C_CLOSED")==0 ){
19f70 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
19f80 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
19f90 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OSED;.  }else if
19fa0 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d  ( strcmp(argv[2]
19fb0 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  , "SQLITE_MAGIC_
19fc0 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20  BUSY")==0 ){.   
19fd0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
19fe0 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a  ITE_MAGIC_BUSY;.
19ff0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1a000 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
1a010 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22  ITE_MAGIC_ERROR"
1a020 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
1a030 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1a040 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  AGIC_ERROR;.  }e
1a050 6c 73 65 20 69 66 28 20 54 63 6c 5f 47 65 74 49  lse if( Tcl_GetI
1a060 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
1a070 32 5d 2c 20 26 64 62 2d 3e 6d 61 67 69 63 29 20  2], &db->magic) 
1a080 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1a090 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
1a0a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1a0b0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1a0c0 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
1a0d0 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67    DB .**.** Trig
1a0e0 67 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70 74  ger an interrupt
1a0f0 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63   on DB.*/.static
1a100 20 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72 72   int test_interr
1a110 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  upt(.  void * cl
1a120 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1a130 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1a140 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1a150 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ar **argv.){.  s
1a160 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
1a170 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
1a180 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a190 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1a1a0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1a1b0 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1a1c0 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
1a1d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a1e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1a1f0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1a200 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1a210 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a220 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  R;.  sqlite3_int
1a230 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72 65  errupt(db);.  re
1a240 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1a250 73 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69 74  static u8 *sqlit
1a260 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e  e3_stack_baselin
1a270 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69  e = 0;../*.** Fi
1a280 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69 74  ll the stack wit
1a290 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61 74  h a known bitpat
1a2a0 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tern..*/.static 
1a2b0 76 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28 76  void prepStack(v
1a2c0 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  oid){.  int i;. 
1a2d0 20 75 33 32 20 62 69 67 42 75 66 5b 36 35 35 33   u32 bigBuf[6553
1a2e0 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  6];.  for(i=0; i
1a2f0 3c 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29 3b  <sizeof(bigBuf);
1a300 20 69 2b 2b 29 20 62 69 67 42 75 66 5b 69 5d 20   i++) bigBuf[i] 
1a310 3d 20 30 78 64 65 61 64 62 65 65 66 3b 0a 20 20  = 0xdeadbeef;.  
1a320 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
1a330 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a 29 26 62  seline = (u8*)&b
1a340 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 7d 0a  igBuf[65536];.}.
1a350 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 63  ./*.** Get the c
1a360 75 72 72 65 6e 74 20 73 74 61 63 6b 20 64 65 70  urrent stack dep
1a370 74 68 2e 20 20 55 73 65 64 20 66 6f 72 20 64 65  th.  Used for de
1a380 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
1a390 0a 75 36 34 20 73 71 6c 69 74 65 33 53 74 61 63  .u64 sqlite3Stac
1a3a0 6b 44 65 70 74 68 28 76 6f 69 64 29 7b 0a 20 20  kDepth(void){.  
1a3b0 75 38 20 78 3b 0a 20 20 72 65 74 75 72 6e 20 28  u8 x;.  return (
1a3c0 75 36 34 29 28 73 71 6c 69 74 65 33 5f 73 74 61  u64)(sqlite3_sta
1a3d0 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d 20 26 78  ck_baseline - &x
1a3e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
1a3f0 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63  e:  sqlite3_stac
1a400 6b 5f 75 73 65 64 20 44 42 20 53 51 4c 0a 2a 2a  k_used DB SQL.**
1a410 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65 61 73 75  .** Try to measu
1a420 72 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  re the amount of
1a430 20 73 74 61 63 6b 20 73 70 61 63 65 20 75 73 65   stack space use
1a440 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73  d by a call to s
1a450 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a 2f 0a 73  qlite3_exec.*/.s
1a460 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1a470 74 61 63 6b 5f 75 73 65 64 28 0a 20 20 76 6f 69  tack_used(.  voi
1a480 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1a490 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1a4a0 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1a4b0 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1a4c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1a4d0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1a4e0 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
1a4f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a500 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a510 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a520 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1a530 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 53 51  .        " DB SQ
1a540 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  L", 0);.    retu
1a550 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a560 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1a570 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1a580 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1a590 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a5a0 20 70 72 65 70 53 74 61 63 6b 28 29 3b 0a 20 20   prepStack();.  
1a5b0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
1a5c0 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  ec(db, argv[2], 
1a5d0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28  0, 0, 0);.  for(
1a5e0 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30 20 26 26  i=65535; i>=0 &&
1a5f0 20 28 28 75 33 32 2a 29 73 71 6c 69 74 65 33 5f   ((u32*)sqlite3_
1a600 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 29 5b  stack_baseline)[
1a610 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65 65 66 3b  -i]==0xdeadbeef;
1a620 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53 65   i--){}.  Tcl_Se
1a630 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1a640 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1a650 28 69 2a 34 29 29 3b 0a 20 20 72 65 74 75 72 6e  (i*4));.  return
1a660 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1a670 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f  * Usage: sqlite_
1a680 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20  delete_function 
1a690 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  DB function-name
1a6a0 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  .**.** Delete th
1a6b0 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  e user function 
1a6c0 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27 20  'function-name' 
1a6d0 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61  from database ha
1a6e0 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20 69  ndle DB. It.** i
1a6f0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1a700 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
1a710 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73 20   was created as 
1a720 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65 72  UTF8, any number
1a730 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73   of.** arguments
1a740 20 28 74 68 65 20 77 61 79 20 74 68 65 20 54 43   (the way the TC
1a750 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73  L interface does
1a760 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   it)..*/.static 
1a770 69 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e 63 74  int delete_funct
1a780 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ion(.  void * cl
1a790 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1a7a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1a7b0 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1a7c0 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ar **argv.){.  i
1a7d0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1a7e0 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1a7f0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1a800 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a810 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1a820 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1a830 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1a840 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f      " DB functio
1a850 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20  n-name", 0);.   
1a860 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a870 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1a880 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1a890 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1a8a0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a8b0 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1a8c0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1a8d0 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  on(db, argv[2], 
1a8e0 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
1a8f0 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
1a900 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1a910 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
1a920 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
1a930 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
1a940 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1a950 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1a960 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  ite_delete_colla
1a970 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69 6f  tion DB collatio
1a980 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c  n-name.**.** Del
1a990 65 74 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ete the collatio
1a9a0 6e 20 73 65 71 75 65 6e 63 65 20 27 63 6f 6c 6c  n sequence 'coll
1a9b0 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d  ation-name' from
1a9c0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1a9d0 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73 20 61   .** DB. It is a
1a9e0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1a9f0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1aa00 63 65 20 77 61 73 20 63 72 65 61 74 65 64 20 61  ce was created a
1aa10 73 20 55 54 46 38 20 28 74 68 65 20 0a 2a 2a 20  s UTF8 (the .** 
1aa20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65  way the TCL inte
1aa30 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a  rface does it)..
1aa40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
1aa50 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  lete_collation(.
1aa60 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1aa70 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1aa80 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1aa90 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1aaa0 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63  argv.){.  int rc
1aab0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1aac0 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
1aad0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1aae0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1aaf0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1ab00 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1ab10 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
1ab20 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d   DB function-nam
1ab30 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
1ab40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ab50 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1ab60 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1ab70 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1ab80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ab90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
1aba0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
1abb0 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c 49  b, argv[2], SQLI
1abc0 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b 0a  TE_UTF8, 0, 0);.
1abd0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1abe0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1abf0 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
1ac00 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
1ac10 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1ac20 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1ac30 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
1ac40 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52  ommit DB.**.** R
1ac50 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1ac60 65 20 64 61 74 61 62 61 73 65 20 44 42 20 69 73  e database DB is
1ac70 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 75   currently in au
1ac80 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a  to-commit mode..
1ac90 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  ** Return false 
1aca0 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
1acb0 63 20 69 6e 74 20 67 65 74 5f 61 75 74 6f 63 6f  c int get_autoco
1acc0 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  mmit(.  void * c
1acd0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1ace0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1acf0 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1ad00 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1ad10 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
1ad20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1ad30 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
1ad40 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1ad50 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1ad60 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1ad70 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1ad80 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1ad90 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1ada0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1adb0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1adc0 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1add0 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1ade0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1adf0 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
1ae00 64 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  d", sqlite3_get_
1ae10 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b  autocommit(db));
1ae20 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1ae30 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1ae40 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1ae50 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1ae60 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 62  Usage: sqlite3_b
1ae70 75 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d  usy_timeout DB M
1ae80 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  S.**.** Set the 
1ae90 62 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20 54  busy timeout.  T
1aea0 68 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73 69  his is more easi
1aeb0 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74 68  ly done using th
1aec0 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74  e timeout.** met
1aed0 68 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20 69  hod of the TCL i
1aee0 6e 74 65 72 66 61 63 65 2e 20 20 42 75 74 20 77  nterface.  But w
1aef0 65 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f 20  e need a way to 
1af00 74 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a 2a  test the case.**
1af10 20 77 68 65 72 65 20 69 74 20 72 65 74 75 72 6e   where it return
1af20 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  s SQLITE_MISUSE.
1af30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1af40 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  est_busy_timeout
1af50 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1af60 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1af70 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1af80 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1af90 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
1afa0 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74 65  rc, ms;.  sqlite
1afb0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1afc0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1afd0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1afe0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1aff0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1b000 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1b010 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a       " DB", 0);.
1b020 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b030 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1b040 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1b050 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1b060 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1b070 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1b080 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
1b090 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20  argv[2], &ms) ) 
1b0a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b0b0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1b0c0 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62  _busy_timeout(db
1b0d0 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70  , ms);.  Tcl_App
1b0e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b0f0 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  , sqlite3TestErr
1b100 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
1b110 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1b120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1b130 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74    tcl_variable_t
1b140 79 70 65 20 56 41 52 49 41 42 4c 45 4e 41 4d 45  ype VARIABLENAME
1b150 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1b160 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
1b170 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74  ternal represent
1b180 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a  ation for the.**
1b190 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 67 69   value of the gi
1b1a0 76 65 6e 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ven variable..*/
1b1b0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 5f  .static int tcl_
1b1c0 76 61 72 69 61 62 6c 65 5f 74 79 70 65 28 0a 20  variable_type(. 
1b1d0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1b1e0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1b1f0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b200 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1b210 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1b220 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72  .  Tcl_Obj *pVar
1b230 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
1b240 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1b250 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1b260 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49 41 42  1, objv, "VARIAB
1b270 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  LE");.    return
1b280 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1b290 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74    pVar = Tcl_Get
1b2a0 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 54  Var2Ex(interp, T
1b2b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1b2c0 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f 4c 45  v[1]), 0, TCL_LE
1b2d0 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a 20 20  AVE_ERR_MSG);.  
1b2e0 69 66 28 20 70 56 61 72 3d 3d 30 20 29 20 72 65  if( pVar==0 ) re
1b2f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b300 20 20 69 66 28 20 70 56 61 72 2d 3e 74 79 70 65    if( pVar->type
1b310 50 74 72 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  Ptr ){.    Tcl_S
1b320 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1b330 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
1b340 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70 65 50  gObj(pVar->typeP
1b350 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a  tr->name, -1));.
1b360 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1b370 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1b380 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65  age:  sqlite3_re
1b390 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f 4e 3f  lease_memory ?N?
1b3a0 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  .**.** Attempt t
1b3b0 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79  o release memory
1b3c0 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1b3d0 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  but not actually
1b3e0 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 54 68   required..** Th
1b3f0 65 20 69 6e 74 65 67 65 72 20 4e 20 69 73 20 74  e integer N is t
1b400 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1b410 65 73 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  es we are trying
1b420 20 74 6f 20 72 65 6c 65 61 73 65 2e 20 20 54 68   to release.  Th
1b430 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  e .** return val
1b440 75 65 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  ue is the amount
1b450 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74 75 61   of memory actua
1b460 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f  lly released..*/
1b470 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1b480 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
1b490 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1b4a0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1b4b0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b4c0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1b4d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1b4e0 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
1b4f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
1b500 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20  ORY_MANAGEMENT) 
1b510 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1b520 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
1b530 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20 61    int N;.  int a
1b540 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  mt;.  if( objc!=
1b550 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  1 && objc!=2 ){.
1b560 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1b570 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1b580 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20  objv, "?N?");.  
1b590 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b5a0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
1b5b0 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc==2 ){.    if(
1b5c0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1b5d0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1b5e0 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e  1], &N) ) return
1b5f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
1b600 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d 31 3b  lse{.    N = -1;
1b610 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c  .  }.  amt = sql
1b620 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
1b630 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65  ory(N);.  Tcl_Se
1b640 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1b650 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1b660 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (amt));.#endif. 
1b670 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1b680 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1b690 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
1b6a0 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a  ap_limit ?N?.**.
1b6b0 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20  ** Query or set 
1b6c0 74 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69  the soft heap li
1b6d0 6d 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  mit for the curr
1b6e0 65 6e 74 20 74 68 72 65 61 64 2e 20 20 54 68 65  ent thread.  The
1b6f0 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c  .** limit is onl
1b700 79 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65  y changed if the
1b710 20 4e 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20   N is present.  
1b720 54 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6d  The previous lim
1b730 69 74 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  it.** is returne
1b740 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1b750 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f   test_soft_heap_
1b760 6c 69 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20  limit(.  void * 
1b770 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1b780 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b790 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1b7a0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1b7b0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69  bjv[].){.  stati
1b7c0 63 20 69 6e 74 20 73 6f 66 74 48 65 61 70 4c 69  c int softHeapLi
1b7d0 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  mit = 0;.  int a
1b7e0 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  mt;.  if( objc!=
1b7f0 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  1 && objc!=2 ){.
1b800 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1b810 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1b820 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20  objv, "?N?");.  
1b830 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b840 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20  OR;.  }.  amt = 
1b850 73 6f 66 74 48 65 61 70 4c 69 6d 69 74 3b 0a 20  softHeapLimit;. 
1b860 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
1b870 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 69      int N;.    i
1b880 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1b890 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1b8a0 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75  v[1], &N) ) retu
1b8b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b8c0 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68    sqlite3_soft_h
1b8d0 65 61 70 5f 6c 69 6d 69 74 28 4e 29 3b 0a 20 20  eap_limit(N);.  
1b8e0 20 20 73 6f 66 74 48 65 61 70 4c 69 6d 69 74 20    softHeapLimit 
1b8f0 3d 20 4e 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  = N;.  }.  Tcl_S
1b900 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1b910 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1b920 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65 74 75 72  j(amt));.  retur
1b930 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1b940 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
1b950 74 65 33 5f 63 6c 65 61 72 5f 74 73 64 5f 6d 65  te3_clear_tsd_me
1b960 6d 64 65 62 75 67 0a 2a 2a 0a 2a 2a 20 43 6c 65  mdebug.**.** Cle
1b970 61 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 4d 45  ar all of the ME
1b980 4d 44 45 42 55 47 20 69 6e 66 6f 72 6d 61 74 69  MDEBUG informati
1b990 6f 6e 20 6f 75 74 20 6f 66 20 74 68 72 65 61 64  on out of thread
1b9a0 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 2e 0a  -specific data..
1b9b0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 61 6c 6c  ** This will all
1b9c0 6f 77 20 69 74 20 74 6f 20 62 65 20 64 65 61 6c  ow it to be deal
1b9d0 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  located..*/.stat
1b9e0 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6c 65 61  ic int test_clea
1b9f0 72 5f 74 73 64 5f 6d 65 6d 64 65 62 75 67 28 0a  r_tsd_memdebug(.
1ba00 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1ba10 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1ba20 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1ba30 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1ba40 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1ba50 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  {.  return TCL_O
1ba60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1ba70 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 74 73 64  e:   sqlite3_tsd
1ba80 5f 72 65 6c 65 61 73 65 0a 2a 2a 0a 2a 2a 20 43  _release.**.** C
1ba90 61 6c 6c 20 73 71 6c 69 74 65 33 52 65 6c 65 61  all sqlite3Relea
1baa0 73 65 54 68 72 65 61 64 44 61 74 61 2e 0a 2a 2f  seThreadData..*/
1bab0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1bac0 5f 74 73 64 5f 72 65 6c 65 61 73 65 28 0a 20 20  _tsd_release(.  
1bad0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1bae0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1baf0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1bb00 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1bb10 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1bb20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1bb30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1bb40 20 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61     sqlite3_threa
1bb50 64 5f 63 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20  d_cleanup.**.** 
1bb60 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33  Call the sqlite3
1bb70 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 20  _thread_cleanup 
1bb80 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  API..*/.static i
1bb90 6e 74 20 74 65 73 74 5f 74 68 72 65 61 64 5f 63  nt test_thread_c
1bba0 6c 65 61 6e 75 70 28 0a 20 20 76 6f 69 64 20 2a  leanup(.  void *
1bbb0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1bbc0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1bbd0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1bbe0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1bbf0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1bc00 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  te3_thread_clean
1bc10 75 70 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  up();.  return T
1bc20 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
1bc30 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
1bc40 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  3_pager_refcount
1bc50 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  s  DB.**.** Retu
1bc60 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d  rn a list of num
1bc70 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20 74  bers which are t
1bc80 68 65 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74  he PagerRefcount
1bc90 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65   for all.** page
1bca0 72 73 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62  rs on each datab
1bcb0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
1bcc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1bcd0 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  st_pager_refcoun
1bce0 74 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ts(.  void * cli
1bcf0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1bd00 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1bd10 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1bd20 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1bd30 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
1bd40 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *db;.  int i;.  
1bd50 69 6e 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c  int v, *a;.  Tcl
1bd60 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a  _Obj *pResult;..
1bd70 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1bd80 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1bd90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1bda0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1bdb0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
1bdc0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1bdd0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
1bde0 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  , 0), " DB", 0);
1bdf0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1be00 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1be10 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1be20 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1be30 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1be40 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1be50 45 52 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74  ERROR;.  pResult
1be60 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
1be70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
1be80 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1be90 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
1bea0 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
1beb0 76 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  v = -1;.    }els
1bec0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1bed0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1bee0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 61  >mutex);.      a
1bef0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1bf00 74 61 74 73 28 73 71 6c 69 74 65 33 42 74 72 65  tats(sqlite3Btre
1bf10 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69  ePager(db->aDb[i
1bf20 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 20 20 76  ].pBt));.      v
1bf30 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73   = a[0];.      s
1bf40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1bf50 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1bf60 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73     }.    Tcl_Lis
1bf70 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1bf80 74 28 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63  t(0, pResult, Tc
1bf90 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b  l_NewIntObj(v));
1bfa0 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
1bfb0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1bfc0 70 52 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75  pResult);.  retu
1bfd0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
1bfe0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77  *.** tclcmd:   w
1bff0 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74  orking_64bit_int
1c000 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20  .**.** Some TCL 
1c010 62 75 69 6c 64 73 20 28 65 78 3a 20 63 79 67 77  builds (ex: cygw
1c020 69 6e 29 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f  in) do not suppo
1c030 72 74 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  rt 64-bit intege
1c040 72 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61  rs.  This.** lea
1c050 64 73 20 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f  ds to a number o
1c060 66 20 74 65 73 74 20 66 61 69 6c 75 72 65 73 2e  f test failures.
1c070 20 20 54 68 65 20 70 72 65 73 65 6e 74 20 63 6f    The present co
1c080 6d 6d 61 6e 64 20 63 68 65 63 6b 73 20 74 68 65  mmand checks the
1c090 0a 2a 2a 20 54 43 4c 20 62 75 69 6c 64 20 74 6f  .** TCL build to
1c0a0 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
1c0b0 6e 6f 74 20 69 74 20 73 75 70 70 6f 72 74 73 20  not it supports 
1c0c0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e  64-bit integers.
1c0d0 20 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20    It.** returns 
1c0e0 54 52 55 45 20 69 66 20 69 74 20 64 6f 65 73 20  TRUE if it does 
1c0f0 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74  and FALSE if not
1c100 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d  ..**.** This com
1c110 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20  mand is used to 
1c120 77 61 72 6e 20 75 73 65 72 73 20 74 68 61 74 20  warn users that 
1c130 74 68 65 69 72 20 54 43 4c 20 62 75 69 6c 64 20  their TCL build 
1c140 69 73 20 64 65 66 65 63 74 69 76 65 0a 2a 2a 20  is defective.** 
1c150 61 6e 64 20 74 68 61 74 20 74 68 65 20 65 72 72  and that the err
1c160 6f 72 73 20 74 68 65 79 20 61 72 65 20 73 65 65  ors they are see
1c170 69 6e 67 20 69 6e 20 74 68 65 20 74 65 73 74 20  ing in the test 
1c180 73 63 72 69 70 74 73 20 6d 69 67 68 74 20 62 65  scripts might be
1c190 0a 2a 2a 20 61 20 72 65 73 75 6c 74 20 6f 66 20  .** a result of 
1c1a0 74 68 65 69 72 20 64 65 66 65 63 74 69 76 65 20  their defective 
1c1b0 54 43 4c 20 72 61 74 68 65 72 20 74 68 61 6e 20  TCL rather than 
1c1c0 70 72 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69  problems in SQLi
1c1d0 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
1c1e0 74 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f  t working_64bit_
1c1f0 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  int(.  ClientDat
1c200 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
1c210 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
1c220 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
1c230 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
1c240 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c250 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1c260 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1c270 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1c280 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
1c290 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
1c2a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1c2b0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
1c2c0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c2d0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
1c2e0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
1c2f0 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f   Tcl_Obj *pTestO
1c300 62 6a 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e  bj;.  int workin
1c310 67 20 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f  g = 0;..  pTestO
1c320 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65  bj = Tcl_NewWide
1c330 49 6e 74 4f 62 6a 28 31 30 30 30 30 30 30 2a 28  IntObj(1000000*(
1c340 69 36 34 29 31 32 33 34 35 36 37 38 39 30 29 3b  i64)1234567890);
1c350 0a 20 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72  .  working = str
1c360 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  cmp(Tcl_GetStrin
1c370 67 28 70 54 65 73 74 4f 62 6a 29 2c 20 22 31 32  g(pTestObj), "12
1c380 33 34 35 36 37 38 39 30 30 30 30 30 30 30 22 29  34567890000000")
1c390 3d 3d 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  ==0;.  Tcl_DecrR
1c3a0 65 66 43 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a  efCount(pTestObj
1c3b0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1c3c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1c3d0 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
1c3e0 77 6f 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74  working));.  ret
1c3f0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
1c400 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
1c410 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a  vfs_unlink_test.
1c420 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
1c430 6f 6d 6d 61 6e 64 20 75 6e 72 65 67 69 73 74 65  ommand unregiste
1c440 72 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 56  rs the primary V
1c450 46 53 20 61 6e 64 20 74 68 65 6e 20 72 65 67 69  FS and then regi
1c460 73 74 65 72 73 0a 2a 2a 20 69 74 20 62 61 63 6b  sters.** it back
1c470 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 69 73   again.  This is
1c480 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68   used to test th
1c490 65 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65 67  e ability to reg
1c4a0 69 73 74 65 72 20 61 0a 2a 2a 20 56 46 53 20 77  ister a.** VFS w
1c4b0 68 65 6e 20 6e 6f 6e 65 20 61 72 65 20 70 72 65  hen none are pre
1c4c0 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
1c4d0 65 64 2c 20 61 6e 64 20 74 68 65 20 61 62 69 6c  ed, and the abil
1c4e0 69 74 79 20 74 6f 20 0a 2a 2a 20 75 6e 72 65 67  ity to .** unreg
1c4f0 69 73 74 65 72 20 74 68 65 20 6f 6e 6c 79 20 61  ister the only a
1c500 76 61 69 6c 61 62 6c 65 20 56 46 53 2e 20 20 54  vailable VFS.  T
1c510 69 63 6b 65 74 20 23 32 37 33 38 0a 2a 2f 0a 73  icket #2738.*/.s
1c520 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 75 6e  tatic int vfs_un
1c530 6c 69 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c 69  link_test(.  Cli
1c540 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
1c550 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
1c560 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
1c570 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
1c580 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1c590 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
1c5a0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
1c5b0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
1c5c0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
1c5d0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
1c5e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c5f0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
1c600 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1c610 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
1c620 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
1c630 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
1c640 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56  sqlite3_vfs *apV
1c650 66 73 5b 32 30 5d 3b 0a 0a 20 20 66 6f 72 28 69  fs[20];..  for(i
1c660 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70 56  =0; i<sizeof(apV
1c670 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73  fs)/sizeof(apVfs
1c680 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
1c690 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74  apVfs[i] = sqlit
1c6a0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
1c6b0 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d      if( apVfs[i]
1c6c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1c6d0 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69  ( apVfs[i]==sqli
1c6e0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56  te3_vfs_find(apV
1c6f0 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b  fs[i]->zName) );
1c700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
1c710 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70  fs_unregister(ap
1c720 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61  Vfs[i]);.      a
1c730 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
1c740 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73  3_vfs_find(apVfs
1c750 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20  [i]->zName) );. 
1c760 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
1c770 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66  t( 0==sqlite3_vf
1c780 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 66  s_find(0) );.  f
1c790 6f 72 28 69 3d 73 69 7a 65 6f 66 28 61 70 56 66  or(i=sizeof(apVf
1c7a0 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b  s)/sizeof(apVfs[
1c7b0 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  0])-1; i>=0; i--
1c7c0 29 7b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  ){.    if( apVfs
1c7d0 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [i] ){.      sql
1c7e0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1c7f0 72 28 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a  r(apVfs[i], 1);.
1c800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70        assert( ap
1c810 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f  Vfs[i]==sqlite3_
1c820 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20  vfs_find(0) );. 
1c830 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56       assert( apV
1c840 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76  fs[i]==sqlite3_v
1c850 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d  fs_find(apVfs[i]
1c860 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20  ->zName) );.    
1c870 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  }.  }.  return T
1c880 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1c890 74 63 6c 63 6d 64 3a 20 20 73 61 76 65 5f 70 72  tclcmd:  save_pr
1c8a0 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74  ng_state.*/.stat
1c8b0 69 63 20 69 6e 74 20 73 61 76 65 5f 70 72 6e 67  ic int save_prng
1c8c0 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74  _state(.  Client
1c8d0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
1c8e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
1c8f0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
1c900 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
1c910 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1c920 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1c930 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1c940 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1c950 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1c960 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
1c970 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c980 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1c990 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1c9a0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
1c9b0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
1c9c0 7b 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20  {.  extern void 
1c9d0 73 71 6c 69 74 65 33 53 61 76 65 50 72 6e 67 53  sqlite3SavePrngS
1c9e0 74 61 74 65 28 76 6f 69 64 29 3b 0a 20 20 73 71  tate(void);.  sq
1c9f0 6c 69 74 65 33 53 61 76 65 50 72 6e 67 53 74 61  lite3SavePrngSta
1ca00 74 65 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  te();.  return T
1ca10 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74  CL_OK;.}./*.** t
1ca20 63 6c 63 6d 64 3a 20 20 72 65 73 74 6f 72 65 5f  clcmd:  restore_
1ca30 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74  prng_state.*/.st
1ca40 61 74 69 63 20 69 6e 74 20 72 65 73 74 6f 72 65  atic int restore
1ca50 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43  _prng_state(.  C
1ca60 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1ca70 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
1ca80 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
1ca90 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
1caa0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1cab0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1cac0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1cad0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1cae0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1caf0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
1cb00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1cb10 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1cb20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
1cb30 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
1cb40 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
1cb50 20 2a 2f 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20   */.){.  extern 
1cb60 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 74  void sqlite3Rest
1cb70 6f 72 65 50 72 6e 67 53 74 61 74 65 28 76 6f 69  orePrngState(voi
1cb80 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  d);.  sqlite3Res
1cb90 74 6f 72 65 50 72 6e 67 53 74 61 74 65 28 29 3b  torePrngState();
1cba0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1cbb0 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  ;.}./*.** tclcmd
1cbc0 3a 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74  :  reset_prng_st
1cbd0 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ate.*/.static in
1cbe0 74 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61  t reset_prng_sta
1cbf0 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
1cc00 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
1cc10 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
1cc20 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
1cc30 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
1cc40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1cc50 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1cc60 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1cc70 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1cc80 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
1cc90 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1cca0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
1ccb0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
1ccc0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1ccd0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
1cce0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
1ccf0 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69  extern void sqli
1cd00 74 65 33 52 65 73 65 74 50 72 6e 67 53 74 61 74  te3ResetPrngStat
1cd10 65 28 76 6f 69 64 29 3b 0a 20 20 73 71 6c 69 74  e(void);.  sqlit
1cd20 65 33 52 65 73 65 74 50 72 6e 67 53 74 61 74 65  e3ResetPrngState
1cd30 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ();.  return TCL
1cd40 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  _OK;.}.../*.** R
1cd50 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73  egister commands
1cd60 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e   with the TCL in
1cd70 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e  terpreter..*/.in
1cd80 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e  t Sqlitetest1_In
1cd90 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
1cda0 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e  nterp){.  extern
1cdb0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
1cdc0 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  rch_count;.  ext
1cdd0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1cde0 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b  interrupt_count;
1cdf0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
1ce00 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f  lite3_open_file_
1ce10 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
1ce20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74  int sqlite3_sort
1ce30 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
1ce40 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72   int sqlite3_cur
1ce50 72 65 6e 74 5f 74 69 6d 65 3b 0a 20 20 65 78 74  rent_time;.  ext
1ce60 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1ce70 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20  max_blobsize;.  
1ce80 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1ce90 65 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63  e3BtreeSharedCac
1cea0 68 65 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a  heReport(void*,.
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ced0 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
1cee0 74 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62  terp*,int,Tcl_Ob
1cef0 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61  j*CONST*);.  sta
1cf00 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
1cf10 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
1cf20 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20      Tcl_CmdProc 
1cf30 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64  *xProc;.  } aCmd
1cf40 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64  [] = {.     { "d
1cf50 62 5f 65 6e 74 65 72 22 2c 20 20 20 20 20 20 20  b_enter",       
1cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1cf70 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f  Tcl_CmdProc*)db_
1cf80 65 6e 74 65 72 20 20 20 20 20 20 20 20 20 20 20  enter           
1cf90 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64      },.     { "d
1cfa0 62 5f 6c 65 61 76 65 22 2c 20 20 20 20 20 20 20  b_leave",       
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1cfc0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f  Tcl_CmdProc*)db_
1cfd0 6c 65 61 76 65 20 20 20 20 20 20 20 20 20 20 20  leave           
1cfe0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1cff0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
1d000 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  nt",           (
1d010 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1d020 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
1d030 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1d040 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
1d050 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 28  nt64",         (
1d060 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1d070 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
1d080 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  64  },.     { "s
1d090 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
1d0a0 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  tr",           (
1d0b0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1d0c0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
1d0d0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1d0e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
1d0f0 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  str",          (
1d100 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1d110 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74  ite3_snprintf_st
1d120 72 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  r   },.     { "s
1d130 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
1d140 74 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28  tronly",       (
1d150 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1d160 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
1d170 6f 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73  only},.     { "s
1d180 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
1d190 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28  ouble",        (
1d1a0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1d1b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
1d1c0 62 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ble },.     { "s
1d1d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
1d1e0 63 61 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28  caled",        (
1d1f0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1d200 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
1d210 6c 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  led },.     { "s
1d220 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68  qlite3_mprintf_h
1d230 65 78 64 6f 75 62 6c 65 22 2c 20 20 20 28 54 63  exdouble",   (Tc
1d240 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
1d250 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f  e3_mprintf_hexdo
1d260 75 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73  uble},.     { "s
1d270 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a  qlite3_mprintf_z
1d280 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28  _test",        (
1d290 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
1d2a0 74 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20  t_mprintf_z     
1d2b0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1d2c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f  lite3_mprintf_n_
1d2d0 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54  test",        (T
1d2e0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
1d2f0 5f 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20 20 20  _mprintf_n      
1d300 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1d310 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e  ite3_snprintf_in
1d320 74 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  t",          (Tc
1d330 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
1d340 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20  snprintf_int    
1d350 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1d360 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
1d370 72 6f 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c  rowid",     (Tcl
1d380 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c  _CmdProc*)test_l
1d390 61 73 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20  ast_rowid       
1d3a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1d3b0 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c  e3_exec_printf",
1d3c0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
1d3d0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78  CmdProc*)test_ex
1d3e0 65 63 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d  ec_printf      }
1d3f0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1d400 33 5f 65 78 65 63 22 2c 20 20 20 20 20 20 20 20  3_exec",        
1d410 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
1d420 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
1d430 63 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  c             },
1d440 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1d450 5f 65 78 65 63 5f 6e 72 22 2c 20 20 20 20 20 20  _exec_nr",      
1d460 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
1d470 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
1d480 5f 6e 72 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  _nr          },.
1d490 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1d4a0 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
1d4b0 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ",      (Tcl_Cmd
1d4c0 50 72 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f 74  Proc*)test_get_t
1d4d0 61 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 20  able_printf },. 
1d4e0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
1d4f0 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20  lose",          
1d500 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1d510 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74  roc*)sqlite_test
1d520 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20  _close     },.  
1d530 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72     { "sqlite3_cr
1d540 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  eate_function", 
1d550 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
1d560 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f  oc*)test_create_
1d570 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20  function  },.   
1d580 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
1d590 61 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20  ate_aggregate", 
1d5a0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
1d5b0 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61  c*)test_create_a
1d5c0 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20  ggregate },.    
1d5d0 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73   { "sqlite_regis
1d5e0 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  ter_test_functio
1d5f0 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  n", (Tcl_CmdProc
1d600 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  *)test_register_
1d610 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20  func    },.     
1d620 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22  { "sqlite_abort"
1d630 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d640 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
1d650 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20  )sqlite_abort   
1d660 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
1d670 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20   "sqlite_bind", 
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d690 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1d6a0 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20  test_bind       
1d6b0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
1d6c0 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20  "breakpoint",   
1d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6e0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
1d6f0 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20  est_breakpoint  
1d700 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
1d710 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20 20  sqlite3_key",   
1d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d730 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
1d740 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20  st_key          
1d750 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1d760 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20 20  qlite3_rekey",  
1d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1d780 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
1d790 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20 20  t_rekey         
1d7a0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1d7b0 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c  lite_set_magic",
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
1d7d0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
1d7e0 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20 20  te_set_magic    
1d7f0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1d800 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22 2c  ite3_interrupt",
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
1d820 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
1d830 69 6e 74 65 72 72 75 70 74 20 20 20 20 20 20 20  interrupt       
1d840 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1d850 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69  te_delete_functi
1d860 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  on",        (Tcl
1d870 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65  _CmdProc*)delete
1d880 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20 20  _function       
1d890 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1d8a0 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69  e_delete_collati
1d8b0 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  on",       (Tcl_
1d8c0 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f  CmdProc*)delete_
1d8d0 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d  collation      }
1d8e0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1d8f0 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
1d900 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
1d910 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f  mdProc*)get_auto
1d920 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d 2c  commit        },
1d930 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1d940 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20 20 20  _stack_used",   
1d950 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
1d960 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74 61 63  dProc*)test_stac
1d970 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d 2c 0a  k_used       },.
1d980 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1d990 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20  busy_timeout",  
1d9a0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1d9b0 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79 5f  Proc*)test_busy_
1d9c0 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20  timeout     },. 
1d9d0 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c 20      { "printf", 
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9f0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1da00 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74 66  roc*)test_printf
1da10 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1da20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 69 6f     { "sqlite3_io
1da30 5f 74 72 61 63 65 22 2c 20 20 20 20 20 20 20 20  _trace",        
1da40 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
1da50 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63  oc*)test_io_trac
1da60 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d  e         },.  }
1da70 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
1da80 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
1da90 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f  Name;.     Tcl_O
1daa0 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  bjCmdProc *xProc
1dab0 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69  ;.     void *cli
1dac0 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62  entData;.  } aOb
1dad0 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  jCmd[] = {.     
1dae0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65  { "sqlite3_conne
1daf0 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20  ction_pointer", 
1db00 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f     get_sqlite_po
1db10 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20  inter, 0 },.    
1db20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
1db30 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
1db40 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
1db50 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  t,      0 },.   
1db60 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
1db70 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20  d_zeroblob",    
1db80 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a       test_bind_z
1db90 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20  eroblob, 0 },.  
1dba0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
1dbb0 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20  nd_int64",      
1dbc0 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
1dbd0 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20  int64,    0 },. 
1dbe0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
1dbf0 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  ind_double",    
1dc00 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
1dc10 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a  _double,   0 },.
1dc20 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1dc30 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20  bind_null",     
1dc40 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
1dc50 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c  d_null     ,0 },
1dc60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1dc70 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20  _bind_text",    
1dc80 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
1dc90 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d  nd_text     ,0 }
1dca0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1dcb0 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20  3_bind_text16", 
1dcc0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
1dcd0 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20  ind_text16   ,0 
1dce0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1dcf0 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20  e3_bind_blob",  
1dd00 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
1dd10 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30  bind_blob     ,0
1dd20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1dd30 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
1dd40 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74  er_count",  test
1dd50 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
1dd60 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20  count, 0},.     
1dd70 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
1dd80 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c  parameter_name",
1dd90 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72     test_bind_par
1dda0 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d  ameter_name,  0}
1ddb0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1ddc0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
1ddd0 5f 69 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62  _index",  test_b
1dde0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
1ddf0 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  dex, 0},.     { 
1de00 22 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62  "sqlite3_clear_b
1de10 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20  indings",       
1de20 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64   test_clear_bind
1de30 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  ings, 0},.     {
1de40 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22   "sqlite3_sleep"
1de50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1de60 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20    test_sleep,   
1de70 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
1de80 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  { "sqlite3_errco
1de90 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  de",            
1dea0 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20     test_errcode 
1deb0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
1dec0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d   { "sqlite3_errm
1ded0 73 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sg",            
1dee0 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20      test_errmsg 
1def0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
1df00 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
1df10 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20 20 20  msg16",         
1df20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67       test_errmsg
1df30 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  16      ,0 },.  
1df40 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
1df50 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  en",            
1df60 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20        test_open 
1df70 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
1df80 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
1df90 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20  pen16",         
1dfa0 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
1dfb0 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  16        ,0 },.
1dfc0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1dfd0 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20  complete16",    
1dfe0 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d          test_com
1dff0 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c  plete16    ,0 },
1e000 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ..     { "sqlite
1e010 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20 20  3_prepare",     
1e020 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
1e030 72 65 70 61 72 65 20 20 20 20 20 20 20 2c 30 20  repare       ,0 
1e040 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1e050 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20  e3_prepare16",  
1e060 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
1e070 70 72 65 70 61 72 65 31 36 20 20 20 20 20 2c 30  prepare16     ,0
1e080 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1e090 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22 2c  te3_prepare_v2",
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1e0b0 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20 20 2c  _prepare_v2    ,
1e0c0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
1e0d0 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76  ite3_prepare16_v
1e0e0 32 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  2",          tes
1e0f0 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 20  t_prepare16_v2  
1e100 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
1e110 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22 2c  lite3_finalize",
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1e130 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20 20  st_finalize     
1e140 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
1e150 71 6c 69 74 65 33 5f 72 65 73 65 74 22 2c 20 20  qlite3_reset",  
1e160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1e170 65 73 74 5f 72 65 73 65 74 20 20 20 20 20 20 20  est_reset       
1e180 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
1e190 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 22  sqlite3_expired"
1e1a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e1b0 74 65 73 74 5f 65 78 70 69 72 65 64 20 20 20 20  test_expired    
1e1c0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
1e1d0 22 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65  "sqlite3_transfe
1e1e0 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20  r_bindings",    
1e1f0 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f 62   test_transfer_b
1e200 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  ind ,0 },.     {
1e210 20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65   "sqlite3_change
1e220 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  s",             
1e230 20 20 74 65 73 74 5f 63 68 61 6e 67 65 73 20 20    test_changes  
1e240 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
1e250 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 65 70 22  { "sqlite3_step"
1e260 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e270 20 20 20 74 65 73 74 5f 73 74 65 70 20 20 20 20     test_step    
1e280 20 20 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20 20        ,0 },..   
1e290 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6c    { "sqlite3_rel
1e2a0 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20  ease_memory",   
1e2b0 20 20 20 20 20 74 65 73 74 5f 72 65 6c 65 61 73       test_releas
1e2c0 65 5f 6d 65 6d 6f 72 79 2c 20 20 20 20 20 30 7d  e_memory,     0}
1e2d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1e2e0 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
1e2f0 74 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73  t",       test_s
1e300 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 2c 20  oft_heap_limit, 
1e310 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
1e320 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 74 73 64  qlite3_clear_tsd
1e330 5f 6d 65 6d 64 65 62 75 67 22 2c 20 20 20 20 74  _memdebug",    t
1e340 65 73 74 5f 63 6c 65 61 72 5f 74 73 64 5f 6d 65  est_clear_tsd_me
1e350 6d 64 65 62 75 67 2c 20 30 7d 2c 0a 20 20 20 20  mdebug, 0},.    
1e360 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 73 64 5f   { "sqlite3_tsd_
1e370 72 65 6c 65 61 73 65 22 2c 20 20 20 20 20 20 20  release",       
1e380 20 20 20 20 74 65 73 74 5f 74 73 64 5f 72 65 6c      test_tsd_rel
1e390 65 61 73 65 2c 20 20 20 20 20 20 20 20 30 7d 2c  ease,        0},
1e3a0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1e3b0 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 22  _thread_cleanup"
1e3c0 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 74 68  ,        test_th
1e3d0 72 65 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20  read_cleanup,   
1e3e0 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
1e3f0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63  lite3_pager_refc
1e400 6f 75 6e 74 73 22 2c 20 20 20 20 20 20 20 74 65  ounts",       te
1e410 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  st_pager_refcoun
1e420 74 73 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20  ts,    0},..    
1e430 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64   { "sqlite3_load
1e440 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20  _extension",    
1e450 20 20 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78      test_load_ex
1e460 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c  tension,     0},
1e470 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1e480 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
1e490 65 6e 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e  ension", test_en
1e4a0 61 62 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20  able_load,      
1e4b0 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
1e4c0 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
1e4d0 65 73 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65  esult_codes", te
1e4e0 73 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  st_extended_resu
1e4f0 6c 74 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 0a 20  lt_codes, 0},.. 
1e500 20 20 20 20 7b 20 22 73 61 76 65 5f 70 72 6e 67      { "save_prng
1e510 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20 20 20  _state",        
1e520 20 20 20 20 20 20 20 73 61 76 65 5f 70 72 6e 67         save_prng
1e530 5f 73 74 61 74 65 2c 20 20 20 20 30 20 7d 2c 0a  _state,    0 },.
1e540 20 20 20 20 20 7b 20 22 72 65 73 74 6f 72 65 5f       { "restore_
1e550 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20  prng_state",    
1e560 20 20 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f          restore_
1e570 70 72 6e 67 5f 73 74 61 74 65 2c 20 30 20 7d 2c  prng_state, 0 },
1e580 0a 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f 70  .     { "reset_p
1e590 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20  rng_state",     
1e5a0 20 20 20 20 20 20 20 20 20 72 65 73 65 74 5f 70           reset_p
1e5b0 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 30 20 7d  rng_state,   0 }
1e5c0 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ,..     /* sqlit
1e5d0 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50  e3_column_*() AP
1e5e0 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c  I */.     { "sql
1e5f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
1e600 74 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  t",          tes
1e610 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20  t_column_count  
1e620 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
1e630 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74  lite3_data_count
1e640 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
1e650 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20 20  st_data_count   
1e660 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
1e670 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
1e680 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  pe",           t
1e690 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20  est_column_type 
1e6a0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
1e6b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1e6c0 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  lob",           
1e6d0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  test_column_blob
1e6e0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
1e6f0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
1e700 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20  double",        
1e710 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75   test_column_dou
1e720 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  ble ,0 },.     {
1e730 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
1e740 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
1e750 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e    test_column_in
1e760 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  t64  ,0 },.     
1e770 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
1e780 6e 5f 74 65 78 74 22 2c 20 20 20 20 20 20 20 74  n_text",       t
1e790 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20  est_stmt_utf8,  
1e7a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1e7b0 65 78 74 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ext      },.    
1e7c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
1e7d0 6d 6e 5f 64 65 63 6c 74 79 70 65 22 2c 20 20 20  mn_decltype",   
1e7e0 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20  test_stmt_utf8, 
1e7f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1e800 64 65 63 6c 74 79 70 65 20 20 7d 2c 0a 20 20 20  decltype  },.   
1e810 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
1e820 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 20 20 20  umn_name",      
1e830 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c   test_stmt_utf8,
1e840 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
1e850 5f 6e 61 6d 65 20 20 20 20 20 20 7d 2c 0a 20 20  _name      },.  
1e860 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
1e870 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 20 20  lumn_int",      
1e880 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c    test_stmt_int,
1e890 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1e8a0 6e 5f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a 20  n_int       },. 
1e8b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
1e8c0 6f 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20 20  olumn_bytes",   
1e8d0 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74     test_stmt_int
1e8e0 2c 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,   sqlite3_colu
1e8f0 6d 6e 5f 62 79 74 65 73 20 20 20 20 20 7d 2c 0a  mn_bytes     },.
1e900 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1e910 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
1e920 44 41 54 41 0a 7b 20 22 73 71 6c 69 74 65 33 5f  DATA.{ "sqlite3_
1e930 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f  column_database_
1e940 6e 61 6d 65 22 2c 20 74 65 73 74 5f 73 74 6d 74  name", test_stmt
1e950 5f 75 74 66 38 2c 20 73 71 6c 69 74 65 33 5f 63  _utf8, sqlite3_c
1e960 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
1e970 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33  ame},.{ "sqlite3
1e980 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
1e990 6d 65 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75  me", test_stmt_u
1e9a0 74 66 38 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tf8, sqlite3_col
1e9b0 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c  umn_table_name},
1e9c0 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75  .{ "sqlite3_colu
1e9d0 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 22 2c  mn_origin_name",
1e9e0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c   test_stmt_utf8,
1e9f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1ea00 6f 72 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65  origin_name},.#e
1ea10 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
1ea20 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1ea30 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1ea40 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c  column_bytes16",
1ea50 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e      test_stmt_in
1ea60 74 2c 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  t,   sqlite3_col
1ea70 75 6d 6e 5f 62 79 74 65 73 31 36 20 20 20 7d 2c  umn_bytes16   },
1ea80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1ea90 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c  _column_text16",
1eaa0 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75       test_stmt_u
1eab0 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f  tf16, sqlite3_co
1eac0 6c 75 6d 6e 5f 74 65 78 74 31 36 20 20 20 20 7d  lumn_text16    }
1ead0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1eae0 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
1eaf0 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f  e16", test_stmt_
1eb00 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63  utf16, sqlite3_c
1eb10 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36  olumn_decltype16
1eb20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1eb30 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36  e3_column_name16
1eb40 22 2c 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74  ",     test_stmt
1eb50 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f  _utf16, sqlite3_
1eb60 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 20 20 20  column_name16   
1eb70 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f   },.     { "add_
1eb80 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63  alignment_test_c
1eb90 6f 6c 6c 61 74 69 6f 6e 73 22 2c 20 61 64 64 5f  ollations", add_
1eba0 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63  alignment_test_c
1ebb0 6f 6c 6c 61 74 69 6f 6e 73 2c 20 30 20 20 20 20  ollations, 0    
1ebc0 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49    },.#ifdef SQLI
1ebd0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
1ebe0 5f 4d 45 54 41 44 41 54 41 0a 7b 22 73 71 6c 69  _METADATA.{"sqli
1ebf0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62  te3_column_datab
1ec00 61 73 65 5f 6e 61 6d 65 31 36 22 2c 0a 20 20 74  ase_name16",.  t
1ec10 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
1ec20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1ec30 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 7d 2c  atabase_name16},
1ec40 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .{"sqlite3_colum
1ec50 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 22 2c  n_table_name16",
1ec60 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
1ec70 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
1ec80 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a  _table_name16},.
1ec90 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  {"sqlite3_column
1eca0 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c  _origin_name16",
1ecb0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
1ecc0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
1ecd0 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 7d 2c  _origin_name16},
1ece0 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20  .#endif.#endif. 
1ecf0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
1ed00 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
1ed10 76 32 22 2c 20 74 65 73 74 5f 63 72 65 61 74 65  v2", test_create
1ed20 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 2c 20 30  _collation_v2, 0
1ed30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1ed40 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  te3_global_recov
1ed50 65 72 22 2c 20 20 20 20 20 74 65 73 74 5f 67 6c  er",     test_gl
1ed60 6f 62 61 6c 5f 72 65 63 6f 76 65 72 2c 20 30 20  obal_recover, 0 
1ed70 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 77 6f 72    },.     { "wor
1ed80 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 22 2c  king_64bit_int",
1ed90 20 20 20 20 20 20 20 20 20 20 77 6f 72 6b 69 6e            workin
1eda0 67 5f 36 34 62 69 74 5f 69 6e 74 2c 20 20 20 30  g_64bit_int,   0
1edb0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66     },.     { "vf
1edc0 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 22 2c 20  s_unlink_test", 
1edd0 20 20 20 20 20 20 20 20 20 20 20 76 66 73 5f 75             vfs_u
1ede0 6e 6c 69 6e 6b 5f 74 65 73 74 2c 20 20 20 20 20  nlink_test,     
1edf0 30 20 20 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20  0   },..     /* 
1ee00 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f  Functions from o
1ee10 73 2e 68 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  s.h */.#ifndef S
1ee20 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
1ee30 4f 0a 23 69 66 20 30 0a 20 20 20 20 20 7b 20 22  O.#if 0.     { "
1ee40 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
1ee50 64 57 72 69 74 65 22 2c 74 65 73 74 5f 73 71 6c  dWrite",test_sql
1ee60 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
1ee70 69 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ite, 0 },.     {
1ee80 20 22 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65   "sqlite3OsClose
1ee90 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 73  ",        test_s
1eea0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 2c 20 30  qlite3OsClose, 0
1eeb0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1eec0 74 65 33 4f 73 4c 6f 63 6b 22 2c 20 20 20 20 20  te3OsLock",     
1eed0 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33      test_sqlite3
1eee0 4f 73 4c 6f 63 6b 2c 20 30 20 7d 2c 0a 20 20 20  OsLock, 0 },.   
1eef0 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73 54 65    { "sqlite3OsTe
1ef00 6d 70 46 69 6c 65 4e 61 6d 65 22 2c 20 74 65 73  mpFileName", tes
1ef10 74 5f 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46  t_sqlite3OsTempF
1ef20 69 6c 65 4e 61 6d 65 2c 20 30 20 7d 2c 0a 20 20  ileName, 0 },.  
1ef30 20 0a 20 20 20 20 20 2f 2a 20 43 75 73 74 6f 6d   .     /* Custom
1ef40 20 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 73   test interfaces
1ef50 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   */.     { "sqli
1ef60 74 65 33 4f 73 55 6e 6c 6f 63 6b 22 2c 20 20 20  te3OsUnlock",   
1ef70 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74        test_sqlit
1ef80 65 33 4f 73 55 6e 6c 6f 63 6b 2c 20 30 20 20 20  e3OsUnlock, 0   
1ef90 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69   },.#endif.#endi
1efa0 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
1efb0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
1efc0 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c   { "add_test_col
1efd0 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 74 65  late",        te
1efe0 73 74 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20  st_collate, 0   
1eff0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1f000 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c   { "add_test_col
1f010 6c 61 74 65 5f 6e 65 65 64 65 64 22 2c 20 74 65  late_needed", te
1f020 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
1f030 64 2c 20 30 20 20 20 20 20 7d 2c 0a 20 20 20 20  d, 0     },.    
1f040 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 66 75 6e   { "add_test_fun
1f050 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 74 65  ction",       te
1f060 73 74 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20  st_function, 0  
1f070 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64           },.#end
1f080 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
1f090 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 22 2c  e3_test_errstr",
1f0a0 20 20 20 20 20 74 65 73 74 5f 65 72 72 73 74 72       test_errstr
1f0b0 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  , 0             
1f0c0 7d 2c 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 76  },.     { "tcl_v
1f0d0 61 72 69 61 62 6c 65 5f 74 79 70 65 22 2c 20 20  ariable_type",  
1f0e0 20 20 20 20 20 74 63 6c 5f 76 61 72 69 61 62 6c       tcl_variabl
1f0f0 65 5f 74 79 70 65 2c 20 30 20 20 20 20 20 20 20  e_type, 0       
1f100 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  },.#ifndef SQLIT
1f110 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1f120 43 48 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  CHE.     { "sqli
1f130 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
1f140 64 5f 63 61 63 68 65 22 2c 20 74 65 73 74 5f 65  d_cache", test_e
1f150 6e 61 62 6c 65 5f 73 68 61 72 65 64 2c 20 30 20  nable_shared, 0 
1f160 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1f170 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65  te3_shared_cache
1f180 5f 72 65 70 6f 72 74 22 2c 20 73 71 6c 69 74 65  _report", sqlite
1f190 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68  3BtreeSharedCach
1f1a0 65 52 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e  eReport, 0},.#en
1f1b0 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
1f1c0 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
1f1d0 75 6d 62 65 72 22 2c 20 74 65 73 74 5f 6c 69 62  umber", test_lib
1f1e0 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20  version_number, 
1f1f0 30 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c  0  },.#ifdef SQL
1f200 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
1f210 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20  N_METADATA.     
1f220 7b 20 22 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  { "sqlite3_table
1f230 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
1f240 22 2c 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f  ", test_table_co
1f250 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30  lumn_metadata, 0
1f260 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e    },.#endif.#ifn
1f270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f280 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20  INCRBLOB.     { 
1f290 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65  "sqlite3_blob_re
1f2a0 61 64 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f  ad",  test_blob_
1f2b0 72 65 61 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20  read, 0  },.    
1f2c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62   { "sqlite3_blob
1f2d0 5f 77 72 69 74 65 22 2c 20 74 65 73 74 5f 62 6c  _write", test_bl
1f2e0 6f 62 5f 77 72 69 74 65 2c 20 30 20 20 7d 2c 0a  ob_write, 0  },.
1f2f0 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 73 74  #endif.  };.  st
1f300 61 74 69 63 20 69 6e 74 20 62 69 74 6d 61 73 6b  atic int bitmask
1f310 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42  _size = sizeof(B
1f320 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20 69 6e 74  itmask)*8;.  int
1f330 20 69 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74   i;.  extern int
1f340 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
1f350 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f 66 75 6c  unt, sqlite3_ful
1f360 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20 65  lsync_count;.  e
1f370 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1f380 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
1f390 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
1f3a0 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e  qlite3_like_coun
1f3b0 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
1f3c0 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f  sqlite3_xferopt_
1f3d0 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
1f3e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
1f3f0 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 3b 0a  r_readdb_count;.
1f400 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
1f410 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
1f420 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  db_count;.  exte
1f430 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
1f440 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
1f450 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
1f460 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67  sqlite3_pager_pg
1f470 66 72 65 65 5f 63 6f 75 6e 74 3b 0a 23 69 66 20  free_count;.#if 
1f480 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e  OS_UNIX && defin
1f490 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
1f4a0 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
1f4b0 53 41 46 45 0a 20 20 65 78 74 65 72 6e 20 69 6e  SAFE.  extern in
1f4c0 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  t threadsOverrid
1f4d0 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
1f4e0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  ;.#endif.#if OS_
1f4f0 57 49 4e 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  WIN.  extern int
1f500 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
1f510 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
1f520 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 65  SQLITE_DEBUG.  e
1f530 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1f540 33 5f 77 68 65 72 65 5f 74 72 61 63 65 3b 0a 20  3_where_trace;. 
1f550 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
1f560 74 65 33 5f 6f 73 5f 74 72 61 63 65 3b 0a 20 20  te3_os_trace;.  
1f570 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1f580 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72  e3_vdbe_addop_tr
1f590 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  ace;.#endif.#ifd
1f5a0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1f5b0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
1f5c0 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70  te3_enable_in_op
1f5d0 74 3b 0a 20 20 65 78 74 65 72 6e 20 63 68 61 72  t;.  extern char
1f5e0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
1f5f0 6c 61 6e 5b 5d 3b 0a 20 20 73 74 61 74 69 63 20  lan[];.  static 
1f600 63 68 61 72 20 2a 71 75 65 72 79 5f 70 6c 61 6e  char *query_plan
1f610 20 3d 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79   = sqlite3_query
1f620 5f 70 6c 61 6e 3b 0a 23 65 6e 64 69 66 0a 0a 20  _plan;.#endif.. 
1f630 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
1f640 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28  of(aCmd)/sizeof(
1f650 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aCmd[0]); i++){.
1f660 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f      Tcl_CreateCo
1f670 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43  mmand(interp, aC
1f680 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d  md[i].zName, aCm
1f690 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30  d[i].xProc, 0, 0
1f6a0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1f6b0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43  ; i<sizeof(aObjC
1f6c0 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43  md)/sizeof(aObjC
1f6d0 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  md[0]); i++){.  
1f6e0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
1f6f0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61  ommand(interp, a
1f700 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  ObjCmd[i].zName,
1f710 20 0a 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d   .        aObjCm
1f720 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a  d[i].xProc, aObj
1f730 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74  Cmd[i].clientDat
1f740 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  a, 0);.  }.  Tcl
1f750 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
1f760 20 22 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f   "sqlite_search_
1f770 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
1f780 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73  char*)&sqlite3_s
1f790 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c  earch_count, TCL
1f7a0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
1f7b0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
1f7c0 2c 20 22 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63  , "sqlite_sort_c
1f7d0 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63  ount", .      (c
1f7e0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 6f  har*)&sqlite3_so
1f7f0 72 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  rt_count, TCL_LI
1f800 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
1f810 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
1f820 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
1f830 73 69 7a 65 22 2c 20 0a 20 20 20 20 20 20 28 63  size", .      (c
1f840 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6d 61  har*)&sqlite3_ma
1f850 78 5f 62 6c 6f 62 73 69 7a 65 2c 20 54 43 4c 5f  x_blobsize, TCL_
1f860 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
1f870 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
1f880 20 22 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f   "sqlite_like_co
1f890 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
1f8a0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6c 69 6b  ar*)&sqlite3_lik
1f8b0 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  e_count, TCL_LIN
1f8c0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
1f8d0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
1f8e0 71 6c 69 74 65 5f 69 6e 74 65 72 72 75 70 74 5f  qlite_interrupt_
1f8f0 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
1f900 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 69  char*)&sqlite3_i
1f910 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 2c 20  nterrupt_count, 
1f920 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
1f930 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1f940 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65  erp, "sqlite_ope
1f950 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a  n_file_count", .
1f960 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
1f970 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f  lite3_open_file_
1f980 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
1f990 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
1f9a0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
1f9b0 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  ite_current_time
1f9c0 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
1f9d0 29 26 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  )&sqlite3_curren
1f9e0 74 5f 74 69 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b  t_time, TCL_LINK
1f9f0 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
1fa00 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
1fa10 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f  lite3_xferopt_co
1fa20 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
1fa30 72 2a 29 26 73 71 6c 69 74 65 33 5f 78 66 65 72  r*)&sqlite3_xfer
1fa40 6f 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  opt_count, TCL_L
1fa50 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
1fa60 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
1fa70 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  "sqlite3_pager_r
1fa80 65 61 64 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20  eaddb_count",.  
1fa90 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
1faa0 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
1fab0 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
1fac0 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
1fad0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
1fae0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
1faf0 65 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  edb_count",.    
1fb00 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
1fb10 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
1fb20 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
1fb30 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
1fb40 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
1fb50 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
1fb60 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  j_count",.      
1fb70 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
1fb80 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
1fb90 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
1fba0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
1fbb0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
1fbc0 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
1fbd0 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
1fbe0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67  ar*)&sqlite3_pag
1fbf0 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 2c  er_pgfree_count,
1fc00 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
1fc10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fc20 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f  MIT_UTF16.  Tcl_
1fc30 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
1fc40 22 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e  "unaligned_strin
1fc50 67 5f 63 6f 75 6e 74 65 72 22 2c 0a 20 20 20 20  g_counter",.    
1fc60 20 20 28 63 68 61 72 2a 29 26 75 6e 61 6c 69 67    (char*)&unalig
1fc70 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74  ned_string_count
1fc80 65 72 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  er, TCL_LINK_INT
1fc90 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  );.#endif.#if OS
1fca0 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64  _UNIX && defined
1fcb0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
1fcc0 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
1fcd0 46 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  FE.  Tcl_LinkVar
1fce0 28 69 6e 74 65 72 70 2c 20 22 74 68 72 65 61 64  (interp, "thread
1fcf0 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
1fd00 65 72 73 4c 6f 63 6b 73 22 2c 0a 20 20 20 20 20  ersLocks",.     
1fd10 20 28 63 68 61 72 2a 29 26 74 68 72 65 61 64 73   (char*)&threads
1fd20 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
1fd30 72 73 4c 6f 63 6b 73 2c 20 54 43 4c 5f 4c 49 4e  rsLocks, TCL_LIN
1fd40 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23  K_INT);.#endif.#
1fd50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fd60 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c  IT_UTF16.  Tcl_L
1fd70 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
1fd80 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65 65 64  sqlite_last_need
1fd90 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20  ed_collation",. 
1fda0 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 7a 4e       (char*)&pzN
1fdb0 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 2c 20  eededCollation, 
1fdc0 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c  TCL_LINK_STRING|
1fdd0 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e  TCL_LINK_READ_ON
1fde0 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  LY);.#endif.#if 
1fdf0 4f 53 5f 57 49 4e 0a 20 20 54 63 6c 5f 4c 69 6e  OS_WIN.  Tcl_Lin
1fe00 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
1fe10 6c 69 74 65 5f 6f 73 5f 74 79 70 65 22 2c 0a 20  lite_os_type",. 
1fe20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
1fe30 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 54 43  ite3_os_type, TC
1fe40 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e  L_LINK_INT);.#en
1fe50 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1fe60 45 5f 54 45 53 54 0a 20 20 54 63 6c 5f 4c 69 6e  E_TEST.  Tcl_Lin
1fe70 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
1fe80 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c 61 6e 22  lite_query_plan"
1fe90 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
1fea0 71 75 65 72 79 5f 70 6c 61 6e 2c 20 54 43 4c 5f  query_plan, TCL_
1feb0 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f  LINK_STRING|TCL_
1fec0 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b  LINK_READ_ONLY);
1fed0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1fee0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 54 63  QLITE_DEBUG.  Tc
1fef0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
1ff00 2c 20 22 73 71 6c 69 74 65 5f 61 64 64 6f 70 5f  , "sqlite_addop_
1ff10 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63  trace",.      (c
1ff20 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 76 64  har*)&sqlite3_vd
1ff30 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 2c 20  be_addop_trace, 
1ff40 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
1ff50 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1ff60 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 77 68 65  erp, "sqlite_whe
1ff70 72 65 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20  re_trace",.     
1ff80 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
1ff90 5f 77 68 65 72 65 5f 74 72 61 63 65 2c 20 54 43  _where_trace, TC
1ffa0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
1ffb0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
1ffc0 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 72  p, "sqlite_os_tr
1ffd0 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ace",.      (cha
1ffe0 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  r*)&sqlite3_os_t
1fff0 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
20000 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e  NT);.#endif.#ifn
20010 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20020 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f 4c 69 6e  DISKIO.  Tcl_Lin
20030 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
20040 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  lite_opentemp_co
20050 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
20060 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e  r*)&sqlite3_open
20070 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  temp_count, TCL_
20080 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
20090 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  f.  Tcl_LinkVar(
200a0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
200b0 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
200c0 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
200d0 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  )&sqlite_static_
200e0 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c 5f  bind_value, TCL_
200f0 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20  LINK_STRING);.  
20100 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
20110 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  rp, "sqlite_stat
20120 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 22 2c 0a  ic_bind_nbyte",.
20130 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
20140 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
20150 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c 49 4e 4b  _nbyte, TCL_LINK
20160 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
20170 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
20180 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72 65 63 74  lite_temp_direct
20190 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ory",.      (cha
201a0 72 2a 29 26 73 71 6c 69 74 65 33 5f 74 65 6d 70  r*)&sqlite3_temp
201b0 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f  _directory, TCL_
201c0 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20  LINK_STRING);.  
201d0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
201e0 72 70 2c 20 22 62 69 74 6d 61 73 6b 5f 73 69 7a  rp, "bitmask_siz
201f0 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
20200 29 26 62 69 74 6d 61 73 6b 5f 73 69 7a 65 2c 20  )&bitmask_size, 
20210 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c  TCL_LINK_INT|TCL
20220 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29  _LINK_READ_ONLY)
20230 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
20240 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
20250 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  sync_count",.   
20260 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
20270 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54  e3_sync_count, T
20280 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
20290 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
202a0 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 75 6c 6c  rp, "sqlite_full
202b0 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  sync_count",.   
202c0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
202d0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
202e0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
202f0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
20300 54 45 53 54 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  TEST.  Tcl_LinkV
20310 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
20320 74 65 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74  te_enable_in_opt
20330 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
20340 26 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f  &sqlite3_enable_
20350 69 6e 5f 6f 70 74 2c 20 54 43 4c 5f 4c 49 4e 4b  in_opt, TCL_LINK
20360 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _INT);.#endif.  
20370 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
20380 0a                                               .