/ Hex Artifact Content
Login

Artifact fed7656affe3bc687043bb76d13650a40cb21aef:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a  te library..**.*
0220: 2a 20 24 49 64 3a 20 74 65 73 74 31 2e 63 2c 76  * $Id: test1.c,v
0230: 20 31 2e 33 32 36 20 32 30 30 38 2f 31 30 2f 30   1.326 2008/10/0
0240: 32 20 31 34 3a 34 39 3a 30 32 20 64 61 6e 69 65  2 14:49:02 danie
0250: 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a  lk1977 Exp $.*/.
0260: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0270: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0280: 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65  "tcl.h".#include
0290: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
02a0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
02b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
02c0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72   copy of the fir
02d0: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 53  st part of the S
02e0: 71 6c 69 74 65 44 62 20 73 74 72 75 63 74 75 72  qliteDb structur
02f0: 65 20 69 6e 20 0a 2a 2a 20 74 63 6c 73 71 6c 69  e in .** tclsqli
0300: 74 65 2e 63 2e 20 20 57 65 20 6e 65 65 64 20 69  te.c.  We need i
0310: 74 20 68 65 72 65 20 73 6f 20 74 68 61 74 20 74  t here so that t
0320: 68 65 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f  he get_sqlite_po
0330: 69 6e 74 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a  inter routine.**
0340: 20 63 61 6e 20 65 78 74 72 61 63 74 20 74 68 65   can extract the
0350: 20 73 71 6c 69 74 65 33 2a 20 70 6f 69 6e 74 65   sqlite3* pointe
0360: 72 20 66 72 6f 6d 20 61 6e 20 65 78 69 73 74 69  r from an existi
0370: 6e 67 20 54 63 6c 20 53 51 4c 69 74 65 0a 2a 2a  ng Tcl SQLite.**
0380: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
0390: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20  struct SqliteDb 
03a0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
03b0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .};../*.** Conve
03c0: 72 74 20 74 65 78 74 20 67 65 6e 65 72 61 74 65  rt text generate
03d0: 64 20 62 79 20 74 68 65 20 22 25 70 22 20 63 6f  d by the "%p" co
03e0: 6e 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20  nversion format 
03f0: 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20 61 20 70  back into.** a p
0400: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
0410: 63 20 69 6e 74 20 74 65 73 74 48 65 78 54 6f 49  c int testHexToI
0420: 6e 74 28 69 6e 74 20 68 29 7b 0a 20 20 69 66 28  nt(int h){.  if(
0430: 20 68 3e 3d 27 30 27 20 26 26 20 68 3c 3d 27 39   h>='0' && h<='9
0440: 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ' ){.    return 
0450: 68 20 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65  h - '0';.  }else
0460: 20 69 66 28 20 68 3e 3d 27 61 27 20 26 26 20 68   if( h>='a' && h
0470: 3c 3d 27 66 27 20 29 7b 0a 20 20 20 20 72 65 74  <='f' ){.    ret
0480: 75 72 6e 20 68 20 2d 20 27 61 27 20 2b 20 31 30  urn h - 'a' + 10
0490: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
04a0: 73 73 65 72 74 28 20 68 3e 3d 27 41 27 20 26 26  ssert( h>='A' &&
04b0: 20 68 3c 3d 27 46 27 20 29 3b 0a 20 20 20 20 72   h<='F' );.    r
04c0: 65 74 75 72 6e 20 68 20 2d 20 27 41 27 20 2b 20  eturn h - 'A' + 
04d0: 31 30 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 2a  10;.  }.}.void *
04e0: 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54  sqlite3TestTextT
04f0: 6f 50 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20  oPtr(const char 
0500: 2a 7a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a  *z){.  void *p;.
0510: 20 20 75 36 34 20 76 3b 0a 20 20 75 33 32 20 76    u64 v;.  u32 v
0520: 32 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  2;.  if( z[0]=='
0530: 30 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 78 27 20  0' && z[1]=='x' 
0540: 29 7b 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20  ){.    z += 2;. 
0550: 20 7d 0a 20 20 76 20 3d 20 30 3b 0a 20 20 77 68   }.  v = 0;.  wh
0560: 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 76  ile( *z ){.    v
0570: 20 3d 20 28 76 3c 3c 34 29 20 2b 20 74 65 73 74   = (v<<4) + test
0580: 48 65 78 54 6f 49 6e 74 28 2a 7a 29 3b 0a 20 20  HexToInt(*z);.  
0590: 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    z++;.  }.  if(
05a0: 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65   sizeof(p)==size
05b0: 6f 66 28 76 29 20 29 7b 0a 20 20 20 20 6d 65 6d  of(v) ){.    mem
05c0: 63 70 79 28 26 70 2c 20 26 76 2c 20 73 69 7a 65  cpy(&p, &v, size
05d0: 6f 66 28 70 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  of(p));.  }else{
05e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
05f0: 65 6f 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28 76  eof(p)==sizeof(v
0600: 32 29 20 29 3b 0a 20 20 20 20 76 32 20 3d 20 28  2) );.    v2 = (
0610: 75 33 32 29 76 3b 0a 20 20 20 20 6d 65 6d 63 70  u32)v;.    memcp
0620: 79 28 26 70 2c 20 26 76 32 2c 20 73 69 7a 65 6f  y(&p, &v2, sizeo
0630: 66 28 70 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f(p));.  }.  ret
0640: 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn p;.}.../*.**
0650: 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74   A TCL command t
0660: 68 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20  hat returns the 
0670: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  address of the s
0680: 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 0a 2a  qlite* pointer.*
0690: 2a 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 20  * for an sqlite 
06a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 73 74 61  connection insta
06b0: 6e 63 65 2e 20 20 42 61 64 20 74 68 69 6e 67 73  nce.  Bad things
06c0: 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 0a 2a   happen if the.*
06d0: 2a 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61  * input is not a
06e0: 6e 20 73 71 6c 69 74 65 20 63 6f 6e 6e 65 63 74  n sqlite connect
06f0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
0700: 6e 74 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f  nt get_sqlite_po
0710: 69 6e 74 65 72 28 0a 20 20 76 6f 69 64 20 2a 20  inter(.  void * 
0720: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
0730: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0740: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
0750: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
0760: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63  bjv[].){.  struc
0770: 74 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20  t SqliteDb *p;. 
0780: 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
0790: 49 6e 66 6f 3b 0a 20 20 63 68 61 72 20 7a 42 75  Info;.  char zBu
07a0: 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 6f 62  f[100];.  if( ob
07b0: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
07c0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
07d0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
07e0: 53 51 4c 49 54 45 2d 43 4f 4e 4e 45 43 54 49 4f  SQLITE-CONNECTIO
07f0: 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
0800: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
0810: 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d   if( !Tcl_GetCom
0820: 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
0830: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
0840: 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66  bjv[1]), &cmdInf
0850: 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  o) ){.    Tcl_Ap
0860: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
0870: 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20  p, "command not 
0880: 66 6f 75 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20  found: ",.      
0890: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
08a0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68  ng(objv[1]), (ch
08b0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
08c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
08d0: 7d 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20  }.  p = (struct 
08e0: 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
08f0: 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b  o.objClientData;
0900: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
0910: 20 22 25 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20   "%p", p->db);. 
0920: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 42 75   if( strncmp(zBu
0930: 66 2c 22 30 78 22 2c 32 29 20 29 7b 0a 20 20 20  f,"0x",2) ){.   
0940: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
0950: 30 78 25 70 22 2c 20 70 2d 3e 64 62 29 3b 0a 20  0x%p", p->db);. 
0960: 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52   }.  Tcl_AppendR
0970: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
0980: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
0990: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
09a0: 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74  * Decode a point
09b0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
09c0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20   object..*/.int 
09d0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
09e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
09f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c   const char *zA,
0a00: 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29   sqlite3 **ppDb)
0a10: 7b 0a 20 20 73 74 72 75 63 74 20 53 71 6c 69 74  {.  struct Sqlit
0a20: 65 44 62 20 2a 70 3b 0a 20 20 54 63 6c 5f 43 6d  eDb *p;.  Tcl_Cm
0a30: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
0a40: 20 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d   if( Tcl_GetComm
0a50: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
0a60: 7a 41 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  zA, &cmdInfo) ){
0a70: 0a 20 20 20 20 70 20 3d 20 28 73 74 72 75 63 74  .    p = (struct
0a80: 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
0a90: 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
0aa0: 3b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 70 2d  ;.    *ppDb = p-
0ab0: 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >db;.  }else{.  
0ac0: 20 20 2a 70 70 44 62 20 3d 20 28 73 71 6c 69 74    *ppDb = (sqlit
0ad0: 65 33 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54  e3*)sqlite3TestT
0ae0: 65 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20  extToPtr(zA);.  
0af0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
0b00: 4b 3b 0a 7d 0a 0a 0a 63 6f 6e 73 74 20 63 68 61  K;.}...const cha
0b10: 72 20 2a 73 71 6c 69 74 65 33 54 65 73 74 45 72  r *sqlite3TestEr
0b20: 72 6f 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b  rorName(int rc){
0b30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0b40: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 73 77 69 74  Name = 0;.  swit
0b50: 63 68 28 20 72 63 20 26 20 30 78 66 66 20 29 7b  ch( rc & 0xff ){
0b60: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0b70: 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  _OK:         zNa
0b80: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22  me = "SQLITE_OK"
0b90: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
0ba0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0bb0: 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 7a 4e  E_ERROR:      zN
0bc0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52  ame = "SQLITE_ER
0bd0: 52 4f 52 22 3b 20 20 20 20 20 20 20 62 72 65 61  ROR";       brea
0be0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0bf0: 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 7a  TE_PERM:       z
0c00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
0c10: 45 52 4d 22 3b 20 20 20 20 20 20 20 20 62 72 65  ERM";        bre
0c20: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0c30: 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20  ITE_ABORT:      
0c40: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0c50: 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20 62 72  ABORT";       br
0c60: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0c70: 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20  LITE_BUSY:      
0c80: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0c90: 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 62  _BUSY";        b
0ca0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0cb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20  QLITE_LOCKED:   
0cc0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0cd0: 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20  E_LOCKED";      
0ce0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0cf0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20  SQLITE_NOMEM:   
0d00: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0d10: 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20  TE_NOMEM";      
0d20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0d30: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
0d40: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
0d50: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20  ITE_READONLY";  
0d60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0d70: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  e SQLITE_INTERRU
0d80: 50 54 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  PT:  zName = "SQ
0d90: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b  LITE_INTERRUPT";
0da0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0db0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a  se SQLITE_IOERR:
0dc0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
0dd0: 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20 20  QLITE_IOERR";   
0de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0df0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ase SQLITE_CORRU
0e00: 50 54 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  PT:    zName = "
0e10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b  SQLITE_CORRUPT";
0e20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0e30: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c  case SQLITE_FULL
0e40: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
0e50: 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20  "SQLITE_FULL";  
0e60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0e70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
0e80: 54 4f 50 45 4e 3a 20 20 20 7a 4e 61 6d 65 20 3d  TOPEN:   zName =
0e90: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
0ea0: 4e 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  N";    break;.  
0eb0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52    case SQLITE_PR
0ec0: 4f 54 4f 43 4f 4c 3a 20 20 20 7a 4e 61 6d 65 20  OTOCOL:   zName 
0ed0: 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  = "SQLITE_PROTOC
0ee0: 4f 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  OL";    break;. 
0ef0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45     case SQLITE_E
0f00: 4d 50 54 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65  MPTY:      zName
0f10: 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59   = "SQLITE_EMPTY
0f20: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
0f30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0f40: 53 43 48 45 4d 41 3a 20 20 20 20 20 7a 4e 61 6d  SCHEMA:     zNam
0f50: 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45  e = "SQLITE_SCHE
0f60: 4d 41 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  MA";      break;
0f70: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0f80: 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 7a 4e 61  _CONSTRAINT: zNa
0f90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
0fa0: 53 54 52 41 49 4e 54 22 3b 20 20 62 72 65 61 6b  STRAINT";  break
0fb0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0fc0: 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 7a 4e  E_MISMATCH:   zN
0fd0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
0fe0: 53 4d 41 54 43 48 22 3b 20 20 20 20 62 72 65 61  SMATCH";    brea
0ff0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1000: 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 7a  TE_MISUSE:     z
1010: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
1020: 49 53 55 53 45 22 3b 20 20 20 20 20 20 62 72 65  ISUSE";      bre
1030: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1040: 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20  ITE_NOLFS:      
1050: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
1060: 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 62 72  NOLFS";       br
1070: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
1080: 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20  LITE_AUTH:      
1090: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
10a0: 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20 62  _AUTH";        b
10b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
10c0: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20  QLITE_FORMAT:   
10d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
10e0: 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20 20  E_FORMAT";      
10f0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1100: 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20  SQLITE_RANGE:   
1110: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1120: 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20  TE_RANGE";      
1130: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1140: 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20   SQLITE_ROW:    
1150: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
1160: 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20  ITE_ROW";       
1170: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1180: 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20  e SQLITE_DONE:  
1190: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
11a0: 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20  LITE_DONE";     
11b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11c0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  se SQLITE_NOTADB
11d0: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
11e0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20  QLITE_NOTADB";  
11f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1200: 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  ase SQLITE_TOOBI
1210: 47 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  G:     zName = "
1220: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20  SQLITE_TOOBIG"; 
1230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1240: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1250: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
1260: 22 53 51 4c 49 54 45 5f 55 6e 6b 6e 6f 77 6e 22  "SQLITE_Unknown"
1270: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;     break;.  }
1280: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
1290: 0a 7d 0a 23 64 65 66 69 6e 65 20 74 31 45 72 72  .}.#define t1Err
12a0: 6f 72 4e 61 6d 65 20 73 71 6c 69 74 65 33 54 65  orName sqlite3Te
12b0: 73 74 45 72 72 6f 72 4e 61 6d 65 0a 0a 2f 2a 0a  stErrorName../*.
12c0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 73 71  ** Convert an sq
12d0: 6c 69 74 65 33 5f 73 74 6d 74 2a 20 69 6e 74 6f  lite3_stmt* into
12e0: 20 61 6e 20 73 71 6c 69 74 65 33 2a 2e 20 20 54   an sqlite3*.  T
12f0: 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  his depends on t
1300: 68 65 0a 2a 2a 20 66 61 63 74 20 74 68 61 74 20  he.** fact that 
1310: 74 68 65 20 73 71 6c 69 74 65 33 2a 20 69 73 20  the sqlite3* is 
1320: 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1330: 69 6e 20 74 68 65 20 56 64 62 65 20 73 74 72 75  in the Vdbe stru
1340: 63 74 75 72 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cture..*/.#defin
1350: 65 20 53 74 6d 74 54 6f 44 62 28 58 29 20 20 20  e StmtToDb(X)   
1360: 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
1370: 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  e(X)../*.** Chec
1380: 6b 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65  k a return value
1390: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
13a0: 20 61 67 72 65 65 73 20 77 69 74 68 20 74 68 65   agrees with the
13b0: 20 72 65 73 75 6c 74 73 0a 2a 2a 20 66 72 6f 6d   results.** from
13c0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
13d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13e0: 54 65 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f  TestErrCode(Tcl_
13f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1400: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1410: 20 72 63 29 7b 0a 20 20 69 66 28 20 72 63 21 3d   rc){.  if( rc!=
1420: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 26 26  SQLITE_MISUSE &&
1430: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1440: 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  & sqlite3_errcod
1450: 65 28 64 62 29 21 3d 72 63 20 29 7b 0a 20 20 20  e(db)!=rc ){.   
1460: 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
1470: 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71  .    int r2 = sq
1480: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
1490: 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
14a0: 42 75 66 2c 20 22 65 72 72 6f 72 20 63 6f 64 65  Buf, "error code
14b0: 20 25 73 20 28 25 64 29 20 64 6f 65 73 20 6e 6f   %s (%d) does no
14c0: 74 20 6d 61 74 63 68 20 73 71 6c 69 74 65 33 5f  t match sqlite3_
14d0: 65 72 72 63 6f 64 65 20 25 73 20 28 25 64 29 22  errcode %s (%d)"
14e0: 2c 0a 20 20 20 20 20 20 20 74 31 45 72 72 6f 72  ,.       t1Error
14f0: 4e 61 6d 65 28 72 63 29 2c 20 72 63 2c 20 74 31  Name(rc), rc, t1
1500: 45 72 72 6f 72 4e 61 6d 65 28 72 32 29 2c 20 72  ErrorName(r2), r
1510: 32 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65  2);.    Tcl_Rese
1520: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
1530: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1540: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1550: 75 66 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  uf, 0);.    retu
1560: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
1570: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 0;.}../*.** D
1580: 65 63 6f 64 65 20 61 20 70 6f 69 6e 74 65 72 20  ecode a pointer 
1590: 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 73 74  to an sqlite3_st
15a0: 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  mt object..*/.st
15b0: 61 74 69 63 20 69 6e 74 20 67 65 74 53 74 6d 74  atic int getStmt
15c0: 50 6f 69 6e 74 65 72 28 0a 20 20 54 63 6c 5f 49  Pointer(.  Tcl_I
15d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a  nterp *interp, .
15e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
15f0: 72 67 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f  rg,  .  sqlite3_
1600: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a 29 7b  stmt **ppStmt.){
1610: 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 28 73 71  .  *ppStmt = (sq
1620: 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73 71 6c 69  lite3_stmt*)sqli
1630: 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
1640: 28 7a 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e  (zArg);.  return
1650: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1660: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 65 78  * Generate a tex
1670: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
1680: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 68   of a pointer th
1690: 61 74 20 63 61 6e 20 62 65 20 75 6e 64 65 72 73  at can be unders
16a0: 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68 65 20 67  tood.** by the g
16b0: 65 74 44 62 50 6f 69 6e 74 65 72 20 61 6e 64 20  etDbPointer and 
16c0: 67 65 74 56 6d 50 6f 69 6e 74 65 72 20 72 6f 75  getVmPointer rou
16d0: 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a 2a 2a 0a  tines above..**.
16e0: 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 69  ** The problem i
16f0: 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61 63 68 69  s, on some machi
1700: 6e 65 73 20 28 53 6f 6c 61 72 69 73 29 20 69 66  nes (Solaris) if
1710: 20 79 6f 75 20 64 6f 20 61 20 70 72 69 6e 74 66   you do a printf
1720: 20 77 69 74 68 0a 2a 2a 20 22 25 70 22 20 79 6f   with.** "%p" yo
1730: 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e 20 61 72  u cannot turn ar
1740: 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61 20 73 63  ound and do a sc
1750: 61 6e 66 20 77 69 74 68 20 74 68 65 20 73 61 6d  anf with the sam
1760: 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a 20 67 65  e "%p" and.** ge
1770: 74 20 79 6f 75 72 20 70 6f 69 6e 74 65 72 20 62  t your pointer b
1780: 61 63 6b 2e 20 20 59 6f 75 20 68 61 76 65 20 74  ack.  You have t
1790: 6f 20 70 72 65 70 65 6e 64 20 61 20 22 30 78 22  o prepend a "0x"
17a0: 20 62 65 66 6f 72 65 20 69 74 20 77 69 6c 6c 0a   before it will.
17b0: 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20 61 74 20  ** work.  Or at 
17c0: 6c 65 61 73 74 20 74 68 61 74 20 69 73 20 77 68  least that is wh
17d0: 61 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  at is reported t
17e0: 6f 20 6d 65 20 28 64 72 68 29 2e 20 20 42 75 74  o me (drh).  But
17f0: 20 74 68 69 73 0a 2a 2a 20 62 65 68 61 76 69 6f   this.** behavio
1800: 72 20 76 61 72 69 65 73 20 66 72 6f 6d 20 6d 61  r varies from ma
1810: 63 68 69 6e 65 20 74 6f 20 6d 61 63 68 69 6e 65  chine to machine
1820: 2e 20 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  .  The solution 
1830: 75 73 65 64 20 68 65 72 20 69 73 0a 2a 2a 20 74  used her is.** t
1840: 6f 20 74 65 73 74 20 74 68 65 20 73 74 72 69 6e  o test the strin
1850: 67 20 72 69 67 68 74 20 61 66 74 65 72 20 69 74  g right after it
1860: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
1870: 20 73 65 65 20 69 66 20 69 74 20 63 61 6e 20 62   see if it can b
1880: 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f 6f 64 20  e.** understood 
1890: 62 79 20 73 63 61 6e 66 2c 20 61 6e 64 20 69 66  by scanf, and if
18a0: 20 6e 6f 74 2c 20 74 72 79 20 70 72 65 70 65 6e   not, try prepen
18b0: 64 69 6e 67 20 61 6e 20 22 30 78 22 20 74 6f 20  ding an "0x" to 
18c0: 73 65 65 20 69 66 0a 2a 2a 20 74 68 61 74 20 68  see if.** that h
18d0: 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74 68 69 6e  elps.  If nothin
18e0: 67 20 77 6f 72 6b 73 2c 20 61 20 66 61 74 61 6c  g works, a fatal
18f0: 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65 72 61   error is genera
1900: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
1910: 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1920: 65 72 53 74 72 28 54 63 6c 5f 49 6e 74 65 72 70  erStr(Tcl_Interp
1930: 20 2a 69 6e 74 65 72 70 2c 20 63 68 61 72 20 2a   *interp, char *
1940: 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70 29 7b 0a  zPtr, void *p){.
1950: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1960: 74 66 28 31 30 30 2c 20 7a 50 74 72 2c 20 22 25  tf(100, zPtr, "%
1970: 70 22 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  p", p);.  return
1980: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1990: 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  * The callback r
19a0: 6f 75 74 69 6e 65 20 66 6f 72 20 73 71 6c 69 74  outine for sqlit
19b0: 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 29  e3_exec_printf()
19c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19d0: 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 28 76  exec_printf_cb(v
19e0: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 61  oid *pArg, int a
19f0: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
1a00: 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65 29 7b 0a  , char **name){.
1a10: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 73    Tcl_DString *s
1a20: 74 72 20 3d 20 28 54 63 6c 5f 44 53 74 72 69 6e  tr = (Tcl_DStrin
1a30: 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 69  g*)pArg;.  int i
1a40: 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f 44 53 74  ;..  if( Tcl_DSt
1a50: 72 69 6e 67 4c 65 6e 67 74 68 28 73 74 72 29 3d  ringLength(str)=
1a60: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
1a70: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
1a80: 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69  .      Tcl_DStri
1a90: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
1aa0: 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20 3f 20 6e  str, name[i] ? n
1ab0: 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29  ame[i] : "NULL")
1ac0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
1ad0: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
1ae0: 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ++){.    Tcl_DSt
1af0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
1b00: 74 28 73 74 72 2c 20 61 72 67 76 5b 69 5d 20 3f  t(str, argv[i] ?
1b10: 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e 55 4c 4c   argv[i] : "NULL
1b20: 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ");.  }.  return
1b30: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   0;.}../*.** The
1b40: 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 63 61 6c   I/O tracing cal
1b50: 6c 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66 20 21 64  lback..*/.#if !d
1b60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b70: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
1b80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1b90: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 73 74 61 74  LE_IOTRACE).stat
1ba0: 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61 63 65  ic FILE *iotrace
1bb0: 5f 66 69 6c 65 20 3d 20 30 3b 0a 73 74 61 74 69  _file = 0;.stati
1bc0: 63 20 76 6f 69 64 20 69 6f 5f 74 72 61 63 65 5f  c void io_trace_
1bd0: 63 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 63  callback(const c
1be0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1bf0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1c00: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
1c10: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70   zFormat);.  vfp
1c20: 72 69 6e 74 66 28 69 6f 74 72 61 63 65 5f 66 69  rintf(iotrace_fi
1c30: 6c 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  le, zFormat, ap)
1c40: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
1c50: 20 20 66 66 6c 75 73 68 28 69 6f 74 72 61 63 65    fflush(iotrace
1c60: 5f 66 69 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69 66  _file);.}.#endif
1c70: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1c80: 69 6f 5f 74 72 61 63 65 20 46 49 4c 45 4e 41 4d  io_trace FILENAM
1c90: 45 0a 2a 2a 0a 2a 2a 20 54 75 72 6e 20 49 2f 4f  E.**.** Turn I/O
1ca0: 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f   tracing on or o
1cb0: 66 66 2e 20 20 49 66 20 46 49 4c 45 4e 41 4d 45  ff.  If FILENAME
1cc0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 6d 70 74 79   is not an empty
1cd0: 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 49 2f 4f 20   string,.** I/O 
1ce0: 74 72 61 63 69 6e 67 20 62 65 67 69 6e 73 20 67  tracing begins g
1cf0: 6f 69 6e 67 20 69 6e 74 6f 20 46 49 4c 45 4e 41  oing into FILENA
1d00: 4d 45 2e 20 49 66 20 46 49 4c 45 4e 41 4d 45 20  ME. If FILENAME 
1d10: 69 73 20 61 6e 20 65 6d 70 74 79 0a 2a 2a 20 73  is an empty.** s
1d20: 74 72 69 6e 67 2c 20 49 2f 4f 20 74 72 61 63 69  tring, I/O traci
1d30: 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  ng is turned off
1d40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d50: 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 28 0a 20  test_io_trace(. 
1d60: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
1d70: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1d80: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1d90: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1da0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1db0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1dc0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
1dd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1de0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1df0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
1e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
1e10: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
1e20: 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 64 65 66  t */.){.#if !def
1e30: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1e40: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
1e50: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1e60: 5f 49 4f 54 52 41 43 45 29 0a 20 20 69 66 28 20  _IOTRACE).  if( 
1e70: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
1e80: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1e90: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1ea0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1eb0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
1ec0: 20 20 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e           " FILEN
1ed0: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
1ee0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ef0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 6f 74 72  ;.  }.  if( iotr
1f00: 61 63 65 5f 66 69 6c 65 20 29 7b 0a 20 20 20 20  ace_file ){.    
1f10: 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69 6c 65  if( iotrace_file
1f20: 21 3d 73 74 64 6f 75 74 20 26 26 20 69 6f 74 72  !=stdout && iotr
1f30: 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 65 72 72  ace_file!=stderr
1f40: 20 29 7b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65   ){.      fclose
1f50: 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 29 3b 0a  (iotrace_file);.
1f60: 20 20 20 20 7d 0a 20 20 20 20 69 6f 74 72 61 63      }.    iotrac
1f70: 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  e_file = 0;.    
1f80: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d  sqlite3IoTrace =
1f90: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72   0;.  }.  if( ar
1fa0: 67 76 5b 31 5d 5b 30 5d 20 29 7b 0a 20 20 20 20  gv[1][0] ){.    
1fb0: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
1fc0: 31 5d 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20  1],"stdout")==0 
1fd0: 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65  ){.      iotrace
1fe0: 5f 66 69 6c 65 20 3d 20 73 74 64 6f 75 74 3b 0a  _file = stdout;.
1ff0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
2000: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74  rcmp(argv[1],"st
2010: 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  derr")==0 ){.   
2020: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
2030: 3d 20 73 74 64 65 72 72 3b 0a 20 20 20 20 7d 65  = stderr;.    }e
2040: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  lse{.      iotra
2050: 63 65 5f 66 69 6c 65 20 3d 20 66 6f 70 65 6e 28  ce_file = fopen(
2060: 61 72 67 76 5b 31 5d 2c 20 22 77 22 29 3b 0a 20  argv[1], "w");. 
2070: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2080: 49 6f 54 72 61 63 65 20 3d 20 69 6f 5f 74 72 61  IoTrace = io_tra
2090: 63 65 5f 63 61 6c 6c 62 61 63 6b 3b 0a 20 20 7d  ce_callback;.  }
20a0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
20b0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
20c0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
20d0: 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20  e3_exec_printf  
20e0: 44 42 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49  DB  FORMAT  STRI
20f0: 4e 47 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  NG.**.** Invoke 
2100: 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63  the sqlite3_exec
2110: 5f 70 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66  _printf() interf
2120: 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70  ace using the op
2130: 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44  en database.** D
2140: 42 2e 20 20 54 68 65 20 53 51 4c 20 69 73 20 74  B.  The SQL is t
2150: 68 65 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54  he string FORMAT
2160: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74  .  The format st
2170: 72 69 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74  ring should cont
2180: 61 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72  ain.** one %s or
2190: 20 25 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20   %q.  STRING is 
21a0: 74 68 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74  the value insert
21b0: 65 64 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71  ed into %s or %q
21c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21d0: 74 65 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66  test_exec_printf
21e0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
21f0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
2200: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2210: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2220: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2230: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2240: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
2250: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2260: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2270: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
2280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2290: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
22a0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
22b0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f  ite3 *db;.  Tcl_
22c0: 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69  DString str;.  i
22d0: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
22e0: 45 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Err = 0;.  char 
22f0: 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42  *zSql;.  char zB
2300: 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72  uf[30];.  if( ar
2310: 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=4 ){.    Tcl
2320: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2330: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
2340: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
2350: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
2360: 20 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54       " DB FORMAT
2370: 20 53 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20   STRING", 0);.  
2380: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2390: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
23a0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
23b0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
23c0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
23d0: 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ROR;.  Tcl_DStri
23e0: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
23f0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2400: 70 72 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 20  printf(argv[2], 
2410: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d  argv[3]);.  rc =
2420: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
2430: 2c 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69  , zSql, exec_pri
2440: 6e 74 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a  ntf_cb, &str, &z
2450: 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Err);.  sqlite3_
2460: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70  free(zSql);.  sp
2470: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
2480: 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70  , rc);.  Tcl_App
2490: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
24a0: 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f  p, zBuf);.  Tcl_
24b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
24c0: 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45  terp, rc==SQLITE
24d0: 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e  _OK ? Tcl_DStrin
24e0: 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a  gValue(&str) : z
24f0: 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Err);.  Tcl_DStr
2500: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
2510: 20 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69   if( zErr ) sqli
2520: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
2530: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
2540: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
2550: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
2560: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
2570: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2580: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 64  ./*.** Usage:  d
2590: 62 5f 65 6e 74 65 72 20 44 42 0a 2a 2a 20 20 20  b_enter DB.**   
25a0: 20 20 20 20 20 20 64 62 5f 6c 65 61 76 65 20 44        db_leave D
25b0: 42 0a 2a 2a 0a 2a 2a 20 45 6e 74 65 72 20 6f 72  B.**.** Enter or
25c0: 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78   leave the mutex
25d0: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 63   on a database c
25e0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
25f0: 61 74 69 63 20 69 6e 74 20 64 62 5f 65 6e 74 65  atic int db_ente
2600: 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  r(.  void *NotUs
2610: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
2620: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2630: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2640: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2650: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2660: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
2670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2680: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2690: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
26a0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
26b0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
26c0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
26d0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
26e0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
26f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2700: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2710: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2720: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2730: 0a 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30  .       " DB", 0
2740: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2750: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2760: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2770: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
2780: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2790: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
27a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
27b0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
27c0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73  turn TCL_OK;.}.s
27d0: 74 61 74 69 63 20 69 6e 74 20 64 62 5f 6c 65 61  tatic int db_lea
27e0: 76 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ve(.  void *NotU
27f0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
2800: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
2810: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
2820: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2830: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
2840: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
2850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2860: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2870: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
2880: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
2890: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
28a0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
28b0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
28c0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
28d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
28e0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
28f0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
2900: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
2910: 20 0a 20 20 20 20 20 20 20 22 20 44 42 22 2c 20   .       " DB", 
2920: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
2930: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2940: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
2950: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
2960: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
2970: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
2980: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
2990: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
29a0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
29b0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
29c0: 71 6c 69 74 65 33 5f 65 78 65 63 20 20 44 42 20  qlite3_exec  DB 
29d0: 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b   SQL.**.** Invok
29e0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78  e the sqlite3_ex
29f0: 65 63 20 69 6e 74 65 72 66 61 63 65 20 75 73 69  ec interface usi
2a00: 6e 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ng the open data
2a10: 62 61 73 65 20 44 42 0a 2a 2f 0a 73 74 61 74 69  base DB.*/.stati
2a20: 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63 28  c int test_exec(
2a30: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
2a40: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2a50: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2a60: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2a70: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2a80: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2a90: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ab0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2ac0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
2ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
2ae0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
2af0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
2b00: 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44  te3 *db;.  Tcl_D
2b10: 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e  String str;.  in
2b20: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
2b30: 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  rr = 0;.  char *
2b40: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  zSql;.  int i, j
2b50: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
2b60: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  ];.  if( argc!=3
2b70: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2b80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2b90: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2ba0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2bb0: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2bc0: 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20  " DB SQL", 0);. 
2bd0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2be0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2bf0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2c00: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
2c10: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2c20: 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72  RROR;.  Tcl_DStr
2c30: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
2c40: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
2c50: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 72  mprintf("%s", ar
2c60: 67 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  gv[2]);.  for(i=
2c70: 6a 3d 30 3b 20 7a 53 71 6c 5b 69 5d 3b 29 7b 0a  j=0; zSql[i];){.
2c80: 20 20 20 20 69 66 28 20 7a 53 71 6c 5b 69 5d 3d      if( zSql[i]=
2c90: 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20 7a 53  ='%' ){.      zS
2ca0: 71 6c 5b 6a 2b 2b 5d 20 3d 20 28 74 65 73 74 48  ql[j++] = (testH
2cb0: 65 78 54 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 31  exToInt(zSql[i+1
2cc0: 5d 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78  ])<<4) + testHex
2cd0: 54 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 32 5d 29  ToInt(zSql[i+2])
2ce0: 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a  ;.      i += 3;.
2cf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d00: 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 7a 53 71   zSql[j++] = zSq
2d10: 6c 5b 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20  l[i++];.    }.  
2d20: 7d 0a 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b  }.  zSql[j] = 0;
2d30: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2d40: 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65  exec(db, zSql, e
2d50: 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26  xec_printf_cb, &
2d60: 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73  str, &zErr);.  s
2d70: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
2d80: 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  );.  sprintf(zBu
2d90: 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20  f, "%d", rc);.  
2da0: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
2db0: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b  t(interp, zBuf);
2dc0: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65  .  Tcl_AppendEle
2dd0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d  ment(interp, rc=
2de0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c  =SQLITE_OK ? Tcl
2df0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
2e00: 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54  tr) : zErr);.  T
2e10: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
2e20: 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  str);.  if( zErr
2e30: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
2e40: 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c  zErr);.  if( sql
2e50: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
2e60: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
2e70: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2e80: 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
2e90: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
2ea0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78  age:  sqlite3_ex
2eb0: 65 63 5f 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a  ec_nr  DB  SQL.*
2ec0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
2ed0: 73 71 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74  sqlite3_exec int
2ee0: 65 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65  erface using the
2ef0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 44   open database D
2f00: 42 2e 20 20 44 69 73 63 61 72 64 0a 2a 2a 20 61  B.  Discard.** a
2f10: 6c 6c 20 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74  ll results.*/.st
2f20: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78  atic int test_ex
2f30: 65 63 5f 6e 72 28 0a 20 20 76 6f 69 64 20 2a 4e  ec_nr(.  void *N
2f40: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
2f50: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2f60: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2f70: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2f80: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2f90: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fb0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2fc0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2fd0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2fe0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2ff0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3000: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
3010: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
3020: 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28  *zErr = 0;.  if(
3030: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
3040: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3050: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
3060: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
3070: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
3080: 0a 20 20 20 20 20 20 20 22 20 44 42 20 53 51 4c  .       " DB SQL
3090: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
30a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
30b0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
30c0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
30d0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
30e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
30f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
3100: 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30  c(db, argv[2], 0
3110: 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69  , 0, &zErr);.  i
3120: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
3130: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
3140: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
3150: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
3160: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
3170: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3180: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65  te3_mprintf_z_te
3190: 73 74 20 20 53 45 50 41 52 41 54 4f 52 20 20 41  st  SEPARATOR  A
31a0: 52 47 30 20 20 41 52 47 31 20 2e 2e 2e 0a 2a 2a  RG0  ARG1 ....**
31b0: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25 7a 20  .** Test the %z 
31c0: 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65  format of sqlite
31d0: 4d 50 72 69 6e 74 66 28 29 2e 20 20 55 73 65 20  MPrintf().  Use 
31e0: 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74 66  multiple mprintf
31f0: 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  () calls to .** 
3200: 63 6f 6e 63 61 74 65 6e 61 74 65 20 61 72 67 30  concatenate arg0
3210: 20 74 68 72 6f 75 67 68 20 61 72 67 6e 20 75 73   through argn us
3220: 69 6e 67 20 73 65 70 61 72 61 74 6f 72 20 61 73  ing separator as
3230: 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e 0a   the separator..
3240: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
3250: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
3260: 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66  int test_mprintf
3270: 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  _z(.  void *NotU
3280: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
3290: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
32a0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
32b0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
32c0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
32d0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
32e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
32f0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3300: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
3310: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
3320: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
3330: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
3340: 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30  har *zResult = 0
3350: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f  ;.  int i;..  fo
3360: 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 20 26 26  r(i=2; i<argc &&
3370: 20 28 69 3d 3d 32 20 7c 7c 20 7a 52 65 73 75 6c   (i==2 || zResul
3380: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 52  t); i++){.    zR
3390: 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 4d  esult = sqlite3M
33a0: 50 72 69 6e 74 66 28 30 2c 20 22 25 7a 25 73 25  Printf(0, "%z%s%
33b0: 73 22 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72 67  s", zResult, arg
33c0: 76 5b 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  v[1], argv[i]);.
33d0: 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64    }.  Tcl_Append
33e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
33f0: 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73 71  Result, 0);.  sq
3400: 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 73 75  lite3_free(zResu
3410: 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  lt);.  return TC
3420: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3430: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
3440: 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20 53  printf_n_test  S
3450: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73 74  TRING.**.** Test
3460: 20 74 68 65 20 25 6e 20 66 6f 72 6d 61 74 20 6f   the %n format o
3470: 66 20 73 71 6c 69 74 65 4d 50 72 69 6e 74 66 28  f sqliteMPrintf(
3480: 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6c  ).  Return the l
3490: 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20  ength of the.** 
34a0: 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2f  input string..*/
34b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
34c0: 5f 6d 70 72 69 6e 74 66 5f 6e 28 0a 20 20 76 6f  _mprintf_n(.  vo
34d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
34e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
34f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
3500: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
3510: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
3520: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3530: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3540: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3550: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3560: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3570: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3580: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3590: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 74  /.){.  char *zSt
35a0: 72 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  r;.  int n = 0;.
35b0: 20 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33    zStr = sqlite3
35c0: 4d 50 72 69 6e 74 66 28 30 2c 20 22 25 73 25 6e  MPrintf(0, "%s%n
35d0: 22 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 3b  ", argv[1], &n);
35e0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
35f0: 7a 53 74 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74  zStr);.  Tcl_Set
3600: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
3610: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
3620: 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  n));.  return TC
3630: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3640: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
3650: 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 53 49 5a  nprintf_int  SIZ
3660: 45 20 46 4f 52 4d 41 54 20 20 49 4e 54 0a 2a 2a  E FORMAT  INT.**
3670: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 6f 66 20  .** Test the of 
3680: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
3690: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 49 5a  () routine.  SIZ
36a0: 45 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  E is the size of
36b0: 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
36c0: 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 2e 20  uffer in bytes. 
36d0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   The maximum siz
36e0: 65 20 69 73 20 31 30 30 2e 20 20 46 4f 52 4d 41  e is 100.  FORMA
36f0: 54 20 69 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d  T is the.** form
3700: 61 74 20 73 74 72 69 6e 67 2e 20 20 49 4e 54 20  at string.  INT 
3710: 69 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65  is a single inte
3720: 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  ger argument.  T
3730: 68 65 20 46 4f 52 4d 41 54 0a 2a 2a 20 73 74 72  he FORMAT.** str
3740: 69 6e 67 20 6d 75 73 74 20 72 65 71 75 69 72 65  ing must require
3750: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   no more than th
3760: 69 73 20 6f 6e 65 20 69 6e 74 65 67 65 72 20 61  is one integer a
3770: 72 67 75 6d 65 6e 74 2e 20 20 49 66 0a 2a 2a 20  rgument.  If.** 
3780: 59 6f 75 20 70 61 73 73 20 69 6e 20 61 20 66 6f  You pass in a fo
3790: 72 6d 61 74 20 73 74 72 69 6e 67 20 74 68 61 74  rmat string that
37a0: 20 72 65 71 75 69 72 65 73 20 6d 6f 72 65 20 74   requires more t
37b0: 68 61 6e 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74  han one argument
37c0: 2c 0a 2a 2a 20 62 61 64 20 74 68 69 6e 67 73 20  ,.** bad things 
37d0: 77 69 6c 6c 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a  will happen..*/.
37e0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
37f0: 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20  snprintf_int(.  
3800: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3810: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3820: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3830: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
3840: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
3850: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
3860: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3870: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3880: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3890: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
38a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
38b0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
38c0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 53   */.){.  char zS
38d0: 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e 74 20 6e  tr[100];.  int n
38e0: 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 31 5d 29   = atoi(argv[1])
38f0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
3900: 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67 76 5b 32  zFormat = argv[2
3910: 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d 20 61 74  ];.  int a1 = at
3920: 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69  oi(argv[3]);.  i
3930: 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a 53 74 72  f( n>sizeof(zStr
3940: 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f 66 28 7a  ) ) n = sizeof(z
3950: 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Str);.  sqlite3_
3960: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
3970: 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20 22 61 62  zStr), zStr, "ab
3980: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
3990: 73 74 75 76 77 78 79 7a 22 29 3b 0a 20 20 73 71  stuvwxyz");.  sq
39a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
39b0: 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d 61 74 2c  , zStr, zFormat,
39c0: 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   a1);.  Tcl_Appe
39d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
39e0: 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20 72 65 74   zStr, 0);.  ret
39f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
3a00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3a10: 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 0a 2f 2a  IT_GET_TABLE../*
3a20: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3a30: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
3a40: 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d 41 54  intf  DB  FORMAT
3a50: 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d 6e 6f 2d    STRING  ?--no-
3a60: 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20 49 6e  counts?.**.** In
3a70: 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
3a80: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
3a90: 66 28 29 20 69 6e 74 65 72 66 61 63 65 20 75 73  f() interface us
3aa0: 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ing the open dat
3ab0: 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68  abase.** DB.  Th
3ac0: 65 20 53 51 4c 20 69 73 20 74 68 65 20 73 74 72  e SQL is the str
3ad0: 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65  ing FORMAT.  The
3ae0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73   format string s
3af0: 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  hould contain.**
3b00: 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20   one %s or %q.  
3b10: 53 54 52 49 4e 47 20 69 73 20 74 68 65 20 76 61  STRING is the va
3b20: 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  lue inserted int
3b30: 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73  o %s or %q..*/.s
3b40: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67  tatic int test_g
3b50: 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28  et_table_printf(
3b60: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3b70: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3b80: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3b90: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
3ba0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
3bb0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
3bc0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
3bd0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3be0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
3bf0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
3c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
3c10: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
3c20: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
3c30: 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44  te3 *db;.  Tcl_D
3c40: 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e  String str;.  in
3c50: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
3c60: 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52  rr = 0;.  int nR
3c70: 6f 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  ow, nCol;.  char
3c80: 20 2a 2a 61 52 65 73 75 6c 74 3b 0a 20 20 69 6e   **aResult;.  in
3c90: 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  t i;.  char zBuf
3ca0: 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 53  [30];.  char *zS
3cb0: 71 6c 3b 0a 20 20 69 6e 74 20 72 65 73 43 6f 75  ql;.  int resCou
3cc0: 6e 74 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 61  nt = -1;.  if( a
3cd0: 72 67 63 3d 3d 35 20 29 7b 0a 20 20 20 20 69 66  rgc==5 ){.    if
3ce0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
3cf0: 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72  erp, argv[4], &r
3d00: 65 73 43 6f 75 6e 74 29 20 29 20 72 65 74 75 72  esCount) ) retur
3d10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
3d20: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 26  .  if( argc!=4 &
3d30: 26 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  & argc!=5 ){.   
3d40: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
3d50: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
3d60: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
3d70: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
3d80: 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 46 4f   .       " DB FO
3d90: 52 4d 41 54 20 53 54 52 49 4e 47 20 3f 43 4f 55  RMAT STRING ?COU
3da0: 4e 54 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  NT?", 0);.    re
3db0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3dc0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
3dd0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
3de0: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
3df0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3e00: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
3e10: 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c  it(&str);.  zSql
3e20: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
3e30: 74 66 28 61 72 67 76 5b 32 5d 2c 61 72 67 76 5b  tf(argv[2],argv[
3e40: 33 5d 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d  3]);.  if( argc=
3e50: 3d 35 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =5 ){.    rc = s
3e60: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
3e70: 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73  (db, zSql, &aRes
3e80: 75 6c 74 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  ult, 0, 0, &zErr
3e90: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3ea0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74  rc = sqlite3_get
3eb0: 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71 6c 2c  _table(db, zSql,
3ec0: 20 26 61 52 65 73 75 6c 74 2c 20 26 6e 52 6f 77   &aResult, &nRow
3ed0: 2c 20 26 6e 43 6f 6c 2c 20 26 7a 45 72 72 29 3b  , &nCol, &zErr);
3ee0: 0a 20 20 20 20 72 65 73 43 6f 75 6e 74 20 3d 20  .    resCount = 
3ef0: 28 6e 52 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 0a 20  (nRow+1)*nCol;. 
3f00: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
3f10: 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e  e(zSql);.  sprin
3f20: 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 72  tf(zBuf, "%d", r
3f30: 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  c);.  Tcl_Append
3f40: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3f50: 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d  zBuf);.  if( rc=
3f60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3f70: 20 20 69 66 28 20 61 72 67 63 3d 3d 34 20 29 7b    if( argc==4 ){
3f80: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
3f90: 42 75 66 2c 20 22 25 64 22 2c 20 6e 52 6f 77 29  Buf, "%d", nRow)
3fa0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  ;.      Tcl_Appe
3fb0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3fc0: 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 73  , zBuf);.      s
3fd0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64  printf(zBuf, "%d
3fe0: 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  ", nCol);.      
3ff0: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
4000: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b  t(interp, zBuf);
4010: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
4020: 3d 30 3b 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20  =0; i<resCount; 
4030: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
4040: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4050: 74 65 72 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d  terp, aResult[i]
4060: 20 3f 20 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20   ? aResult[i] : 
4070: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20  "NULL");.    }. 
4080: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
4090: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
40a0: 74 65 72 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d  terp, zErr);.  }
40b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f  .  sqlite3_free_
40c0: 74 61 62 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a  table(aResult);.
40d0: 20 20 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c    if( zErr ) sql
40e0: 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
40f0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
4100: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
4110: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
4120: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4130: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
4140: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
4150: 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c  TE_OMIT_GET_TABL
4160: 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  E */.../*.** Usa
4170: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73  ge:  sqlite3_las
4180: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44  t_insert_rowid D
4190: 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
41a0: 74 68 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49  the integer ROWI
41b0: 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  D of the most re
41c0: 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a  cent insert..*/.
41d0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
41e0: 6c 61 73 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f  last_rowid(.  vo
41f0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
4200: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4210: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
4220: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
4230: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
4240: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
4250: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
4260: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4270: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
4280: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
4290: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
42a0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
42b0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
42c0: 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  db;.  char zBuf[
42d0: 33 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  30];..  if( argc
42e0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
42f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
4300: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
4310: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
4320: 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c  , argv[0], " DB\
4330: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
4340: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4350: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
4360: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
4370: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
4380: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4390: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
43a0: 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c  %lld", sqlite3_l
43b0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
43c0: 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70  (db));.  Tcl_App
43d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
43e0: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
43f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4400: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
4410: 20 73 71 6c 69 74 65 33 5f 6b 65 79 20 44 42 20   sqlite3_key DB 
4420: 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  KEY.**.** Set th
4430: 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a  e codec key..*/.
4440: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
4450: 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  key(.  void *Not
4460: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
4470: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
4480: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
4490: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
44a0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
44b0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
44d0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
44e0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
44f0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
4500: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
4510: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
4520: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
4530: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b  onst char *zKey;
4540: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
4550: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
4560: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4570: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
4580: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
4590: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
45a0: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
45b0: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
45c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
45d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
45e0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
45f0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
4600: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4610: 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76  R;.  zKey = argv
4620: 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74  [2];.  nKey = st
4630: 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23 69 66 64  rlen(zKey);.#ifd
4640: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
4650: 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65  DEC.  sqlite3_ke
4660: 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  y(db, zKey, nKey
4670: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
4680: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
4690: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
46a0: 74 65 33 5f 72 65 6b 65 79 20 44 42 20 4b 45 59  te3_rekey DB KEY
46b0: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  .**.** Change th
46c0: 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a  e codec key..*/.
46d0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
46e0: 72 65 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e  rekey(.  void *N
46f0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
4700: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
4710: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
4720: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
4730: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
4740: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4760: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
4770: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
4780: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
4790: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
47a0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
47b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
47c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65   const char *zKe
47d0: 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  y;.  int nKey;. 
47e0: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
47f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4800: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
4810: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
4820: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
4830: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
4840: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
4850: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4860: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
4870: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
4880: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
4890: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
48a0: 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72  ROR;.  zKey = ar
48b0: 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20  gv[2];.  nKey = 
48c0: 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23 69  strlen(zKey);.#i
48d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
48e0: 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f  CODEC.  sqlite3_
48f0: 72 65 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20  rekey(db, zKey, 
4900: 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nKey);.#endif.  
4910: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
4920: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
4930: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 44 42  sqlite3_close DB
4940: 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68  .**.** Closes th
4950: 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
4960: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6f 70 65  d by sqlite3_ope
4970: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4980: 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f   sqlite_test_clo
4990: 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  se(.  void *NotU
49a0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
49b0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
49c0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
49d0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
49e0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
49f0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4a10: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4a20: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
4a30: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4a40: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4a50: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
4a60: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
4a70: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
4a80: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
4a90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
4aa0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
4ab0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
4ac0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
4ad0: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
4ae0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4af0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4b00: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
4b10: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
4b20: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
4b30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
4b40: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65   = sqlite3_close
4b50: 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  (db);.  Tcl_SetR
4b60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
4b70: 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
4b80: 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
4b90: 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
4ba0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  _OK;.}../*.** Im
4bb0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
4bc0: 74 68 65 20 78 5f 63 6f 61 6c 65 73 63 65 28 29  the x_coalesce()
4bd0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65   function..** Re
4be0: 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 61  turn the first a
4bf0: 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c  rgument non-NULL
4c00: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
4c10: 61 74 69 63 20 76 6f 69 64 20 74 31 5f 69 66 6e  atic void t1_ifn
4c20: 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ullFunc(.  sqlit
4c30: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
4c40: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
4c50: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
4c60: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
4c70: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
4c80: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
4c90: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c   if( SQLITE_NULL
4ca0: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
4cb0: 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20 29 7b  type(argv[i]) ){
4cc0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
4cd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
4ce0: 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  es(argv[i]);.   
4cf0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4d00: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
4d10: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
4d20: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
4d30: 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 2c  ]),.          n,
4d40: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
4d50: 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  T);.      break;
4d60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4d70: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 65  .** These are te
4d80: 73 74 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 20  st functions.   
4d90: 20 68 65 78 38 28 29 20 69 6e 74 65 72 70 72 65   hex8() interpre
4da0: 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20  ts its argument 
4db0: 61 73 0a 2a 2a 20 55 54 46 38 20 61 6e 64 20 72  as.** UTF8 and r
4dc0: 65 74 75 72 6e 73 20 61 20 68 65 78 20 65 6e 63  eturns a hex enc
4dd0: 6f 64 69 6e 67 2e 20 20 68 65 78 31 36 6c 65 28  oding.  hex16le(
4de0: 29 20 69 6e 74 65 72 70 72 65 74 73 20 69 74 73  ) interprets its
4df0: 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 61 73 20   argument.** as 
4e00: 55 54 46 31 36 6c 65 20 61 6e 64 20 72 65 74 75  UTF16le and retu
4e10: 72 6e 73 20 61 20 68 65 78 20 65 6e 63 6f 64 69  rns a hex encodi
4e20: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
4e30: 69 64 20 68 65 78 38 46 75 6e 63 28 73 71 6c 69  id hex8Func(sqli
4e40: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c 20  te3_context *p, 
4e50: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
4e60: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
4e70: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
4e80: 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  d char *z;.  int
4e90: 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   i;.  char zBuf[
4ea0: 32 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  200];.  z = sqli
4eb0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
4ec0: 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28 69  rgv[0]);.  for(i
4ed0: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42 75  =0; i<sizeof(zBu
4ee0: 66 29 2f 32 20 2d 20 32 20 26 26 20 7a 5b 69 5d  f)/2 - 2 && z[i]
4ef0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69  ; i++){.    spri
4f00: 6e 74 66 28 26 7a 42 75 66 5b 69 2a 32 5d 2c 20  ntf(&zBuf[i*2], 
4f10: 22 25 30 32 78 22 2c 20 7a 5b 69 5d 26 30 78 66  "%02x", z[i]&0xf
4f20: 66 29 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69  f);.  }.  zBuf[i
4f30: 2a 32 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  *2] = 0;.  sqlit
4f40: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
4f50: 2c 20 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d  , (char*)zBuf, -
4f60: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
4f70: 45 4e 54 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20  ENT);.}.#ifndef 
4f80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
4f90: 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  6.static void he
4fa0: 78 31 36 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  x16Func(sqlite3_
4fb0: 63 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20  context *p, int 
4fc0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
4fd0: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  lue **argv){.  c
4fe0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 73 68  onst unsigned sh
4ff0: 6f 72 74 20 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e  ort int *z;.  in
5000: 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  t i;.  char zBuf
5010: 5b 34 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c  [400];.  z = sql
5020: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
5030: 36 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f  6(argv[0]);.  fo
5040: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
5050: 7a 42 75 66 29 2f 34 20 2d 20 34 20 26 26 20 7a  zBuf)/4 - 4 && z
5060: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  [i]; i++){.    s
5070: 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69 2a 34  printf(&zBuf[i*4
5080: 5d 2c 20 22 25 30 34 78 22 2c 20 7a 5b 69 5d 26  ], "%04x", z[i]&
5090: 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20 7a 42 75  0xff);.  }.  zBu
50a0: 66 5b 69 2a 34 5d 20 3d 20 30 3b 0a 20 20 73 71  f[i*4] = 0;.  sq
50b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
50c0: 74 28 70 2c 20 28 63 68 61 72 2a 29 7a 42 75 66  t(p, (char*)zBuf
50d0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
50e0: 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69  NSIENT);.}.#endi
50f0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63  f../*.** A struc
5100: 74 75 72 65 20 69 6e 74 6f 20 77 68 69 63 68 20  ture into which 
5110: 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 74 65  to accumulate te
5120: 78 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 64 73  xt..*/.struct ds
5130: 74 72 20 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  tr {.  int nAllo
5140: 63 3b 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c  c;  /* Space all
5150: 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ocated */.  int 
5160: 6e 55 73 65 64 3b 20 20 20 2f 2a 20 53 70 61 63  nUsed;   /* Spac
5170: 65 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72  e used */.  char
5180: 20 2a 7a 3b 20 20 20 20 20 2f 2a 20 54 68 65 20   *z;     /* The 
5190: 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  space */.};../*.
51a0: 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20 74  ** Append text t
51b0: 6f 20 61 20 64 73 74 72 0a 2a 2f 0a 73 74 61 74  o a dstr.*/.stat
51c0: 69 63 20 76 6f 69 64 20 64 73 74 72 41 70 70 65  ic void dstrAppe
51d0: 6e 64 28 73 74 72 75 63 74 20 64 73 74 72 20 2a  nd(struct dstr *
51e0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
51f0: 2c 20 69 6e 74 20 64 69 76 69 64 65 72 29 7b 0a  , int divider){.
5200: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
5210: 28 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55  (z);.  if( p->nU
5220: 73 65 64 20 2b 20 6e 20 2b 20 32 20 3e 20 70 2d  sed + n + 2 > p-
5230: 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 63  >nAlloc ){.    c
5240: 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 70  har *zNew;.    p
5250: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41  ->nAlloc = p->nA
5260: 6c 6c 6f 63 2a 32 20 2b 20 6e 20 2b 20 32 30 30  lloc*2 + n + 200
5270: 3b 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c  ;.    zNew = sql
5280: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e  ite3_realloc(p->
5290: 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20  z, p->nAlloc);. 
52a0: 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29     if( zNew==0 )
52b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
52c0: 66 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 20 20  free(p->z);.    
52d0: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
52e0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 20 20  izeof(*p));.    
52f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
5300: 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b      p->z = zNew;
5310: 0a 20 20 7d 0a 20 20 69 66 28 20 64 69 76 69 64  .  }.  if( divid
5320: 65 72 20 26 26 20 70 2d 3e 6e 55 73 65 64 3e 30  er && p->nUsed>0
5330: 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e   ){.    p->z[p->
5340: 6e 55 73 65 64 2b 2b 5d 20 3d 20 64 69 76 69 64  nUsed++] = divid
5350: 65 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  er;.  }.  memcpy
5360: 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d  (&p->z[p->nUsed]
5370: 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d 3e  , z, n+1);.  p->
5380: 6e 55 73 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a 2f  nUsed += n;.}../
5390: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 64 20 66 6f 72  *.** Invoked for
53a0: 20 65 61 63 68 20 63 61 6c 6c 62 61 63 6b 20 66   each callback f
53b0: 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 65 63 46  rom sqlite3ExecF
53c0: 75 6e 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  unc.*/.static in
53d0: 74 20 65 78 65 63 46 75 6e 63 43 61 6c 6c 62 61  t execFuncCallba
53e0: 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  ck(void *pData, 
53f0: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
5400: 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f  *argv, char **No
5410: 74 55 73 65 64 29 7b 0a 20 20 73 74 72 75 63 74  tUsed){.  struct
5420: 20 64 73 74 72 20 2a 70 20 3d 20 28 73 74 72 75   dstr *p = (stru
5430: 63 74 20 64 73 74 72 2a 29 70 44 61 74 61 3b 0a  ct dstr*)pData;.
5440: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
5450: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
5460: 7b 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b 69  {.    if( argv[i
5470: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 73  ]==0 ){.      ds
5480: 74 72 41 70 70 65 6e 64 28 70 2c 20 22 4e 55 4c  trAppend(p, "NUL
5490: 4c 22 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 65  L", ' ');.    }e
54a0: 6c 73 65 7b 0a 20 20 20 20 20 20 64 73 74 72 41  lse{.      dstrA
54b0: 70 70 65 6e 64 28 70 2c 20 61 72 67 76 5b 69 5d  ppend(p, argv[i]
54c0: 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 0a 20 20  , ' ');.    }.  
54d0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
54e0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
54f0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 73  ation of the x_s
5500: 71 6c 69 74 65 5f 65 78 65 63 28 29 20 66 75 6e  qlite_exec() fun
5510: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
5520: 63 74 69 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20 61  ction takes.** a
5530: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
5540: 20 61 6e 64 20 61 74 74 65 6d 70 74 73 20 74 6f   and attempts to
5550: 20 65 78 65 63 75 74 65 20 74 68 61 74 20 61 72   execute that ar
5560: 67 75 6d 65 6e 74 20 61 73 20 53 51 4c 20 63 6f  gument as SQL co
5570: 64 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 69  de..** This is i
5580: 6c 6c 65 67 61 6c 20 61 6e 64 20 73 68 6f 75 6c  llegal and shoul
5590: 64 20 73 65 74 20 74 68 65 20 53 51 4c 49 54 45  d set the SQLITE
55a0: 5f 4d 49 53 55 53 45 20 66 6c 61 67 20 6f 6e 20  _MISUSE flag on 
55b0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
55c0: 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 30 37 3a  .** 2004-Jan-07:
55d0: 20 20 57 65 20 68 61 76 65 20 63 68 61 6e 67 65    We have change
55e0: 64 20 74 68 69 73 20 74 6f 20 6d 61 6b 65 20 69  d this to make i
55f0: 74 20 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  t legal to call 
5600: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a  sqlite3_exec().*
5610: 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20  * from within a 
5620: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 20 20  function call.  
5630: 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
5640: 74 69 6e 65 20 73 69 6d 75 6c 61 74 65 73 20 74  tine simulates t
5650: 68 65 20 65 66 66 65 63 74 20 6f 66 20 68 61 76  he effect of hav
5660: 69 6e 67 20 74 77 6f 20 74 68 72 65 61 64 73 20  ing two threads 
5670: 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 75 73  attempt to.** us
5680: 65 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  e the same datab
5690: 61 73 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ase at the same 
56a0: 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  time..*/.static 
56b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 65 63  void sqlite3Exec
56c0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
56d0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
56e0: 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  , .  int argc,  
56f0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5700: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74 72   **argv.){.  str
5710: 75 63 74 20 64 73 74 72 20 78 3b 0a 20 20 6d 65  uct dstr x;.  me
5720: 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65  mset(&x, 0, size
5730: 6f 66 28 78 29 29 3b 0a 20 20 28 76 6f 69 64 29  of(x));.  (void)
5740: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 28 73 71  sqlite3_exec((sq
5750: 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 5f 75  lite3*)sqlite3_u
5760: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
5770: 29 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ),.      (char*)
5780: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
5790: 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a 20 20 20  xt(argv[0]),.   
57a0: 20 20 20 65 78 65 63 46 75 6e 63 43 61 6c 6c 62     execFuncCallb
57b0: 61 63 6b 2c 20 26 78 2c 20 30 29 3b 0a 20 20 73  ack, &x, 0);.  s
57c0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
57d0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c  xt(context, x.z,
57e0: 20 78 2e 6e 55 73 65 64 2c 20 53 51 4c 49 54 45   x.nUsed, SQLITE
57f0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
5800: 71 6c 69 74 65 33 5f 66 72 65 65 28 78 2e 7a 29  qlite3_free(x.z)
5810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
5820: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 6b 74  mentation of tkt
5830: 32 32 31 33 66 75 6e 63 28 29 2c 20 61 20 73 63  2213func(), a sc
5840: 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 74 68  alar function th
5850: 61 74 20 74 61 6b 65 73 20 65 78 61 63 74 6c 79  at takes exactly
5860: 0a 2a 2a 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74  .** one argument
5870: 2e 20 49 74 20 68 61 73 20 74 77 6f 20 69 6e 74  . It has two int
5880: 65 72 65 73 74 69 6e 67 20 66 65 61 74 75 72 65  eresting feature
5890: 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63 61  s:.**.** * It ca
58a0: 6c 6c 73 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  lls sqlite3_valu
58b0: 65 5f 74 65 78 74 28 29 20 33 20 74 69 6d 65 73  e_text() 3 times
58c0: 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   on the argument
58d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2e   sqlite3_value*.
58e0: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 74 68 72  .**   If the thr
58f0: 65 65 20 70 6f 69 6e 74 65 72 73 20 72 65 74 75  ee pointers retu
5900: 72 6e 65 64 20 61 72 65 20 6e 6f 74 20 74 68 65  rned are not the
5910: 20 73 61 6d 65 20 61 6e 20 53 51 4c 20 65 72 72   same an SQL err
5920: 6f 72 20 69 73 20 72 61 69 73 65 64 2e 0a 2a 2a  or is raised..**
5930: 0a 2a 2a 20 2a 20 4f 74 68 65 72 77 69 73 65 20  .** * Otherwise 
5940: 69 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70  it returns a cop
5950: 79 20 6f 66 20 74 68 65 20 74 65 78 74 20 72 65  y of the text re
5960: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
5970: 69 74 73 20 0a 2a 2a 20 20 20 61 72 67 75 6d 65  its .**   argume
5980: 6e 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  nt in such a way
5990: 20 61 73 20 74 68 65 20 56 44 42 45 20 72 65 70   as the VDBE rep
59a0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 20 61  resentation is a
59b0: 20 4d 65 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20 20   Mem* cell .**  
59c0: 20 77 69 74 68 20 74 68 65 20 4d 45 4d 5f 54 65   with the MEM_Te
59d0: 72 6d 20 66 6c 61 67 20 63 6c 65 61 72 2e 20 0a  rm flag clear. .
59e0: 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 32 32  **.** Ticket #22
59f0: 31 33 20 63 61 6e 20 74 68 65 72 65 66 6f 72 65  13 can therefore
5a00: 20 62 65 20 74 65 73 74 65 64 20 62 79 20 65 76   be tested by ev
5a10: 61 6c 75 61 74 69 6e 67 20 74 68 65 20 66 6f 6c  aluating the fol
5a20: 6c 6f 77 69 6e 67 0a 2a 2a 20 53 51 4c 20 65 78  lowing.** SQL ex
5a30: 70 72 65 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20  pression:.**.** 
5a40: 20 20 74 6b 74 32 32 31 33 66 75 6e 63 28 74 6b    tkt2213func(tk
5a50: 74 32 32 31 33 66 75 6e 63 28 27 61 20 73 74 72  t2213func('a str
5a60: 69 6e 67 27 29 29 3b 0a 2a 2f 0a 73 74 61 74 69  ing'));.*/.stati
5a70: 63 20 76 6f 69 64 20 74 6b 74 32 32 31 33 46 75  c void tkt2213Fu
5a80: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
5a90: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
5aa0: 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c  xt, .  int argc,
5ab0: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c    .  sqlite3_val
5ac0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
5ad0: 6e 74 20 6e 54 65 78 74 3b 0a 20 20 75 6e 73 69  nt nText;.  unsi
5ae0: 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20  gned char const 
5af0: 2a 7a 54 65 78 74 31 3b 0a 20 20 75 6e 73 69 67  *zText1;.  unsig
5b00: 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ned char const *
5b10: 7a 54 65 78 74 32 3b 0a 20 20 75 6e 73 69 67 6e  zText2;.  unsign
5b20: 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  ed char const *z
5b30: 54 65 78 74 33 3b 0a 0a 20 20 6e 54 65 78 74 20  Text3;..  nText 
5b40: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
5b50: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
5b60: 20 20 7a 54 65 78 74 31 20 3d 20 73 71 6c 69 74    zText1 = sqlit
5b70: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5b80: 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 32  gv[0]);.  zText2
5b90: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5ba0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
5bb0: 20 20 7a 54 65 78 74 33 20 3d 20 73 71 6c 69 74    zText3 = sqlit
5bc0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5bd0: 67 76 5b 30 5d 29 3b 0a 0a 20 20 69 66 28 20 7a  gv[0]);..  if( z
5be0: 54 65 78 74 31 21 3d 7a 54 65 78 74 32 20 7c 7c  Text1!=zText2 ||
5bf0: 20 7a 54 65 78 74 32 21 3d 7a 54 65 78 74 33 20   zText2!=zText3 
5c00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
5c10: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
5c20: 65 78 74 2c 20 22 74 6b 74 32 32 31 33 20 69 73  ext, "tkt2213 is
5c30: 20 6e 6f 74 20 66 69 78 65 64 22 2c 20 2d 31 29   not fixed", -1)
5c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
5c50: 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 28 63 68  har *zCopy = (ch
5c60: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
5c70: 6c 6f 63 28 6e 54 65 78 74 29 3b 0a 20 20 20 20  loc(nText);.    
5c80: 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 54  memcpy(zCopy, zT
5c90: 65 78 74 31 2c 20 6e 54 65 78 74 29 3b 0a 20 20  ext1, nText);.  
5ca0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5cb0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
5cc0: 43 6f 70 79 2c 20 6e 54 65 78 74 2c 20 73 71 6c  Copy, nText, sql
5cd0: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a  ite3_free);.  }.
5ce0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
5cf0: 6c 6f 77 69 6e 67 20 53 51 4c 20 66 75 6e 63 74  lowing SQL funct
5d00: 69 6f 6e 20 74 61 6b 65 73 20 34 20 61 72 67 75  ion takes 4 argu
5d10: 6d 65 6e 74 73 2e 20 20 54 68 65 20 32 6e 64 20  ments.  The 2nd 
5d20: 61 6e 64 0a 2a 2a 20 34 74 68 20 61 72 67 75 6d  and.** 4th argum
5d30: 65 6e 74 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  ent must be one 
5d40: 6f 66 20 74 68 65 73 65 20 73 74 72 69 6e 67 73  of these strings
5d50: 3a 20 20 27 74 65 78 74 27 2c 20 27 74 65 78 74  :  'text', 'text
5d60: 31 36 27 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f 62  16',.** or 'blob
5d70: 27 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  ' corresponding 
5d80: 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73  to API functions
5d90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
5da0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29  te3_value_text()
5db0: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
5dc0: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a  _value_text16().
5dd0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  **      sqlite3_
5de0: 76 61 6c 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a 0a  value_blob().**.
5df0: 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72 67  ** The third arg
5e00: 75 6d 65 6e 74 20 69 73 20 61 20 73 74 72 69 6e  ument is a strin
5e10: 67 2c 20 65 69 74 68 65 72 20 27 62 79 74 65 73  g, either 'bytes
5e20: 27 20 6f 72 20 27 62 79 74 65 73 31 36 27 20 6f  ' or 'bytes16' o
5e30: 72 20 27 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f 72  r 'noop',.** cor
5e40: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50  responding to AP
5e50: 49 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  Is:.**.**      s
5e60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
5e70: 65 73 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  es().**      sql
5e80: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
5e90: 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 6e 6f 6f  16().**      noo
5ea0: 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 41 50 49 73  p.**.** The APIs
5eb0: 20 64 65 73 69 67 6e 61 74 65 64 20 62 79 20 74   designated by t
5ec0: 68 65 20 32 6e 64 20 74 68 72 6f 75 67 68 20 34  he 2nd through 4
5ed0: 74 68 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  th arguments are
5ee0: 20 61 70 70 6c 69 65 64 0a 2a 2a 20 74 6f 20 74   applied.** to t
5ef0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5f00: 74 20 69 6e 20 6f 72 64 65 72 2e 20 20 49 66 20  t in order.  If 
5f10: 74 68 65 20 70 6f 69 6e 74 65 72 73 20 72 65 74  the pointers ret
5f20: 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  urned by the.** 
5f30: 73 65 63 6f 6e 64 20 61 6e 64 20 66 6f 75 72 74  second and fourt
5f40: 68 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  h are different,
5f50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
5f60: 74 75 72 6e 73 20 31 2e 20 20 4f 74 68 65 72 77  turns 1.  Otherw
5f70: 69 73 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ise,.** this rou
5f80: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e 0a  tine returns 0..
5f90: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
5fa0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74  ion is used to t
5fb0: 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 6e 20  est to see when 
5fc0: 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
5fd0: 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f 74  s from.** the _t
5fe0: 65 78 74 28 29 2c 20 5f 74 65 78 74 31 36 28 29  ext(), _text16()
5ff0: 20 61 6e 64 20 5f 62 6c 6f 62 28 29 20 41 50 49   and _blob() API
6000: 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64  s become invalid
6010: 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
6020: 76 6f 69 64 20 70 74 72 43 68 6e 67 46 75 6e 63  void ptrChngFunc
6030: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  tion(.  sqlite3_
6040: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
6050: 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  , .  int argc,  
6060: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
6070: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
6080: 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 2a 70 32  st void *p1, *p2
6090: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
60a0: 7a 43 6d 64 3b 0a 20 20 69 66 28 20 61 72 67 63  zCmd;.  if( argc
60b0: 21 3d 34 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  !=4 ) return;.  
60c0: 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68  zCmd = (const ch
60d0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
60e0: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b  e_text(argv[1]);
60f0: 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29  .  if( zCmd==0 )
6100: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
6110: 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74  trcmp(zCmd,"text
6120: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20  ")==0 ){.    p1 
6130: 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73  = (const void*)s
6140: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6150: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e  t(argv[0]);.#ifn
6160: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6170: 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66  UTF16.  }else if
6180: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22  ( strcmp(zCmd, "
6190: 74 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20  text16")==0 ){. 
61a0: 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76     p1 = (const v
61b0: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
61c0: 75 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30  ue_text16(argv[0
61d0: 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  ]);.#endif.  }el
61e0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  se if( strcmp(zC
61f0: 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29  md, "blob")==0 )
6200: 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73  {.    p1 = (cons
6210: 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  t void*)sqlite3_
6220: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
6230: 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0]);.  }else{.  
6240: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
6250: 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68  zCmd = (const ch
6260: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
6270: 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b  e_text(argv[2]);
6280: 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29  .  if( zCmd==0 )
6290: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
62a0: 74 72 63 6d 70 28 7a 43 6d 64 2c 22 62 79 74 65  trcmp(zCmd,"byte
62b0: 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  s")==0 ){.    sq
62c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
62d0: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e  s(argv[0]);.#ifn
62e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
62f0: 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66  UTF16.  }else if
6300: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22  ( strcmp(zCmd, "
6310: 62 79 74 65 73 31 36 22 29 3d 3d 30 20 29 7b 0a  bytes16")==0 ){.
6320: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
6330: 65 5f 62 79 74 65 73 31 36 28 61 72 67 76 5b 30  e_bytes16(argv[0
6340: 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  ]);.#endif.  }el
6350: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  se if( strcmp(zC
6360: 6d 64 2c 20 22 6e 6f 6f 70 22 29 3d 3d 30 20 29  md, "noop")==0 )
6370: 7b 0a 20 20 20 20 2f 2a 20 64 6f 20 6e 6f 74 68  {.    /* do noth
6380: 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  ing */.  }else{.
6390: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
63a0: 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20    zCmd = (const 
63b0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
63c0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 33 5d  lue_text(argv[3]
63d0: 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30  );.  if( zCmd==0
63e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
63f0: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65   strcmp(zCmd,"te
6400: 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  xt")==0 ){.    p
6410: 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  2 = (const void*
6420: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6430: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69  ext(argv[0]);.#i
6440: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6450: 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20  T_UTF16.  }else 
6460: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6470: 20 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29 7b   "text16")==0 ){
6480: 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74  .    p2 = (const
6490: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
64a0: 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76  alue_text16(argv
64b0: 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  [0]);.#endif.  }
64c0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
64d0: 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30  zCmd, "blob")==0
64e0: 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f   ){.    p2 = (co
64f0: 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65  nst void*)sqlite
6500: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
6510: 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v[0]);.  }else{.
6520: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6530: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6540: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 31  _int(context, p1
6550: 21 3d 70 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  !=p2);.}.../*.**
6560: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
6570: 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63  test_create_func
6580: 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61  tion DB.**.** Ca
6590: 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  ll the sqlite3_c
65a0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41  reate_function A
65b0: 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  PI on the given 
65c0: 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65  database in orde
65d0: 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61  r.** to create a
65e0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
65f0: 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e 20 20 54  "x_coalesce".  T
6600: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
6610: 73 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  s the same thing
6620: 0a 2a 2a 20 61 73 20 74 68 65 20 22 63 6f 61 6c  .** as the "coal
6630: 65 73 63 65 22 20 66 75 6e 63 74 69 6f 6e 2e 20  esce" function. 
6640: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
6650: 6c 73 6f 20 72 65 67 69 73 74 65 72 73 20 61 6e  lso registers an
6660: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   SQL function.**
6670: 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c 69 74 65   named "x_sqlite
6680: 5f 65 78 65 63 22 20 74 68 61 74 20 69 6e 76 6f  _exec" that invo
6690: 6b 65 73 20 73 71 6c 69 74 65 33 5f 65 78 65 63  kes sqlite3_exec
66a0: 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67 20 73 71  ().  Invoking sq
66b0: 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20  lite3_exec().** 
66c0: 69 6e 20 74 68 69 73 20 77 61 79 20 69 73 20 69  in this way is i
66d0: 6c 6c 65 67 61 6c 20 72 65 63 75 72 73 69 6f 6e  llegal recursion
66e0: 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 61 69 73   and should rais
66f0: 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  e an SQLITE_MISU
6700: 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68 65  SE error..** The
6710: 20 65 66 66 65 63 74 20 69 73 20 73 69 6d 69 6c   effect is simil
6720: 61 72 20 74 6f 20 74 72 79 69 6e 67 20 74 6f 20  ar to trying to 
6730: 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74  use the same dat
6740: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6750: 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74 68 72   from.** two thr
6760: 65 61 64 73 20 61 74 20 74 68 65 20 73 61 6d 65  eads at the same
6770: 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   time..**.** The
6780: 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61   original motiva
6790: 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f  tion for this ro
67a0: 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20  utine was to be 
67b0: 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65  able to call the
67c0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61  .** sqlite3_crea
67d0: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63  te_function func
67e0: 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65  tion while a que
67f0: 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  ry is in progres
6800: 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  s in order.** to
6810: 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54 45   test the SQLITE
6820: 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69 6f  _MISUSE detectio
6830: 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74  n logic..*/.stat
6840: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61  ic int test_crea
6850: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  te_function(.  v
6860: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
6870: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6880: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
6890: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
68a0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
68b0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
68c0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
68d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
68e0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
68f0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
6900: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
6910: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
6920: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
6930: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
6940: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
6950: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
6960: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
6970: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
6980: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
6990: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 44 42  [0],.       " DB
69a0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
69b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
69c0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
69d0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
69e0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
69f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6a00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
6a10: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
6a20: 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2c  b, "x_coalesce",
6a30: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c   -1, SQLITE_ANY,
6a40: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 74 31 5f   0, .        t1_
6a50: 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30 2c 20 30  ifnullFunc, 0, 0
6a60: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
6a70: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
6a80: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
6a90: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
6aa0: 68 65 78 38 22 2c 20 31 2c 20 53 51 4c 49 54 45  hex8", 1, SQLITE
6ab0: 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20  _ANY, 0, .      
6ac0: 20 20 20 20 68 65 78 38 46 75 6e 63 2c 20 30 2c      hex8Func, 0,
6ad0: 20 30 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66   0);.  }.#ifndef
6ae0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
6af0: 31 36 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  16.  if( rc==SQL
6b00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
6b10: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
6b20: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
6b30: 68 65 78 31 36 22 2c 20 31 2c 20 53 51 4c 49 54  hex16", 1, SQLIT
6b40: 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20  E_ANY, 0, .     
6b50: 20 20 20 20 20 68 65 78 31 36 46 75 6e 63 2c 20       hex16Func, 
6b60: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
6b70: 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  f.  if( rc==SQLI
6b80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
6b90: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
6ba0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
6bb0: 6b 74 32 32 31 33 66 75 6e 63 22 2c 20 31 2c 20  kt2213func", 1, 
6bc0: 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a  SQLITE_ANY, 0, .
6bd0: 20 20 20 20 20 20 20 20 20 20 74 6b 74 32 32 31            tkt221
6be0: 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29  3Function, 0, 0)
6bf0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
6c00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6c10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
6c20: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
6c30: 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68 61 6e 67  , "pointer_chang
6c40: 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 4e  e", 4, SQLITE_AN
6c50: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  Y, 0, .         
6c60: 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e   ptrChngFunction
6c70: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 23 69  , 0, 0);.  }..#i
6c80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6c90: 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 55 73 65  T_UTF16.  /* Use
6ca0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65   the sqlite3_cre
6cb0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 29  ate_function16()
6cc0: 20 41 50 49 20 68 65 72 65 2e 20 4d 61 69 6e 6c   API here. Mainl
6cd0: 79 20 66 6f 72 20 66 75 6e 2c 20 62 75 74 20 61  y for fun, but a
6ce0: 6c 73 6f 20 0a 20 20 2a 2a 20 62 65 63 61 75 73  lso .  ** becaus
6cf0: 65 20 69 74 20 69 73 20 6e 6f 74 20 74 65 73 74  e it is not test
6d00: 65 64 20 61 6e 79 77 68 65 72 65 20 65 6c 73 65  ed anywhere else
6d10: 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
6d20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6d30: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66  const void *zUtf
6d40: 31 36 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  16;.    sqlite3_
6d50: 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20  value *pVal;.   
6d60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
6d70: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
6d80: 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
6d90: 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
6da0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
6db0: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
6dc0: 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  , "x_sqlite_exec
6dd0: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
6de0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
6df0: 20 20 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c      zUtf16 = sql
6e00: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
6e10: 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  al, SQLITE_UTF16
6e20: 4e 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28  NATIVE);.    if(
6e30: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6e40: 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
6e50: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6e60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
6e70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
6e80: 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 64 62  te_function16(db
6e90: 2c 20 7a 55 74 66 31 36 2c 20 0a 20 20 20 20 20  , zUtf16, .     
6ea0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 53 51             1, SQ
6eb0: 4c 49 54 45 5f 55 54 46 31 36 2c 20 64 62 2c 20  LITE_UTF16, db, 
6ec0: 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63 2c  sqlite3ExecFunc,
6ed0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
6ee0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
6ef0: 65 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71  ee(pVal);.    sq
6f00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6f10: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
6f20: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
6f30: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
6f40: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
6f50: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
6f60: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
6f70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
6f80: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
6f90: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
6fa0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
6fb0: 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74  /*.** Routines t
6fc0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
6fd0: 78 5f 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67  x_count() aggreg
6fe0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ate function..**
6ff0: 0a 2a 2a 20 78 5f 63 6f 75 6e 74 28 29 20 63 6f  .** x_count() co
7000: 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20  unts the number 
7010: 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c 20 61 72 67 75  of non-null argu
7020: 6d 65 6e 74 73 2e 20 20 42 75 74 20 74 68 65 72  ments.  But ther
7030: 65 20 61 72 65 0a 2a 2a 20 73 6f 6d 65 20 74 77  e are.** some tw
7040: 69 73 74 73 20 66 6f 72 20 74 65 73 74 69 6e 67  ists for testing
7050: 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a   purposes..**.**
7060: 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   If the argument
7070: 20 74 6f 20 78 5f 63 6f 75 6e 74 28 29 20 69 73   to x_count() is
7080: 20 34 30 20 74 68 65 6e 20 61 20 55 54 46 2d 38   40 then a UTF-8
7090: 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74   error is report
70a0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 65  ed.** on the ste
70b0: 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20  p function.  If 
70c0: 78 5f 63 6f 75 6e 74 28 34 31 29 20 69 73 20 73  x_count(41) is s
70d0: 65 65 6e 2c 20 74 68 65 6e 20 61 20 55 54 46 2d  een, then a UTF-
70e0: 31 36 20 65 72 72 6f 72 0a 2a 2a 20 69 73 20 72  16 error.** is r
70f0: 65 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 73  eported on the s
7100: 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  tep function.  I
7110: 66 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e  f the total coun
7120: 74 20 69 73 20 34 32 2c 20 74 68 65 6e 0a 2a 2a  t is 42, then.**
7130: 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69   a UTF-8 error i
7140: 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68  s reported on th
7150: 65 20 66 69 6e 61 6c 69 7a 65 20 66 75 6e 63 74  e finalize funct
7160: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
7170: 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74 43 74  struct t1CountCt
7180: 78 20 74 31 43 6f 75 6e 74 43 74 78 3b 0a 73 74  x t1CountCtx;.st
7190: 72 75 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20  ruct t1CountCtx 
71a0: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74  {.  int n;.};.st
71b0: 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e  atic void t1Coun
71c0: 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  tStep(.  sqlite3
71d0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
71e0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
71f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7200: 2a 61 72 67 76 0a 29 7b 0a 20 20 74 31 43 6f 75  *argv.){.  t1Cou
7210: 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ntCtx *p;.  p = 
7220: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
7230: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
7240: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
7250: 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c    if( (argc==0 |
7260: 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73  | SQLITE_NULL!=s
7270: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
7280: 65 28 61 72 67 76 5b 30 5d 29 20 29 20 26 26 20  e(argv[0]) ) && 
7290: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b  p ){.    p->n++;
72a0: 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3e  .  }.  if( argc>
72b0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d  0 ){.    int v =
72c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
72d0: 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  nt(argv[0]);.   
72e0: 20 69 66 28 20 76 3d 3d 34 30 20 29 7b 0a 20 20   if( v==40 ){.  
72f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7300: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
7310: 2c 20 22 76 61 6c 75 65 20 6f 66 20 34 30 20 68  , "value of 40 h
7320: 61 6e 64 65 64 20 74 6f 20 78 5f 63 6f 75 6e 74  anded to x_count
7330: 22 2c 20 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20  ", -1);.#ifndef 
7340: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
7350: 36 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  6.    }else if( 
7360: 76 3d 3d 34 31 20 29 7b 0a 20 20 20 20 20 20 63  v==41 ){.      c
7370: 6f 6e 73 74 20 63 68 61 72 20 7a 55 74 66 31 36  onst char zUtf16
7380: 45 72 72 4d 73 67 5b 5d 20 3d 20 7b 20 30 2c 20  ErrMsg[] = { 0, 
7390: 30 78 36 31 2c 20 30 2c 20 30 78 36 32 2c 20 30  0x61, 0, 0x62, 0
73a0: 2c 20 30 78 36 33 2c 20 30 2c 20 30 2c 20 30 7d  , 0x63, 0, 0, 0}
73b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
73c0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 31 36 28 63  result_error16(c
73d0: 6f 6e 74 65 78 74 2c 20 26 7a 55 74 66 31 36 45  ontext, &zUtf16E
73e0: 72 72 4d 73 67 5b 31 2d 53 51 4c 49 54 45 5f 42  rrMsg[1-SQLITE_B
73f0: 49 47 45 4e 44 49 41 4e 5d 2c 20 2d 31 29 3b 0a  IGENDIAN], -1);.
7400: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
7410: 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76 6f 69  .}   .static voi
7420: 64 20 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a  d t1CountFinaliz
7430: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
7440: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 74  t *context){.  t
7450: 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20  1CountCtx *p;.  
7460: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
7470: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
7480: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
7490: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
74a0: 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 34 32 20     if( p->n==42 
74b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
74c0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
74d0: 6e 74 65 78 74 2c 20 22 78 5f 63 6f 75 6e 74 20  ntext, "x_count 
74e0: 74 6f 74 61 6c 73 20 74 6f 20 34 32 22 2c 20 2d  totals to 42", -
74f0: 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
7500: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7510: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
7520: 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a   p ? p->n : 0);.
7530: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61      }.  }.}..sta
7540: 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63 79 43  tic void legacyC
7550: 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c 69  ountStep(.  sqli
7560: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
7570: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
7580: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
7590: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 2f 2a  e **argv.){.  /*
75a0: 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a 73 74 61 74   no-op */.}.stat
75b0: 69 63 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f  ic void legacyCo
75c0: 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  untFinalize(sqli
75d0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
75e0: 74 65 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  text){.  sqlite3
75f0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
7600: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 61 67 67  ext, sqlite3_agg
7610: 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e  regate_count(con
7620: 74 65 78 74 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  text));.}../*.**
7630: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
7640: 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74  _create_aggregat
7650: 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  e DB.**.** Call 
7660: 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61  the sqlite3_crea
7670: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20  te_function API 
7680: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  on the given dat
7690: 61 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a  abase in order.*
76a0: 2a 20 74 6f 20 63 72 65 61 74 65 20 61 20 66 75  * to create a fu
76b0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f  nction named "x_
76c0: 63 6f 75 6e 74 22 2e 20 20 54 68 69 73 20 66 75  count".  This fu
76d0: 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
76e0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 69 6c  r.** to the buil
76f0: 74 2d 69 6e 20 63 6f 75 6e 74 28 29 20 66 75 6e  t-in count() fun
7700: 63 74 69 6f 6e 2c 20 77 69 74 68 20 61 20 66 65  ction, with a fe
7710: 77 20 73 70 65 63 69 61 6c 20 71 75 69 72 6b 73  w special quirks
7720: 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20  .** for testing 
7730: 74 68 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75  the sqlite3_resu
7740: 6c 74 5f 65 72 72 6f 72 28 29 20 41 50 49 73 2e  lt_error() APIs.
7750: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
7760: 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66  nal motivation f
7770: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
7780: 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74  was to be able t
7790: 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71  o call the.** sq
77a0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67  lite3_create_agg
77b0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
77c0: 77 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73  while a query is
77d0: 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20   in progress in 
77e0: 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74  order.** to test
77f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55   the SQLITE_MISU
7800: 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67  SE detection log
7810: 69 63 2e 20 20 53 65 65 20 6d 69 73 75 73 65 2e  ic.  See misuse.
7820: 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  test..**.** This
7830: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 6c 61 74   routine was lat
7840: 65 72 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74  er extended to t
7850: 65 73 74 20 74 68 65 20 75 73 65 20 6f 66 20 73  est the use of s
7860: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
7870: 72 6f 72 28 29 0a 2a 2a 20 77 69 74 68 69 6e 20  ror().** within 
7880: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
7890: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 74 65 72  ons..**.** Later
78a0: 3a 20 49 74 20 69 73 20 6e 6f 77 20 61 6c 73 6f  : It is now also
78b0: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 72 65 67   extended to reg
78c0: 69 73 74 65 72 20 74 68 65 20 61 67 67 72 65 67  ister the aggreg
78d0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
78e0: 22 6c 65 67 61 63 79 5f 63 6f 75 6e 74 28 29 22  "legacy_count()"
78f0: 20 77 69 74 68 20 74 68 65 20 73 75 70 70 6c 69   with the suppli
7900: 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
7910: 6c 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  le. This is used
7920: 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20  .** to test the 
7930: 64 65 70 72 65 63 61 74 65 64 20 73 71 6c 69 74  deprecated sqlit
7940: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75  e3_aggregate_cou
7950: 6e 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61  nt() API..*/.sta
7960: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65  tic int test_cre
7970: 61 74 65 5f 61 67 67 72 65 67 61 74 65 28 0a 20  ate_aggregate(. 
7980: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
7990: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
79a0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
79b0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
79c0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
79d0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
79e0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
79f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7a00: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
7a10: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
7a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
7a30: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
7a40: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
7a50: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
7a60: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
7a70: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
7a80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7a90: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
7aa0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
7ab0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
7ac0: 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
7ad0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7ae0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
7af0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
7b00: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
7b10: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
7b20: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
7b30: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7b40: 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75  ction(db, "x_cou
7b50: 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55  nt", 0, SQLITE_U
7b60: 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  TF8, 0, 0,.     
7b70: 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31 43   t1CountStep,t1C
7b80: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20  ountFinalize);. 
7b90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7ba0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
7bb0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
7bc0: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f  nction(db, "x_co
7bd0: 75 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  unt", 1, SQLITE_
7be0: 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20  UTF8, 0, 0,.    
7bf0: 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65 70 2c      t1CountStep,
7c00: 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29  t1CountFinalize)
7c10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
7c20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7c30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7c40: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7c50: 2c 20 22 6c 65 67 61 63 79 5f 63 6f 75 6e 74 22  , "legacy_count"
7c60: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 0, SQLITE_ANY,
7c70: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 6c   0, 0,.        l
7c80: 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70 2c 20  egacyCountStep, 
7c90: 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c  legacyCountFinal
7ca0: 69 7a 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  ize.    );.  }. 
7cb0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
7cc0: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
7cd0: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
7ce0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
7cf0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
7d00: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
7d10: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
7d20: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
7d30: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
7d40: 65 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54 0a  e:  printf TEXT.
7d50: 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70 75  **.** Send outpu
7d60: 74 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55 73  t to printf.  Us
7d70: 65 20 74 68 69 73 20 72 61 74 68 65 72 20 74 68  e this rather th
7d80: 61 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67 65  an puts to merge
7d90: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
7da0: 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 65  n the correct se
7db0: 71 75 65 6e 63 65 20 77 69 74 68 20 64 65 62 75  quence with debu
7dc0: 67 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69 6e  gging printfs in
7dd0: 73 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63 6f  serted into C co
7de0: 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65 73  de..** Puts uses
7df0: 20 61 20 73 65 70 61 72 61 74 65 20 62 75 66 66   a separate buff
7e00: 65 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  er and debugging
7e10: 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c 6c   statements will
7e20: 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73 65   be out of.** se
7e30: 71 75 65 6e 63 65 20 69 66 20 69 74 20 69 73 20  quence if it is 
7e40: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
7e50: 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 66 28  int test_printf(
7e60: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
7e70: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
7e80: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
7e90: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
7ea0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
7eb0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
7ec0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
7ed0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7ee0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
7ef0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
7f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
7f10: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
7f20: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ent */.){.  if( 
7f30: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
7f40: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7f50: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
7f60: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
7f70: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
7f80: 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c        " TEXT\"",
7f90: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
7fa0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
7fb0: 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20   printf("%s\n", 
7fc0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74 75  argv[1]);.  retu
7fd0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  rn TCL_OK;.}....
7fe0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
7ff0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8000: 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  t FORMAT INTEGER
8010: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
8020: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
8030: 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20 69  ntf with three i
8040: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
8050: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8060: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
8070: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
8080: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
8090: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
80a0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
80b0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
80c0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
80d0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
80e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
80f0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8100: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
8110: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
8120: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
8130: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
8140: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68  nt a[3], i;.  ch
8150: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
8160: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
8170: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8180: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
8190: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
81a0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
81b0: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
81c0: 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a  INT INT\"", 0);.
81d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
81e0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
81f0: 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a  i=2; i<5; i++){.
8200: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
8210: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
8220: 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72  i], &a[i-2]) ) r
8230: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8240: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
8250: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
8260: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
8270: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
8280: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8290: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
82a0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
82b0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
82c0: 2f 2a 0a 2a 2a 20 49 66 20 7a 4e 75 6d 20 72 65  /*.** If zNum re
82d0: 70 72 65 73 65 6e 74 73 20 61 6e 20 69 6e 74 65  presents an inte
82e0: 67 65 72 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ger that will fi
82f0: 74 20 69 6e 20 36 34 2d 62 69 74 73 2c 20 74 68  t in 64-bits, th
8300: 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 56 61 6c 75  en set.** *pValu
8310: 65 20 74 6f 20 74 68 61 74 20 69 6e 74 65 67 65  e to that intege
8320: 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 72 75  r and return tru
8330: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65  e.  Otherwise re
8340: 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73  turn false..*/.s
8350: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
8360: 33 47 65 74 49 6e 74 36 34 28 63 6f 6e 73 74 20  3GetInt64(const 
8370: 63 68 61 72 20 2a 7a 4e 75 6d 2c 20 69 36 34 20  char *zNum, i64 
8380: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 66 28 20  *pValue){.  if( 
8390: 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42  sqlite3FitsIn64B
83a0: 69 74 73 28 7a 4e 75 6d 2c 20 30 29 20 29 7b 0a  its(zNum, 0) ){.
83b0: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36      sqlite3Atoi6
83c0: 34 28 7a 4e 75 6d 2c 20 70 56 61 6c 75 65 29 3b  4(zNum, pValue);
83d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
83e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
83f0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
8400: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
8410: 69 6e 74 36 34 20 46 4f 52 4d 41 54 20 49 4e 54  int64 FORMAT INT
8420: 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54  EGER INTEGER INT
8430: 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  EGER.**.** Call 
8440: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68 72  mprintf with thr
8450: 65 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  ee 64-bit intege
8460: 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73  r arguments.*/.s
8470: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
8480: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 28  3_mprintf_int64(
8490: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
84a0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
84b0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
84c0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
84d0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
84e0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
84f0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
8500: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8510: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
8520: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
8530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
8540: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
8550: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
8560: 69 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  i;.  sqlite_int6
8570: 34 20 61 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a  4 a[3];.  char *
8580: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  z;.  if( argc!=5
8590: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
85a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
85b0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
85c0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
85d0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
85e0: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
85f0: 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  INT\"", 0);.    
8600: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8610: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
8620: 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<5; i++){.    
8630: 69 66 28 20 21 73 71 6c 69 74 65 33 47 65 74 49  if( !sqlite3GetI
8640: 6e 74 36 34 28 61 72 67 76 5b 69 5d 2c 20 26 61  nt64(argv[i], &a
8650: 5b 69 2d 32 5d 29 20 29 7b 0a 20 20 20 20 20 20  [i-2]) ){.      
8660: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8670: 28 69 6e 74 65 72 70 2c 20 22 61 72 67 75 6d 65  (interp, "argume
8680: 6e 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69  nt is not a vali
8690: 64 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  d 64-bit integer
86a0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
86b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
86c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20 73     }.  }.  z = s
86d0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
86e0: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
86f0: 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c  1], a[2]);.  Tcl
8700: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8710: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
8720: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
8730: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
8750: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
8760: 66 5f 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54  f_str FORMAT INT
8770: 45 47 45 52 20 49 4e 54 45 47 45 52 20 53 54 52  EGER INTEGER STR
8780: 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  ING.**.** Call m
8790: 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20  printf with two 
87a0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
87b0: 73 20 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67  s and one string
87c0: 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61   argument.*/.sta
87d0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
87e0: 6d 70 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76  mprintf_str(.  v
87f0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
8800: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8810: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
8820: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
8830: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
8840: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
8850: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
8860: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8870: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
8880: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
8890: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
88a0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
88b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d  */.){.  int a[3]
88c0: 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  , i;.  char *z;.
88d0: 20 20 69 66 28 20 61 72 67 63 3c 34 20 7c 7c 20    if( argc<4 || 
88e0: 61 72 67 63 3e 35 20 29 7b 0a 20 20 20 20 54 63  argc>5 ){.    Tc
88f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8900: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
8910: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
8920: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
8930: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e       " FORMAT IN
8940: 54 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22  T INT ?STRING?\"
8950: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
8960: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8970: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b  .  for(i=2; i<4;
8980: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
8990: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
89a0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  , argv[i], &a[i-
89b0: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
89c0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
89d0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
89e0: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
89f0: 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20   a[1], argc>4 ? 
8a00: 61 72 67 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b  argv[4] : NULL);
8a10: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
8a20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30  ult(interp, z, 0
8a30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
8a40: 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  e(z);.  return T
8a50: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
8a60: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
8a70: 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 49 4e 54  snprintf_str INT
8a80: 45 47 45 52 20 46 4f 52 4d 41 54 20 49 4e 54 45  EGER FORMAT INTE
8a90: 47 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49  GER INTEGER STRI
8aa0: 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  NG.**.** Call mp
8ab0: 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69  rintf with two i
8ac0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
8ad0: 20 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20   and one string 
8ae0: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  argument.*/.stat
8af0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  ic int sqlite3_s
8b00: 6e 70 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76  nprintf_str(.  v
8b10: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
8b20: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8b30: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
8b40: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
8b50: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
8b60: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
8b70: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
8b80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8b90: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
8ba0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
8bb0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
8bc0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
8bd0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d  */.){.  int a[3]
8be0: 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  , i;.  int n;.  
8bf0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
8c00: 72 67 63 3c 35 20 7c 7c 20 61 72 67 63 3e 36 20  rgc<5 || argc>6 
8c10: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
8c20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8c30: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
8c40: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
8c50: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
8c60: 49 4e 54 20 46 4f 52 4d 41 54 20 49 4e 54 20 49  INT FORMAT INT I
8c70: 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20  NT ?STRING?\"", 
8c80: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
8c90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
8ca0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
8cb0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
8cc0: 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &n) ) return TCL
8cd0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 6e 3c  _ERROR;.  if( n<
8ce0: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
8cf0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8d00: 2c 20 22 4e 20 6d 75 73 74 20 62 65 20 6e 6f 6e  , "N must be non
8d10: 2d 6e 65 67 61 74 69 76 65 22 2c 20 30 29 3b 0a  -negative", 0);.
8d20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8d30: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
8d40: 69 3d 33 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a  i=3; i<5; i++){.
8d50: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
8d60: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
8d70: 69 5d 2c 20 26 61 5b 69 2d 33 5d 29 20 29 20 72  i], &a[i-3]) ) r
8d80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8d90: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
8da0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29  e3_malloc( n+1 )
8db0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
8dc0: 69 6e 74 66 28 6e 2c 20 7a 2c 20 61 72 67 76 5b  intf(n, z, argv[
8dd0: 32 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  2], a[0], a[1], 
8de0: 61 72 67 63 3e 34 20 3f 20 61 72 67 76 5b 35 5d  argc>4 ? argv[5]
8df0: 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f   : NULL);.  Tcl_
8e00: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8e10: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
8e20: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
8e30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
8e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
8e50: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8e60: 5f 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 49  _double FORMAT I
8e70: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 44  NTEGER INTEGER D
8e80: 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  OUBLE.**.** Call
8e90: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 77   mprintf with tw
8ea0: 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  o integer argume
8eb0: 6e 74 73 20 61 6e 64 20 6f 6e 65 20 64 6f 75 62  nts and one doub
8ec0: 6c 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73  le argument.*/.s
8ed0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
8ee0: 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65  3_mprintf_double
8ef0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
8f00: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
8f10: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
8f20: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
8f30: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
8f40: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
8f50: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
8f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8f70: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8f80: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8fa0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
8fb0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
8fc0: 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75 62   a[3], i;.  doub
8fd0: 6c 65 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  le r;.  char *z;
8fe0: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
8ff0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
9000: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9010: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
9020: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
9030: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
9040: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 44 4f  ORMAT INT INT DO
9050: 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  UBLE\"", 0);.   
9060: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9070: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
9080: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
9090: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
90a0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c  interp, argv[i],
90b0: 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75   &a[i-2]) ) retu
90c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
90d0: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44  }.  if( Tcl_GetD
90e0: 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20 61 72  ouble(interp, ar
90f0: 67 76 5b 34 5d 2c 20 26 72 29 20 29 20 72 65 74  gv[4], &r) ) ret
9100: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9110: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
9120: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b  intf(argv[1], a[
9130: 30 5d 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20 20  0], a[1], r);.  
9140: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9150: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
9160: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9170: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
9180: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
9190: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
91a0: 69 6e 74 66 5f 73 63 61 6c 65 64 20 46 4f 52 4d  intf_scaled FORM
91b0: 41 54 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45  AT DOUBLE DOUBLE
91c0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
91d0: 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ntf with a singl
91e0: 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e  e double argumen
91f0: 74 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  t which is the p
9200: 72 6f 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a  roduct of the.**
9210: 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67   two arguments g
9220: 69 76 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69  iven above.  Thi
9230: 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e  s is used to gen
9240: 65 72 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61  erate overflow a
9250: 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20  nd underflow.** 
9260: 64 6f 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20  doubles to test 
9270: 74 68 61 74 20 74 68 65 79 20 61 72 65 20 63 6f  that they are co
9280: 6e 76 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79  nverted properly
9290: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
92a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
92b0: 73 63 61 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a  scaled(.  void *
92c0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
92d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
92e0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
92f0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
9300: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
9310: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
9320: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9330: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
9340: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
9350: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
9360: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
9370: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
9380: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62  .  int i;.  doub
9390: 6c 65 20 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20  le r[2];.  char 
93a0: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  *z;.  if( argc!=
93b0: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
93c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
93d0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
93e0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
93f0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
9400: 22 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20  " FORMAT DOUBLE 
9410: 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20  DOUBLE\"", 0);. 
9420: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9430: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
9440: 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20  =2; i<4; i++){. 
9450: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f     if( Tcl_GetDo
9460: 75 62 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67  uble(interp, arg
9470: 76 5b 69 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29  v[i], &r[i-2]) )
9480: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9490: 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  R;.  }.  z = sql
94a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
94b0: 76 5b 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29  v[1], r[0]*r[1])
94c0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
94d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
94e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
94f0: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
9500: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
9510: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
9520: 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79  _mprintf_stronly
9530: 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 0a 2a   FORMAT STRING.*
9540: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
9550: 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  f with a single 
9560: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20  double argument 
9570: 77 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f  which is the pro
9580: 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  duct of the.** t
9590: 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76  wo arguments giv
95a0: 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20  en above.  This 
95b0: 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  is used to gener
95c0: 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64  ate overflow and
95d0: 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f   underflow.** do
95e0: 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68  ubles to test th
95f0: 61 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76  at they are conv
9600: 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a  erted properly..
9610: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
9620: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
9630: 72 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 4e  ronly(.  void *N
9640: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
9650: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
9660: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
9670: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
9680: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
9690: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
96b0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
96c0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
96d0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
96e0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
96f0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
9700: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
9710: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
9720: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9730: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
9740: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
9750: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
9760: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
9770: 53 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20  STRING\"", 0);. 
9780: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9790: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
97a0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
97b0: 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 29  rgv[1], argv[2])
97c0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
97d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
97e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
97f0: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
9800: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
9810: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
9820: 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62  _mprintf_hexdoub
9830: 6c 65 20 46 4f 52 4d 41 54 20 48 45 58 0a 2a 2a  le FORMAT HEX.**
9840: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
9850: 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64   with a single d
9860: 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ouble argument w
9870: 68 69 63 68 20 69 73 20 64 65 72 69 76 65 64 20  hich is derived 
9880: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 68 65 78 61  from the.** hexa
9890: 64 65 63 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67  decimal encoding
98a0: 20 6f 66 20 61 6e 20 49 45 45 45 20 64 6f 75 62   of an IEEE doub
98b0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
98c0: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
98d0: 66 5f 68 65 78 64 6f 75 62 6c 65 28 0a 20 20 76  f_hexdouble(.  v
98e0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
98f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
9900: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
9910: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
9920: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
9930: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
9940: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
9950: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9960: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
9970: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
9980: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
9990: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
99a0: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  */.){.  char *z;
99b0: 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 75  .  double r;.  u
99c0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 31 2c 20  nsigned int x1, 
99d0: 78 32 3b 0a 20 20 73 71 6c 69 74 65 5f 75 69 6e  x2;.  sqlite_uin
99e0: 74 36 34 20 64 3b 0a 20 20 69 66 28 20 61 72 67  t64 d;.  if( arg
99f0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
9a00: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9a10: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
9a20: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
9a30: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
9a40: 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49     " FORMAT STRI
9a50: 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NG\"", 0);.    r
9a60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9a70: 0a 20 20 7d 0a 20 20 69 66 28 20 73 73 63 61 6e  .  }.  if( sscan
9a80: 66 28 61 72 67 76 5b 32 5d 2c 20 22 25 30 38 78  f(argv[2], "%08x
9a90: 25 30 38 78 22 2c 20 26 78 32 2c 20 26 78 31 29  %08x", &x2, &x1)
9aa0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
9ab0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9ac0: 72 70 2c 20 22 32 6e 64 20 61 72 67 75 6d 65 6e  rp, "2nd argumen
9ad0: 74 20 73 68 6f 75 6c 64 20 62 65 20 31 36 2d 63  t should be 16-c
9ae0: 68 61 72 61 63 74 65 72 73 20 6f 66 20 68 65 78  haracters of hex
9af0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9b00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9b10: 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20 64 20 3d  .  d = x2;.  d =
9b20: 20 28 64 3c 3c 33 32 29 20 2b 20 78 31 3b 0a 20   (d<<32) + x1;. 
9b30: 20 6d 65 6d 63 70 79 28 26 72 2c 20 26 64 2c 20   memcpy(&r, &d, 
9b40: 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 7a 20  sizeof(r));.  z 
9b50: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
9b60: 66 28 61 72 67 76 5b 31 5d 2c 20 72 29 3b 0a 20  f(argv[1], r);. 
9b70: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9b80: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
9b90: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9ba0: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
9bb0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
9bc0: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61  age: sqlite3_ena
9bd0: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
9be0: 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2f   ?BOOLEAN?.**.*/
9bf0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9c00: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9c10: 5f 43 41 43 48 45 29 0a 73 74 61 74 69 63 20 69  _CACHE).static i
9c20: 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73  nt test_enable_s
9c30: 68 61 72 65 64 28 0a 20 20 43 6c 69 65 6e 74 44  hared(.  ClientD
9c40: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
9c50: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
9c60: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
9c70: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
9c80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9c90: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
9ca0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
9cb0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
9cc0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
9cd0: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
9ce0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9cf0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
9d00: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
9d10: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
9d20: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
9d30: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
9d40: 20 65 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72   enable;.  int r
9d50: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  et = 0;..  if( o
9d60: 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
9d70: 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
9d80: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
9d90: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f 4f  , 1, objv, "?BOO
9da0: 4c 45 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74  LEAN?");.    ret
9db0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9dc0: 20 7d 0a 20 20 72 65 74 20 3d 20 73 71 6c 69 74   }.  ret = sqlit
9dd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
9de0: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
9df0: 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  d;..  if( objc==
9e00: 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  2 ){.    if( Tcl
9e10: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
9e20: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
9e30: 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b 0a  1], &enable) ){.
9e40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9e50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9e60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
9e70: 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
9e80: 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20 20  he(enable);.    
9e90: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9ea0: 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  K ){.      Tcl_S
9eb0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
9ec0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
9ed0: 45 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f  ErrStr(rc), TCL_
9ee0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 72  STATIC);.      r
9ef0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9f00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63 6c  .    }.  }.  Tcl
9f10: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
9f20: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
9f30: 6c 65 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a 20  leanObj(ret));. 
9f40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9f50: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a  }.#endif..../*.*
9f60: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
9f70: 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
9f80: 5f 63 6f 64 65 73 20 20 20 44 42 20 20 20 20 42  _codes   DB    B
9f90: 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61  OOLEAN.**.*/.sta
9fa0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 74  tic int test_ext
9fb0: 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
9fc0: 65 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  es(.  ClientData
9fd0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
9fe0: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
9ff0: 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
a000: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
a010: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
a020: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
a030: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
a040: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
a050: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
a060: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
a070: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
a080: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
a090: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
a0a0: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
a0b0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
a0c0: 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71  int enable;.  sq
a0d0: 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
a0e0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
a0f0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
a100: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
a110: 76 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29  v, "DB BOOLEAN")
a120: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
a130: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
a140: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
a150: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
a160: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
a170: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
a180: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
a190: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
a1a0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
a1b0: 5b 32 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 20  [2], &enable) ) 
a1c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a1d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65  ;.  sqlite3_exte
a1e0: 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
a1f0: 73 28 64 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20  s(db, enable);. 
a200: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
a210: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
a220: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
a230: 6f 6e 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a  on_number.**.*/.
a240: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
a250: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
a260: 72 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  r(.  ClientData 
a270: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
a280: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
a290: 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
a2a0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
a2b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
a2c0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
a2d0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
a2e0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
a2f0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
a300: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a310: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
a320: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
a330: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
a340: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
a350: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  uments */.){.  T
a360: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
a370: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
a380: 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69  ntObj(sqlite3_li
a390: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
a3a0: 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
a3b0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
a3c0: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 74 61  sage: sqlite3_ta
a3d0: 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
a3e0: 61 74 61 20 44 42 20 64 62 6e 61 6d 65 20 74 62  ata DB dbname tb
a3f0: 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a  lname colname.**
a400: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
a410: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
a420: 4d 45 54 41 44 41 54 41 0a 73 74 61 74 69 63 20  METADATA.static 
a430: 69 6e 74 20 74 65 73 74 5f 74 61 62 6c 65 5f 63  int test_table_c
a440: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
a450: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
a460: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
a470: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
a480: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
a490: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
a4a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
a4b0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
a4c0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
a4d0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
a4e0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a500: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a510: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
a520: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
a530: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
a540: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
a550: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
a560: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f   char *zDb;.  co
a570: 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a  nst char *zTbl;.
a580: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
a590: 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ol;.  int rc;.  
a5a0: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a  Tcl_Obj *pRet;..
a5b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
a5c0: 61 74 61 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74  atatype;.  const
a5d0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b   char *zCollseq;
a5e0: 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a  .  int notnull;.
a5f0: 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
a600: 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 72  ;.  int autoincr
a610: 65 6d 65 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62  ement;..  if( ob
a620: 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
a630: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
a640: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
a650: 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d  DB dbname tblnam
a660: 65 20 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20 20  e colname");.   
a670: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a680: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
a690: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
a6a0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
a6b0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
a6c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a6d0: 52 3b 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47  R;.  zDb = Tcl_G
a6e0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
a6f0: 29 3b 0a 20 20 7a 54 62 6c 20 3d 20 54 63 6c 5f  );.  zTbl = Tcl_
a700: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
a710: 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 54 63 6c  ]);.  zCol = Tcl
a720: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
a730: 34 5d 29 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c  4]);..  if( strl
a740: 65 6e 28 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62  en(zDb)==0 ) zDb
a750: 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71   = 0;..  rc = sq
a760: 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
a770: 6d 6e 5f 6d 65 74 61 64 61 74 61 28 64 62 2c 20  mn_metadata(db, 
a780: 7a 44 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c  zDb, zTbl, zCol,
a790: 20 0a 20 20 20 20 20 20 26 7a 44 61 74 61 74 79   .      &zDataty
a7a0: 70 65 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26  pe, &zCollseq, &
a7b0: 6e 6f 74 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72  notnull, &primar
a7c0: 79 6b 65 79 2c 20 26 61 75 74 6f 69 6e 63 72 65  ykey, &autoincre
a7d0: 6d 65 6e 74 29 3b 0a 0a 20 20 69 66 28 20 72 63  ment);..  if( rc
a7e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a7f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a800: 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
a810: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
a820: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a830: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
a840: 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f   pRet = Tcl_NewO
a850: 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  bj();.  Tcl_List
a860: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
a870: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
a880: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61  wStringObj(zData
a890: 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63  type, -1));.  Tc
a8a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
a8b0: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
a8c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
a8d0: 28 7a 43 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b  (zCollseq, -1));
a8e0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
a8f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
a900: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
a910: 62 6a 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20  bj(notnull));.  
a920: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
a930: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
a940: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
a950: 70 72 69 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20  primarykey));.  
a960: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
a970: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
a980: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
a990: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b  autoincrement));
a9a0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
a9b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
a9c0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  );..  return TCL
a9d0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
a9e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a9f0: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 0a 2f 2a 0a  IT_INCRBLOB../*.
aa00: 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  ** sqlite3_blob_
aa10: 72 65 61 64 20 20 43 48 41 4e 4e 45 4c 20 4f 46  read  CHANNEL OF
aa20: 46 53 45 54 20 4e 0a 2a 2a 0a 2a 2a 20 20 20 54  FSET N.**.**   T
aa30: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
aa40: 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  sed to test the 
aa50: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
aa60: 64 28 29 20 69 6e 20 77 61 79 73 20 74 68 61 74  d() in ways that
aa70: 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20 63 68  .**   the Tcl ch
aa80: 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63 65 20  annel interface 
aa90: 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20 66 69  does not. The fi
aaa0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  rst argument sho
aab0: 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68 65 20  uld.**   be the 
aac0: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 20  name of a valid 
aad0: 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65 64 20  channel created 
aae0: 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62  by the [incrblob
aaf0: 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66  ] method.**   of
ab00: 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   a database hand
ab10: 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
ab20: 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f  n calls sqlite3_
ab30: 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20 20  blob_read().**  
ab40: 20 74 6f 20 72 65 61 64 20 4e 20 62 79 74 65 73   to read N bytes
ab50: 20 66 72 6f 6d 20 6f 66 66 73 65 74 20 4f 46 46   from offset OFF
ab60: 53 45 54 20 66 72 6f 6d 20 74 68 65 20 75 6e 64  SET from the und
ab70: 65 72 6c 79 69 6e 67 20 53 51 4c 69 74 65 0a 2a  erlying SQLite.*
ab80: 2a 20 20 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e  *   blob handle.
ab90: 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63  .**.**   On succ
aba0: 65 73 73 2c 20 61 20 62 79 74 65 2d 61 72 72 61  ess, a byte-arra
abb0: 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  y object contain
abc0: 69 6e 67 20 74 68 65 20 72 65 61 64 20 64 61 74  ing the read dat
abd0: 61 20 69 73 20 0a 2a 2a 20 20 20 72 65 74 75 72  a is .**   retur
abe0: 6e 65 64 2e 20 4f 6e 20 66 61 69 6c 75 72 65 2c  ned. On failure,
abf0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
ac00: 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 20 74   result is set t
ac10: 6f 20 74 68 65 0a 2a 2a 20 20 20 74 65 78 74 20  o the.**   text 
ac20: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
ac30: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 65  f the returned e
ac40: 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
ac50: 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 0a  "SQLITE_NOMEM").
ac60: 2a 2a 20 20 20 61 6e 64 20 61 20 54 63 6c 20 65  **   and a Tcl e
ac70: 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68 72 6f  xception is thro
ac80: 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  wn..*/.static in
ac90: 74 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64  t test_blob_read
aca0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
acb0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
acc0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
acd0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
ace0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
acf0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
ad00: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
ad10: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
ad20: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
ad30: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
ad40: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
ad50: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ad60: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
ad70: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
ad80: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
ad90: 6e 65 6c 3b 0a 20 20 43 6c 69 65 6e 74 44 61 74  nel;.  ClientDat
ada0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  a instanceData;.
adb0: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
adc0: 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e 6f 74  pBlob;.  int not
add0: 55 73 65 64 3b 0a 20 20 69 6e 74 20 6e 42 79 74  Used;.  int nByt
ade0: 65 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74  e;.  int iOffset
adf0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
ae00: 72 20 2a 7a 42 75 66 3b 0a 20 20 69 6e 74 20 72  r *zBuf;.  int r
ae10: 63 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  c;.  .  if( objc
ae20: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
ae30: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
ae40: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48  rp, 1, objv, "CH
ae50: 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 4e 22 29  ANNEL OFFSET N")
ae60: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
ae70: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 63  _ERROR;.  }..  c
ae80: 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74  hannel = Tcl_Get
ae90: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
aea0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
aeb0: 6a 76 5b 31 5d 29 2c 20 26 6e 6f 74 55 73 65 64  jv[1]), &notUsed
aec0: 29 3b 0a 20 20 69 66 28 20 21 63 68 61 6e 6e 65  );.  if( !channe
aed0: 6c 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d  l.   || TCL_OK!=
aee0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
aef0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
af00: 5d 2c 20 26 69 4f 66 66 73 65 74 29 0a 20 20 20  ], &iOffset).   
af10: 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  || TCL_OK!=Tcl_G
af20: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
af30: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
af40: 42 79 74 65 29 0a 20 20 20 7c 7c 20 6e 42 79 74  Byte).   || nByt
af50: 65 3c 30 20 7c 7c 20 69 4f 66 66 73 65 74 3c 30  e<0 || iOffset<0
af60: 0a 20 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  .  ){ .    retur
af70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
af80: 0a 0a 20 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ..  instanceData
af90: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
afa0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
afb0: 61 6e 6e 65 6c 29 3b 0a 20 20 70 42 6c 6f 62 20  annel);.  pBlob 
afc0: 3d 20 2a 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f  = *((sqlite3_blo
afd0: 62 20 2a 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  b **)instanceDat
afe0: 61 29 3b 0a 0a 20 20 7a 42 75 66 20 3d 20 28 75  a);..  zBuf = (u
aff0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
b000: 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  cl_Alloc(nByte);
b010: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
b020: 62 6c 6f 62 5f 72 65 61 64 28 70 42 6c 6f 62 2c  blob_read(pBlob,
b030: 20 7a 42 75 66 2c 20 6e 42 79 74 65 2c 20 69 4f   zBuf, nByte, iO
b040: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
b050: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b060: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
b070: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
b080: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
b090: 7a 42 75 66 2c 20 6e 42 79 74 65 29 29 3b 0a 20  zBuf, nByte));. 
b0a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
b0b0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
b0c0: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
b0d0: 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72  3TestErrorName(r
b0e0: 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  c), TCL_VOLATILE
b0f0: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65  );.  }.  Tcl_Fre
b100: 65 28 28 63 68 61 72 20 2a 29 7a 42 75 66 29 3b  e((char *)zBuf);
b110: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
b120: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f  SQLITE_OK ? TCL_
b130: 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b  OK : TCL_ERROR);
b140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65  .}../*.** sqlite
b150: 33 5f 62 6c 6f 62 5f 77 72 69 74 65 20 43 48 41  3_blob_write CHA
b160: 4e 4e 45 4c 20 4f 46 46 53 45 54 20 44 41 54 41  NNEL OFFSET DATA
b170: 20 3f 4e 44 41 54 41 3f 0a 2a 2a 0a 2a 2a 20 20   ?NDATA?.**.**  
b180: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73   This command is
b190: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68   used to test th
b1a0: 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77  e sqlite3_blob_w
b1b0: 72 69 74 65 28 29 20 69 6e 20 77 61 79 73 20 74  rite() in ways t
b1c0: 68 61 74 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c  hat.**   the Tcl
b1d0: 20 63 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61   channel interfa
b1e0: 63 65 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65  ce does not. The
b1f0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
b200: 73 68 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74  should.**   be t
b210: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c  he name of a val
b220: 69 64 20 63 68 61 6e 6e 65 6c 20 63 72 65 61 74  id channel creat
b230: 65 64 20 62 79 20 74 68 65 20 5b 69 6e 63 72 62  ed by the [incrb
b240: 6c 6f 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20  lob] method.**  
b250: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 68   of a database h
b260: 61 6e 64 6c 65 2e 20 54 68 69 73 20 66 75 6e 63  andle. This func
b270: 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74  tion calls sqlit
b280: 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29 0a  e3_blob_write().
b290: 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20 74 68  **   to write th
b2a0: 65 20 44 41 54 41 20 62 79 74 65 2d 61 72 72 61  e DATA byte-arra
b2b0: 79 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79  y to the underly
b2c0: 69 6e 67 20 53 51 4c 69 74 65 20 62 6c 6f 62 20  ing SQLite blob 
b2d0: 68 61 6e 64 6c 65 2e 0a 2a 2a 20 20 20 61 74 20  handle..**   at 
b2e0: 6f 66 66 73 65 74 20 4f 46 46 53 45 54 2e 0a 2a  offset OFFSET..*
b2f0: 2a 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73  *.**   On succes
b300: 73 2c 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  s, an empty stri
b310: 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ng is returned. 
b320: 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  On failure, the 
b330: 69 6e 74 65 72 70 72 65 74 65 72 0a 2a 2a 20 20  interpreter.**  
b340: 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 20 74   result is set t
b350: 6f 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  o the text repre
b360: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
b370: 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
b380: 63 6f 64 65 20 0a 2a 2a 20 20 20 28 69 2e 65 2e  code .**   (i.e.
b390: 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29   "SQLITE_NOMEM")
b3a0: 20 61 6e 64 20 61 20 54 63 6c 20 65 78 63 65 70   and a Tcl excep
b3b0: 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a  tion is thrown..
b3c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
b3d0: 73 74 5f 62 6c 6f 62 5f 77 72 69 74 65 28 0a 20  st_blob_write(. 
b3e0: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
b3f0: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
b400: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
b410: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
b420: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
b430: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
b440: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
b450: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b470: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
b480: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
b490: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
b4a0: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
b4b0: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
b4c0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c  _Channel channel
b4d0: 3b 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69  ;.  ClientData i
b4e0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 73  nstanceData;.  s
b4f0: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c  qlite3_blob *pBl
b500: 6f 62 3b 0a 20 20 69 6e 74 20 6e 6f 74 55 73 65  ob;.  int notUse
b510: 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74  d;.  int iOffset
b520: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 75  ;.  int rc;..  u
b530: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42  nsigned char *zB
b540: 75 66 3b 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a  uf;.  int nBuf;.
b550: 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34    .  if( objc!=4
b560: 20 26 26 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20   && objc!=5 ){. 
b570: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
b580: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
b590: 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46  bjv, "CHANNEL OF
b5a0: 46 53 45 54 20 44 41 54 41 20 3f 4e 44 41 54 41  FSET DATA ?NDATA
b5b0: 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
b5c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
b5d0: 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f    channel = Tcl_
b5e0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
b5f0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
b600: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 6e 6f 74 55  (objv[1]), &notU
b610: 73 65 64 29 3b 0a 20 20 69 66 28 20 21 63 68 61  sed);.  if( !cha
b620: 6e 6e 65 6c 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d  nnel || TCL_OK!=
b630: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
b640: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
b650: 5d 2c 20 26 69 4f 66 66 73 65 74 29 20 29 7b 20  ], &iOffset) ){ 
b660: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b670: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ERROR;.  }..  in
b680: 73 74 61 6e 63 65 44 61 74 61 20 3d 20 54 63 6c  stanceData = Tcl
b690: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
b6a0: 6e 63 65 44 61 74 61 28 63 68 61 6e 6e 65 6c 29  nceData(channel)
b6b0: 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 2a 28 28 73  ;.  pBlob = *((s
b6c0: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69  qlite3_blob **)i
b6d0: 6e 73 74 61 6e 63 65 44 61 74 61 29 3b 0a 0a 20  nstanceData);.. 
b6e0: 20 7a 42 75 66 20 3d 20 54 63 6c 5f 47 65 74 42   zBuf = Tcl_GetB
b6f0: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
b700: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 75 66 29 3b  objv[3], &nBuf);
b710: 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26  .  if( objc==5 &
b720: 26 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  & Tcl_GetIntFrom
b730: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
b740: 5b 34 5d 2c 20 26 6e 42 75 66 29 20 29 7b 0a 20  [4], &nBuf) ){. 
b750: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b760: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
b770: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
b780: 74 65 28 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20  te(pBlob, zBuf, 
b790: 6e 42 75 66 2c 20 69 4f 66 66 73 65 74 29 3b 0a  nBuf, iOffset);.
b7a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b7b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
b7c0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
b7d0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
b7e0: 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63  TestErrorName(rc
b7f0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
b800: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
b810: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f  (rc==SQLITE_OK ?
b820: 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52   TCL_OK : TCL_ER
b830: 52 4f 52 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ROR);.}.#endif..
b840: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
b850: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
b860: 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48 41 4e 44  ation_v2 DB-HAND
b870: 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43  LE NAME CMP-PROC
b880: 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20   DEL-PROC.**.** 
b890: 20 20 54 68 69 73 20 54 63 6c 20 70 72 6f 63 20    This Tcl proc 
b8a0: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
b8b0: 69 6e 67 20 74 68 65 20 65 78 70 65 72 69 6d 65  ing the experime
b8c0: 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ntal.**   sqlite
b8d0: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
b8e0: 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72 66 61 63  on_v2() interfac
b8f0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54 65 73  e..*/.struct Tes
b900: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20 20  tCollationX {.  
b910: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
b920: 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
b930: 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Cmp;.  Tcl_Obj *
b940: 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65 66  pDel;.};.typedef
b950: 20 73 74 72 75 63 74 20 54 65 73 74 43 6f 6c 6c   struct TestColl
b960: 61 74 69 6f 6e 58 20 54 65 73 74 43 6f 6c 6c 61  ationX TestColla
b970: 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63 20 76 6f  tionX;.static vo
b980: 69 64 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c  id testCreateCol
b990: 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69 64 20 2a  lationDel(void *
b9a0: 70 43 74 78 29 7b 0a 20 20 54 65 73 74 43 6f 6c  pCtx){.  TestCol
b9b0: 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65  lationX *p = (Te
b9c0: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70  stCollationX *)p
b9d0: 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d  Ctx;..  int rc =
b9e0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
b9f0: 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65  ->interp, p->pDe
ba00: 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  l, TCL_EVAL_DIRE
ba10: 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  CT|TCL_EVAL_GLOB
ba20: 41 4c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  AL);.  if( rc!=T
ba30: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  CL_OK ){.    Tcl
ba40: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
ba50: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  (p->interp);.  }
ba60: 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ..  Tcl_DecrRefC
ba70: 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20  ount(p->pCmp);. 
ba80: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
ba90: 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20 20 73 71  t(p->pDel);.  sq
baa0: 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64  lite3_free((void
bab0: 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20   *)p);.}.static 
bac0: 69 6e 74 20 74 65 73 74 43 72 65 61 74 65 43 6f  int testCreateCo
bad0: 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20 20 76 6f  llationCmp(.  vo
bae0: 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  id *pCtx,.  int 
baf0: 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73 74 20 76  nLeft,.  const v
bb00: 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e  oid *zLeft,.  in
bb10: 74 20 6e 52 69 67 68 74 2c 0a 20 20 63 6f 6e 73  t nRight,.  cons
bb20: 74 20 76 6f 69 64 20 2a 7a 52 69 67 68 74 0a 29  t void *zRight.)
bb30: 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  {.  TestCollatio
bb40: 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c  nX *p = (TestCol
bb50: 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a  lationX *)pCtx;.
bb60: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
bb70: 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  pt = Tcl_Duplica
bb80: 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a  teObj(p->pCmp);.
bb90: 20 20 69 6e 74 20 69 52 65 73 20 3d 20 30 3b 0a    int iRes = 0;.
bba0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
bbb0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
bbc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
bbd0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
bbe0: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
bbf0: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 4c  ngObj((char *)zL
bc00: 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b 0a 20 20  eft, nLeft));.  
bc10: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
bc20: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
bc30: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
bc40: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 52  ngObj((char *)zR
bc50: 69 67 68 74 2c 6e 52 69 67 68 74 29 29 3b 0a 0a  ight,nRight));..
bc60: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
bc70: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
bc80: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
bc90: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c  TCL_EVAL_DIRECT|
bca0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
bcb0: 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54  .   || TCL_OK!=T
bcc0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
bcd0: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  (p->interp, Tcl_
bce0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e  GetObjResult(p->
bcf0: 69 6e 74 65 72 70 29 2c 20 26 69 52 65 73 29 0a  interp), &iRes).
bd00: 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63    ){.    Tcl_Bac
bd10: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e  kgroundError(p->
bd20: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54  interp);.  }.  T
bd30: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
bd40: 70 53 63 72 69 70 74 29 3b 0a 0a 20 20 72 65 74  pScript);..  ret
bd50: 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73 74 61 74  urn iRes;.}.stat
bd60: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61  ic int test_crea
bd70: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
bd80: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
bd90: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74  ientData, /* Not
bda0: 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49   used */.  Tcl_I
bdb0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
bdc0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
bdd0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
bde0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
bdf0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
be00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
be10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
be20: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
be30: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
be40: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
be50: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  uments */.){.  T
be60: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70  estCollationX *p
be70: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
be80: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
be90: 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
bea0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
beb0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
bec0: 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41  v, "DB-HANDLE NA
bed0: 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d  ME CMP-PROC DEL-
bee0: 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65 74 75  PROC");.    retu
bef0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
bf00: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
bf10: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
bf20: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
bf30: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
bf40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
bf50: 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74   p = (TestCollat
bf60: 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d  ionX *)sqlite3_m
bf70: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65 73  alloc(sizeof(Tes
bf80: 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20  tCollationX));. 
bf90: 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b   p->pCmp = objv[
bfa0: 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20  3];.  p->pDel = 
bfb0: 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e  objv[4];.  p->in
bfc0: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
bfd0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
bfe0: 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63  t(p->pCmp);.  Tc
bff0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
c000: 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20 3d  ->pDel);..  rc =
c010: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c020: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c  collation_v2(db,
c030: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c040: 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20 20  bjv[2]), 16, .  
c050: 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20 74      (void *)p, t
c060: 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69  estCreateCollati
c070: 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61 74  onCmp, testCreat
c080: 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20  eCollationDel.  
c090: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
c0a0: 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20  ITE_MISUSE ){.  
c0b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
c0c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  lt(interp, "sqli
c0d0: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
c0e0: 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64 20 74  te_v2() failed t
c0f0: 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20 20 20  o detect ".     
c100: 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e 63   "an invalid enc
c110: 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29 30  oding", (char*)0
c120: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c130: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
c140: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
c150: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
c160: 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  db, Tcl_GetStrin
c170: 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c 49  g(objv[2]), SQLI
c180: 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
c190: 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74 43  (void *)p, testC
c1a0: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d  reateCollationCm
c1b0: 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c  p, testCreateCol
c1c0: 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20  lationDel.  );. 
c1d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
c1e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
c1f0: 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
c200: 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45  ension DB-HANDLE
c210: 20 46 49 4c 45 20 3f 50 52 4f 43 3f 0a 2a 2f 0a   FILE ?PROC?.*/.
c220: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
c230: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 0a  load_extension(.
c240: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
c250: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20  entData, /* Not 
c260: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
c270: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
c280: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
c290: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
c2a0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
c2b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c2d0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
c2e0: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
c2f0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
c300: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
c310: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
c320: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
c330: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
c340: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
c350: 61 72 20 2a 7a 44 62 3b 0a 20 20 63 68 61 72 20  ar *zDb;.  char 
c360: 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 2a  *zFile;.  char *
c370: 7a 50 72 6f 63 20 3d 20 30 3b 0a 20 20 63 68 61  zProc = 0;.  cha
c380: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20  r *zErr = 0;..  
c390: 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f  if( objc!=4 && o
c3a0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
c3b0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
c3c0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
c3d0: 22 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20  "DB-HANDLE FILE 
c3e0: 3f 50 52 4f 43 3f 22 29 3b 0a 20 20 20 20 72 65  ?PROC?");.    re
c3f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c400: 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
c410: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
c420: 5d 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63  ]);.  zFile = Tc
c430: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c440: 5b 32 5d 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63  [2]);.  if( objc
c450: 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63  ==4 ){.    zProc
c460: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
c470: 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a 0a  (objv[3]);.  }..
c480: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
c490: 20 43 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   C database hand
c4a0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20  le from the Tcl 
c4b0: 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a  command name */.
c4c0: 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f    if( !Tcl_GetCo
c4d0: 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
c4e0: 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29  , zDb, &cmdInfo)
c4f0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
c500: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
c510: 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f   "command not fo
c520: 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68  und: ", zDb, (ch
c530: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
c540: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c550: 7d 0a 20 20 64 62 20 3d 20 28 28 73 74 72 75 63  }.  db = ((struc
c560: 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49  t SqliteDb*)cmdI
c570: 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74  nfo.objClientDat
c580: 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  a)->db;.  assert
c590: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c  (db);..  /* Call
c5a0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
c5b0: 43 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 61  C function. If a
c5c0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
c5d0: 73 65 74 20 72 63 20 74 6f 20 0a 20 20 2a 2a 20  set rc to .  ** 
c5e0: 54 43 4c 5f 45 52 52 4f 52 20 61 6e 64 20 6c 6f  TCL_ERROR and lo
c5f0: 61 64 20 61 6e 79 20 65 72 72 6f 72 20 73 74 72  ad any error str
c600: 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 69 6e 74  ing into the int
c610: 65 72 70 72 65 74 65 72 2e 20 49 66 20 6e 6f 20  erpreter. If no 
c620: 0a 20 20 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  .  ** error occu
c630: 72 73 2c 20 73 65 74 20 72 63 20 74 6f 20 54 43  rs, set rc to TC
c640: 4c 5f 4f 4b 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  L_OK..  */.#ifde
c650: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
c660: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 72  AD_EXTENSION.  r
c670: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
c680: 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74  ;.  zErr = sqlit
c690: 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 68 69 73  e3_mprintf("this
c6a0: 20 62 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c   build omits sql
c6b0: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
c6c0: 69 6f 6e 28 29 22 29 3b 0a 23 65 6c 73 65 0a 20  ion()");.#else. 
c6d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f   rc = sqlite3_lo
c6e0: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c  ad_extension(db,
c6f0: 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26   zFile, zProc, &
c700: 7a 45 72 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20  zErr);.#endif.  
c710: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c720: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
c730: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
c740: 45 72 72 20 3f 20 7a 45 72 72 20 3a 20 22 22 2c  Err ? zErr : "",
c750: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
c760: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
c770: 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
c780: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
c790: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
c7a0: 28 7a 45 72 72 29 3b 0a 0a 20 20 72 65 74 75 72  (zErr);..  retur
c7b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
c7c0: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e  sage: sqlite3_en
c7d0: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
c7e0: 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20 4f 4e  ion DB-HANDLE ON
c7f0: 4f 46 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OFF.*/.static in
c800: 74 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f  t test_enable_lo
c810: 61 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ad(.  ClientData
c820: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
c830: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63  Not used */.  Tc
c840: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c850: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
c860: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
c870: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
c880: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
c890: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
c8a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
c8b0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
c8c0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
c8d0: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
c8e0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
c8f0: 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d    Tcl_CmdInfo cm
c900: 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33  dInfo;.  sqlite3
c910: 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44   *db;.  char *zD
c920: 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a  b;.  int onoff;.
c930: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
c940: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
c950: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
c960: 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44  , objv, "DB-HAND
c970: 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20  LE ONOFF");.    
c980: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c990: 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63  ;.  }.  zDb = Tc
c9a0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c9b0: 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20 45 78 74 72  [1]);..  /* Extr
c9c0: 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62 61  act the C databa
c9d0: 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74  se handle from t
c9e0: 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e  he Tcl command n
c9f0: 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63  ame */.  if( !Tc
ca00: 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f  l_GetCommandInfo
ca10: 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63  (interp, zDb, &c
ca20: 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54  mdInfo) ){.    T
ca30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ca40: 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64  interp, "command
ca50: 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a   not found: ", z
ca60: 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  Db, (char*)0);. 
ca70: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ca80: 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20  ROR;.  }.  db = 
ca90: 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65 44  ((struct SqliteD
caa0: 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c  b*)cmdInfo.objCl
cab0: 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20  ientData)->db;. 
cac0: 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20   assert(db);..  
cad0: 2f 2a 20 47 65 74 20 74 68 65 20 6f 6e 6f 66 66  /* Get the onoff
cae0: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
caf0: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
cb00: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
cb10: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66  , objv[2], &onof
cb20: 66 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  f) ){.    return
cb30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
cb40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
cb50: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
cb60: 4f 4e 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  ON.  Tcl_AppendR
cb70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 74  esult(interp, "t
cb80: 68 69 73 20 62 75 69 6c 64 20 6f 6d 69 74 73 20  his build omits 
cb90: 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
cba0: 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 20 20 72 65  ension()");.  re
cbb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
cbc0: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f  #else.  sqlite3_
cbd0: 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
cbe0: 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e 6f 66 66 29  nsion(db, onoff)
cbf0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
cc00: 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  K;.#endif.}../*.
cc10: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
cc20: 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20 53 68  e_abort.**.** Sh
cc30: 75 74 64 6f 77 6e 20 74 68 65 20 70 72 6f 63 65  utdown the proce
cc40: 73 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ss immediately. 
cc50: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63   This is not a c
cc60: 6c 65 61 6e 20 73 68 75 74 64 6f 77 6e 2e 0a 2a  lean shutdown..*
cc70: 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  * This command i
cc80: 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
cc90: 68 65 20 72 65 63 6f 76 65 72 61 62 69 6c 69 74  he recoverabilit
cca0: 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  y of a database 
ccb0: 69 6e 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74 20  in.** the event 
ccc0: 6f 66 20 61 20 70 72 6f 67 72 61 6d 20 63 72 61  of a program cra
ccd0: 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sh..*/.static in
cce0: 74 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 28 0a  t sqlite_abort(.
ccf0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
cd00: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
cd10: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
cd20: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
cd30: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
cd40: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
cd50: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
cd60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cd70: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
cd80: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
cd90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
cda0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
cdb0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  nt */.){.  asser
cdc0: 74 28 20 69 6e 74 65 72 70 3d 3d 30 20 29 3b 20  t( interp==0 ); 
cdd0: 20 20 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 61    /* This will a
cde0: 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f 0a 20 20  lways fail */.  
cdf0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
ce00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
ce10: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  owing routine is
ce20: 20 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20   a user-defined 
ce30: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 68 6f  SQL function who
ce40: 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a 20 69 73  se purpose.** is
ce50: 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c   to test the sql
ce60: 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 28 29  ite_set_result()
ce70: 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   API..*/.static 
ce80: 76 6f 69 64 20 74 65 73 74 46 75 6e 63 28 73 71  void testFunc(sq
ce90: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
cea0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
ceb0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
cec0: 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68 69 6c 65  **argv){.  while
ced0: 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20  ( argc>=2 ){.   
cee0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
cef0: 67 30 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  g0 = (char*)sqli
cf00: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
cf10: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[0]);.    if(
cf20: 20 7a 41 72 67 30 20 29 7b 0a 20 20 20 20 20 20   zArg0 ){.      
cf30: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
cf40: 72 49 43 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e  rICmp(zArg0, "in
cf50: 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  t") ){.        s
cf60: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
cf70: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
cf80: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
cf90: 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65  v[1]));.      }e
cfa0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
cfb0: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e  trICmp(zArg0,"in
cfc0: 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t64")==0 ){.    
cfd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
cfe0: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
cff0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
d000: 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 29 3b  int64(argv[1]));
d010: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
d020: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
d030: 7a 41 72 67 30 2c 22 73 74 72 69 6e 67 22 29 3d  zArg0,"string")=
d040: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
d050: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
d060: 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  t(context, (char
d070: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
d080: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 2c 20 2d  text(argv[1]), -
d090: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  1,.            S
d0a0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d0b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
d0c0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
d0d0: 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c 65 22 29  (zArg0,"double")
d0e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
d0f0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
d100: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 73 71  uble(context, sq
d110: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
d120: 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20  le(argv[1]));.  
d130: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
d140: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72  lite3StrICmp(zAr
d150: 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b  g0,"null")==0 ){
d160: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d170: 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e  _result_null(con
d180: 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  text);.      }el
d190: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
d1a0: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 76 61 6c  rICmp(zArg0,"val
d1b0: 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ue")==0 ){.     
d1c0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
d1d0: 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c  t_value(context,
d1e0: 20 61 72 67 76 5b 73 71 6c 69 74 65 33 5f 76 61   argv[sqlite3_va
d1f0: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
d200: 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
d210: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72  .        goto er
d220: 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ror_out;.      }
d230: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d240: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
d250: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 67 63  ;.    }.    argc
d260: 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72 67 76 20   -= 2;.    argv 
d270: 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75  += 2;.  }.  retu
d280: 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a  rn;..error_out:.
d290: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
d2a0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22  _error(context,"
d2b0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73  first argument s
d2c0: 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a  hould be one of:
d2d0: 20 22 0a 20 20 20 20 20 20 22 69 6e 74 20 69 6e   ".      "int in
d2e0: 74 36 34 20 73 74 72 69 6e 67 20 64 6f 75 62 6c  t64 string doubl
d2f0: 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22 2c 20 2d  e null value", -
d300: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  1);.}../*.** Usa
d310: 67 65 3a 20 20 20 73 71 6c 69 74 65 5f 72 65 67  ge:   sqlite_reg
d320: 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74  ister_test_funct
d330: 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45 0a 2a 2a  ion  DB  NAME.**
d340: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65  .** Register the
d350: 20 74 65 73 74 20 53 51 4c 20 66 75 6e 63 74 69   test SQL functi
d360: 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  on on the databa
d370: 73 65 20 44 42 20 75 6e 64 65 72 20 74 68 65 20  se DB under the 
d380: 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74  name NAME..*/.st
d390: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65  atic int test_re
d3a0: 67 69 73 74 65 72 5f 66 75 6e 63 28 0a 20 20 76  gister_func(.  v
d3b0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
d3c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
d3d0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
d3e0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
d3f0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
d400: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
d410: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
d420: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d430: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
d440: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
d450: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
d460: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
d470: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
d480: 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
d490: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
d4a0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d4b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
d4c0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
d4d0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
d4e0: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
d4f0: 20 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22 2c   FUNCTION-NAME",
d500: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
d510: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
d520: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
d530: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
d540: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
d550: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
d560: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
d570: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  e_function(db, a
d580: 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[2], -1, SQLI
d590: 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20  TE_UTF8, 0, .   
d5a0: 20 20 20 74 65 73 74 46 75 6e 63 2c 20 30 2c 20     testFunc, 0, 
d5b0: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  0);.  if( rc!=0 
d5c0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
d5d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d5e0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
d5f0: 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
d600: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
d610: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
d620: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
d630: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
d640: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d650: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
d660: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
d670: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
d680: 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69    STMT .**.** Fi
d690: 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65  nalize a stateme
d6a0: 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  nt handle..*/.st
d6b0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66 69  atic int test_fi
d6c0: 6e 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a  nalize(.  void *
d6d0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
d6e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
d6f0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
d700: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
d710: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
d720: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
d730: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
d740: 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20  ite3 *db = 0;.. 
d750: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
d760: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d770: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
d780: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
d790: 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
d7a0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
d7b0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
d7c0: 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20   0), " <STMT>", 
d7d0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
d7e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
d7f0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
d800: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
d810: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
d820: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
d830: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d840: 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
d850: 20 20 20 20 64 62 20 3d 20 53 74 6d 74 54 6f 44      db = StmtToD
d860: 62 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20  b(pStmt);.  }.  
d870: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
d880: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
d890: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
d8a0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
d8b0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
d8c0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66  CL_STATIC);.  if
d8d0: 28 20 64 62 20 26 26 20 73 71 6c 69 74 65 33 54  ( db && sqlite3T
d8e0: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
d8f0: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
d900: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d910: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
d920: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
d930: 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74   sqlite3_next_st
d940: 6d 74 20 20 44 42 20 20 53 54 4d 54 0a 2a 2a 0a  mt  DB  STMT.**.
d950: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  ** Return the ne
d960: 78 74 20 73 74 61 74 6d 65 6e 74 20 69 6e 20 73  xt statment in s
d970: 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 53 54  equence after ST
d980: 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  MT..*/.static in
d990: 74 20 74 65 73 74 5f 6e 65 78 74 5f 73 74 6d 74  t test_next_stmt
d9a0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
d9b0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
d9c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
d9d0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
d9e0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
d9f0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
da00: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 73 71 6c  mt *pStmt;.  sql
da10: 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20  ite3 *db = 0;.  
da20: 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a  char zBuf[50];..
da30: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
da40: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
da50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
da60: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
da70: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
da80: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
da90: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
daa0: 2c 20 30 29 2c 20 22 20 44 42 20 53 54 4d 54 22  , 0), " DB STMT"
dab0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
dac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
dad0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
dae0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
daf0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
db00: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
db10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
db20: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
db30: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
db40: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
db50: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
db60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
db70: 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f  pStmt = sqlite3_
db80: 6e 65 78 74 5f 73 74 6d 74 28 64 62 2c 20 70 53  next_stmt(db, pS
db90: 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d  tmt);.  if( pStm
dba0: 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
dbb0: 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
dbc0: 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
dbd0: 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
dbe0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
dbf0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
dc00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
dc10: 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
dc20: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
dc30: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
dc40: 6c 69 74 65 33 5f 72 65 73 65 74 20 20 53 54 4d  lite3_reset  STM
dc50: 54 20 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61  T .**.** Reset a
dc60: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
dc70: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
dc80: 20 74 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76   test_reset(.  v
dc90: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
dca0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
dcb0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
dcc0: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
dcd0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
dce0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
dcf0: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
dd00: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
dd10: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
dd20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
dd30: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
dd40: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
dd50: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
dd60: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
dd70: 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22  ], 0), " <STMT>"
dd80: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
dd90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
dda0: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
ddb0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
ddc0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
ddd0: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
dde0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ddf0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
de00: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
de10: 20 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73    if( pStmt && s
de20: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
de30: 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
de40: 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
de50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
de60: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
de70: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
de80: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
de90: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
dea0: 5f 53 54 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69  _STATIC);./*.  i
deb0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
dec0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ded0: 20 7d 0a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54   }.*/.  return T
dee0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
def0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
df00: 65 78 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a  expired STMT .**
df10: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
df20: 69 66 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69  if a recompilati
df30: 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  on of the statem
df40: 65 6e 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64  ent is recommend
df50: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
df60: 74 20 74 65 73 74 5f 65 78 70 69 72 65 64 28 0a  t test_expired(.
df70: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
df80: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
df90: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
dfa0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
dfb0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
dfc0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
dfd0: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 6f   *pStmt;.  if( o
dfe0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
dff0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e000: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
e010: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
e020: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
e030: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
e040: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
e050: 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20   <STMT>", 0);.  
e060: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e070: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
e080: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
e090: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
e0a0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
e0b0: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
e0c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
e0d0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
e0e0: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
e0f0: 61 6e 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 78  anObj(sqlite3_ex
e100: 70 69 72 65 64 28 70 53 74 6d 74 29 29 29 3b 0a  pired(pStmt)));.
e110: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
e120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
e130: 20 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66    sqlite3_transf
e140: 65 72 5f 62 69 6e 64 69 6e 67 73 20 46 52 4f 4d  er_bindings FROM
e150: 53 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a 2a  STMT TOSTMT.**.*
e160: 2a 20 54 72 61 6e 73 66 65 72 20 61 6c 6c 20 62  * Transfer all b
e170: 69 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46 52 4f  indings from FRO
e180: 4d 53 54 4d 54 20 6f 76 65 72 20 74 6f 20 54 4f  MSTMT over to TO
e190: 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69  STMT.*/.static i
e1a0: 6e 74 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72  nt test_transfer
e1b0: 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 20  _bind(.  void * 
e1c0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
e1d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
e1e0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
e1f0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
e200: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
e210: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c  e3_stmt *pStmt1,
e220: 20 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20   *pStmt2;.  if( 
e230: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
e240: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e250: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
e260: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
e270: 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
e280: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
e290: 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
e2a0: 22 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53  " FROM-STMT TO-S
e2b0: 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
e2c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e2d0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
e2e0: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
e2f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
e300: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31  bjv[1]), &pStmt1
e310: 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  )) return TCL_ER
e320: 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74  ROR;.  if( getSt
e330: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
e340: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
e350: 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74  objv[2]), &pStmt
e360: 32 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  2)) return TCL_E
e370: 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
e380: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
e390: 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e   .     Tcl_NewIn
e3a0: 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61  tObj(sqlite3_tra
e3b0: 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70  nsfer_bindings(p
e3c0: 53 74 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b  Stmt1,pStmt2)));
e3d0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
e3e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
e3f0: 3a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  :  sqlite3_chang
e400: 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  es DB.**.** Retu
e410: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
e420: 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f   changes made to
e430: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 79   the database by
e440: 20 74 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a 2a   the last SQL.**
e450: 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73   execution..*/.s
e460: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
e470: 68 61 6e 67 65 73 28 0a 20 20 76 6f 69 64 20 2a  hanges(.  void *
e480: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
e490: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
e4a0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
e4b0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
e4c0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
e4d0: 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f  te3 *db;.  if( o
e4e0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
e4f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e500: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
e510: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
e520: 5c 22 22 2c 0a 20 20 20 20 20 20 20 54 63 6c 5f  \"",.       Tcl_
e530: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
e540: 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
e550: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e560: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
e570: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
e580: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
e590: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
e5a0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
e5b0: 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
e5c0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
e5d0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
e5e0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62  lite3_changes(db
e5f0: 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
e600: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  L_OK;.}../*.** T
e610: 68 69 73 20 69 73 20 74 68 65 20 22 73 74 61 74  his is the "stat
e620: 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20 74  ic_bind_value" t
e630: 68 61 74 20 76 61 72 69 61 62 6c 65 73 20 61 72  hat variables ar
e640: 65 20 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e 0a  e bound to when.
e650: 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f 70 74 69  ** the FLAG opti
e660: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 5f 62 69  on of sqlite3_bi
e670: 6e 64 20 69 73 20 22 73 74 61 74 69 63 22 0a 2a  nd is "static".*
e680: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73  /.static char *s
e690: 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
e6a0: 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 73 74 61  d_value = 0;.sta
e6b0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 73  tic int sqlite_s
e6c0: 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65  tatic_bind_nbyte
e6d0: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 61   = 0;../*.** Usa
e6e0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  ge:  sqlite3_bin
e6f0: 64 20 20 56 4d 20 20 49 44 58 20 20 56 41 4c 55  d  VM  IDX  VALU
e700: 45 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 53  E  FLAGS.**.** S
e710: 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ets the value of
e720: 20 74 68 65 20 49 44 58 2d 74 68 20 6f 63 63 75   the IDX-th occu
e730: 72 61 6e 63 65 20 6f 66 20 22 3f 22 20 69 6e 20  rance of "?" in 
e740: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
e750: 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56 41 4c  .** string.  VAL
e760: 55 45 20 69 73 20 74 68 65 20 6e 65 77 20 76 61  UE is the new va
e770: 6c 75 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d  lue.  If FLAGS==
e780: 22 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41 4c 55  "null" then VALU
e790: 45 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 20  E is.** ignored 
e7a0: 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69 73  and the value is
e7b0: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 49   set to NULL.  I
e7c0: 66 20 46 4c 41 47 53 3d 3d 22 73 74 61 74 69 63  f FLAGS=="static
e7d0: 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61  " then.** the va
e7e0: 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  lue is set to th
e7f0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 74 61  e value of a sta
e800: 74 69 63 20 76 61 72 69 61 62 6c 65 20 6e 61 6d  tic variable nam
e810: 65 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 73 74  ed.** "sqlite_st
e820: 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22  atic_bind_value"
e830: 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 6f  .  If FLAGS=="no
e840: 72 6d 61 6c 22 20 74 68 65 6e 20 61 20 63 6f 70  rmal" then a cop
e850: 79 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41 4c 55  y.** of the VALU
e860: 45 20 69 73 20 6d 61 64 65 2e 20 20 49 66 20 46  E is made.  If F
e870: 4c 41 47 53 3d 3d 22 62 6c 6f 62 31 30 22 20 74  LAGS=="blob10" t
e880: 68 65 6e 20 61 20 56 41 4c 55 45 20 69 73 20 69  hen a VALUE is i
e890: 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 20 61 20 31  gnored.** an a 1
e8a0: 30 2d 62 79 74 65 20 62 6c 6f 62 20 22 61 62 63  0-byte blob "abc
e8b0: 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22 20 69  \000xyz\000pq" i
e8c0: 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 73  s inserted..*/.s
e8d0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
e8e0: 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ind(.  void *Not
e8f0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
e900: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
e910: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
e920: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
e930: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
e940: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
e950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e960: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
e970: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
e980: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
e990: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
e9a0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
e9b0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
e9c0: 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tmt;.  int rc;. 
e9d0: 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66 28 20   int idx;.  if( 
e9e0: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
e9f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ea00: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
ea10: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
ea20: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
ea30: 20 20 20 20 20 20 20 22 20 56 4d 20 49 44 58 20         " VM IDX 
ea40: 56 41 4c 55 45 20 28 6e 75 6c 6c 7c 73 74 61 74  VALUE (null|stat
ea50: 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c 20 30  ic|normal)\"", 0
ea60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ea70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
ea80: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
ea90: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
eaa0: 5d 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ], &pStmt) ) ret
eab0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
eac0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
ead0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
eae0: 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
eaf0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
eb00: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
eb10: 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  "null")==0 ){.  
eb20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
eb30: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
eb40: 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  idx);.  }else if
eb50: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
eb60: 2c 22 73 74 61 74 69 63 22 29 3d 3d 30 20 29 7b  ,"static")==0 ){
eb70: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
eb80: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
eb90: 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73  t, idx, sqlite_s
eba0: 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
ebb0: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  , -1, 0);.  }els
ebc0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
ebd0: 76 5b 34 5d 2c 22 73 74 61 74 69 63 2d 6e 62 79  v[4],"static-nby
ebe0: 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tes")==0 ){.    
ebf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
ec00: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
ec10: 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  x, sqlite_static
ec20: 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 0a 20 20 20  _bind_value,.   
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec50: 20 20 20 20 73 71 6c 69 74 65 5f 73 74 61 74 69      sqlite_stati
ec60: 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 30 29  c_bind_nbyte, 0)
ec70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
ec80: 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 6f  rcmp(argv[4],"no
ec90: 72 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  rmal")==0 ){.   
eca0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
ecb0: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
ecc0: 64 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d 31 2c  dx, argv[3], -1,
ecd0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
ece0: 54 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  T);.  }else if( 
ecf0: 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
ed00: 62 6c 6f 62 31 30 22 29 3d 3d 30 20 29 7b 0a 20  blob10")==0 ){. 
ed10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
ed20: 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
ed30: 20 69 64 78 2c 20 22 61 62 63 5c 30 30 30 78 79   idx, "abc\000xy
ed40: 7a 5c 30 30 30 70 71 22 2c 20 31 30 2c 20 53 51  z\000pq", 10, SQ
ed50: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
ed60: 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41  }else{.    Tcl_A
ed70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ed80: 72 70 2c 20 22 34 74 68 20 61 72 67 75 6d 65 6e  rp, "4th argumen
ed90: 74 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  t should be ".  
eda0: 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c 22 20        "\"null\" 
edb0: 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20 6f 72  or \"static\" or
edc0: 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20 30 29   \"normal\"", 0)
edd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
ede0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
edf0: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
ee00: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
ee10: 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
ee20: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ee30: 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29  RROR;.  if( rc )
ee40: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
ee50: 35 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  50];.    sprintf
ee60: 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20  (zBuf, "(%d) ", 
ee70: 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  rc);.    Tcl_App
ee80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ee90: 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 45  , zBuf, sqlite3E
eea0: 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20  rrStr(rc), 0);. 
eeb0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
eec0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
eed0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
eee0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
eef0: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55 73 61  _UTF16./*.** Usa
ef00: 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c  ge: add_test_col
ef10: 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20 3c 75  late <db ptr> <u
ef20: 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c  tf8> <utf16le> <
ef30: 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54  utf16be>.**.** T
ef40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ef50: 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 61  used to test tha
ef60: 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73  t SQLite selects
ef70: 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6c   the correct col
ef80: 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e  lation.** sequen
ef90: 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e  ce callback when
efa0: 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f   multiple versio
efb0: 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e  ns (for differen
efc0: 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73  t text encodings
efd0: 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62  ).** are availab
efe0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  le..**.** Callin
eff0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  g this routine r
f000: 65 67 69 73 74 65 72 73 20 74 68 65 20 63 6f 6c  egisters the col
f010: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
f020: 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 0a 2a  "test_collate".*
f030: 2a 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20  * with database 
f040: 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54 68 65  handle <db>. The
f050: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
f060: 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73 74 20   must be a list 
f070: 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f 6f 6c  of three.** bool
f080: 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66 20 74  ean values. If t
f090: 68 65 20 66 69 72 73 74 20 69 73 20 74 72 75 65  he first is true
f0a0: 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f 6e  , then a version
f0b0: 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65   of test_collate
f0c0: 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65 72 65   is.** registere
f0d0: 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20  d for UTF-8, if 
f0e0: 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 74 72  the second is tr
f0f0: 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69 73  ue, a version is
f100: 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 0a   registered for.
f110: 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20  ** UTF-16le, if 
f120: 74 68 65 20 74 68 69 72 64 20 69 73 20 74 72 75  the third is tru
f130: 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76 65  e, a UTF-16be ve
f140: 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  rsion is availab
f150: 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75 73 20  le..** Previous 
f160: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65 73 74  versions of test
f170: 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64 65 6c  _collate are del
f180: 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
f190: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
f1a0: 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  ce test_collate 
f1b0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
f1c0: 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a  y calling the.**
f1d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73   following TCL s
f1e0: 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  cript:.**.**   "
f1f0: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 65 6e  test_collate <en
f200: 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e 22 0a  c> <lhs> <rhs>".
f210: 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73 3e 20  **.** The <lhs> 
f220: 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20 74 68  and <rhs> are th
f230: 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62 65 69  e two values bei
f240: 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65 6e 63  ng compared, enc
f250: 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  oded in UTF-8..*
f260: 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61 72 61  * The <enc> para
f270: 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 6e 63  meter is the enc
f280: 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63 6f 6c  oding of the col
f290: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
f2a0: 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65 20 73  that.** SQLite s
f2b0: 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c 6c 2e  elected to call.
f2c0: 20 54 68 65 20 54 43 4c 20 74 65 73 74 20 73 63   The TCL test sc
f2d0: 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  ript implements 
f2e0: 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63 6f 6c  the.** "test_col
f2f0: 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a 0a 2a  late" proc..**.*
f300: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  * Note that this
f310: 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20   will only work 
f320: 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 70 72 65  with one intepre
f330: 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c 20 61  ter at a time, a
f340: 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 70 20  s the.** interp 
f350: 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65 20 77  pointer to use w
f360: 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67 20 74  hen evaluating t
f370: 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73  he TCL script is
f380: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 54   stored in.** pT
f390: 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70  estCollateInterp
f3a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f  ..*/.static Tcl_
f3b0: 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43 6f 6c  Interp* pTestCol
f3c0: 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74 61 74  lateInterp;.stat
f3d0: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c  ic int test_coll
f3e0: 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64  ate_func(.  void
f3f0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
f400: 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  A, const void *z
f410: 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63 6f 6e  A,.  int nB, con
f420: 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20  st void *zB.){. 
f430: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 20 3d   Tcl_Interp *i =
f440: 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
f450: 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63 69 6e  erp;.  int encin
f460: 20 3d 20 28 69 6e 74 29 70 43 74 78 3b 0a 20 20   = (int)pCtx;.  
f470: 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e  int res;.  int n
f480: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ;..  sqlite3_val
f490: 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f  ue *pVal;.  Tcl_
f4a0: 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d  Obj *pX;..  pX =
f4b0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f4c0: 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  j("test_collate"
f4d0: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
f4e0: 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a  rRefCount(pX);..
f4f0: 20 20 73 77 69 74 63 68 28 20 65 6e 63 69 6e 20    switch( encin 
f500: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
f510: 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 54  TE_UTF8:.      T
f520: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f530: 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
f540: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
f550: 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20  TF-8",-1));.    
f560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
f570: 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  e SQLITE_UTF16LE
f580: 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
f590: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f5a0: 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
f5b0: 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45  ingObj("UTF-16LE
f5c0: 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72  ",-1));.      br
f5d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
f5e0: 4c 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20  LITE_UTF16BE:.  
f5f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
f600: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
f610: 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  X,Tcl_NewStringO
f620: 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 2d 31  bj("UTF-16BE",-1
f630: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
f640: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
f650: 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
f660: 20 7d 0a 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c   }..  pVal = sql
f670: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
f680: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
f690: 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c 20  etStr(pVal, nA, 
f6a0: 7a 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54  zA, encin, SQLIT
f6b0: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 6e 20 3d  E_STATIC);.  n =
f6c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
f6d0: 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 54 63  ytes(pVal);.  Tc
f6e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f6f0: 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20 20  lement(i,pX,.   
f700: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
f710: 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74  Obj((char*)sqlit
f720: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
f730: 61 6c 29 2c 6e 29 29 3b 0a 20 20 73 71 6c 69 74  al),n));.  sqlit
f740: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
f750: 61 6c 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e 63 69  al, nB, zB, enci
f760: 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
f770: 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
f780: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
f790: 6c 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  l);.  Tcl_ListOb
f7a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f7b0: 2c 70 58 2c 0a 20 20 20 20 20 20 54 63 6c 5f 4e  ,pX,.      Tcl_N
f7c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
f7d0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
f7e0: 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b  _text(pVal),n));
f7f0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
f800: 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 54 63  ree(pVal);..  Tc
f810: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70  l_EvalObjEx(i, p
f820: 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  X, 0);.  Tcl_Dec
f830: 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
f840: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
f850: 62 6a 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a  bj(i, Tcl_GetObj
f860: 52 65 73 75 6c 74 28 69 29 2c 20 26 72 65 73 29  Result(i), &res)
f870: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
f880: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  }.static int tes
f890: 74 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69  t_collate(.  voi
f8a0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
f8b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
f8c0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
f8d0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
f8e0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
f8f0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
f900: 74 20 76 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33  t val;.  sqlite3
f910: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
f920: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
f930: 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61  bjc!=5 ) goto ba
f940: 64 5f 61 72 67 73 3b 0a 20 20 70 54 65 73 74 43  d_args;.  pTestC
f950: 6f 6c 6c 61 74 65 49 6e 74 65 72 70 20 3d 20 69  ollateInterp = i
f960: 6e 74 65 72 70 3b 0a 20 20 69 66 28 20 67 65 74  nterp;.  if( get
f970: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
f980: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
f990: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
f9a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f9b0: 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b  R;..  if( TCL_OK
f9c0: 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
f9d0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
f9e0: 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29  objv[2], &val) )
f9f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fa00: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
fa10: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
fa20: 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c  on(db, "test_col
fa30: 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  late", SQLITE_UT
fa40: 46 38 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  F8, .          (
fa50: 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54  void *)SQLITE_UT
fa60: 46 38 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c  F8, val?test_col
fa70: 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20  late_func:0);.  
fa80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
fa90: 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76  K ){.    const v
faa0: 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20  oid *zUtf16;.   
fab0: 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
fac0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
fad0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
fae0: 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  3], &val) ) retu
faf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fb00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
fb10: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
fb20: 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74  db, "test_collat
fb30: 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  e", SQLITE_UTF16
fb40: 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  LE, .           
fb50: 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f   (void *)SQLITE_
fb60: 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74 65 73  UTF16LE, val?tes
fb70: 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30  t_collate_func:0
fb80: 29 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f  );.    if( TCL_O
fb90: 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
fba0: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
fbb0: 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20   objv[4], &val) 
fbc0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
fbd0: 4f 52 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69  OR;..#if 0.    i
fbe0: 66 28 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c  f( sqlite3_iMall
fbf0: 6f 63 46 61 69 6c 3e 30 20 29 7b 0a 20 20 20 20  ocFail>0 ){.    
fc00: 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f    sqlite3_iMallo
fc10: 63 46 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23  cFail++;.    }.#
fc20: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
fc30: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
fc40: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56  ->mutex);.    pV
fc50: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
fc60: 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71  eNew(db);.    sq
fc70: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
fc80: 28 70 56 61 6c 2c 20 2d 31 2c 20 22 74 65 73 74  (pVal, -1, "test
fc90: 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54  _collate", SQLIT
fca0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
fcb0: 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66  TATIC);.    zUtf
fcc0: 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  16 = sqlite3Valu
fcd0: 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
fce0: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
fcf0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
fd00: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
fd10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
fd20: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
fd30: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
fd40: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
fd50: 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31  tion16(db, zUtf1
fd60: 36 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  6, SQLITE_UTF16B
fd70: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 76  E, .          (v
fd80: 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46  oid *)SQLITE_UTF
fd90: 31 36 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63  16BE, val?test_c
fda0: 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
fdb0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fdc0: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
fdd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
fde0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
fdf0: 74 65 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  tex);.  }.  if( 
fe00: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
fe10: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
fe20: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
fe30: 45 52 52 4f 52 3b 0a 20 20 0a 20 20 69 66 28 20  ERROR;.  .  if( 
fe40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
fe50: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
fe60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
fe70: 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61  lite3TestErrorNa
fe80: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
fe90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fea0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
feb0: 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73  CL_OK;..bad_args
fec0: 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  :.  Tcl_AppendRe
fed0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
fee0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
fef0: 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
ff00: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
ff10: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
ff20: 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e  ), " <DB> <utf8>
ff30: 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31   <utf16le> <utf1
ff40: 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74  6be>", 0);.  ret
ff50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
ff60: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ../*.** When the
ff70: 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65   collation neede
ff80: 64 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  d callback is in
ff90: 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64 20 74 68  voked, record th
ffa0: 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74 68  e name of .** th
ffb0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
ffc0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 68  ating function h
ffd0: 65 72 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64  ere.  The record
ffe0: 65 64 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b 65  ed name is linke
fff0: 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76 61  d.** to a TCL va
10000 72 69 61 62 6c 65 20 61 6e 64 20 75 73 65 64 20  riable and used 
10010 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
10020 74 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  t the requested 
10030 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61 6d  collation.** nam
10040 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2f  e is correct..*/
10050 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 65  .static char zNe
10060 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32 30  ededCollation[20
10070 30 5d 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20  0];.static char 
10080 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69  *pzNeededCollati
10090 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c 6c  on = zNeededColl
100a0 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ation;.../*.** C
100b0 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6c  alled when a col
100c0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
100d0 69 73 20 6e 65 65 64 65 64 2e 20 20 52 65 67 69  is needed.  Regi
100e0 73 74 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20  stered using.** 
100f0 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
10100 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a 2f  n_needed16()..*/
10110 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
10120 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64  t_collate_needed
10130 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  _cb(.  void *pCt
10140 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  x, .  sqlite3 *d
10150 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  b,.  int eTextRe
10160 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  p,.  const void 
10170 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20  *pName.){.  int 
10180 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
10190 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
101a0 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63 68  z;.  for(z = (ch
101b0 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b 20  ar*)pName, i=0; 
101c0 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b 29  *z || z[1]; z++)
101d0 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20 29 20 7a  {.    if( *z ) z
101e0 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
101f0 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a 20  i++] = *z;.  }. 
10200 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f   zNeededCollatio
10210 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  n[i] = 0;.  sqli
10220 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
10230 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20  tion(.      db, 
10240 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
10250 45 4e 43 28 64 62 29 2c 20 28 76 6f 69 64 20 2a  ENC(db), (void *
10260 29 65 6e 63 2c 20 74 65 73 74 5f 63 6f 6c 6c 61  )enc, test_colla
10270 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a  te_func);.}../*.
10280 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65  ** Usage: add_te
10290 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
102a0 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d DB.*/.static i
102b0 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  nt test_collate_
102c0 6e 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a  needed(.  void *
102d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
102e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
102f0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
10300 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
10310 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
10320 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
10330 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
10340 32 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67  2 ) goto bad_arg
10350 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  s;.  if( getDbPo
10360 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
10370 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10380 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
10390 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
103a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   rc = sqlite3_co
103b0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
103c0 28 64 62 2c 20 30 2c 20 74 65 73 74 5f 63 6f 6c  (db, 0, test_col
103d0 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 29 3b  late_needed_cb);
103e0 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74  .  zNeededCollat
103f0 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 69 66  ion[0] = 0;.  if
10400 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
10410 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
10420 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
10430 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
10440 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61  n TCL_OK;..bad_a
10450 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e 67  rgs:.  Tcl_Wrong
10460 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
10470 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
10480 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10490 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OR;.}../*.** tcl
104a0 63 6d 64 3a 20 20 20 61 64 64 5f 61 6c 69 67 6e  cmd:   add_align
104b0 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  ment_test_collat
104c0 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 41  ions  DB.**.** A
104d0 64 64 20 74 77 6f 20 6e 65 77 20 63 6f 6c 6c 61  dd two new colla
104e0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 74  ting sequences t
104f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 44  o the database D
10500 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20 75 74 66 31  B.**.**     utf1
10510 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a 20 20 20 20  6_aligned.**    
10520 20 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64   utf16_unaligned
10530 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c  .**.** Both coll
10540 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
10550 75 73 65 20 74 68 65 20 73 61 6d 65 20 73 6f 72  use the same sor
10560 74 20 6f 72 64 65 72 20 61 73 20 42 49 4e 41 52  t order as BINAR
10570 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 64  Y..** The only d
10580 69 66 66 65 72 65 6e 63 65 20 69 73 20 74 68 61  ifference is tha
10590 74 20 74 68 65 20 75 74 66 31 36 5f 61 6c 69 67  t the utf16_alig
105a0 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  ned collating.**
105b0 20 73 65 71 75 65 6e 63 65 20 69 73 20 64 65 63   sequence is dec
105c0 6c 61 72 65 64 20 77 69 74 68 20 74 68 65 20 53  lared with the S
105d0 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
105e0 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a 20 42 6f 74  NED flag..** Bot
105f0 68 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  h collating func
10600 74 69 6f 6e 73 20 69 6e 63 72 65 6d 65 6e 74 20  tions increment 
10610 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 75 74  the unaligned ut
10620 66 31 36 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 77  f16 counter.** w
10630 68 65 6e 65 76 65 72 20 74 68 65 79 20 73 65 65  henever they see
10640 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 62   a string that b
10650 65 67 69 6e 73 20 6f 6e 20 61 6e 20 6f 64 64 20  egins on an odd 
10660 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a  byte boundary..*
10670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 61  /.static int una
10680 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
10690 75 6e 74 65 72 20 3d 20 30 3b 0a 73 74 61 74 69  unter = 0;.stati
106a0 63 20 69 6e 74 20 61 6c 69 67 6e 6d 65 6e 74 43  c int alignmentC
106b0 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20  ollFunc(.  void 
106c0 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20  *NotUsed,.  int 
106d0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
106e0 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20  d *pKey1,.  int 
106f0 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey2, const voi
10700 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e  d *pKey2.){.  in
10710 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e  t rc, n;.  n = n
10720 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65  Key1<nKey2 ? nKe
10730 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 69 66  y1 : nKey2;.  if
10740 28 20 6e 4b 65 79 31 3e 30 20 26 26 20 31 3d 3d  ( nKey1>0 && 1==
10750 28 31 26 28 69 6e 74 29 70 4b 65 79 31 29 20 29  (1&(int)pKey1) )
10760 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e   unaligned_strin
10770 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 69  g_counter++;.  i
10780 66 28 20 6e 4b 65 79 32 3e 30 20 26 26 20 31 3d  f( nKey2>0 && 1=
10790 3d 28 31 26 28 69 6e 74 29 70 4b 65 79 32 29 20  =(1&(int)pKey2) 
107a0 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69  ) unaligned_stri
107b0 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ng_counter++;.  
107c0 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79  rc = memcmp(pKey
107d0 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20  1, pKey2, n);.  
107e0 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
107f0 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b   rc = nKey1 - nK
10800 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
10810 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69  n rc;.}.static i
10820 6e 74 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74  nt add_alignment
10830 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73  _test_collations
10840 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
10850 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
10860 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
10870 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
10880 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
10890 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
108a0 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 32  b;.  if( objc>=2
108b0 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 44   ){.    if( getD
108c0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
108d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
108e0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
108f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10900 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
10910 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
10920 62 2c 20 22 75 74 66 31 36 5f 75 6e 61 6c 69 67  b, "utf16_unalig
10930 6e 65 64 22 2c 0a 20 20 20 20 20 20 20 20 53 51  ned",.        SQ
10940 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a 20 20 20  LITE_UTF16, .   
10950 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65 6e       0, alignmen
10960 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 20 20  tCollFunc);.    
10970 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
10980 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74  ollation(db, "ut
10990 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c 0a 20 20  f16_aligned",.  
109a0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
109b0 31 36 20 7c 20 53 51 4c 49 54 45 5f 55 54 46 31  16 | SQLITE_UTF1
109c0 36 5f 41 4c 49 47 4e 45 44 2c 20 0a 20 20 20 20  6_ALIGNED, .    
109d0 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74      0, alignment
109e0 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 7d 0a 20  CollFunc);.  }. 
109f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10a00 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
10a10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10a20 4d 49 54 5f 55 54 46 31 36 29 20 2a 2f 0a 0a 2f  MIT_UTF16) */../
10a30 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f  *.** Usage: add_
10a40 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 64  test_function <d
10a50 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75  b ptr> <utf8> <u
10a60 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65  tf16le> <utf16be
10a70 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  >.**.** This fun
10a80 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
10a90 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
10aa0 65 20 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f  e selects the co
10ab0 72 72 65 63 74 20 75 73 65 72 0a 2a 2a 20 66 75  rrect user.** fu
10ac0 6e 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20  nction callback 
10ad0 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65  when multiple ve
10ae0 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66  rsions (for diff
10af0 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64  erent text encod
10b00 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61  ings).** are ava
10b10 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61  ilable..**.** Ca
10b20 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
10b30 6e 65 20 72 65 67 69 73 74 65 72 73 20 75 70 20  ne registers up 
10b40 74 6f 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e  to three version
10b50 73 20 6f 66 20 74 68 65 20 75 73 65 72 20 66 75  s of the user fu
10b60 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f  nction.** "test_
10b70 66 75 6e 63 74 69 6f 6e 22 20 77 69 74 68 20 64  function" with d
10b80 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
10b90 64 62 3e 2e 20 20 49 66 20 74 68 65 20 73 65 63  db>.  If the sec
10ba0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a  ond argument is.
10bb0 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20  ** true, then a 
10bc0 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f  version of test_
10bd0 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 67 69  function is regi
10be0 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 38  stered for UTF-8
10bf0 2c 20 69 66 20 74 68 65 0a 2a 2a 20 74 68 69 72  , if the.** thir
10c00 64 20 69 73 20 74 72 75 65 2c 20 61 20 76 65 72  d is true, a ver
10c10 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72  sion is register
10c20 65 64 20 66 6f 72 20 55 54 46 2d 31 36 6c 65 2c  ed for UTF-16le,
10c30 20 69 66 20 74 68 65 20 66 6f 75 72 74 68 20 69   if the fourth i
10c40 73 0a 2a 2a 20 74 72 75 65 2c 20 61 20 55 54 46  s.** true, a UTF
10c50 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20 69 73  -16be version is
10c60 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 50 72 65   available.  Pre
10c70 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f  vious versions o
10c80 66 0a 2a 2a 20 74 65 73 74 5f 66 75 6e 63 74 69  f.** test_functi
10c90 6f 6e 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  on are deleted..
10ca0 2a 2a 0a 2a 2a 20 54 68 65 20 75 73 65 72 20 66  **.** The user f
10cb0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
10cc0 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  mented by callin
10cd0 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
10ce0 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a  TCL script:.**.*
10cf0 2a 20 20 20 22 74 65 73 74 5f 66 75 6e 63 74 69  *   "test_functi
10d00 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72 67 3e 22 0a  on <enc> <arg>".
10d10 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 3c 65 6e 63  **.** Where <enc
10d20 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 54 46 2d  > is one of UTF-
10d30 38 2c 20 55 54 46 2d 31 36 4c 45 20 6f 72 20 55  8, UTF-16LE or U
10d40 54 46 31 36 42 45 2c 20 61 6e 64 20 3c 61 72 67  TF16BE, and <arg
10d50 3e 20 69 73 20 74 68 65 0a 2a 2a 20 73 69 6e 67  > is the.** sing
10d60 6c 65 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  le argument pass
10d70 65 64 20 74 6f 20 74 68 65 20 53 51 4c 20 66 75  ed to the SQL fu
10d80 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75  nction. The valu
10d90 65 20 72 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a  e returned by.**
10da0 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   the TCL script 
10db0 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 72  is used as the r
10dc0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
10dd0 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  he SQL function.
10de0 20 49 74 0a 2a 2a 20 69 73 20 70 61 73 73 65 64   It.** is passed
10df0 20 74 6f 20 53 51 4c 69 74 65 20 75 73 69 6e 67   to SQLite using
10e00 20 55 54 46 2d 31 36 42 45 20 66 6f 72 20 61 20   UTF-16BE for a 
10e10 55 54 46 2d 38 20 74 65 73 74 5f 66 75 6e 63 74  UTF-8 test_funct
10e20 69 6f 6e 28 29 2c 20 55 54 46 2d 38 0a 2a 2a 20  ion(), UTF-8.** 
10e30 66 6f 72 20 61 20 55 54 46 2d 31 36 4c 45 20 74  for a UTF-16LE t
10e40 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  est_function(), 
10e50 61 6e 64 20 55 54 46 2d 31 36 4c 45 20 66 6f 72  and UTF-16LE for
10e60 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   an implementati
10e70 6f 6e 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 65  on that.** prefe
10e80 72 73 20 55 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a  rs UTF-16BE..*/.
10e90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10ea0 4d 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63  MIT_UTF16.static
10eb0 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74   void test_funct
10ec0 69 6f 6e 5f 75 74 66 38 28 0a 20 20 73 71 6c 69  ion_utf8(.  sqli
10ed0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
10ee0 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
10ef0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
10f00 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f  **argv.){.  Tcl_
10f10 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
10f20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20    Tcl_Obj *pX;. 
10f30 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
10f40 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d  pVal;.  interp =
10f50 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73   (Tcl_Interp *)s
10f60 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
10f70 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54  (pCtx);.  pX = T
10f80 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10f90 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
10fa0 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
10fb0 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
10fc0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10fd0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10fe0 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69   pX, Tcl_NewStri
10ff0 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 20 2d  ngObj("UTF-8", -
11000 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
11010 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11020 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20  interp, pX, .   
11030 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
11040 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74  Obj((char*)sqlit
11050 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
11060 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20  gv[0]), -1));.  
11070 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
11080 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20  terp, pX, 0);.  
11090 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
110a0 28 70 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (pX);.  sqlite3_
110b0 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
110c0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
110d0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 2d  esult(interp), -
110e0 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
110f0 45 4e 54 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73  ENT);.  pVal = s
11100 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
11110 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
11120 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
11130 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
11140 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a  esult(interp), .
11150 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
11160 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
11170 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
11180 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70 43 74  ult_text16be(pCt
11190 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  x, sqlite3_value
111a0 5f 74 65 78 74 31 36 62 65 28 70 56 61 6c 29 2c  _text16be(pVal),
111b0 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54  .      -1, SQLIT
111c0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
111d0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
111e0 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63  (pVal);.}.static
111f0 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74   void test_funct
11200 69 6f 6e 5f 75 74 66 31 36 6c 65 28 0a 20 20 73  ion_utf16le(.  s
11210 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
11220 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
11230 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
11240 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54  ue **argv.){.  T
11250 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11260 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  p;.  Tcl_Obj *pX
11270 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
11280 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72  e *pVal;.  inter
11290 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20  p = (Tcl_Interp 
112a0 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
112b0 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20  ata(pCtx);.  pX 
112c0 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
112d0 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  bj("test_functio
112e0 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  n", -1);.  Tcl_I
112f0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ncrRefCount(pX);
11300 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
11310 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11320 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53  rp, pX, Tcl_NewS
11330 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36  tringObj("UTF-16
11340 4c 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  LE", -1));.  Tcl
11350 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11360 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
11370 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  , .      Tcl_New
11380 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a  StringObj((char*
11390 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
113a0 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31  ext(argv[0]), -1
113b0 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
113c0 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  jEx(interp, pX, 
113d0 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
113e0 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56  fCount(pX);.  pV
113f0 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
11400 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
11410 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
11420 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53  al, -1, Tcl_GetS
11430 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
11440 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49  rp), .      SQLI
11450 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
11460 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
11470 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
11480 43 74 78 2c 28 63 68 61 72 2a 29 73 71 6c 69 74  Ctx,(char*)sqlit
11490 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
114a0 61 6c 29 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52  al),-1,SQLITE_TR
114b0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
114c0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
114d0 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  l);.}.static voi
114e0 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  d test_function_
114f0 75 74 66 31 36 62 65 28 0a 20 20 73 71 6c 69 74  utf16be(.  sqlit
11500 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
11510 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
11520 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
11530 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49  *argv.){.  Tcl_I
11540 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
11550 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20   Tcl_Obj *pX;.  
11560 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
11570 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20  Val;.  interp = 
11580 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71  (Tcl_Interp *)sq
11590 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
115a0 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63  pCtx);.  pX = Tc
115b0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
115c0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
115d0 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
115e0 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
115f0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11600 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11610 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pX, Tcl_NewStrin
11620 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c  gObj("UTF-16BE",
11630 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
11640 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11650 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20  t(interp, pX, . 
11660 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
11670 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
11680 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
11690 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a  argv[0]), -1));.
116a0 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
116b0 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a  interp, pX, 0);.
116c0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
116d0 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d  nt(pX);.  pVal =
116e0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
116f0 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
11700 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
11710 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
11720 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
11730 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
11740 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
11750 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
11760 65 73 75 6c 74 5f 74 65 78 74 31 36 28 70 43 74  esult_text16(pCt
11770 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  x, sqlite3_value
11780 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c  _text16le(pVal),
11790 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54  .      -1, SQLIT
117a0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
117b0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
117c0 65 78 74 31 36 62 65 28 70 43 74 78 2c 20 73 71  ext16be(pCtx, sq
117d0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
117e0 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20  16le(pVal),.    
117f0 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41    -1, SQLITE_TRA
11800 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
11810 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
11820 6c 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33  le(pCtx, sqlite3
11830 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28  _value_text16le(
11840 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c  pVal),.      -1,
11850 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
11860 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  T);.  sqlite3Val
11870 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a  ueFree(pVal);.}.
11880 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11890 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73  _OMIT_UTF16 */.s
118a0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66  tatic int test_f
118b0 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20  unction(.  void 
118c0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
118d0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
118e0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
118f0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
11900 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
11910 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
11920 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a  TF16.  sqlite3 *
11930 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a  db;.  int val;..
11940 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20    if( objc!=5 ) 
11950 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
11960 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
11970 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
11980 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
11990 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
119a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66  TCL_ERROR;..  if
119b0 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
119c0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
119d0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
119e0 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
119f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
11a00 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69   val ){.    sqli
11a10 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11a20 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75  ion(db, "test_fu
11a30 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49  nction", 1, SQLI
11a40 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
11a50 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
11a60 75 6e 63 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c  unction_utf8, 0,
11a70 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54   0);.  }.  if( T
11a80 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
11a90 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
11aa0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
11ab0 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
11ac0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
11ad0 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
11ae0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
11af0 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
11b00 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
11b10 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20  UTF16LE, .      
11b20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
11b30 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c  unction_utf16le,
11b40 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
11b50 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
11b60 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
11b70 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
11b80 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
11b90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
11ba0 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69   val ){.    sqli
11bb0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11bc0 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75  ion(db, "test_fu
11bd0 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49  nction", 1, SQLI
11be0 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20  TE_UTF16BE, .   
11bf0 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73       interp, tes
11c00 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36  t_function_utf16
11c10 62 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  be, 0, 0);.  }..
11c20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
11c30 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c  .bad_args:.  Tcl
11c40 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11c50 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
11c60 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
11c70 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65  "",.      Tcl_Ge
11c80 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
11c90 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44  bjv[0], 0), " <D
11ca0 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  B> <utf8> <utf16
11cb0 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20  le> <utf16be>", 
11cc0 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  0);.#endif /* SQ
11cd0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
11ce0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
11cf0 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
11d00 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 74  Usage:         t
11d10 65 73 74 5f 65 72 72 73 74 72 20 3c 65 72 72 20  est_errstr <err 
11d20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  code>.**.** Test
11d30 20 74 68 61 74 20 74 68 65 20 65 6e 67 6c 69 73   that the englis
11d40 68 20 6c 61 6e 67 75 61 67 65 20 73 74 72 69 6e  h language strin
11d50 67 20 65 71 75 69 76 61 6c 65 6e 74 73 20 66 6f  g equivalents fo
11d60 72 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63  r sqlite error c
11d70 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73 61 6e 65  odes.** are sane
11d80 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
11d90 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  is an integer re
11da0 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 73 71  presenting an sq
11db0 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  lite error code.
11dc0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
11dd0 73 20 61 20 6c 69 73 74 20 6f 66 20 74 77 6f 20  s a list of two 
11de0 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20 73 74  elements, the st
11df0 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
11e00 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72  ion of the.** er
11e10 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 74 68 65  ror code and the
11e20 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   english languag
11e30 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a  e explanation..*
11e40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
11e50 74 5f 65 72 72 73 74 72 28 0a 20 20 76 6f 69 64  t_errstr(.  void
11e60 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
11e70 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
11e80 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
11e90 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
11ea0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68  T objv[].){.  ch
11eb0 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74  ar *zCode;.  int
11ec0 20 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d   i;.  if( objc!=
11ed0 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
11ee0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
11ef0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72  , 1, objv, "<err
11f00 6f 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a  or code>");.  }.
11f10 0a 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47  .  zCode = Tcl_G
11f20 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
11f30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
11f40 32 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  200; i++){.    i
11f50 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 74 31 45  f( 0==strcmp(t1E
11f60 72 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f  rrorName(i), zCo
11f70 64 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  de) ) break;.  }
11f80 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
11f90 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
11fa0 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69  )sqlite3ErrStr(i
11fb0 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
11fc0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
11fd0 20 55 73 61 67 65 3a 20 20 20 20 62 72 65 61 6b   Usage:    break
11fe0 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73  point.**.** This
11ff0 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74 73 20   routine exists 
12000 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73 65 20  for one purpose 
12010 2d 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 70  - to provide a p
12020 6c 61 63 65 20 74 6f 20 70 75 74 20 61 0a 2a 2a  lace to put a.**
12030 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 69 74 68   breakpoint with
12040 20 47 44 42 20 74 68 61 74 20 63 61 6e 20 62 65   GDB that can be
12050 20 74 72 69 67 67 65 72 65 64 20 75 73 69 6e 67   triggered using
12060 20 54 43 4c 20 63 6f 64 65 2e 20 20 54 68 65 20   TCL code.  The 
12070 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  use.** for this 
12080 69 73 20 77 68 65 6e 20 61 20 70 61 72 74 69 63  is when a partic
12090 75 6c 61 72 20 74 65 73 74 20 66 61 69 6c 73 20  ular test fails 
120a0 6f 6e 20 28 73 61 79 29 20 74 68 65 20 31 34 38  on (say) the 148
120b0 35 74 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a  5th iteration..*
120c0 2a 20 49 6e 20 74 68 65 20 54 43 4c 20 74 65 73  * In the TCL tes
120d0 74 20 73 63 72 69 70 74 2c 20 77 65 20 63 61 6e  t script, we can
120e0 20 61 64 64 20 63 6f 64 65 20 6c 69 6b 65 20 74   add code like t
120f0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69  his:.**.**     i
12100 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72 65  f {$i==1485} bre
12110 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68  akpoint.**.** Th
12120 65 6e 20 72 75 6e 20 74 65 73 74 66 69 78 74 75  en run testfixtu
12130 72 65 20 69 6e 20 74 68 65 20 64 65 62 75 67 67  re in the debugg
12140 65 72 20 61 6e 64 20 77 61 69 74 20 66 6f 72 20  er and wait for 
12150 74 68 65 20 62 72 65 61 6b 70 6f 69 6e 74 20 74  the breakpoint t
12160 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68 65 6e  o.** fire.  Then
12170 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 72 65 61   additional brea
12180 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62 65 20 73  kpoints can be s
12190 65 74 20 74 6f 20 74 72 61 63 65 20 64 6f 77 6e  et to trace down
121a0 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74 61   the bug..*/.sta
121b0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 72 65  tic int test_bre
121c0 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20  akpoint(.  void 
121d0 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
121e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
121f0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
12200 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
12210 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
12220 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
12230 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
12240 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
12250 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
12260 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
12270 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
12280 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
12290 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  {.  return TCL_O
122a0 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  K;         /* Do
122b0 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f   nothing */.}../
122c0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
122d0 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62  lite3_bind_zerob
122e0 6c 6f 62 20 20 53 54 4d 54 20 49 44 58 20 4e 0a  lob  STMT IDX N.
122f0 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
12300 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f  qlite3_bind_zero
12310 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20  blob interface. 
12320 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
12330 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
12340 2a 20 49 44 58 20 69 73 20 74 68 65 20 69 6e 64  * IDX is the ind
12350 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
12360 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
12370 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
12380 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
12390 64 73 20 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f  ds a N-byte zero
123a0 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20  -filled BLOB to 
123b0 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  the wildcard..*/
123c0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
123d0 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a  _bind_zeroblob(.
123e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
123f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
12400 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
12410 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
12420 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
12430 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
12440 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
12450 64 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  dx;.  int n;.  i
12460 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
12470 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
12480 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
12490 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
124a0 53 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a 20 20  STMT IDX N");.  
124b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
124c0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
124d0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
124e0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
124f0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
12500 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
12510 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
12520 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
12530 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
12540 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
12550 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
12560 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
12570 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
12580 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72 65 74 75  v[3], &n) ) retu
12590 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
125a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
125b0 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 70 53 74 6d  nd_zeroblob(pStm
125c0 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20 20 69 66  t, idx, n);.  if
125d0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
125e0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
125f0 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
12600 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12610 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
12620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12630 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12640 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
12650 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
12660 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
12670 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54 4d  e3_bind_int  STM
12680 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20  T N VALUE.**.** 
12690 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
126a0 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72 66  _bind_int interf
126b0 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
126c0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
126d0 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
126e0 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
126f0 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
12700 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
12710 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
12720 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74 20 69  binds a 32-bit i
12730 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20  nteger VALUE to 
12740 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a  that wildcard..*
12750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
12760 74 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20 76 6f  t_bind_int(.  vo
12770 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
12780 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
12790 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
127a0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
127b0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
127c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
127d0 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
127e0 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20 69    int value;.  i
127f0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
12800 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
12810 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12820 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
12830 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
12840 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
12850 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
12860 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
12870 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30  STMT N VALUE", 0
12880 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
12890 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
128a0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
128b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
128c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
128d0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
128e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
128f0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
12900 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
12910 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
12920 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12930 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
12940 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
12950 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75  , objv[3], &valu
12960 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
12970 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
12980 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
12990 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
129a0 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
129b0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
129c0 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
129d0 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
129e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
129f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12a00 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
12a10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
12a20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
12a30 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
12a40 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
12a50 5f 69 6e 74 36 34 20 20 53 54 4d 54 20 4e 20 56  _int64  STMT N V
12a60 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
12a70 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
12a80 5f 69 6e 74 36 34 20 69 6e 74 65 72 66 61 63 65  _int64 interface
12a90 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
12aa0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
12ab0 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
12ac0 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
12ad0 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
12ae0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
12af0 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
12b00 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ds a 64-bit inte
12b10 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61  ger VALUE to tha
12b20 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  t wildcard..*/.s
12b30 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
12b40 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69  ind_int64(.  voi
12b50 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
12b60 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
12b70 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
12b80 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
12b90 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
12ba0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
12bb0 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
12bc0 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 69 6e   i64 value;.  in
12bd0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
12be0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
12bf0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
12c00 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
12c10 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
12c20 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
12c30 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
12c40 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
12c50 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29  TMT N VALUE", 0)
12c60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
12c70 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
12c80 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
12c90 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
12ca0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
12cb0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
12cc0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12cd0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
12ce0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12cf0 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
12d00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12d10 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69  .  if( Tcl_GetWi
12d20 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
12d30 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
12d40 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54  alue) ) return T
12d50 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
12d60 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  = sqlite3_bind_i
12d70 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 64 78 2c  nt64(pStmt, idx,
12d80 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73   value);.  if( s
12d90 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
12da0 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
12db0 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
12dc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12dd0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
12de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
12df0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12e00 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
12e10 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
12e20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
12e30 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 20 53 54  _bind_double  ST
12e40 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  MT N VALUE.**.**
12e50 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
12e60 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 69 6e  3_bind_double in
12e70 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
12e80 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
12e90 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
12ea0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
12eb0 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
12ec0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
12ed0 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
12ee0 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62  .** binds a 64-b
12ef0 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45  it integer VALUE
12f00 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72   to that wildcar
12f10 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12f20 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c   test_bind_doubl
12f30 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
12f40 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
12f50 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
12f60 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
12f70 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
12f80 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
12f90 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
12fa0 74 20 69 64 78 3b 0a 20 20 64 6f 75 62 6c 65 20  t idx;.  double 
12fb0 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
12fc0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12fd0 56 61 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Val;.  int i;.  
12fe0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
12ff0 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
13000 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
13010 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
13020 73 70 65 63 69 61 6c 20 66 6c 6f 61 74 69 6e 67  special floating
13030 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a   point value */.
13040 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
13050 20 69 55 70 70 65 72 3b 20 20 20 2f 2a 20 55 70   iUpper;   /* Up
13060 70 65 72 20 33 32 20 62 69 74 73 20 2a 2f 0a 20  per 32 bits */. 
13070 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
13080 69 4c 6f 77 65 72 3b 20 20 20 2f 2a 20 4c 6f 77  iLower;   /* Low
13090 65 72 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20  er 32 bits */.  
130a0 7d 20 61 53 70 65 63 69 61 6c 46 70 5b 5d 20 3d  } aSpecialFp[] =
130b0 20 7b 0a 20 20 20 20 7b 20 20 22 4e 61 4e 22 2c   {.    {  "NaN",
130c0 20 20 20 20 20 20 30 78 37 66 66 66 66 66 66 66        0x7fffffff
130d0 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a  , 0xffffffff },.
130e0 20 20 20 20 7b 20 20 22 53 4e 61 4e 22 2c 20 20      {  "SNaN",  
130f0 20 20 20 30 78 37 66 66 37 66 66 66 66 2c 20 30     0x7ff7ffff, 0
13100 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20  xffffffff },.   
13110 20 7b 20 20 22 2d 4e 61 4e 22 2c 20 20 20 20 20   {  "-NaN",     
13120 30 78 66 66 66 66 66 66 66 66 2c 20 30 78 66 66  0xffffffff, 0xff
13130 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20  ffffff },.    { 
13140 20 22 2d 53 4e 61 4e 22 2c 20 20 20 20 30 78 66   "-SNaN",    0xf
13150 66 66 37 66 66 66 66 2c 20 30 78 66 66 66 66 66  ff7ffff, 0xfffff
13160 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2b  fff },.    {  "+
13170 49 6e 66 22 2c 20 20 20 20 20 30 78 37 66 66 30  Inf",     0x7ff0
13180 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30  0000, 0x00000000
13190 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 49 6e 66   },.    {  "-Inf
131a0 22 2c 20 20 20 20 20 30 78 66 66 66 30 30 30 30  ",     0xfff0000
131b0 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c  0, 0x00000000 },
131c0 0a 20 20 20 20 7b 20 20 22 45 70 73 69 6c 6f 6e  .    {  "Epsilon
131d0 22 2c 20 20 30 78 30 30 30 30 30 30 30 30 2c 20  ",  0x00000000, 
131e0 30 78 30 30 30 30 30 30 30 31 20 7d 2c 0a 20 20  0x00000001 },.  
131f0 20 20 7b 20 20 22 2d 45 70 73 69 6c 6f 6e 22 2c    {  "-Epsilon",
13200 20 30 78 38 30 30 30 30 30 30 30 2c 20 30 78 30   0x80000000, 0x0
13210 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b  0000001 },.    {
13220 20 20 22 4e 61 4e 30 22 2c 20 20 20 20 20 30 78    "NaN0",     0x
13230 37 66 66 38 30 30 30 30 2c 20 30 78 30 30 30 30  7ff80000, 0x0000
13240 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0000 },.    {  "
13250 2d 4e 61 4e 30 22 2c 20 20 20 20 30 78 66 66 66  -NaN0",    0xfff
13260 38 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  80000, 0x0000000
13270 30 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28  0 },.  };..  if(
13280 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
13290 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
132a0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
132b0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
132c0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
132d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
132e0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
132f0 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22   " STMT N VALUE"
13300 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
13310 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
13320 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
13330 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
13340 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
13350 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
13360 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13370 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
13380 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
13390 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29  , objv[2], &idx)
133a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
133b0 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72  ROR;..  /* Inter
133c0 63 65 70 74 20 74 68 65 20 73 74 72 69 6e 67 20  cept the string 
133d0 22 4e 61 4e 22 20 61 6e 64 20 67 65 6e 65 72 61  "NaN" and genera
133e0 74 65 20 61 20 4e 61 4e 20 76 61 6c 75 65 20 66  te a NaN value f
133f0 6f 72 20 69 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20  or it..  ** All 
13400 6f 74 68 65 72 20 73 74 72 69 6e 67 73 20 61 72  other strings ar
13410 65 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  e passed through
13420 20 74 6f 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c   to Tcl_GetDoubl
13430 65 46 72 6f 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a  eFromObj()..  **
13440 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
13450 6f 6d 4f 62 6a 28 29 20 73 68 6f 75 6c 64 20 75  omObj() should u
13460 6e 64 65 72 73 74 61 6e 64 20 22 4e 61 4e 22 20  nderstand "NaN" 
13470 62 75 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e  but some version
13480 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61  s.  ** contain a
13490 20 62 75 67 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61   bug..  */.  zVa
134a0 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
134b0 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f  g(objv[3]);.  fo
134c0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
134d0 61 53 70 65 63 69 61 6c 46 70 29 2f 73 69 7a 65  aSpecialFp)/size
134e0 6f 66 28 61 53 70 65 63 69 61 6c 46 70 5b 30 5d  of(aSpecialFp[0]
134f0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
13500 20 73 74 72 63 6d 70 28 61 53 70 65 63 69 61 6c   strcmp(aSpecial
13510 46 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61  Fp[i].zName, zVa
13520 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  l)==0 ){.      s
13530 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 78 3b  qlite3_uint64 x;
13540 0a 20 20 20 20 20 20 78 20 3d 20 61 53 70 65 63  .      x = aSpec
13550 69 61 6c 46 70 5b 69 5d 2e 69 55 70 70 65 72 3b  ialFp[i].iUpper;
13560 0a 20 20 20 20 20 20 78 20 3c 3c 3d 20 33 32 3b  .      x <<= 32;
13570 0a 20 20 20 20 20 20 78 20 7c 3d 20 61 53 70 65  .      x |= aSpe
13580 63 69 61 6c 46 70 5b 69 5d 2e 69 4c 6f 77 65 72  cialFp[i].iLower
13590 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
135a0 73 69 7a 65 6f 66 28 76 61 6c 75 65 29 3d 3d 38  sizeof(value)==8
135b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
135c0 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 29  ( sizeof(x)==8 )
135d0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
135e0 76 61 6c 75 65 2c 20 26 78 2c 20 38 29 3b 0a 20  value, &x, 8);. 
135f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13600 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73  }.  }.  if( i>=s
13610 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70  izeof(aSpecialFp
13620 29 2f 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61  )/sizeof(aSpecia
13630 6c 46 70 5b 30 5d 29 20 26 26 0a 20 20 20 20 20  lFp[0]) &&.     
13640 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c      Tcl_GetDoubl
13650 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  eFromObj(interp,
13660 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
13670 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
13680 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
13690 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
136a0 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c  nd_double(pStmt,
136b0 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20   idx, value);.  
136c0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
136d0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
136e0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
136f0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
13700 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
13710 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13720 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13730 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
13740 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
13750 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
13760 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20  ite3_bind_null  
13770 53 54 4d 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73  STMT N.**.** Tes
13780 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
13790 6e 64 5f 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63  nd_null interfac
137a0 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
137b0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
137c0 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
137d0 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
137e0 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
137f0 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
13800 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
13810 6e 64 73 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68  nds a NULL to th
13820 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  e wildcard..*/.s
13830 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
13840 69 6e 64 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64  ind_null(.  void
13850 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
13860 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
13870 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
13880 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
13890 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
138a0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
138b0 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
138c0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
138d0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
138e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
138f0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
13900 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
13910 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
13920 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
13930 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
13940 20 53 54 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20   STMT N", 0);.  
13950 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13960 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
13970 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
13980 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
13990 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
139a0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
139b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
139c0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
139d0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
139e0 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
139f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
13a00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
13a10 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64  d_null(pStmt, id
13a20 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  x);.  if( sqlite
13a30 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
13a40 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
13a50 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
13a60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13a70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13a80 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
13a90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
13aa0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
13ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
13ac0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
13ad0 74 65 78 74 20 20 53 54 4d 54 20 4e 20 53 54 52  text  STMT N STR
13ae0 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20  ING BYTES.**.** 
13af0 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
13b00 5f 62 69 6e 64 5f 74 65 78 74 20 69 6e 74 65 72  _bind_text inter
13b10 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
13b20 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
13b30 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
13b40 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
13b50 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
13b60 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
13b70 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
13b80 20 62 69 6e 64 73 20 61 20 55 54 46 2d 38 20 73   binds a UTF-8 s
13b90 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20  tring STRING to 
13ba0 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54  the wildcard.  T
13bb0 68 65 20 73 74 72 69 6e 67 20 69 73 20 42 59 54  he string is BYT
13bc0 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67  ES bytes.** long
13bd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13be0 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 28 0a  test_bind_text(.
13bf0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
13c00 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
13c10 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
13c20 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
13c30 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
13c40 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
13c50 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
13c60 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  dx;.  int bytes;
13c70 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a  .  char *value;.
13c80 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
13c90 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
13ca0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
13cb0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
13cc0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
13cd0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
13ce0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
13cf0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
13d00 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20   " STMT N VALUE 
13d10 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20  BYTES", 0);.    
13d20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13d30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
13d40 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
13d50 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
13d60 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
13d70 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
13d80 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
13d90 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
13da0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
13db0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
13dc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c  TCL_ERROR;.  val
13dd0 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f  ue = (char*)Tcl_
13de0 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
13df0 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  Obj(objv[3], &by
13e00 74 65 73 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  tes);.  if( Tcl_
13e10 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
13e20 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
13e30 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
13e40 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
13e50 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
13e60 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
13e70 20 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 53   value, bytes, S
13e80 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
13e90 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
13ea0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
13eb0 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
13ec0 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
13ed0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
13ee0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13ef0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
13f00 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13f10 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72  sqlite3TestError
13f20 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
13f30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13f40 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
13f50 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
13f60 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
13f70 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20  te3_bind_text16 
13f80 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e  ?-static? STMT N
13f90 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a   STRING BYTES.**
13fa0 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
13fb0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
13fc0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
13fd0 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
13fe0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
13ff0 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
14000 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
14010 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
14020 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
14030 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55  and.** binds a U
14040 54 46 2d 31 36 20 73 74 72 69 6e 67 20 53 54 52  TF-16 string STR
14050 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63  ING to the wildc
14060 61 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67  ard.  The string
14070 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a   is BYTES bytes.
14080 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ** long..*/.stat
14090 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
140a0 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69 64 20  _text16(.  void 
140b0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
140c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
140d0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
140e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
140f0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
14100 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
14110 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73  TF16.  sqlite3_s
14120 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
14130 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74  t idx;.  int byt
14140 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75  es;.  char *valu
14150 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
14160 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 29 20 3d  void (*xDel)() =
14170 20 28 6f 62 6a 63 3d 3d 36 3f 53 51 4c 49 54 45   (objc==6?SQLITE
14180 5f 53 54 41 54 49 43 3a 53 51 4c 49 54 45 5f 54  _STATIC:SQLITE_T
14190 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 54 63 6c  RANSIENT);.  Tcl
141a0 5f 4f 62 6a 20 2a 6f 53 74 6d 74 20 20 20 20 3d  _Obj *oStmt    =
141b0 20 6f 62 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20   objv[objc-4];. 
141c0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20   Tcl_Obj *oN    
141d0 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33     = objv[objc-3
141e0 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53  ];.  Tcl_Obj *oS
141f0 74 72 69 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f 62  tring  = objv[ob
14200 6a 63 2d 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a  jc-2];.  Tcl_Obj
14210 20 2a 6f 42 79 74 65 73 20 20 20 3d 20 6f 62 6a   *oBytes   = obj
14220 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66  v[objc-1];..  if
14230 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
14240 63 21 3d 36 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c!=6){.    Tcl_A
14250 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
14260 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
14270 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
14280 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
14290 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
142a0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
142b0 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53  MT N VALUE BYTES
142c0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
142d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
142e0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
142f0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
14300 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 53 74  cl_GetString(oSt
14310 6d 74 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  mt), &pStmt) ) r
14320 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14330 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
14340 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
14350 20 6f 4e 2c 20 26 69 64 78 29 20 29 20 72 65 74   oN, &idx) ) ret
14360 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14370 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29   value = (char*)
14380 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
14390 46 72 6f 6d 4f 62 6a 28 6f 53 74 72 69 6e 67 2c  FromObj(oString,
143a0 20 30 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47   0);.  if( Tcl_G
143b0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
143c0 65 72 70 2c 20 6f 42 79 74 65 73 2c 20 26 62 79  erp, oBytes, &by
143d0 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
143e0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
143f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
14400 78 74 31 36 28 70 53 74 6d 74 2c 20 69 64 78 2c  xt16(pStmt, idx,
14410 20 28 76 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20   (void *)value, 
14420 62 79 74 65 73 2c 20 78 44 65 6c 29 3b 0a 20 20  bytes, xDel);.  
14430 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
14440 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
14450 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
14460 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
14470 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
14480 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14490 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
144a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
144b0 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65  te3TestErrorName
144c0 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
144d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
144e0 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53    }..#endif /* S
144f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
14500 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
14510 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
14520 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
14530 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74 61 74 69  ind_blob ?-stati
14540 63 3f 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42  c? STMT N DATA B
14550 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
14560 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
14570 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e  _blob interface.
14580 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
14590 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
145a0 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
145b0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
145c0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
145d0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
145e0 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
145f0 73 20 61 20 42 4c 4f 42 20 74 6f 20 74 68 65 20  s a BLOB to the 
14600 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 42  wildcard.  The B
14610 4c 4f 42 20 69 73 20 42 59 54 45 53 20 62 79 74  LOB is BYTES byt
14620 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
14630 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
14640 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64  ind_blob(.  void
14650 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
14660 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
14670 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
14680 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
14690 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
146a0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
146b0 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
146c0 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
146d0 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
146e0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 65  rc;.  sqlite3_de
146f0 73 74 72 75 63 74 6f 72 5f 74 79 70 65 20 78 44  structor_type xD
14700 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49  estructor = SQLI
14710 54 45 5f 54 52 41 4e 53 49 45 4e 54 3b 0a 0a 20  TE_TRANSIENT;.. 
14720 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
14730 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20 54  objc!=6 ){.    T
14740 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
14750 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
14760 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
14770 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
14780 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
14790 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
147a0 22 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59  " STMT N DATA BY
147b0 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TES", 0);.    re
147c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
147d0 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d    }..  if( objc=
147e0 3d 36 20 29 7b 0a 20 20 20 20 78 44 65 73 74 72  =6 ){.    xDestr
147f0 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 53  uctor = SQLITE_S
14800 54 41 54 49 43 3b 0a 20 20 20 20 6f 62 6a 76 2b  TATIC;.    objv+
14810 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  +;.  }..  if( ge
14820 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
14830 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
14840 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
14850 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
14860 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
14870 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
14880 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
14890 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
148a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61   TCL_ERROR;.  va
148b0 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  lue = Tcl_GetStr
148c0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
148d0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
148e0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
148f0 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[4], &bytes) )
14900 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14910 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
14920 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
14930 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20  mt, idx, value, 
14940 62 79 74 65 73 2c 20 78 44 65 73 74 72 75 63 74  bytes, xDestruct
14950 6f 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  or);.  if( sqlit
14960 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
14970 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
14980 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
14990 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
149a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
149b0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
149c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
149d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
149e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
149f0 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
14a00 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
14a10 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74    STMT.**.** Ret
14a20 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
14a30 66 20 77 69 6c 64 63 61 72 64 73 20 69 6e 20 74  f wildcards in t
14a40 68 65 20 67 69 76 65 6e 20 73 74 61 74 65 6d 65  he given stateme
14a50 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
14a60 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61  t test_bind_para
14a70 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76  meter_count(.  v
14a80 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
14a90 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
14aa0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
14ab0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
14ac0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
14ad0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
14ae0 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
14af0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
14b00 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
14b10 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
14b20 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
14b30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
14b40 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
14b50 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
14b60 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
14b70 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
14b80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14b90 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
14ba0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
14bb0 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
14bc0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
14bd0 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  r_count(pStmt)))
14be0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
14bf0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
14c00 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
14c10 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
14c20 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20    STMT  N.**.** 
14c30 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
14c40 6f 66 20 74 68 65 20 4e 74 68 20 77 69 6c 64 63  of the Nth wildc
14c50 61 72 64 2e 20 20 54 68 65 20 66 69 72 73 74 20  ard.  The first 
14c60 77 69 6c 64 63 61 72 64 20 69 73 20 31 2e 0a 2a  wildcard is 1..*
14c70 2a 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  * An empty strin
14c80 67 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  g is returned if
14c90 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   N is out of ran
14ca0 67 65 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c  ge or if the wil
14cb0 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65  dcard.** is name
14cc0 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
14cd0 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  int test_bind_pa
14ce0 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20  rameter_name(.  
14cf0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
14d00 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
14d10 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
14d20 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
14d30 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
14d40 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
14d50 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  pStmt;.  int i;.
14d60 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
14d70 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
14d80 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
14d90 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22  , objv, "STMT N"
14da0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
14db0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
14dc0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
14dd0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
14de0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
14df0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
14e00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14e10 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
14e20 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
14e30 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20 72 65 74  jv[2], &i) ) ret
14e40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14e50 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
14e60 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  t(interp, .     
14e70 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14e80 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  (sqlite3_bind_pa
14e90 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74  rameter_name(pSt
14ea0 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20  mt,i),-1).  );. 
14eb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
14ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
14ed0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
14ee0 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 20 20  arameter_index  
14ef0 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a  STMT  NAME.**.**
14f00 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
14f10 78 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  x of the wildcar
14f20 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  d called NAME.  
14f30 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
14f40 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  e is.** no such 
14f50 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
14f60 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
14f70 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
14f80 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  x(.  void * clie
14f90 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
14fa0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
14fb0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
14fc0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
14fd0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
14fe0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
14ff0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
15000 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
15010 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
15020 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22 29  jv, "STMT NAME")
15030 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
15040 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
15050 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
15060 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
15070 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
15080 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
15090 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
150a0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
150b0 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
150c0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20  l_NewIntObj(.   
150d0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
150e0 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
150f0 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74  (pStmt,Tcl_GetSt
15100 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20  ring(objv[2])). 
15110 20 20 20 20 29 0a 20 20 29 3b 0a 20 20 72 65 74      ).  );.  ret
15120 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
15130 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
15140 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
15150 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a  ings STMT.**.*/.
15160 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
15170 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a  clear_bindings(.
15180 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
15190 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
151a0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
151b0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
151c0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
151d0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
151e0 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
151f0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
15200 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
15210 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
15220 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
15230 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15240 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
15250 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
15260 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15270 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
15280 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15290 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
152a0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
152b0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
152c0 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
152d0 69 6e 67 73 28 70 53 74 6d 74 29 29 29 3b 0a 20  ings(pStmt)));. 
152e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
152f0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
15300 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20    sqlite3_sleep 
15310 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a  MILLISECONDS.*/.
15320 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
15330 73 6c 65 65 70 28 0a 20 20 76 6f 69 64 20 2a 20  sleep(.  void * 
15340 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
15350 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
15360 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
15370 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
15380 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d  bjv[].){.  int m
15390 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  s;..  if( objc!=
153a0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
153b0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
153c0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c  , 1, objv, "MILL
153d0 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20  ISECONDS");.    
153e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
153f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
15400 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
15410 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
15420 6d 73 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ms) ){.    retur
15430 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
15440 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
15450 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
15460 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
15470 33 5f 73 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20  3_sleep(ms)));. 
15480 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
15490 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
154a0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20  sqlite3_errcode 
154b0 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
154c0 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
154d0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
154e0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
154f0 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72  ite3_* API.** er
15500 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22  ror code. e.g. "
15510 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a  SQLITE_ERROR"..*
15520 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
15530 74 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69  t_errcode(.  voi
15540 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
15550 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15560 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
15570 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
15580 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
15590 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
155a0 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75  t rc;.  char zBu
155b0 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  f[30];..  if( ob
155c0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
155d0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
155e0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
155f0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
15600 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
15610 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
15620 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
15630 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15640 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
15650 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
15660 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
15670 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
15680 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15690 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
156a0 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
156b0 0a 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29  .  if( (rc&0xff)
156c0 3d 3d 72 63 20 29 7b 0a 20 20 20 20 7a 42 75 66  ==rc ){.    zBuf
156d0 5b 30 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  [0] = 0;.  }else
156e0 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  {.    sprintf(zB
156f0 75 66 2c 22 2b 25 64 22 2c 20 72 63 3e 3e 38 29  uf,"+%d", rc>>8)
15700 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65  ;.  }.  Tcl_Appe
15710 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
15720 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
15730 4e 61 6d 65 28 72 63 29 2c 20 7a 42 75 66 2c 20  Name(rc), zBuf, 
15740 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
15750 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
15760 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d  age:   test_errm
15770 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  sg DB.**.** Retu
15780 72 6e 73 20 74 68 65 20 55 54 46 2d 38 20 72 65  rns the UTF-8 re
15790 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
157a0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
157b0 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  e string for the
157c0 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  .** most recent 
157d0 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61  sqlite3_* API ca
157e0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
157f0 74 20 74 65 73 74 5f 65 72 72 6d 73 67 28 0a 20  t test_errmsg(. 
15800 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
15810 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
15820 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
15830 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
15840 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
15850 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
15860 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
15870 72 72 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rr;..  if( objc!
15880 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
15890 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
158a0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
158b0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
158c0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
158d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
158e0 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
158f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15900 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
15910 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
15920 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15930 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
15940 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15950 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69  ;..  zErr = sqli
15960 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a  te3_errmsg(db);.
15970 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
15980 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
15990 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72  ewStringObj(zErr
159a0 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e  , -1));.  return
159b0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
159c0 2a 20 55 73 61 67 65 3a 20 20 20 74 65 73 74 5f  * Usage:   test_
159d0 65 72 72 6d 73 67 31 36 20 44 42 0a 2a 2a 0a 2a  errmsg16 DB.**.*
159e0 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54  * Returns the UT
159f0 46 2d 31 36 20 72 65 70 72 65 73 65 6e 74 61 74  F-16 representat
15a00 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72  ion of the error
15a10 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20   message string 
15a20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  for the.** most 
15a30 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a  recent sqlite3_*
15a40 20 41 50 49 20 63 61 6c 6c 2e 20 54 68 69 73 20   API call. This 
15a50 69 73 20 61 20 62 79 74 65 20 61 72 72 61 79 20  is a byte array 
15a60 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 54 43  object at the TC
15a70 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e 64  L .** level, and
15a80 20 69 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65   it includes the
15a90 20 30 78 30 30 20 30 78 30 30 20 74 65 72 6d 69   0x00 0x00 termi
15aa0 6e 61 74 6f 72 20 62 79 74 65 73 20 61 74 20 74  nator bytes at t
15ab0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
15ac0 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a   UTF-16 string..
15ad0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
15ae0 73 74 5f 65 72 72 6d 73 67 31 36 28 0a 20 20 76  st_errmsg16(.  v
15af0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15b00 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15b10 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15b20 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15b30 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
15b40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15b50 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
15b60 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
15b70 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20 20 69 6e  void *zErr;.  in
15b80 74 20 62 79 74 65 73 20 3d 20 30 3b 0a 0a 20 20  t bytes = 0;..  
15b90 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
15ba0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
15bb0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
15bc0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
15bd0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
15be0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
15bf0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c  objv[0]), " DB",
15c00 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
15c10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
15c20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
15c30 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
15c40 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
15c50 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
15c60 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45  TCL_ERROR;..  zE
15c70 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rr = sqlite3_err
15c80 6d 73 67 31 36 28 64 62 29 3b 0a 20 20 69 66 28  msg16(db);.  if(
15c90 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 62 79 74   zErr ){.    byt
15ca0 65 73 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31  es = sqlite3Utf1
15cb0 36 42 79 74 65 4c 65 6e 28 7a 45 72 72 2c 20 2d  6ByteLen(zErr, -
15cc0 31 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65  1);.  }.  Tcl_Se
15cd0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
15ce0 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  p, Tcl_NewByteAr
15cf0 72 61 79 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74  rayObj(zErr, byt
15d00 65 73 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  es));.#endif /* 
15d10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
15d20 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
15d30 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
15d40 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
15d50 65 70 61 72 65 20 44 42 20 73 71 6c 20 62 79 74  epare DB sql byt
15d60 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a  es tailvar.**.**
15d70 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c   Compile up to <
15d80 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20  bytes> bytes of 
15d90 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c  the supplied SQL
15da0 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73   string <sql> us
15db0 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
15dc0 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65  handle <DB>. The
15dd0 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c   parameter <tail
15de0 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65  val> is the name
15df0 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20   of a global.** 
15e00 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73  variable that is
15e10 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73   set to the unus
15e20 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73  ed portion of <s
15e30 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a  ql> (if any). A.
15e40 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69  ** STMT handle i
15e50 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
15e60 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
15e70 72 65 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a  repare(.  void *
15e80 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
15e90 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
15ea0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
15eb0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
15ec0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
15ed0 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
15ee0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
15ef0 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73  nt bytes;.  cons
15f00 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20  t char *zTail = 
15f10 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
15f20 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
15f30 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
15f40 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
15f50 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  objc!=5 ){.    T
15f60 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15f70 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
15f80 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
15f90 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
15fa0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
15fb0 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
15fc0 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30  ytes tailvar", 0
15fd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
15fe0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
15ff0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
16000 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
16010 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
16020 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
16030 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20  L_ERROR;.  zSql 
16040 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
16050 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
16060 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
16070 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
16080 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
16090 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
160a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
160b0 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c  repare(db, zSql,
160c0 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
160d0 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28 20 73  &zTail);.  if( s
160e0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
160f0 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
16100 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16110 52 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61 69  RROR;.  if( zTai
16120 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74  l ){.    if( byt
16130 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  es>=0 ){.      b
16140 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28  ytes = bytes - (
16150 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20  zTail-zSql);.   
16160 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 6c 65   }.    if( strle
16170 6e 28 7a 54 61 69 6c 29 3c 62 79 74 65 73 20 29  n(zTail)<bytes )
16180 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20  {.      bytes = 
16190 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a 20  strlen(zTail);. 
161a0 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a     }.    Tcl_Obj
161b0 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
161c0 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f  objv[4], 0, Tcl_
161d0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61  NewStringObj(zTa
161e0 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a  il, bytes), 0);.
161f0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
16200 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
16210 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20  ssert( pStmt==0 
16220 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
16230 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63  Buf, "(%d) ", rc
16240 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
16250 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16260 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72  zBuf, sqlite3_er
16270 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
16280 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
16290 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
162a0 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
162b0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
162c0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
162d0 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
162e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
162f0 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
16300 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16310 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
16320 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
16330 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
16340 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
16350 32 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  2 DB sql bytes t
16360 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ailvar.**.** Com
16370 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65  pile up to <byte
16380 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  s> bytes of the 
16390 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72  supplied SQL str
163a0 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a  ing <sql> using.
163b0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
163c0 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72  le <DB>. The par
163d0 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e  ameter <tailval>
163e0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
163f0 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69  a global.** vari
16400 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74  able that is set
16410 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70   to the unused p
16420 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20  ortion of <sql> 
16430 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53  (if any). A.** S
16440 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65  TMT handle is re
16450 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
16460 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61  c int test_prepa
16470 72 65 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20  re_v2(.  void * 
16480 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
16490 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
164a0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
164b0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
164c0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
164d0 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
164e0 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
164f0 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74  t bytes;.  const
16500 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30   char *zTail = 0
16510 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
16520 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
16530 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
16540 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
16550 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
16560 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16570 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
16580 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
16590 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
165a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
165b0 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79  0]), " DB sql by
165c0 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29  tes tailvar", 0)
165d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
165e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
165f0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
16600 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
16610 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
16620 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
16630 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d  _ERROR;.  zSql =
16640 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
16650 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[2]);.  if( T
16660 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
16670 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
16680 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
16690 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
166a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
166b0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
166c0 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74  l, bytes, &pStmt
166d0 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20 61 73 73  , &zTail);.  ass
166e0 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
166f0 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a  K || pStmt==0);.
16700 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
16710 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
16720 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
16730 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
16740 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20  f( zTail ){.    
16750 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a  if( bytes>=0 ){.
16760 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79        bytes = by
16770 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53 71  tes - (zTail-zSq
16780 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  l);.    }.    Tc
16790 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
167a0 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c  erp, objv[4], 0,
167b0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
167c0 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c  j(zTail, bytes),
167d0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
167e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
167f0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d      assert( pStm
16800 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69  t==0 );.    spri
16810 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20  ntf(zBuf, "(%d) 
16820 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f  ", rc);.    Tcl_
16830 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16840 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74  erp, zBuf, sqlit
16850 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
16860 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16870 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
16880 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
16890 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
168a0 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
168b0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
168c0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
168d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
168e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
168f0 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
16900 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
16910 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
16920 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
16930 61 72 65 5f 74 6b 74 33 31 33 34 20 44 42 0a 2a  are_tkt3134 DB.*
16940 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
16950 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
16960 6e 74 20 66 6f 72 20 61 20 7a 65 72 6f 2d 62 79  nt for a zero-by
16970 74 65 20 73 74 72 69 6e 67 20 61 73 20 61 20 74  te string as a t
16980 65 73 74 0a 2a 2a 20 66 6f 72 20 74 69 63 6b 65  est.** for ticke
16990 74 20 23 33 31 33 34 2e 20 20 54 68 65 20 73 74  t #3134.  The st
169a0 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 70  ring should be p
169b0 72 65 63 65 65 64 65 64 20 62 79 20 61 20 7a 65  receeded by a ze
169c0 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  ro byte..*/.stat
169d0 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70  ic int test_prep
169e0 61 72 65 5f 74 6b 74 33 31 33 34 28 0a 20 20 76  are_tkt3134(.  v
169f0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16a00 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16a10 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16a20 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16a30 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
16a40 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
16a50 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
16a60 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c 30 30 30  r zSql[] = "\000
16a70 53 45 4c 45 43 54 20 31 22 3b 0a 20 20 73 71 6c  SELECT 1";.  sql
16a80 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
16a90 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
16aa0 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  f[50];.  int rc;
16ab0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
16ac0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
16ad0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16ae0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
16af0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
16b00 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
16b10 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
16b20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69  DB sql bytes tai
16b30 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72  lvar", 0);.    r
16b40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16b50 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
16b60 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
16b70 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
16b80 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
16b90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16ba0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
16bb0 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 26  prepare_v2(db, &
16bc0 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20 26 70 53 74  zSql[1], 0, &pSt
16bd0 6d 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  mt, 0);.  assert
16be0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc==SQLITE_OK |
16bf0 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69  | pStmt==0);.  i
16c00 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
16c10 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
16c20 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
16c30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
16c40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16c50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
16c60 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70 72  mt==0 );.    spr
16c70 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29  intf(zBuf, "(%d)
16c80 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c   ", rc);.    Tcl
16c90 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16ca0 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69  terp, zBuf, sqli
16cb0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
16cc0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
16cd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
16ce0 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
16cf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
16d00 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
16d10 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
16d20 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
16d30 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c  L_ERROR;.    Tcl
16d40 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16d50 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
16d60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
16d70 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
16d80 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
16d90 70 61 72 65 31 36 20 44 42 20 73 71 6c 20 62 79  pare16 DB sql by
16da0 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a  tes tailvar.**.*
16db0 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
16dc0 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
16dd0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
16de0 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
16df0 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
16e00 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
16e10 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
16e20 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
16e30 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
16e40 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
16e50 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
16e60 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
16e70 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
16e80 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
16e90 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
16ea0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
16eb0 70 72 65 70 61 72 65 31 36 28 0a 20 20 76 6f 69  prepare16(.  voi
16ec0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
16ed0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
16ee0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
16ef0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
16f00 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
16f10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16f20 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
16f30 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   *db;.  const vo
16f40 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73  id *zSql;.  cons
16f50 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20  t void *zTail = 
16f60 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54  0;.  Tcl_Obj *pT
16f70 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
16f80 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
16f90 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
16fa0 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a  50]; .  int rc;.
16fb0 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20    int bytes;    
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16fd0 68 65 20 69 6e 74 65 67 65 72 20 73 70 65 63 69  he integer speci
16fe0 66 69 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f  fied as arg 3 */
16ff0 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20  .  int objlen;  
17000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17010 54 68 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c  The byte-array l
17020 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a  ength of arg 2 *
17030 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  /..  if( objc!=5
17040 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
17050 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
17060 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
17070 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
17080 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
17090 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
170a0 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
170b0 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20  ilvar", 0);.    
170c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
170d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
170e0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
170f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
17100 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
17110 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17120 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
17130 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
17140 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a  bj(objv[2], &obj
17150 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  len);.  if( Tcl_
17160 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
17170 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
17180 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
17190 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
171a0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
171b0 72 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c 20 62  re16(db, zSql, b
171c0 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 26 7a  ytes, &pStmt, &z
171d0 54 61 69 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c  Tail);.  if( sql
171e0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
171f0 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
17200 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17210 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  OR;.  if( rc ){.
17220 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17230 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
17240 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 6f 62   zTail ){.    ob
17250 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20  jlen = objlen - 
17260 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38  ((u8 *)zTail-(u8
17270 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73   *)zSql);.  }els
17280 65 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  e{.    objlen = 
17290 30 3b 0a 20 20 7d 0a 20 20 70 54 61 69 6c 20 3d  0;.  }.  pTail =
172a0 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
172b0 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c  yObj((u8 *)zTail
172c0 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 54 63 6c  , objlen);.  Tcl
172d0 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _IncrRefCount(pT
172e0 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 53  ail);.  Tcl_ObjS
172f0 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
17300 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c  bjv[4], 0, pTail
17310 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
17320 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
17330 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
17340 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
17350 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
17360 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
17370 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
17380 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
17390 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
173a0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
173b0 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53   0);.#endif /* S
173c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
173d0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
173e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
173f0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
17400 70 61 72 65 31 36 5f 76 32 20 44 42 20 73 71 6c  pare16_v2 DB sql
17410 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a   bytes tailvar.*
17420 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
17430 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
17440 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
17450 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
17460 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
17470 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
17480 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
17490 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
174a0 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
174b0 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
174c0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
174d0 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
174e0 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
174f0 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
17500 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
17510 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
17520 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28  st_prepare16_v2(
17530 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
17540 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
17550 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
17560 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
17570 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
17580 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
17590 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
175a0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
175b0 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a  nst void *zSql;.
175c0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54    const void *zT
175d0 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f  ail = 0;.  Tcl_O
175e0 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20  bj *pTail = 0;. 
175f0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17600 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
17610 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e   zBuf[50]; .  in
17620 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65  t rc;.  int byte
17630 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
17640 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72    /* The integer
17650 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61 72   specified as ar
17660 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  g 3 */.  int obj
17670 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
17680 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61     /* The byte-a
17690 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61  rray length of a
176a0 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  rg 2 */..  if( o
176b0 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
176c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
176d0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
176e0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
176f0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
17700 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
17710 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79  0]), " DB sql by
17720 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29  tes tailvar", 0)
17730 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
17740 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
17750 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
17760 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
17770 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
17780 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
17790 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d  _ERROR;.  zSql =
177a0 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
177b0 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
177c0 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66  , &objlen);.  if
177d0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
177e0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
177f0 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
17800 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17810 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
17820 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 64 62  _prepare16_v2(db
17830 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26  , zSql, bytes, &
17840 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a  pStmt, &zTail);.
17850 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
17860 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
17870 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
17880 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
17890 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
178a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
178b0 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61 69 6c 20   }..  if( zTail 
178c0 29 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  ){.    objlen = 
178d0 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20 2a 29  objlen - ((u8 *)
178e0 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c  zTail-(u8 *)zSql
178f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17900 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  objlen = 0;.  }.
17910 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65    pTail = Tcl_Ne
17920 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75  wByteArrayObj((u
17930 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65  8 *)zTail, objle
17940 6e 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  n);.  Tcl_IncrRe
17950 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20  fCount(pTail);. 
17960 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
17970 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
17980 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20   0, pTail, 0);. 
17990 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
179a0 74 28 70 54 61 69 6c 29 3b 0a 0a 20 20 69 66 28  t(pTail);..  if(
179b0 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
179c0 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
179d0 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
179e0 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
179f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17a00 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41  ROR;.  }.  Tcl_A
17a10 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
17a20 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65  rp, zBuf, 0);.#e
17a30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
17a40 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72  MIT_UTF16 */.  r
17a50 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
17a60 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
17a70 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e  lite3_open filen
17a80 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73  ame ?options-lis
17a90 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t?.*/.static int
17aa0 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f   test_open(.  vo
17ab0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
17ac0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
17ad0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
17ae0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
17af0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
17b00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
17b10 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  ename;.  sqlite3
17b20 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
17b30 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
17b40 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
17b50 20 26 26 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f   && objc!=2 && o
17b60 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
17b70 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
17b80 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
17b90 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
17ba0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
17bb0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
17bc0 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20  0]), " filename 
17bd0 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30  options-list", 0
17be0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17bf0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
17c00 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63  zFilename = objc
17c10 3e 31 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69  >1 ? Tcl_GetStri
17c20 6e 67 28 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b  ng(objv[1]) : 0;
17c30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
17c40 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
17c50 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73  &db);.  .  if( s
17c60 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
17c70 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
17c80 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74   zBuf, db) ) ret
17c90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17ca0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
17cb0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
17cc0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
17cd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
17ce0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65  age: sqlite3_ope
17cf0 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  n16 filename opt
17d00 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ions.*/.static i
17d10 6e 74 20 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a  nt test_open16(.
17d20 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17d30 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17d40 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17d50 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17d60 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17d70 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
17d80 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 63 6f  _OMIT_UTF16.  co
17d90 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e  nst void *zFilen
17da0 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ame;.  sqlite3 *
17db0 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
17dc0 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
17dd0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
17de0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
17df0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
17e00 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
17e10 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
17e20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
17e30 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66  ng(objv[0]), " f
17e40 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d  ilename options-
17e50 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72  list", 0);.    r
17e60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17e70 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d  .  }..  zFilenam
17e80 65 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  e = Tcl_GetByteA
17e90 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
17ea0 5b 31 5d 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20  [1], 0);.  rc = 
17eb0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a  sqlite3_open16(z
17ec0 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a  Filename, &db);.
17ed0 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33    .  if( sqlite3
17ee0 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
17ef0 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
17f00 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   db) ) return TC
17f10 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41  L_ERROR;.  Tcl_A
17f20 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
17f30 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65  rp, zBuf, 0);.#e
17f40 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
17f50 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72  MIT_UTF16 */.  r
17f60 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
17f70 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
17f80 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36  lite3_complete16
17f90 20 3c 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e   <UTF-16 string>
17fa0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
17fb0 69 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  if the supplied 
17fc0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f  argument is a co
17fd0 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
17fe0 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a  ment, or zero.**
17ff0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
18000 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
18010 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69  omplete16(.  voi
18020 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
18030 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18040 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18050 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
18060 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
18070 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
18080 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20  _OMIT_COMPLETE) 
18090 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
180a0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20  TE_OMIT_UTF16). 
180b0 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20   char *zBuf;..  
180c0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
180d0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
180e0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
180f0 62 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71  bjv, "<utf-16 sq
18100 6c 3e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  l>");.    return
18110 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18120 0a 20 20 7a 42 75 66 20 3d 20 28 63 68 61 72 2a  .  zBuf = (char*
18130 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61  )Tcl_GetByteArra
18140 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  yFromObj(objv[1]
18150 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  , 0);.  Tcl_SetO
18160 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
18170 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
18180 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31  qlite3_complete1
18190 36 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64 69  6(zBuf)));.#endi
181a0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
181b0 5f 43 4f 4d 50 4c 45 54 45 20 26 26 20 53 51 4c  _COMPLETE && SQL
181c0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
181d0 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
181e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
181f0 65 3a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20  e: sqlite3_step 
18200 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e  STMT.**.** Advan
18210 63 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ce the statement
18220 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
18230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18240 74 65 73 74 5f 73 74 65 70 28 0a 20 20 76 6f 69  test_step(.  voi
18250 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
18260 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18270 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18280 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
18290 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
182a0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
182b0 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
182c0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
182d0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
182e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
182f0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
18300 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
18310 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
18320 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
18330 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
18340 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18350 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
18360 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
18370 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18380 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
18390 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
183a0 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
183b0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
183c0 0a 20 20 2f 2a 20 69 66 28 20 72 63 21 3d 53 51  .  /* if( rc!=SQ
183d0 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72 63 21  LITE_DONE && rc!
183e0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 72 65  =SQLITE_ROW ) re
183f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20  turn TCL_ERROR; 
18400 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  */.  Tcl_SetResu
18410 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
18420 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
18430 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
18440 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
18450 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
18460 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54  _column_count ST
18470 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  MT .**.** Return
18480 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
18490 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
184a0 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65  by the sql state
184b0 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74  ment STMT..*/.st
184c0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
184d0 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f  lumn_count(.  vo
184e0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
184f0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
18500 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
18510 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
18520 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
18530 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
18540 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
18550 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
18560 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18570 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
18580 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
18590 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
185a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
185b0 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
185c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
185d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
185e0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
185f0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
18600 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
18610 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
18620 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18630 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
18640 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
18650 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
18660 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
18670 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74  (pStmt)));.  ret
18680 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
18690 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
186a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20  te3_column_type 
186b0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
186c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70  * Return the typ
186d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e  e of the data in
186e0 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
186f0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
18700 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
18710 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74  nt test_column_t
18720 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ype(.  void * cl
18730 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
18740 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
18750 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
18760 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
18770 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
18780 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
18790 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74  int col;.  int t
187a0 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  p;..  if( objc!=
187b0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
187c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
187d0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
187e0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
187f0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
18800 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
18810 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
18820 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
18830 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
18840 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
18850 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
18860 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
18870 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
18880 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18890 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
188a0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
188b0 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
188c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
188d0 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74  R;..  tp = sqlit
188e0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
188f0 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77  Stmt, col);.  sw
18900 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20  itch( tp ){.    
18910 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
18920 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f  GER: .      Tcl_
18930 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
18940 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c  , "INTEGER", TCL
18950 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
18960 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
18970 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20   SQLITE_NULL:.  
18980 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
18990 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22  t(interp, "NULL"
189a0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
189b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
189c0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
189d0 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  AT:.      Tcl_Se
189e0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
189f0 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41  "FLOAT", TCL_STA
18a00 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
18a10 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
18a20 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  ITE_TEXT:.      
18a30 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
18a40 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43  terp, "TEXT", TC
18a50 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
18a60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
18a70 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20  e SQLITE_BLOB:. 
18a80 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
18a90 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42  lt(interp, "BLOB
18aa0 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
18ab0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18ac0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
18ad0 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a   assert(0);.  }.
18ae0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
18af0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
18b00 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
18b10 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75  _int64 STMT colu
18b20 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
18b30 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75  the data in colu
18b40 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74  mn 'column' of t
18b50 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63  he current row c
18b60 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64  ast as an.** wid
18b70 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67  e (64-bit) integ
18b80 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
18b90 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e  t test_column_in
18ba0 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t64(.  void * cl
18bb0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
18bc0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
18bd0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
18be0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
18bf0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
18c00 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
18c10 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69  int col;.  i64 i
18c20 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Val;..  if( objc
18c30 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
18c40 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18c50 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
18c60 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
18c70 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
18c80 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
18c90 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
18ca0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18cb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18cc0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
18cd0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
18ce0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
18cf0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
18d00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18d10 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
18d20 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
18d30 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
18d40 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18d50 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73  ROR;..  iVal = s
18d60 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
18d70 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  t64(pStmt, col);
18d80 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
18d90 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
18da0 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56  NewWideIntObj(iV
18db0 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  al));.  return T
18dc0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
18dd0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
18de0 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20  olumn_blob STMT 
18df0 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
18e00 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
18e10 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20  _blob(.  void * 
18e20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18e30 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18e40 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18e50 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18e60 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18e70 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
18e80 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e    int col;..  in
18e90 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76  t len;.  const v
18ea0 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69  oid *pBlob;..  i
18eb0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
18ec0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
18ed0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
18ee0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
18ef0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
18f00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18f10 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
18f20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
18f30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18f40 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
18f50 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
18f60 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
18f70 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
18f80 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
18f90 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
18fa0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
18fb0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
18fc0 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
18fd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 6c   TCL_ERROR;..  l
18fe0 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  en = sqlite3_col
18ff0 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
19000 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d   col);.  pBlob =
19010 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
19020 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f 6c 29  blob(pStmt, col)
19030 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
19040 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
19050 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
19060 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20  (pBlob, len));. 
19070 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
19080 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
19090 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
190a0 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d  ouble STMT colum
190b0 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
190c0 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d  he data in colum
190d0 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68  n 'column' of th
190e0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61  e current row ca
190f0 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a  st as a double..
19100 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
19110 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  st_column_double
19120 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
19130 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
19140 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
19150 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
19160 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
19170 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
19180 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
19190 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72   col;.  double r
191a0 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Val;..  if( objc
191b0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
191c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
191d0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
191e0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
191f0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
19200 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
19210 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
19220 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
19230 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19240 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
19250 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
19260 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19270 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
19280 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19290 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
192a0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
192b0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
192c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
192d0 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73  ROR;..  rVal = s
192e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
192f0 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29  uble(pStmt, col)
19300 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
19310 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
19320 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56  _NewDoubleObj(rV
19330 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  al));.  return T
19340 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
19350 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64  Usage: sqlite3_d
19360 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a  ata_count STMT .
19370 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
19380 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
19390 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ns returned by t
193a0 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74  he sql statement
193b0 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63   STMT..*/.static
193c0 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61 5f 63   int test_data_c
193d0 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  ount(.  void * c
193e0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
193f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
19400 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
19410 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
19420 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
19430 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
19440 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
19450 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
19460 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
19470 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
19480 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
19490 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
194a0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
194b0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
194c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
194d0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
194e0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
194f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
19500 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
19510 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
19520 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54   TCL_ERROR;..  T
19530 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
19540 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
19550 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61  ntObj(sqlite3_da
19560 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29  ta_count(pStmt))
19570 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
19580 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
19590 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
195a0 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c  mn_text STMT col
195b0 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
195c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
195d0 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f  decltype STMT co
195e0 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
195f0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
19600 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d  _name STMT colum
19610 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
19620 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a  test_stmt_utf8(.
19630 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
19640 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ata,        /* P
19650 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65  ointer to SQLite
19660 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f   API function to
19670 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20   be invoke */.  
19680 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
19690 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
196a0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
196b0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
196c0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
196d0 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63  ;.  int col;.  c
196e0 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75  onst char *(*xFu
196f0 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
19700 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73 74  *, int);.  const
19710 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20   char *zRet;..  
19720 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 63  xFunc = (const c
19730 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74 65 33  har *(*)(sqlite3
19740 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69  _stmt*, int))cli
19750 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f  entData;.  if( o
19760 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
19770 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
19780 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
19790 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
197a0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
197b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
197c0 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
197d0 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
197e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
197f0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
19800 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
19810 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19820 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
19830 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19840 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
19850 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
19860 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
19870 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
19880 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d  _ERROR;.  zRet =
19890 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
198a0 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29  l);.  if( zRet )
198b0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
198c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
198d0 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20  r *)zRet, 0);.  
198e0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
198f0 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
19900 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63   test_global_rec
19910 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  over(.  void * c
19920 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
19930 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
19940 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
19950 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
19960 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
19970 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42  SQLITE_OMIT_GLOB
19980 41 4c 52 45 43 4f 56 45 52 0a 20 20 69 6e 74 20  ALRECOVER.  int 
19990 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  rc;.  if( objc!=
199a0 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
199b0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
199c0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 1, objv, "");.
199d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
199e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
199f0 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
19a00 72 65 63 6f 76 65 72 28 29 3b 0a 20 20 54 63 6c  recover();.  Tcl
19a10 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
19a20 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
19a30 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
19a40 53 54 41 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a  STATIC);.#endif.
19a50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
19a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
19a70 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
19a80 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  text STMT column
19a90 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
19aa0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
19ab0 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d  ltype STMT colum
19ac0 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
19ad0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
19ae0 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  me STMT column.*
19af0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
19b00 74 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a 20 20  t_stmt_utf16(.  
19b10 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
19b20 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  a,     /* Pointe
19b30 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20  r to SQLite API 
19b40 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
19b50 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  nvoked */.  Tcl_
19b60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19b70 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19b80 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
19b90 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
19ba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
19bb0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
19bc0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
19bd0 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  l;.  Tcl_Obj *pR
19be0 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  et;.  const void
19bf0 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e   *zName16;.  con
19c00 73 74 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63  st void *(*xFunc
19c10 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
19c20 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20   int);..  xFunc 
19c30 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28  = (const void *(
19c40 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  *)(sqlite3_stmt*
19c50 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74  , int))clientDat
19c60 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  a;.  if( objc!=3
19c70 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
19c80 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
19c90 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
19ca0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
19cb0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
19cc0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
19cd0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
19ce0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
19cf0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
19d00 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
19d10 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
19d20 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
19d30 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
19d40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19d50 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
19d60 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
19d70 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
19d80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19d90 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78  ;..  zName16 = x
19da0 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29  Func(pStmt, col)
19db0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 31 36 20  ;.  if( zName16 
19dc0 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 54 63  ){.    pRet = Tc
19dd0 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
19de0 6a 28 7a 4e 61 6d 65 31 36 2c 20 73 71 6c 69 74  j(zName16, sqlit
19df0 65 33 55 74 66 31 36 42 79 74 65 4c 65 6e 28 7a  e3Utf16ByteLen(z
19e00 4e 61 6d 65 31 36 2c 20 2d 31 29 2b 32 29 3b 0a  Name16, -1)+2);.
19e10 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
19e20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
19e30 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  t);.  }.#endif /
19e40 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
19e50 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  F16 */..  return
19e60 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
19e70 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
19e80 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d 54  _column_int STMT
19e90 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
19ea0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
19eb0 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54 20 63  umn_bytes STMT c
19ec0 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
19ed0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
19ee0 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54 20 63  n_bytes16 STMT c
19ef0 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  olumn.**.*/.stat
19f00 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
19f10 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  _int(.  void * c
19f20 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 2f 2a  lientData,    /*
19f30 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69   Pointer to SQLi
19f40 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  te API function 
19f50 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f  to be invoked */
19f60 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
19f70 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
19f80 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
19f90 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
19fa0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
19fb0 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
19fc0 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 73    int (*xFunc)(s
19fd0 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
19fe0 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28  t);..  xFunc = (
19ff0 69 6e 74 20 28 2a 29 28 73 71 6c 69 74 65 33 5f  int (*)(sqlite3_
1a000 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65  stmt*, int))clie
1a010 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62  ntData;.  if( ob
1a020 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1a030 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a040 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1a050 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1a060 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1a070 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1a080 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1a090 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1a0a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a0b0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1a0c0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1a0d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1a0e0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1a0f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a100 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1a110 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1a120 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
1a130 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
1a140 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65  ERROR;..  Tcl_Se
1a150 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1a160 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1a170 28 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f  (xFunc(pStmt, co
1a180 6c 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  l)));.  return T
1a190 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1a1a0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 73  Usage:  sqlite_s
1a1b0 65 74 5f 6d 61 67 69 63 20 20 44 42 20 20 4d 41  et_magic  DB  MA
1a1c0 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a  GIC-NUMBER.**.**
1a1d0 20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d 61 67   Set the db->mag
1a1e0 69 63 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  ic value.  This 
1a1f0 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
1a200 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79 20 6c  error recovery l
1a210 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ogic..*/.static 
1a220 69 6e 74 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d  int sqlite_set_m
1a230 61 67 69 63 28 0a 20 20 76 6f 69 64 20 2a 20 63  agic(.  void * c
1a240 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1a250 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1a260 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1a270 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1a280 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1a290 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
1a2a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1a2b0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1a2c0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1a2d0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1a2e0 2c 0a 20 20 20 20 20 20 20 20 20 22 20 44 42 20  ,.         " DB 
1a2f0 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20 20 20 20  MAGIC", 0);.    
1a300 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a310 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1a320 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1a330 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1a340 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a350 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  R;.  if( strcmp(
1a360 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45  argv[2], "SQLITE
1a370 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d 30  _MAGIC_OPEN")==0
1a380 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
1a390 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
1a3a0 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  _OPEN;.  }else i
1a3b0 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32  f( strcmp(argv[2
1a3c0 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43  ], "SQLITE_MAGIC
1a3d0 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b 0a  _CLOSED")==0 ){.
1a3e0 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
1a3f0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
1a400 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
1a410 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c   strcmp(argv[2],
1a420 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42   "SQLITE_MAGIC_B
1a430 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  USY")==0 ){.    
1a440 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
1a450 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
1a460 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1a470 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49  p(argv[2], "SQLI
1a480 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22 29  TE_MAGIC_ERROR")
1a490 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
1a4a0 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
1a4b0 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  GIC_ERROR;.  }el
1a4c0 73 65 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  se if( Tcl_GetIn
1a4d0 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
1a4e0 5d 2c 20 26 64 62 2d 3e 6d 61 67 69 63 29 20 29  ], &db->magic) )
1a4f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1a500 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
1a510 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1a520 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1a530 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 20  lite3_interrupt 
1a540 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67 67   DB .**.** Trigg
1a550 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20  er an interrupt 
1a560 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20  on DB.*/.static 
1a570 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72 72 75  int test_interru
1a580 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  pt(.  void * cli
1a590 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1a5a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1a5b0 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
1a5c0 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71  r **argv.){.  sq
1a5d0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
1a5e0 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
1a5f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a600 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a610 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a620 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1a630 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1a640 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a650 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1a660 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1a670 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1a680 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a690 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  ;.  sqlite3_inte
1a6a0 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72 65 74  rrupt(db);.  ret
1a6b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73  urn TCL_OK;.}..s
1a6c0 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69 74 65  tatic u8 *sqlite
1a6d0 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65  3_stack_baseline
1a6e0 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c   = 0;../*.** Fil
1a6f0 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69 74 68  l the stack with
1a700 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61 74 74   a known bitpatt
1a710 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ern..*/.static v
1a720 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28 76 6f  oid prepStack(vo
1a730 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  id){.  int i;.  
1a740 75 33 32 20 62 69 67 42 75 66 5b 36 35 35 33 36  u32 bigBuf[65536
1a750 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
1a760 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29 3b 20  sizeof(bigBuf); 
1a770 69 2b 2b 29 20 62 69 67 42 75 66 5b 69 5d 20 3d  i++) bigBuf[i] =
1a780 20 30 78 64 65 61 64 62 65 65 66 3b 0a 20 20 73   0xdeadbeef;.  s
1a790 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73  qlite3_stack_bas
1a7a0 65 6c 69 6e 65 20 3d 20 28 75 38 2a 29 26 62 69  eline = (u8*)&bi
1a7b0 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 7d 0a 0a  gBuf[65536];.}..
1a7c0 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 63 75  /*.** Get the cu
1a7d0 72 72 65 6e 74 20 73 74 61 63 6b 20 64 65 70 74  rrent stack dept
1a7e0 68 2e 20 20 55 73 65 64 20 66 6f 72 20 64 65 62  h.  Used for deb
1a7f0 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
1a800 75 36 34 20 73 71 6c 69 74 65 33 53 74 61 63 6b  u64 sqlite3Stack
1a810 44 65 70 74 68 28 76 6f 69 64 29 7b 0a 20 20 75  Depth(void){.  u
1a820 38 20 78 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  8 x;.  return (u
1a830 36 34 29 28 73 71 6c 69 74 65 33 5f 73 74 61 63  64)(sqlite3_stac
1a840 6b 5f 62 61 73 65 6c 69 6e 65 20 2d 20 26 78 29  k_baseline - &x)
1a850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1a860 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b  :  sqlite3_stack
1a870 5f 75 73 65 64 20 44 42 20 53 51 4c 0a 2a 2a 0a  _used DB SQL.**.
1a880 2a 2a 20 54 72 79 20 74 6f 20 6d 65 61 73 75 72  ** Try to measur
1a890 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
1a8a0 73 74 61 63 6b 20 73 70 61 63 65 20 75 73 65 64  stack space used
1a8b0 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   by a call to sq
1a8c0 6c 69 74 65 33 5f 65 78 65 63 0a 2a 2f 0a 73 74  lite3_exec.*/.st
1a8d0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
1a8e0 61 63 6b 5f 75 73 65 64 28 0a 20 20 76 6f 69 64  ack_used(.  void
1a8f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1a900 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1a910 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1a920 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1a930 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1a940 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1a950 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
1a960 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a970 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1a980 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1a990 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
1a9a0 20 20 20 20 20 20 20 20 22 20 44 42 20 53 51 4c          " DB SQL
1a9b0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1a9c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1a9d0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1a9e0 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1a9f0 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1aa00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1aa10 70 72 65 70 53 74 61 63 6b 28 29 3b 0a 20 20 28  prepStack();.  (
1aa20 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65  void)sqlite3_exe
1aa30 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30  c(db, argv[2], 0
1aa40 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69  , 0, 0);.  for(i
1aa50 3d 36 35 35 33 35 3b 20 69 3e 3d 30 20 26 26 20  =65535; i>=0 && 
1aa60 28 28 75 33 32 2a 29 73 71 6c 69 74 65 33 5f 73  ((u32*)sqlite3_s
1aa70 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 29 5b 2d  tack_baseline)[-
1aa80 69 5d 3d 3d 30 78 64 65 61 64 62 65 65 66 3b 20  i]==0xdeadbeef; 
1aa90 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53 65 74  i--){}.  Tcl_Set
1aaa0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1aab0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1aac0 69 2a 34 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  i*4));.  return 
1aad0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1aae0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64   Usage: sqlite_d
1aaf0 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44  elete_function D
1ab00 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 0a  B function-name.
1ab10 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  **.** Delete the
1ab20 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 27   user function '
1ab30 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27 20 66  function-name' f
1ab40 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e  rom database han
1ab50 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20 69 73  dle DB. It.** is
1ab60 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
1ab70 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  e user function 
1ab80 77 61 73 20 63 72 65 61 74 65 64 20 61 73 20 55  was created as U
1ab90 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65 72 20  TF8, any number 
1aba0 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  of.** arguments 
1abb0 28 74 68 65 20 77 61 79 20 74 68 65 20 54 43 4c  (the way the TCL
1abc0 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20   interface does 
1abd0 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  it)..*/.static i
1abe0 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e 63 74 69  nt delete_functi
1abf0 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  on(.  void * cli
1ac00 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1ac10 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1ac20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
1ac30 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  r **argv.){.  in
1ac40 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
1ac50 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
1ac60 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1ac70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1ac80 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1ac90 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1aca0 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
1acb0 20 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e     " DB function
1acc0 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20  -name", 0);.    
1acd0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ace0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1acf0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1ad00 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1ad10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ad20 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1ad30 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1ad40 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d  n(db, argv[2], -
1ad50 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
1ad60 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 54  0, 0, 0, 0);.  T
1ad70 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1ad80 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
1ad90 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
1ada0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
1adb0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1adc0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1add0 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74  te_delete_collat
1ade0 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69 6f 6e  ion DB collation
1adf0 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65  -name.**.** Dele
1ae00 74 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  te the collation
1ae10 20 73 65 71 75 65 6e 63 65 20 27 63 6f 6c 6c 61   sequence 'colla
1ae20 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20  tion-name' from 
1ae30 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1ae40 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73 20 61 73  .** DB. It is as
1ae50 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
1ae60 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1ae70 65 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73  e was created as
1ae80 20 55 54 46 38 20 28 74 68 65 20 0a 2a 2a 20 77   UTF8 (the .** w
1ae90 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  ay the TCL inter
1aea0 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a  face does it)..*
1aeb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c  /.static int del
1aec0 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ete_collation(. 
1aed0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1aee0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1aef0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1af00 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
1af10 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rgv.){.  int rc;
1af20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1af30 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
1af40 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1af50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1af60 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1af70 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1af80 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
1af90 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  DB function-name
1afa0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1afb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1afc0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1afd0 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1afe0 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1aff0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b000 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
1b010 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
1b020 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c 49 54  , argv[2], SQLIT
1b030 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b 0a 20  E_UTF8, 0, 0);. 
1b040 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1b050 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
1b060 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
1b070 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
1b080 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b090 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1b0a0 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
1b0b0 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  mmit DB.**.** Re
1b0c0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1b0d0 20 64 61 74 61 62 61 73 65 20 44 42 20 69 73 20   database DB is 
1b0e0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 75 74  currently in aut
1b0f0 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a 2a  o-commit mode..*
1b100 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69  * Return false i
1b110 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
1b120 20 69 6e 74 20 67 65 74 5f 61 75 74 6f 63 6f 6d   int get_autocom
1b130 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  mit(.  void * cl
1b140 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1b150 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1b160 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1b170 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ar **argv.){.  c
1b180 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
1b190 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1b1a0 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
1b1b0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1b1c0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1b1d0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1b1e0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1b1f0 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 22  , .        " DB"
1b200 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1b210 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1b220 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1b230 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
1b240 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
1b250 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
1b260 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64  printf(zBuf, "%d
1b270 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  ", sqlite3_get_a
1b280 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a  utocommit(db));.
1b290 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1b2a0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1b2b0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1b2c0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1b2d0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 62 75  sage: sqlite3_bu
1b2e0 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d 53  sy_timeout DB MS
1b2f0 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  .**.** Set the b
1b300 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20 54 68  usy timeout.  Th
1b310 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73 69 6c  is is more easil
1b320 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74 68 65  y done using the
1b330 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68   timeout.** meth
1b340 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20 69 6e  od of the TCL in
1b350 74 65 72 66 61 63 65 2e 20 20 42 75 74 20 77 65  terface.  But we
1b360 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f 20 74   need a way to t
1b370 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  est the case.** 
1b380 77 68 65 72 65 20 69 74 20 72 65 74 75 72 6e 73  where it returns
1b390 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a   SQLITE_MISUSE..
1b3a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1b3b0 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  st_busy_timeout(
1b3c0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1b3d0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1b3e0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b3f0 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1b400 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
1b410 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74 65 33  c, ms;.  sqlite3
1b420 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1b430 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1b440 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1b450 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1b460 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1b470 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1b480 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20      " DB", 0);. 
1b490 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b4a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1b4b0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1b4c0 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1b4d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b4e0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1b4f0 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
1b500 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72  rgv[2], &ms) ) r
1b510 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b520 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1b530 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c  busy_timeout(db,
1b540 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   ms);.  Tcl_Appe
1b550 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b560 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f   sqlite3TestErro
1b570 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
1b580 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1b590 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1b5a0 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79   tcl_variable_ty
1b5b0 70 65 20 56 41 52 49 41 42 4c 45 4e 41 4d 45 0a  pe VARIABLENAME.
1b5c0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1b5d0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 74   name of the int
1b5e0 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61  ernal representa
1b5f0 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20  tion for the.** 
1b600 76 61 6c 75 65 20 6f 66 20 74 68 65 20 67 69 76  value of the giv
1b610 65 6e 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  en variable..*/.
1b620 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 5f 76  static int tcl_v
1b630 61 72 69 61 62 6c 65 5f 74 79 70 65 28 0a 20 20  ariable_type(.  
1b640 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1b650 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1b660 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1b670 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1b680 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1b690 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 3b    Tcl_Obj *pVar;
1b6a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1b6b0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1b6c0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1b6d0 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49 41 42 4c  , objv, "VARIABL
1b6e0 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
1b6f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1b700 20 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56   pVar = Tcl_GetV
1b710 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 54 63  ar2Ex(interp, Tc
1b720 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1b730 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f 4c 45 41  [1]), 0, TCL_LEA
1b740 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a 20 20 69  VE_ERR_MSG);.  i
1b750 66 28 20 70 56 61 72 3d 3d 30 20 29 20 72 65 74  f( pVar==0 ) ret
1b760 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b770 20 69 66 28 20 70 56 61 72 2d 3e 74 79 70 65 50   if( pVar->typeP
1b780 74 72 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  tr ){.    Tcl_Se
1b790 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1b7a0 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
1b7b0 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70 65 50 74  Obj(pVar->typePt
1b7c0 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  r->name, -1));. 
1b7d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1b7e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1b7f0 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 6c  ge:  sqlite3_rel
1b800 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f 4e 3f 0a  ease_memory ?N?.
1b810 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  **.** Attempt to
1b820 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20   release memory 
1b830 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62  currently held b
1b840 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ut not actually 
1b850 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 54 68 65  required..** The
1b860 20 69 6e 74 65 67 65 72 20 4e 20 69 73 20 74 68   integer N is th
1b870 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1b880 73 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  s we are trying 
1b890 74 6f 20 72 65 6c 65 61 73 65 2e 20 20 54 68 65  to release.  The
1b8a0 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75   .** return valu
1b8b0 65 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  e is the amount 
1b8c0 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74 75 61 6c  of memory actual
1b8d0 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a  ly released..*/.
1b8e0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1b8f0 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a  release_memory(.
1b900 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1b910 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1b920 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1b930 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1b940 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1b950 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
1b960 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
1b970 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20 26  RY_MANAGEMENT) &
1b980 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1b990 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
1b9a0 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20 61 6d   int N;.  int am
1b9b0 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  t;.  if( objc!=1
1b9c0 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20   && objc!=2 ){. 
1b9d0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1b9e0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1b9f0 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20  bjv, "?N?");.   
1ba00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ba10 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
1ba20 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20  c==2 ){.    if( 
1ba30 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1ba40 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
1ba50 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20  ], &N) ) return 
1ba60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  TCL_ERROR;.  }el
1ba70 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d 31 3b 0a  se{.    N = -1;.
1ba80 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69    }.  amt = sqli
1ba90 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
1baa0 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74  ry(N);.  Tcl_Set
1bab0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1bac0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1bad0 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  amt));.#endif.  
1bae0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1baf0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1bb00 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
1bb10 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a  p_limit ?N?.**.*
1bb20 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20 74  * Query or set t
1bb30 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69 6d  he soft heap lim
1bb40 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  it for the curre
1bb50 6e 74 20 74 68 72 65 61 64 2e 20 20 54 68 65 0a  nt thread.  The.
1bb60 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c 79  ** limit is only
1bb70 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65 20   changed if the 
1bb80 4e 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20 54  N is present.  T
1bb90 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6d 69  he previous limi
1bba0 74 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  t.** is returned
1bbb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bbc0 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  test_soft_heap_l
1bbd0 69 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  imit(.  void * c
1bbe0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1bbf0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1bc00 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1bc10 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1bc20 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63  jv[].){.  static
1bc30 20 69 6e 74 20 73 6f 66 74 48 65 61 70 4c 69 6d   int softHeapLim
1bc40 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 6d  it = 0;.  int am
1bc50 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  t;.  if( objc!=1
1bc60 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20   && objc!=2 ){. 
1bc70 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1bc80 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1bc90 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20  bjv, "?N?");.   
1bca0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1bcb0 52 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73  R;.  }.  amt = s
1bcc0 6f 66 74 48 65 61 70 4c 69 6d 69 74 3b 0a 20 20  oftHeapLimit;.  
1bcd0 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
1bce0 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 69 66     int N;.    if
1bcf0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1bd00 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1bd10 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72  [1], &N) ) retur
1bd20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1bd30 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
1bd40 61 70 5f 6c 69 6d 69 74 28 4e 29 3b 0a 20 20 20  ap_limit(N);.   
1bd50 20 73 6f 66 74 48 65 61 70 4c 69 6d 69 74 20 3d   softHeapLimit =
1bd60 20 4e 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65   N;.  }.  Tcl_Se
1bd70 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1bd80 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1bd90 28 61 6d 74 29 29 3b 0a 20 20 72 65 74 75 72 6e  (amt));.  return
1bda0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1bdb0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
1bdc0 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
1bdd0 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  p.**.** Call the
1bde0 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
1bdf0 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a  cleanup API..*/.
1be00 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1be10 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a  thread_cleanup(.
1be20 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1be30 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1be40 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1be50 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1be60 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1be70 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65  {.  sqlite3_thre
1be80 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 20 20  ad_cleanup();.  
1be90 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1bea0 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
1beb0 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f    sqlite3_pager_
1bec0 72 65 66 63 6f 75 6e 74 73 20 20 44 42 0a 2a 2a  refcounts  DB.**
1bed0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73  .** Return a lis
1bee0 74 20 6f 66 20 6e 75 6d 62 65 72 73 20 77 68 69  t of numbers whi
1bef0 63 68 20 61 72 65 20 74 68 65 20 50 61 67 65 72  ch are the Pager
1bf00 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 61 6c 6c  Refcount for all
1bf10 0a 2a 2a 20 70 61 67 65 72 73 20 6f 6e 20 65 61  .** pagers on ea
1bf20 63 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ch database conn
1bf30 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
1bf40 63 20 69 6e 74 20 74 65 73 74 5f 70 61 67 65 72  c int test_pager
1bf50 5f 72 65 66 63 6f 75 6e 74 73 28 0a 20 20 76 6f  _refcounts(.  vo
1bf60 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1bf70 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1bf80 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1bf90 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1bfa0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1bfb0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1bfc0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 76 2c 20 2a  nt i;.  int v, *
1bfd0 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  a;.  Tcl_Obj *pR
1bfe0 65 73 75 6c 74 3b 0a 0a 20 20 69 66 28 20 6f 62  esult;..  if( ob
1bff0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1c000 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1c010 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1c020 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1c030 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
1c040 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
1c050 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
1c060 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1c070 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c080 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1c090 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1c0a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1c0b0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1c0c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c0d0 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4e   pResult = Tcl_N
1c0e0 65 77 4f 62 6a 28 29 3b 0a 20 20 66 6f 72 28 69  ewObj();.  for(i
1c0f0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1c100 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
1c110 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[i].pBt==0 )
1c120 7b 0a 20 20 20 20 20 20 76 20 3d 20 2d 31 3b 0a  {.      v = -1;.
1c130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c140 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1c150 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1c160 0a 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74  .      a = sqlit
1c170 65 33 50 61 67 65 72 53 74 61 74 73 28 73 71 6c  e3PagerStats(sql
1c180 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
1c190 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b  b->aDb[i].pBt));
1c1a0 0a 20 20 20 20 20 20 76 20 3d 20 61 5b 30 5d 3b  .      v = a[0];
1c1b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1c1c0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1c1d0 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
1c1e0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1c1f0 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
1c200 73 75 6c 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  sult, Tcl_NewInt
1c210 4f 62 6a 28 76 29 29 3b 0a 20 20 7d 0a 20 20 54  Obj(v));.  }.  T
1c220 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1c230 69 6e 74 65 72 70 2c 20 70 52 65 73 75 6c 74 29  interp, pResult)
1c240 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1c250 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  K;.}.../*.** tcl
1c260 63 6d 64 3a 20 20 20 77 6f 72 6b 69 6e 67 5f 36  cmd:   working_6
1c270 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a 20 53  4bit_int.**.** S
1c280 6f 6d 65 20 54 43 4c 20 62 75 69 6c 64 73 20 28  ome TCL builds (
1c290 65 78 3a 20 63 79 67 77 69 6e 29 20 64 6f 20 6e  ex: cygwin) do n
1c2a0 6f 74 20 73 75 70 70 6f 72 74 20 36 34 2d 62 69  ot support 64-bi
1c2b0 74 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68 69  t integers.  Thi
1c2c0 73 0a 2a 2a 20 6c 65 61 64 73 20 74 6f 20 61 20  s.** leads to a 
1c2d0 6e 75 6d 62 65 72 20 6f 66 20 74 65 73 74 20 66  number of test f
1c2e0 61 69 6c 75 72 65 73 2e 20 20 54 68 65 20 70 72  ailures.  The pr
1c2f0 65 73 65 6e 74 20 63 6f 6d 6d 61 6e 64 20 63 68  esent command ch
1c300 65 63 6b 73 20 74 68 65 0a 2a 2a 20 54 43 4c 20  ecks the.** TCL 
1c310 62 75 69 6c 64 20 74 6f 20 73 65 65 20 77 68 65  build to see whe
1c320 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 73  ther or not it s
1c330 75 70 70 6f 72 74 73 20 36 34 2d 62 69 74 20 69  upports 64-bit i
1c340 6e 74 65 67 65 72 73 2e 20 20 49 74 0a 2a 2a 20  ntegers.  It.** 
1c350 72 65 74 75 72 6e 73 20 54 52 55 45 20 69 66 20  returns TRUE if 
1c360 69 74 20 64 6f 65 73 20 61 6e 64 20 46 41 4c 53  it does and FALS
1c370 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  E if not..**.** 
1c380 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
1c390 75 73 65 64 20 74 6f 20 77 61 72 6e 20 75 73 65  used to warn use
1c3a0 72 73 20 74 68 61 74 20 74 68 65 69 72 20 54 43  rs that their TC
1c3b0 4c 20 62 75 69 6c 64 20 69 73 20 64 65 66 65 63  L build is defec
1c3c0 74 69 76 65 0a 2a 2a 20 61 6e 64 20 74 68 61 74  tive.** and that
1c3d0 20 74 68 65 20 65 72 72 6f 72 73 20 74 68 65 79   the errors they
1c3e0 20 61 72 65 20 73 65 65 69 6e 67 20 69 6e 20 74   are seeing in t
1c3f0 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73 20  he test scripts 
1c400 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 72 65  might be.** a re
1c410 73 75 6c 74 20 6f 66 20 74 68 65 69 72 20 64 65  sult of their de
1c420 66 65 63 74 69 76 65 20 54 43 4c 20 72 61 74 68  fective TCL rath
1c430 65 72 20 74 68 61 6e 20 70 72 6f 62 6c 65 6d 73  er than problems
1c440 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73   in SQLite..*/.s
1c450 74 61 74 69 63 20 69 6e 74 20 77 6f 72 6b 69 6e  tatic int workin
1c460 67 5f 36 34 62 69 74 5f 69 6e 74 28 0a 20 20 43  g_64bit_int(.  C
1c470 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1c480 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
1c490 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
1c4a0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
1c4b0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1c4c0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1c4d0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1c4e0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1c4f0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1c500 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
1c510 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c520 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1c530 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
1c540 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
1c550 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
1c560 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a   */.){.  Tcl_Obj
1c570 20 2a 70 54 65 73 74 4f 62 6a 3b 0a 20 20 69 6e   *pTestObj;.  in
1c580 74 20 77 6f 72 6b 69 6e 67 20 3d 20 30 3b 0a 0a  t working = 0;..
1c590 20 20 70 54 65 73 74 4f 62 6a 20 3d 20 54 63 6c    pTestObj = Tcl
1c5a0 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 31  _NewWideIntObj(1
1c5b0 30 30 30 30 30 30 2a 28 69 36 34 29 31 32 33 34  000000*(i64)1234
1c5c0 35 36 37 38 39 30 29 3b 0a 20 20 77 6f 72 6b 69  567890);.  worki
1c5d0 6e 67 20 3d 20 73 74 72 63 6d 70 28 54 63 6c 5f  ng = strcmp(Tcl_
1c5e0 47 65 74 53 74 72 69 6e 67 28 70 54 65 73 74 4f  GetString(pTestO
1c5f0 62 6a 29 2c 20 22 31 32 33 34 35 36 37 38 39 30  bj), "1234567890
1c600 30 30 30 30 30 30 22 29 3d 3d 30 3b 0a 20 20 54  000000")==0;.  T
1c610 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1c620 70 54 65 73 74 4f 62 6a 29 3b 0a 20 20 54 63 6c  pTestObj);.  Tcl
1c630 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1c640 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
1c650 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b 69 6e 67 29  leanObj(working)
1c660 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1c670 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  OK;.}.../*.** tc
1c680 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e 6c 69  lcmd:   vfs_unli
1c690 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68  nk_test.**.** Th
1c6a0 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75  is TCL command u
1c6b0 6e 72 65 67 69 73 74 65 72 73 20 74 68 65 20 70  nregisters the p
1c6c0 72 69 6d 61 72 79 20 56 46 53 20 61 6e 64 20 74  rimary VFS and t
1c6d0 68 65 6e 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  hen registers.**
1c6e0 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 20   it back again. 
1c6f0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
1c700 20 74 65 73 74 20 74 68 65 20 61 62 69 6c 69 74   test the abilit
1c710 79 20 74 6f 20 72 65 67 69 73 74 65 72 20 61 0a  y to register a.
1c720 2a 2a 20 56 46 53 20 77 68 65 6e 20 6e 6f 6e 65  ** VFS when none
1c730 20 61 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20   are previously 
1c740 72 65 67 69 73 74 65 72 65 64 2c 20 61 6e 64 20  registered, and 
1c750 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 0a  the ability to .
1c760 2a 2a 20 75 6e 72 65 67 69 73 74 65 72 20 74 68  ** unregister th
1c770 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
1c780 20 56 46 53 2e 20 20 54 69 63 6b 65 74 20 23 32   VFS.  Ticket #2
1c790 37 33 38 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  738.*/.static in
1c7a0 74 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73  t vfs_unlink_tes
1c7b0 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
1c7c0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
1c7d0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
1c7e0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
1c7f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
1c800 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
1c810 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
1c820 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
1c830 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
1c840 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
1c850 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1c860 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1c870 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
1c880 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c890 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
1c8a0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
1c8b0 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt i;.  sqlite3_
1c8c0 76 66 73 20 2a 70 4d 61 69 6e 3b 0a 20 20 73 71  vfs *pMain;.  sq
1c8d0 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73  lite3_vfs *apVfs
1c8e0 5b 32 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  [20];.  sqlite3_
1c8f0 76 66 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a 0a 20  vfs one, two;.. 
1c900 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
1c910 65 67 69 73 74 65 72 28 30 29 3b 20 20 20 2f 2a  egister(0);   /*
1c920 20 55 6e 72 65 67 69 73 74 65 72 20 6f 66 20 4e   Unregister of N
1c930 55 4c 4c 20 69 73 20 68 61 72 6d 6c 65 73 73 20  ULL is harmless 
1c940 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d  */.  one.zName =
1c950 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77 6f 2e   "__one";.  two.
1c960 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74 77 6f 22 3b  zName = "__two";
1c970 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73  ..  /* Calling s
1c980 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1c990 74 65 72 20 77 69 74 68 20 32 6e 64 20 61 72 67  ter with 2nd arg
1c9a0 75 6d 65 6e 74 20 6f 66 20 30 20 64 6f 65 73 20  ument of 0 does 
1c9b0 6e 6f 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20  not.  ** change 
1c9c0 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 0a  the default VFS.
1c9d0 20 20 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d 20 73    */.  pMain = s
1c9e0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1c9f0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  0);.  sqlite3_vf
1ca00 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c  s_register(&one,
1ca10 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
1ca20 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e  Main==0 || pMain
1ca30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
1ca40 6e 64 28 30 29 20 29 3b 0a 20 20 73 71 6c 69 74  nd(0) );.  sqlit
1ca50 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
1ca60 26 74 77 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65  &two, 0);.  asse
1ca70 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20  rt( pMain==0 || 
1ca80 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76  pMain==sqlite3_v
1ca90 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20  fs_find(0) );.. 
1caa0 20 2f 2a 20 57 65 20 63 61 6e 20 66 69 6e 64 20   /* We can find 
1cab0 61 20 56 46 53 20 62 79 20 69 74 73 20 6e 61 6d  a VFS by its nam
1cac0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  e */.  assert( s
1cad0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1cae0 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29  "__one")==&one )
1caf0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1cb00 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
1cb10 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 0a  two")==&two );..
1cb20 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c    /* Calling sql
1cb30 69 74 65 5f 76 66 73 5f 72 65 67 69 73 74 65 72  ite_vfs_register
1cb40 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73   with non-zero s
1cb50 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1cb60 63 68 61 6e 67 65 73 20 74 68 65 0a 20 20 2a 2a  changes the.  **
1cb70 20 64 65 66 61 75 6c 74 20 56 46 53 2c 20 65 76   default VFS, ev
1cb80 65 6e 20 69 66 20 74 68 65 20 31 73 74 20 70 61  en if the 1st pa
1cb90 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20 65 78  rameter is an ex
1cba0 69 73 74 69 67 20 56 46 53 20 74 68 61 74 20 69  istig VFS that i
1cbb0 73 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  s.  ** previousl
1cbc0 79 20 72 65 67 69 73 74 65 72 65 64 20 61 73 20  y registered as 
1cbd0 74 68 65 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 2e  the non-default.
1cbe0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1cbf0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e  vfs_register(&on
1cc00 65 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28  e, 1);.  assert(
1cc10 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1cc20 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65  d("__one")==&one
1cc30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1cc40 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
1cc50 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
1cc60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1cc70 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
1cc80 26 6f 6e 65 20 29 3b 0a 20 20 73 71 6c 69 74 65  &one );.  sqlite
1cc90 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
1cca0 74 77 6f 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  two, 1);.  asser
1ccb0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
1ccc0 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
1ccd0 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
1cce0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1ccf0 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20  ("__two")==&two 
1cd00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1cd10 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1cd20 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 69 66 28 20  ==&two );.  if( 
1cd30 70 4d 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c  pMain ){.    sql
1cd40 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1cd50 72 28 70 4d 61 69 6e 2c 20 31 29 3b 0a 20 20 20  r(pMain, 1);.   
1cd60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1cd70 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
1cd80 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 20 20  ")==&one );.    
1cd90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1cda0 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22  vfs_find("__two"
1cdb0 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 20 20 61  )==&two );.    a
1cdc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
1cdd0 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
1cde0 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  n );.  }.  .  /*
1cdf0 20 55 6e 6c 69 6e 6b 20 74 68 65 20 64 65 66 61   Unlink the defa
1ce00 75 6c 74 20 56 46 53 2e 20 20 52 65 70 65 61 74  ult VFS.  Repeat
1ce10 20 75 6e 74 69 6c 20 74 68 65 72 65 20 61 72 65   until there are
1ce20 20 6e 6f 20 6d 6f 72 65 20 56 46 53 65 73 0a 20   no more VFSes. 
1ce30 20 2a 2a 20 72 65 67 69 73 74 65 72 65 64 2e 0a   ** registered..
1ce40 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
1ce50 69 3c 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f  i<sizeof(apVfs)/
1ce60 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29  sizeof(apVfs[0])
1ce70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66  ; i++){.    apVf
1ce80 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76  s[i] = sqlite3_v
1ce90 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20  fs_find(0);.    
1cea0 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a  if( apVfs[i] ){.
1ceb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70        assert( ap
1cec0 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f  Vfs[i]==sqlite3_
1ced0 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69  vfs_find(apVfs[i
1cee0 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20  ]->zName) );.   
1cef0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75     sqlite3_vfs_u
1cf00 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b  nregister(apVfs[
1cf10 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  i]);.      asser
1cf20 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66  t( 0==sqlite3_vf
1cf30 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d  s_find(apVfs[i]-
1cf40 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d  >zName) );.    }
1cf50 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 30  .  }.  assert( 0
1cf60 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
1cf70 6e 64 28 30 29 20 29 3b 0a 20 20 0a 20 20 2f 2a  nd(0) );.  .  /*
1cf80 20 52 65 67 69 73 74 65 72 20 74 68 65 20 6d 61   Register the ma
1cf90 69 6e 20 56 46 53 20 61 73 20 6e 6f 6e 2d 64 65  in VFS as non-de
1cfa0 66 61 75 6c 74 20 28 77 69 6c 6c 20 62 65 20 6d  fault (will be m
1cfb0 61 64 65 20 64 65 66 61 75 6c 74 2c 20 73 69 6e  ade default, sin
1cfc0 63 65 0a 20 20 2a 2a 20 69 74 27 6c 6c 20 62 65  ce.  ** it'll be
1cfd0 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e   the only one in
1cfe0 20 65 78 69 73 74 65 6e 63 65 29 2e 0a 20 20 2a   existence)..  *
1cff0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  /.  sqlite3_vfs_
1d000 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20  register(pMain, 
1d010 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  0);.  assert( sq
1d020 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1d030 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 0a 20  )==pMain );.  . 
1d040 20 2f 2a 20 55 6e 2d 72 65 67 69 73 74 65 72 20   /* Un-register 
1d050 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 67 61  the main VFS aga
1d060 69 6e 20 74 6f 20 72 65 73 74 6f 72 65 20 61 6e  in to restore an
1d070 20 65 6d 70 74 79 20 56 46 53 20 6c 69 73 74 20   empty VFS list 
1d080 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
1d090 5f 75 6e 72 65 67 69 73 74 65 72 28 70 4d 61 69  _unregister(pMai
1d0a0 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d  n);.  assert( 0=
1d0b0 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
1d0c0 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  d(0) );..  /* Re
1d0d0 6c 69 6e 6b 20 61 6c 6c 20 56 46 53 65 73 20 69  link all VFSes i
1d0e0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e  n reverse order.
1d0f0 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d 73 69   */  .  for(i=si
1d100 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a 65  zeof(apVfs)/size
1d110 6f 66 28 61 70 56 66 73 5b 30 5d 29 2d 31 3b 20  of(apVfs[0])-1; 
1d120 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
1d130 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a  if( apVfs[i] ){.
1d140 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
1d150 73 5f 72 65 67 69 73 74 65 72 28 61 70 56 66 73  s_register(apVfs
1d160 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  [i], 1);.      a
1d170 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d  ssert( apVfs[i]=
1d180 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
1d190 64 28 30 29 20 29 3b 0a 20 20 20 20 20 20 61 73  d(0) );.      as
1d1a0 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d  sert( apVfs[i]==
1d1b0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1d1c0 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65  (apVfs[i]->zName
1d1d0 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ) );.    }.  }..
1d1e0 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20    /* Unregister 
1d1f0 6f 75 74 20 73 61 6d 70 6c 65 20 56 46 53 65 73  out sample VFSes
1d200 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  . */.  sqlite3_v
1d210 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f  fs_unregister(&o
1d220 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ne);.  sqlite3_v
1d230 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74  fs_unregister(&t
1d240 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72 65 67  wo);..  /* Unreg
1d250 69 73 74 65 72 69 6e 67 20 61 20 56 46 53 20 74  istering a VFS t
1d260 68 61 74 20 69 73 20 6e 6f 74 20 63 75 72 72 65  hat is not curre
1d270 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  ntly registered 
1d280 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20  is harmless */. 
1d290 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
1d2a0 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20  egister(&one);. 
1d2b0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
1d2c0 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a 20  egister(&two);. 
1d2d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1d2e0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
1d2f0 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ")==0 );.  asser
1d300 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
1d310 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 30 20  ind("__two")==0 
1d320 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75  );..  /* We shou
1d330 6c 64 20 62 65 20 6c 65 66 74 20 77 69 74 68 20  ld be left with 
1d340 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 66  the original def
1d350 61 75 6c 74 20 56 46 53 20 62 61 63 6b 20 61 73  ault VFS back as
1d360 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
1d370 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  al */.  assert( 
1d380 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1d390 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 0a 20  (0)==pMain );.. 
1d3a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1d3b0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
1d3c0 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f     vfs_initfail_
1d3d0 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  test.**.** This 
1d3e0 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 61 74 74 65  TCL command atte
1d3f0 6d 70 74 73 20 74 6f 20 76 66 73 5f 66 69 6e 64  mpts to vfs_find
1d400 20 61 6e 64 20 76 66 73 5f 72 65 67 69 73 74 65   and vfs_registe
1d410 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 73 71  r when the.** sq
1d420 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1d430 28 29 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  () interface is 
1d440 66 61 69 6c 69 6e 67 2e 20 20 41 6c 6c 20 63 61  failing.  All ca
1d450 6c 6c 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 2e  lls should fail.
1d460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1d470 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74  fs_initfail_test
1d480 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
1d490 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
1d4a0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
1d4b0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
1d4c0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
1d4d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
1d4e0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
1d4f0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
1d500 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
1d510 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d530 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
1d540 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
1d550 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
1d560 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
1d570 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
1d580 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 3b 0a 20  lite3_vfs one;. 
1d590 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f   one.zName = "__
1d5a0 6f 6e 65 22 3b 0a 0a 20 20 69 66 28 20 73 71 6c  one";..  if( sql
1d5b0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1d5c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d5d0 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ROR;.  sqlite3_v
1d5e0 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65  fs_register(&one
1d5f0 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , 0);.  if( sqli
1d600 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
1d610 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d620 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  OR;.  sqlite3_vf
1d630 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c  s_register(&one,
1d640 20 31 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   1);.  if( sqlit
1d650 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
1d660 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d670 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
1d680 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  OK;.}../*.** Sav
1d690 65 64 20 56 46 53 65 73 0a 2a 2f 0a 73 74 61 74  ed VFSes.*/.stat
1d6a0 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ic sqlite3_vfs *
1d6b0 61 70 56 66 73 5b 32 30 5d 3b 0a 73 74 61 74 69  apVfs[20];.stati
1d6c0 63 20 69 6e 74 20 6e 56 66 73 20 3d 20 30 3b 0a  c int nVfs = 0;.
1d6d0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
1d6e0 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f   vfs_unregister_
1d6f0 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65 67 69  all.**.** Unregi
1d700 73 74 65 72 20 61 6c 6c 20 56 46 53 65 73 2e 0a  ster all VFSes..
1d710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
1d720 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
1d730 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
1d740 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
1d750 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
1d760 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
1d770 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
1d780 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
1d790 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
1d7a0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
1d7b0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
1d7c0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d7e0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
1d7f0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
1d800 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
1d810 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
1d820 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
1d830 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1d840 69 3c 41 72 72 61 79 53 69 7a 65 28 61 70 56 66  i<ArraySize(apVf
1d850 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70  s); i++){.    ap
1d860 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Vfs[i] = sqlite3
1d870 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
1d880 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 3d 3d    if( apVfs[i]==
1d890 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  0 ) break;.    s
1d8a0 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67  qlite3_vfs_unreg
1d8b0 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 29 3b  ister(apVfs[i]);
1d8c0 0a 20 20 7d 0a 20 20 6e 56 66 73 20 3d 20 69 3b  .  }.  nVfs = i;
1d8d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1d8e0 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  ;.}./*.** tclcmd
1d8f0 3a 20 20 20 76 66 73 5f 72 65 72 65 67 69 73 74  :   vfs_reregist
1d900 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52 65 73  er_all.**.** Res
1d910 74 6f 72 65 20 61 6c 6c 20 56 46 53 65 73 20 74  tore all VFSes t
1d920 68 61 74 20 77 65 72 65 20 72 65 6d 6f 76 65 64  hat were removed
1d930 20 75 73 69 6e 67 20 76 66 73 5f 75 6e 72 65 67   using vfs_unreg
1d940 69 73 74 65 72 5f 61 6c 6c 0a 2a 2f 0a 73 74 61  ister_all.*/.sta
1d950 74 69 63 20 69 6e 74 20 76 66 73 5f 72 65 72 65  tic int vfs_rere
1d960 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c  gister_all(.  Cl
1d970 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1d980 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
1d990 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
1d9a0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
1d9b0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1d9c0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1d9d0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1d9e0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1d9f0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1da00 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
1da10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1da20 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1da30 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
1da40 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
1da50 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
1da60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
1da70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 66 73   for(i=0; i<nVfs
1da80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1da90 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1daa0 28 61 70 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29  (apVfs[i], i==0)
1dab0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
1dac0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
1dad0 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
1dae0 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 20 44 42 0a  control_test DB.
1daf0 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
1db00 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
1db10 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
1db20 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61  trol interface a
1db30 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
1db40 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
1db50 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f   of the same..*/
1db60 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
1db70 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 28 0a 20  _control_test(. 
1db80 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
1db90 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
1dba0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
1dbb0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
1dbc0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
1dbd0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1dbe0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1dbf0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1dc00 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1dc10 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
1dc20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1dc30 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1dc40 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
1dc50 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
1dc60 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
1dc70 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
1dc80 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Arg = 0;.  sqlit
1dc90 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
1dca0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1dcb0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1dcc0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1dcd0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1dce0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
1dcf0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1dd00 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
1dd10 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20  [0], 0), " DB", 
1dd20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1dd30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1dd40 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1dd50 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1dd60 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1dd70 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1dd80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1dd90 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
1dda0 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20 30 2c 20  ntrol(db, 0, 0, 
1ddb0 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74  &iArg);.  assert
1ddc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ( rc==SQLITE_ERR
1ddd0 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  OR );.  rc = sql
1dde0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
1ddf0 6c 28 64 62 2c 20 22 6e 6f 74 61 64 61 74 61 62  l(db, "notadatab
1de00 61 73 65 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ase", SQLITE_FCN
1de10 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20 26 69  TL_LOCKSTATE, &i
1de20 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Arg);.  assert( 
1de30 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
1de40 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
1de50 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
1de60 64 62 2c 20 22 6d 61 69 6e 22 2c 20 2d 31 2c 20  db, "main", -1, 
1de70 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74  &iArg);.  assert
1de80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ( rc==SQLITE_ERR
1de90 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  OR );.  rc = sql
1dea0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
1deb0 6c 28 64 62 2c 20 22 74 65 6d 70 22 2c 20 2d 31  l(db, "temp", -1
1dec0 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65  , &iArg);.  asse
1ded0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  rt( rc==SQLITE_E
1dee0 52 52 4f 52 20 29 3b 0a 20 20 72 65 74 75 72 6e  RROR );.  return
1def0 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
1df00 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71  .** tclcmd:   sq
1df10 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 0a 2a  lite3_vfs_list.*
1df20 2a 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 61 20  *.**   Return a 
1df30 74 63 6c 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  tcl list contain
1df40 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
1df50 20 61 6c 6c 20 72 65 67 69 73 74 65 72 65 64 20   all registered 
1df60 76 66 73 27 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  vfs's..*/.static
1df70 20 69 6e 74 20 76 66 73 5f 6c 69 73 74 28 0a 20   int vfs_list(. 
1df80 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
1df90 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
1dfa0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
1dfb0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
1dfc0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
1dfd0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1dfe0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1dff0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1e000 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1e010 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
1e020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1e030 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1e040 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
1e050 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
1e060 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
1e070 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
1e080 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20  e3_vfs *pVfs;.  
1e090 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20  Tcl_Obj *pRet = 
1e0a0 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
1e0b0 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20  if( objc!=1 ){. 
1e0c0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1e0d0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1e0e0 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65  bjv, "");.    re
1e0f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e100 20 20 7d 0a 20 20 66 6f 72 28 70 56 66 73 3d 73    }.  for(pVfs=s
1e110 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1e120 30 29 3b 20 70 56 66 73 3b 20 70 56 66 73 3d 70  0); pVfs; pVfs=p
1e130 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Vfs->pNext){.   
1e140 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1e150 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1e160 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
1e170 74 72 69 6e 67 4f 62 6a 28 70 56 66 73 2d 3e 7a  tringObj(pVfs->z
1e180 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a  Name, -1));.  }.
1e190 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1e1a0 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
1e1b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1e1c0 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
1e1d0 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f  lcmd:   sqlite3_
1e1e0 6c 69 6d 69 74 20 44 42 20 49 44 20 56 41 4c 55  limit DB ID VALU
1e1f0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  E.**.** This TCL
1e200 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
1e210 65 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20  e sqlite3_limit 
1e220 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a  interface and.**
1e230 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63   verifies correc
1e240 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
1e250 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
1e260 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69 6d 69  ic int test_limi
1e270 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
1e280 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
1e290 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
1e2a0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
1e2b0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
1e2c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
1e2d0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
1e2e0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
1e2f0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
1e300 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
1e310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1e320 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1e330 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
1e340 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1e350 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
1e360 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
1e370 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
1e380 74 20 72 63 3b 0a 20 20 73 74 61 74 69 63 20 63  t rc;.  static c
1e390 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
1e3a0 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
1e3b0 20 20 20 20 20 69 6e 74 20 69 64 3b 0a 20 20 7d       int id;.  }
1e3c0 20 61 49 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b   aId[] = {.    {
1e3d0 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c   "SQLITE_LIMIT_L
1e3e0 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20  ENGTH",         
1e3f0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
1e400 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20  T_LENGTH        
1e410 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
1e420 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51  "SQLITE_LIMIT_SQ
1e430 4c 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20  L_LENGTH",      
1e440 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
1e450 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20  _SQL_LENGTH     
1e460 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
1e470 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
1e480 55 4d 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20  UMN",           
1e490 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
1e4a0 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 20  COLUMN          
1e4b0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
1e4c0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
1e4d0 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20 20 20  _DEPTH",        
1e4e0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45    SQLITE_LIMIT_E
1e4f0 58 50 52 5f 44 45 50 54 48 20 20 20 20 20 20 20  XPR_DEPTH       
1e500 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
1e510 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
1e520 55 4e 44 5f 53 45 4c 45 43 54 22 2c 20 20 20 20  UND_SELECT",    
1e530 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
1e540 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20 20  MPOUND_SELECT   
1e550 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
1e560 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
1e570 50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  P",             
1e580 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42  SQLITE_LIMIT_VDB
1e590 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20 20  E_OP            
1e5a0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
1e5b0 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
1e5c0 4e 5f 41 52 47 22 2c 20 20 20 20 20 20 20 20 53  N_ARG",        S
1e5d0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
1e5e0 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20 20  TION_ARG        
1e5f0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
1e600 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
1e610 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
1e620 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43  LITE_LIMIT_ATTAC
1e630 48 45 44 20 20 20 20 20 20 20 20 20 20 20 20 20  HED             
1e640 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
1e650 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
1e660 45 52 4e 5f 4c 45 4e 47 54 48 22 2c 20 53 51 4c  ERN_LENGTH", SQL
1e670 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
1e680 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 7d  ATTERN_LENGTH  }
1e690 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
1e6a0 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
1e6b0 55 4d 42 45 52 22 2c 20 20 20 20 20 53 51 4c 49  UMBER",     SQLI
1e6c0 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
1e6d0 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 7d 2c  E_NUMBER      },
1e6e0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4f 75 74  .    .    /* Out
1e6f0 20 6f 66 20 72 61 6e 67 65 20 74 65 73 74 20 63   of range test c
1e700 61 73 65 73 20 2a 2f 0a 20 20 20 20 7b 20 22 53  ases */.    { "S
1e710 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 53  QLITE_LIMIT_TOOS
1e720 4d 41 4c 4c 22 2c 20 20 20 20 20 20 20 20 20 20  MALL",          
1e730 20 20 2d 31 2c 20 20 20 20 20 20 20 20 20 20 20    -1,           
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
1e760 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 42 49  LITE_LIMIT_TOOBI
1e770 47 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  G",             
1e780 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41   SQLITE_LIMIT_VA
1e790 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2b 31 20  RIABLE_NUMBER+1 
1e7a0 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74     },.  };.  int
1e7b0 20 69 2c 20 69 64 3b 0a 20 20 69 6e 74 20 76 61   i, id;.  int va
1e7c0 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
1e7d0 2a 7a 49 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  *zId;..  if( obj
1e7e0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
1e7f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1e800 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1e810 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1e820 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
1e830 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
1e840 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
1e850 42 20 49 44 20 56 41 4c 55 45 22 2c 20 30 29 3b  B ID VALUE", 0);
1e860 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e870 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1e880 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1e890 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1e8a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1e8b0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1e8c0 45 52 52 4f 52 3b 0a 20 20 7a 49 64 20 3d 20 54  ERROR;.  zId = T
1e8d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1e8e0 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[2]);.  for(i=0
1e8f0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 49 64 29 2f  ; i<sizeof(aId)/
1e900 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29 3b 20  sizeof(aId[0]); 
1e910 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
1e920 72 63 6d 70 28 7a 49 64 2c 20 61 49 64 5b 69 5d  rcmp(zId, aId[i]
1e930 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
1e940 20 20 20 20 69 64 20 3d 20 61 49 64 5b 69 5d 2e      id = aId[i].
1e950 69 64 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  id;.      break;
1e960 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1e970 20 69 3e 3d 73 69 7a 65 6f 66 28 61 49 64 29 2f   i>=sizeof(aId)/
1e980 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29 20 29  sizeof(aId[0]) )
1e990 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1e9a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1e9b0 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 20 74 79  unknown limit ty
1e9c0 70 65 3a 20 22 2c 20 7a 49 64 2c 20 28 63 68 61  pe: ", zId, (cha
1e9d0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
1e9e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1e9f0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1ea00 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1ea10 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20   objv[3], &val) 
1ea20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1ea30 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1ea40 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 69 64 2c  e3_limit(db, id,
1ea50 20 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   val);.  Tcl_Set
1ea60 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1ea70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1ea80 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  rc));.  return T
1ea90 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  CL_OK;  .}../*.*
1eaa0 2a 20 74 63 6c 63 6d 64 3a 20 20 73 61 76 65 5f  * tclcmd:  save_
1eab0 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a  prng_state.**.**
1eac0 20 53 61 76 65 20 74 68 65 20 73 74 61 74 65 20   Save the state 
1ead0 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 72 61  of the pseudo-ra
1eae0 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65  ndom number gene
1eaf0 72 61 74 6f 72 2e 0a 2a 2a 20 41 74 20 74 68 65  rator..** At the
1eb00 20 73 61 6d 65 20 74 69 6d 65 2c 20 76 65 72 69   same time, veri
1eb10 66 79 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  fy that sqlite3_
1eb20 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72  test_control wor
1eb30 6b 73 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20  ks even when.** 
1eb40 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 6f  called with an o
1eb50 75 74 2d 6f 66 2d 72 61 6e 67 65 20 6f 70 63 6f  ut-of-range opco
1eb60 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
1eb70 74 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74  t save_prng_stat
1eb80 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
1eb90 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
1eba0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
1ebb0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
1ebc0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
1ebd0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
1ebe0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
1ebf0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
1ec00 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
1ec10 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
1ec20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1ec30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1ec40 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
1ec50 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1ec60 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
1ec70 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
1ec80 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
1ec90 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 39 39 39  test_control(999
1eca0 39 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  9);.  assert( rc
1ecb0 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
1ecc0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1ecd0 6f 6c 28 2d 31 29 3b 0a 20 20 61 73 73 65 72 74  ol(-1);.  assert
1ece0 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  ( rc==0 );.  sql
1ecf0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1ed00 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1ed10 4c 5f 50 52 4e 47 5f 53 41 56 45 29 3b 0a 20 20  L_PRNG_SAVE);.  
1ed20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1ed30 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
1ed40 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61  restore_prng_sta
1ed50 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  te.*/.static int
1ed60 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74   restore_prng_st
1ed70 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ate(.  ClientDat
1ed80 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
1ed90 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
1eda0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
1edb0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
1edc0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1edd0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1ede0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1edf0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1ee00 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
1ee10 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
1ee20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1ee30 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
1ee40 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1ee50 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
1ee60 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
1ee70 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1ee80 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1ee90 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
1eea0 52 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  RE);.  return TC
1eeb0 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63  L_OK;.}./*.** tc
1eec0 6c 63 6d 64 3a 20 20 72 65 73 65 74 5f 70 72 6e  lcmd:  reset_prn
1eed0 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69  g_state.*/.stati
1eee0 63 20 69 6e 74 20 72 65 73 65 74 5f 70 72 6e 67  c int reset_prng
1eef0 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74  _state(.  Client
1ef00 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
1ef10 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
1ef20 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
1ef30 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
1ef40 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ef50 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1ef60 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1ef70 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1ef80 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1ef90 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
1efa0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1efb0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1efc0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1efd0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
1efe0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
1eff0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  {.  sqlite3_test
1f000 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1f010 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
1f020 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  SET);.  return T
1f030 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1f040 74 63 6c 63 6d 64 3a 20 20 70 63 61 63 68 65 5f  tclcmd:  pcache_
1f050 73 74 61 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  stats.*/.static 
1f060 69 6e 74 20 74 65 73 74 5f 70 63 61 63 68 65 5f  int test_pcache_
1f070 73 74 61 74 73 28 0a 20 20 43 6c 69 65 6e 74 44  stats(.  ClientD
1f080 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
1f090 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
1f0a0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
1f0b0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
1f0c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1f0d0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
1f0e0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
1f0f0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
1f100 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
1f110 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
1f120 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f130 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
1f140 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1f150 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
1f160 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
1f170 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69  .  int nMin;.  i
1f180 6e 74 20 6e 4d 61 78 3b 0a 20 20 69 6e 74 20 6e  nt nMax;.  int n
1f190 43 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e  Current;.  int n
1f1a0 52 65 63 79 63 6c 61 62 6c 65 3b 0a 20 20 54 63  Recyclable;.  Tc
1f1b0 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
1f1c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 74 61  sqlite3PcacheSta
1f1d0 74 73 28 26 6e 43 75 72 72 65 6e 74 2c 20 26 6e  ts(&nCurrent, &n
1f1e0 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52 65  Max, &nMin, &nRe
1f1f0 63 79 63 6c 61 62 6c 65 29 3b 0a 0a 20 20 70 52  cyclable);..  pR
1f200 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
1f210 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
1f220 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1f230 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
1f240 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 75  NewStringObj("cu
1f250 72 72 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 20 20  rrent", -1));.  
1f260 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1f270 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1f280 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
1f290 74 4f 62 6a 28 6e 43 75 72 72 65 6e 74 29 29 3b  tObj(nCurrent));
1f2a0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
1f2b0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1f2c0 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
1f2d0 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 78 22  wStringObj("max"
1f2e0 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
1f2f0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1f300 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
1f310 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
1f320 4d 61 78 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Max));.  Tcl_Lis
1f330 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1f340 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
1f350 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1f360 28 22 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20  ("min", -1));.  
1f370 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1f380 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1f390 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
1f3a0 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20 54  tObj(nMin));.  T
1f3b0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1f3c0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1f3d0 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
1f3e0 69 6e 67 4f 62 6a 28 22 72 65 63 79 63 6c 61 62  ingObj("recyclab
1f3f0 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  le", -1));.  Tcl
1f400 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1f410 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
1f420 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
1f430 6a 28 6e 52 65 63 79 63 6c 61 62 6c 65 29 29 3b  j(nRecyclable));
1f440 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
1f450 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
1f460 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43  t);..  return TC
1f470 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
1f480 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64  Register command
1f490 73 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69  s with the TCL i
1f4a0 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69  nterpreter..*/.i
1f4b0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49  nt Sqlitetest1_I
1f4c0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
1f4d0 69 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72  interp){.  exter
1f4e0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
1f4f0 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  arch_count;.  ex
1f500 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
1f510 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
1f520 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
1f530 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65  qlite3_open_file
1f540 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
1f550 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72   int sqlite3_sor
1f560 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  t_count;.  exter
1f570 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  n int sqlite3_cu
1f580 72 72 65 6e 74 5f 74 69 6d 65 3b 0a 20 20 65 78  rrent_time;.  ex
1f590 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
1f5a0 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20  _max_blobsize;. 
1f5b0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
1f5c0 74 65 33 42 74 72 65 65 53 68 61 72 65 64 43 61  te3BtreeSharedCa
1f5d0 63 68 65 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c  cheReport(void*,
1f5e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f600 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
1f610 6e 74 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f  nterp*,int,Tcl_O
1f620 62 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74  bj*CONST*);.  st
1f630 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20  atic struct {.  
1f640 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
1f650 20 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63       Tcl_CmdProc
1f660 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d   *xProc;.  } aCm
1f670 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22  d[] = {.     { "
1f680 64 62 5f 65 6e 74 65 72 22 2c 20 20 20 20 20 20  db_enter",      
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6a0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62  (Tcl_CmdProc*)db
1f6b0 5f 65 6e 74 65 72 20 20 20 20 20 20 20 20 20 20  _enter          
1f6c0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
1f6d0 64 62 5f 6c 65 61 76 65 22 2c 20 20 20 20 20 20  db_leave",      
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6f0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62  (Tcl_CmdProc*)db
1f700 5f 6c 65 61 76 65 20 20 20 20 20 20 20 20 20 20  _leave          
1f710 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
1f720 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1f730 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
1f740 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
1f750 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
1f760 74 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  t    },.     { "
1f770 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1f780 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  int64",         
1f790 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
1f7a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
1f7b0 74 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  t64  },.     { "
1f7c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1f7d0 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  str",           
1f7e0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
1f7f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
1f800 72 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  r    },.     { "
1f810 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1f820 5f 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20  _str",          
1f830 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
1f840 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73  lite3_snprintf_s
1f850 74 72 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  tr   },.     { "
1f860 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1f870 73 74 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20  stronly",       
1f880 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
1f890 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
1f8a0 72 6f 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22  ronly},.     { "
1f8b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1f8c0 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20  double",        
1f8d0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
1f8e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f  lite3_mprintf_do
1f8f0 75 62 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22  uble },.     { "
1f900 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1f910 73 63 61 6c 65 64 22 2c 20 20 20 20 20 20 20 20  scaled",        
1f920 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
1f930 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
1f940 61 6c 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22  aled },.     { "
1f950 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1f960 68 65 78 64 6f 75 62 6c 65 22 2c 20 20 20 28 54  hexdouble",   (T
1f970 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
1f980 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64  te3_mprintf_hexd
1f990 6f 75 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22  ouble},.     { "
1f9a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1f9b0 7a 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  z_test",        
1f9c0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
1f9d0 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20  st_mprintf_z    
1f9e0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1f9f0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e  qlite3_mprintf_n
1fa00 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28  _test",        (
1fa10 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
1fa20 74 5f 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20 20  t_mprintf_n     
1fa30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1fa40 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69  lite3_snprintf_i
1fa50 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  nt",          (T
1fa60 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
1fa70 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 20  _snprintf_int   
1fa80 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1fa90 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
1faa0 5f 72 6f 77 69 64 22 2c 20 20 20 20 20 28 54 63  _rowid",     (Tc
1fab0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
1fac0 6c 61 73 74 5f 72 6f 77 69 64 20 20 20 20 20 20  last_rowid      
1fad0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1fae0 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 22  te3_exec_printf"
1faf0 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ,           (Tcl
1fb00 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65  _CmdProc*)test_e
1fb10 78 65 63 5f 70 72 69 6e 74 66 20 20 20 20 20 20  xec_printf      
1fb20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1fb30 65 33 5f 65 78 65 63 22 2c 20 20 20 20 20 20 20  e3_exec",       
1fb40 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
1fb50 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78  CmdProc*)test_ex
1fb60 65 63 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  ec             }
1fb70 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1fb80 33 5f 65 78 65 63 5f 6e 72 22 2c 20 20 20 20 20  3_exec_nr",     
1fb90 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
1fba0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
1fbb0 63 5f 6e 72 20 20 20 20 20 20 20 20 20 20 7d 2c  c_nr          },
1fbc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1fbd0 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 20  OMIT_GET_TABLE. 
1fbe0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67      { "sqlite3_g
1fbf0 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 22  et_table_printf"
1fc00 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ,      (Tcl_CmdP
1fc10 72 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f 74 61  roc*)test_get_ta
1fc20 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 23 65  ble_printf },.#e
1fc30 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
1fc40 69 74 65 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20  ite3_close",    
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
1fc60 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
1fc70 65 5f 74 65 73 74 5f 63 6c 6f 73 65 20 20 20 20  e_test_close    
1fc80 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1fc90 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1fca0 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c  ion",       (Tcl
1fcb0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63  _CmdProc*)test_c
1fcc0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20  reate_function  
1fcd0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1fce0 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67  e3_create_aggreg
1fcf0 61 74 65 22 2c 20 20 20 20 20 20 28 54 63 6c 5f  ate",      (Tcl_
1fd00 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72  CmdProc*)test_cr
1fd10 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 7d  eate_aggregate }
1fd20 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1fd30 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66  _register_test_f
1fd40 75 6e 63 74 69 6f 6e 22 2c 20 28 54 63 6c 5f 43  unction", (Tcl_C
1fd50 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 67  mdProc*)test_reg
1fd60 69 73 74 65 72 5f 66 75 6e 63 20 20 20 20 7d 2c  ister_func    },
1fd70 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
1fd80 61 62 6f 72 74 22 2c 20 20 20 20 20 20 20 20 20  abort",         
1fd90 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
1fda0 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 61 62  dProc*)sqlite_ab
1fdb0 6f 72 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  ort          },.
1fdc0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 62       { "sqlite_b
1fdd0 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  ind",           
1fde0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1fdf0 50 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e 64 20  Proc*)test_bind 
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1fe10 20 20 20 20 7b 20 22 62 72 65 61 6b 70 6f 69 6e      { "breakpoin
1fe20 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
1fe30 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1fe40 72 6f 63 2a 29 74 65 73 74 5f 62 72 65 61 6b 70  roc*)test_breakp
1fe50 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a 20 20  oint       },.  
1fe60 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6b 65     { "sqlite3_ke
1fe70 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
1fe80 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
1fe90 6f 63 2a 29 74 65 73 74 5f 6b 65 79 20 20 20 20  oc*)test_key    
1fea0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1feb0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6b    { "sqlite3_rek
1fec0 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ey",            
1fed0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
1fee0 63 2a 29 74 65 73 74 5f 72 65 6b 65 79 20 20 20  c*)test_rekey   
1fef0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1ff00 20 7b 20 22 73 71 6c 69 74 65 5f 73 65 74 5f 6d   { "sqlite_set_m
1ff10 61 67 69 63 22 2c 20 20 20 20 20 20 20 20 20 20  agic",          
1ff20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1ff30 2a 29 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67  *)sqlite_set_mag
1ff40 69 63 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  ic      },.     
1ff50 7b 20 22 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  { "sqlite3_inter
1ff60 72 75 70 74 22 2c 20 20 20 20 20 20 20 20 20 20  rupt",          
1ff70 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
1ff80 29 74 65 73 74 5f 69 6e 74 65 72 72 75 70 74 20  )test_interrupt 
1ff90 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
1ffa0 20 22 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f   "sqlite_delete_
1ffb0 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  function",      
1ffc0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1ffd0 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20  delete_function 
1ffe0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
1fff0 22 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63  "sqlite_delete_c
20000 6f 6c 6c 61 74 69 6f 6e 22 2c 20 20 20 20 20 20  ollation",      
20010 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64   (Tcl_CmdProc*)d
20020 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20  elete_collation 
20030 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
20040 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
20050 63 6f 6d 6d 69 74 22 2c 20 20 20 20 20 20 20 20  commit",        
20060 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 67 65  (Tcl_CmdProc*)ge
20070 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 20 20 20  t_autocommit    
20080 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
20090 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 75 73 65  qlite3_stack_use
200a0 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  d",            (
200b0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
200c0 74 5f 73 74 61 63 6b 5f 75 73 65 64 20 20 20 20  t_stack_used    
200d0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
200e0 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
200f0 75 74 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  ut",          (T
20100 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
20110 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 20 20  _busy_timeout   
20120 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 70 72 69    },.     { "pri
20130 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20 20 20  ntf",           
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
20150 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
20160 70 72 69 6e 74 66 20 20 20 20 20 20 20 20 20 20  printf          
20170 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
20180 74 65 33 49 6f 54 72 61 63 65 22 2c 20 20 20 20  te3IoTrace",    
20190 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
201a0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69 6f 5f  mdProc*)test_io_
201b0 74 72 61 63 65 20 20 20 20 20 20 20 20 20 7d 2c  trace         },
201c0 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 73  .  };.  static s
201d0 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
201e0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54  r *zName;.     T
201f0 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78  cl_ObjCmdProc *x
20200 50 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20  Proc;.     void 
20210 2a 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d  *clientData;.  }
20220 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20   aObjCmd[] = {. 
20230 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
20240 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65  onnection_pointe
20250 72 22 2c 20 20 20 20 67 65 74 5f 73 71 6c 69 74  r",    get_sqlit
20260 65 5f 70 6f 69 6e 74 65 72 2c 20 30 20 7d 2c 0a  e_pointer, 0 },.
20270 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20280 62 69 6e 64 5f 69 6e 74 22 2c 20 20 20 20 20 20  bind_int",      
20290 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
202a0 64 5f 69 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c  d_int,      0 },
202b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
202c0 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c  _bind_zeroblob",
202d0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
202e0 6e 64 5f 7a 65 72 6f 62 6c 6f 62 2c 20 30 20 7d  nd_zeroblob, 0 }
202f0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
20300 33 5f 62 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20  3_bind_int64",  
20310 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
20320 69 6e 64 5f 69 6e 74 36 34 2c 20 20 20 20 30 20  ind_int64,    0 
20330 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
20340 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c  e3_bind_double",
20350 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
20360 62 69 6e 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30  bind_double,   0
20370 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
20380 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20  te3_bind_null", 
20390 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
203a0 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c  _bind_null     ,
203b0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
203c0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c  ite3_bind_text",
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
203e0 74 5f 62 69 6e 64 5f 74 65 78 74 20 20 20 20 20  t_bind_text     
203f0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
20400 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
20410 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  6",           te
20420 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20  st_bind_text16  
20430 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
20440 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
20450 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
20460 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20  est_bind_blob   
20470 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
20480 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
20490 61 6d 65 74 65 72 5f 63 6f 75 6e 74 22 2c 20 20  ameter_count",  
204a0 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
204b0 74 65 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20  ter_count, 0},. 
204c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
204d0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
204e0 6d 65 22 2c 20 20 20 74 65 73 74 5f 62 69 6e 64  me",   test_bind
204f0 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c  _parameter_name,
20500 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
20510 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
20520 65 74 65 72 5f 69 6e 64 65 78 22 2c 20 20 74 65  eter_index",  te
20530 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
20540 72 5f 69 6e 64 65 78 2c 20 30 7d 2c 0a 20 20 20  r_index, 0},.   
20550 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 65    { "sqlite3_cle
20560 61 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20  ar_bindings",   
20570 20 20 20 20 20 74 65 73 74 5f 63 6c 65 61 72 5f       test_clear_
20580 62 69 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a 20 20  bindings, 0},.  
20590 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c     { "sqlite3_sl
205a0 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  eep",           
205b0 20 20 20 20 20 20 74 65 73 74 5f 73 6c 65 65 70        test_sleep
205c0 2c 20 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 20  ,          0},. 
205d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
205e0 72 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20  rrcode",        
205f0 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 63         test_errc
20600 6f 64 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  ode       ,0 },.
20610 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20620 65 72 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20  errmsg",        
20630 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72          test_err
20640 6d 73 67 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  msg        ,0 },
20650 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
20660 5f 65 72 72 6d 73 67 31 36 22 2c 20 20 20 20 20  _errmsg16",     
20670 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72           test_er
20680 72 6d 73 67 31 36 20 20 20 20 20 20 2c 30 20 7d  rmsg16      ,0 }
20690 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
206a0 33 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20  3_open",        
206b0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f            test_o
206c0 70 65 6e 20 20 20 20 20 20 20 20 20 20 2c 30 20  pen          ,0 
206d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
206e0 65 33 5f 6f 70 65 6e 31 36 22 2c 20 20 20 20 20  e3_open16",     
206f0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
20700 6f 70 65 6e 31 36 20 20 20 20 20 20 20 20 2c 30  open16        ,0
20710 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
20720 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c  te3_complete16",
20730 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
20740 5f 63 6f 6d 70 6c 65 74 65 31 36 20 20 20 20 2c  _complete16    ,
20750 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71  0 },..     { "sq
20760 6c 69 74 65 33 5f 70 72 65 70 61 72 65 22 2c 20  lite3_prepare", 
20770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
20780 73 74 5f 70 72 65 70 61 72 65 20 20 20 20 20 20  st_prepare      
20790 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
207a0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
207b0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
207c0 65 73 74 5f 70 72 65 70 61 72 65 31 36 20 20 20  est_prepare16   
207d0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
207e0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
207f0 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  v2",            
20800 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 20  test_prepare_v2 
20810 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
20820 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
20830 5f 74 6b 74 33 31 33 34 22 2c 20 20 20 20 20 20  _tkt3134",      
20840 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b   test_prepare_tk
20850 74 33 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20  t3134, 0},.     
20860 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61  { "sqlite3_prepa
20870 72 65 31 36 5f 76 32 22 2c 20 20 20 20 20 20 20  re16_v2",       
20880 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 31     test_prepare1
20890 36 5f 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20  6_v2  ,0 },.    
208a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69 6e 61   { "sqlite3_fina
208b0 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  lize",          
208c0 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a      test_finaliz
208d0 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  e      ,0 },.   
208e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 73    { "sqlite3_res
208f0 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  et",            
20900 20 20 20 20 20 74 65 73 74 5f 72 65 73 65 74 20       test_reset 
20910 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
20920 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
20930 70 69 72 65 64 22 2c 20 20 20 20 20 20 20 20 20  pired",         
20940 20 20 20 20 20 20 74 65 73 74 5f 65 78 70 69 72        test_expir
20950 65 64 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  ed       ,0 },. 
20960 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74      { "sqlite3_t
20970 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73  ransfer_bindings
20980 22 2c 20 20 20 20 20 74 65 73 74 5f 74 72 61 6e  ",     test_tran
20990 73 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a  sfer_bind ,0 },.
209a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
209b0 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20  changes",       
209c0 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 68 61          test_cha
209d0 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c  nges       ,0 },
209e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
209f0 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20 20 20  _step",         
20a00 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74           test_st
20a10 65 70 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d  ep          ,0 }
20a20 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
20a30 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20  3_next_stmt",   
20a40 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e            test_n
20a50 65 78 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20  ext_stmt     ,0 
20a60 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
20a70 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
20a80 72 79 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  ry",        test
20a90 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c  _release_memory,
20aa0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
20ab0 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65  "sqlite3_soft_he
20ac0 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20  ap_limit",      
20ad0 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f   test_soft_heap_
20ae0 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20  limit,    0},.  
20af0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68     { "sqlite3_th
20b00 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20  read_cleanup",  
20b10 20 20 20 20 20 20 74 65 73 74 5f 74 68 72 65 61        test_threa
20b20 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30  d_cleanup,     0
20b30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
20b40 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
20b50 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  ts",       test_
20b60 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c  pager_refcounts,
20b70 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20      0},..     { 
20b80 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78  "sqlite3_load_ex
20b90 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20  tension",       
20ba0 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e   test_load_exten
20bb0 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20  sion,     0},.  
20bc0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e     { "sqlite3_en
20bd0 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
20be0 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c  ion", test_enabl
20bf0 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30  e_load,        0
20c00 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
20c10 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
20c20 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f  lt_codes", test_
20c30 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
20c40 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20  codes, 0},.     
20c50 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  { "sqlite3_limit
20c60 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
20c70 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20     test_limit,  
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
20c90 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61 76 65  },..     { "save
20ca0 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20  _prng_state",   
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65              save
20cc0 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 20  _prng_state,    
20cd0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73  0 },.     { "res
20ce0 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 22  tore_prng_state"
20cf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73  ,            res
20d00 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c  tore_prng_state,
20d10 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65   0 },.     { "re
20d20 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c  set_prng_state",
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
20d40 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20  set_prng_state, 
20d50 20 20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20    0 },..     /* 
20d60 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a  sqlite3_column_*
20d70 28 29 20 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b  () API */.     {
20d80 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
20d90 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20  _count",        
20da0 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f    test_column_co
20db0 75 6e 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  unt  ,0 },.     
20dc0 7b 20 22 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  { "sqlite3_data_
20dd0 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  count",         
20de0 20 20 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75     test_data_cou
20df0 6e 74 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  nt    ,0 },.    
20e00 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
20e10 6d 6e 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20  mn_type",       
20e20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
20e30 74 79 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20  type   ,0 },.   
20e40 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
20e50 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20  umn_blob",      
20e60 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
20e70 5f 62 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20  _blob   ,0 },.  
20e80 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
20e90 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20  lumn_double",   
20ea0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
20eb0 6e 5f 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20  n_double ,0 },. 
20ec0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
20ed0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20  olumn_int64",   
20ee0 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
20ef0 6d 6e 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a  mn_int64  ,0 },.
20f00 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20f10 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20  column_text",   
20f20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20  test_stmt_utf8, 
20f30 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
20f40 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c 0a 20  column_text },. 
20f50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
20f60 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 74  olumn_name",   t
20f70 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20  est_stmt_utf8,  
20f80 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
20f90 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a 20 20  olumn_name },.  
20fa0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
20fb0 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 74 65  lumn_int",    te
20fc0 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28  st_stmt_int,   (
20fd0 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
20fe0 6c 75 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20 20 20  lumn_int  },.   
20ff0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
21000 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20 74 65 73  umn_bytes",  tes
21010 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76  t_stmt_int,   (v
21020 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
21030 75 6d 6e 5f 62 79 74 65 73 7d 2c 0a 23 69 66 6e  umn_bytes},.#ifn
21040 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21050 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20  DECLTYPE.     { 
21060 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
21070 64 65 63 6c 74 79 70 65 22 2c 74 65 73 74 5f 73  decltype",test_s
21080 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29  tmt_utf8,(void*)
21090 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
210a0 65 63 6c 74 79 70 65 7d 2c 0a 23 65 6e 64 69 66  ecltype},.#endif
210b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
210c0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
210d0 41 44 41 54 41 0a 7b 20 22 73 71 6c 69 74 65 33  ADATA.{ "sqlite3
210e0 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
210f0 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74  _name",test_stmt
21100 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c  _utf8,(void*)sql
21110 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
21120 62 61 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73  base_name},.{ "s
21130 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61  qlite3_column_ta
21140 62 6c 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73  ble_name",test_s
21150 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29  tmt_utf8,(void*)
21160 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
21170 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73  able_name},.{ "s
21180 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
21190 69 67 69 6e 5f 6e 61 6d 65 22 2c 74 65 73 74 5f  igin_name",test_
211a0 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a  stmt_utf8,(void*
211b0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
211c0 6f 72 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65  origin_name},.#e
211d0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
211e0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
211f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
21200 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c  column_bytes16",
21210 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20   test_stmt_int, 
21220 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
21230 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 7d 2c  olumn_bytes16 },
21240 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
21250 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c  _column_text16",
21260 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31    test_stmt_utf1
21270 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  6, (void*)sqlite
21280 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 7d  3_column_text16}
21290 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
212a0 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22  3_column_name16"
212b0 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ,  test_stmt_utf
212c0 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  16, (void*)sqlit
212d0 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36  e3_column_name16
212e0 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 61  },.     { "add_a
212f0 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f  lignment_test_co
21300 6c 6c 61 74 69 6f 6e 73 22 2c 20 61 64 64 5f 61  llations", add_a
21310 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f  lignment_test_co
21320 6c 6c 61 74 69 6f 6e 73 2c 20 30 20 20 20 20 20  llations, 0     
21330 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   },.#ifndef SQLI
21340 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
21350 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
21360 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
21370 31 36 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  16",test_stmt_ut
21380 66 31 36 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  f16,(void*)sqlit
21390 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
213a0 70 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 69  pe16},.#endif.#i
213b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
213c0 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
213d0 54 41 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c  TA.{"sqlite3_col
213e0 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
213f0 65 31 36 22 2c 0a 20 20 74 65 73 74 5f 73 74 6d  e16",.  test_stm
21400 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33  t_utf16, sqlite3
21410 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
21420 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69  _name16},.{"sqli
21430 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
21440 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73  _name16", test_s
21450 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64  tmt_utf16, (void
21460 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
21470 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a  _table_name16},.
21480 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  {"sqlite3_column
21490 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c  _origin_name16",
214a0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
214b0 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
214c0 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
214d0 61 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23  ame16},.#endif.#
214e0 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
214f0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
21500 6c 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74  lation_v2", test
21510 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
21520 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20  n_v2, 0 },.     
21530 7b 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61  { "sqlite3_globa
21540 6c 5f 72 65 63 6f 76 65 72 22 2c 20 20 20 20 20  l_recover",     
21550 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  test_global_reco
21560 76 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20 20 20  ver, 0   },.    
21570 20 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34 62 69   { "working_64bi
21580 74 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20  t_int",         
21590 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69   working_64bit_i
215a0 6e 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  nt,   0   },.   
215b0 20 20 7b 20 22 76 66 73 5f 75 6e 6c 69 6e 6b 5f    { "vfs_unlink_
215c0 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20  test",          
215d0 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73    vfs_unlink_tes
215e0 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20  t,     0   },.  
215f0 20 20 20 7b 20 22 76 66 73 5f 69 6e 69 74 66 61     { "vfs_initfa
21600 69 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20  il_test",       
21610 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f     vfs_initfail_
21620 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20  test,   0   },. 
21630 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 72 65 67      { "vfs_unreg
21640 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20  ister_all",     
21650 20 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73 74      vfs_unregist
21660 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a  er_all,  0   },.
21670 20 20 20 20 20 7b 20 22 76 66 73 5f 72 65 72 65       { "vfs_rere
21680 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20  gister_all",    
21690 20 20 20 20 20 76 66 73 5f 72 65 72 65 67 69 73       vfs_reregis
216a0 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c  ter_all,  0   },
216b0 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
216c0 6e 74 72 6f 6c 5f 74 65 73 74 22 2c 20 20 20 20  ntrol_test",    
216d0 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72        file_contr
216e0 6f 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d  ol_test,   0   }
216f0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
21700 33 5f 76 66 73 5f 6c 69 73 74 22 2c 20 20 20 20  3_vfs_list",    
21710 20 20 20 20 20 20 20 76 66 73 5f 6c 69 73 74 2c         vfs_list,
21720 20 20 20 20 20 30 20 20 20 7d 2c 0a 0a 20 20 20       0   },..   
21730 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66    /* Functions f
21740 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66 6e  rom os.h */.#ifn
21750 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21760 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22 61 64  UTF16.     { "ad
21770 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c  d_test_collate",
21780 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
21790 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 20  late, 0         
217a0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64     },.     { "ad
217b0 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  d_test_collate_n
217c0 65 65 64 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c  eeded", test_col
217d0 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20 30 20 20  late_needed, 0  
217e0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64     },.     { "ad
217f0 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  d_test_function"
21800 2c 20 20 20 20 20 20 20 74 65 73 74 5f 66 75 6e  ,       test_fun
21810 63 74 69 6f 6e 2c 20 30 20 20 20 20 20 20 20 20  ction, 0        
21820 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20     },.#endif.   
21830 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 65 73    { "sqlite3_tes
21840 74 5f 65 72 72 73 74 72 22 2c 20 20 20 20 20 74  t_errstr",     t
21850 65 73 74 5f 65 72 72 73 74 72 2c 20 30 20 20 20  est_errstr, 0   
21860 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
21870 20 20 7b 20 22 74 63 6c 5f 76 61 72 69 61 62 6c    { "tcl_variabl
21880 65 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 74  e_type",       t
21890 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
218a0 2c 20 30 20 20 20 20 20 20 20 7d 2c 0a 23 69 66  , 0       },.#if
218b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
218c0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
218d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e     { "sqlite3_en
218e0 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
218f0 65 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  e", test_enable_
21900 73 68 61 72 65 64 2c 20 30 20 20 7d 2c 0a 20 20  shared, 0  },.  
21910 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 68     { "sqlite3_sh
21920 61 72 65 64 5f 63 61 63 68 65 5f 72 65 70 6f 72  ared_cache_repor
21930 74 22 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65  t", sqlite3Btree
21940 53 68 61 72 65 64 43 61 63 68 65 52 65 70 6f 72  SharedCacheRepor
21950 74 2c 20 30 7d 2c 0a 23 65 6e 64 69 66 0a 20 20  t, 0},.#endif.  
21960 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69     { "sqlite3_li
21970 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 22  bversion_number"
21980 2c 20 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f  , test_libversio
21990 6e 5f 6e 75 6d 62 65 72 2c 20 30 20 20 7d 2c 0a  n_number, 0  },.
219a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
219b0 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
219c0 44 41 54 41 0a 20 20 20 20 20 7b 20 22 73 71 6c  DATA.     { "sql
219d0 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
219e0 6e 5f 6d 65 74 61 64 61 74 61 22 2c 20 74 65 73  n_metadata", tes
219f0 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  t_table_column_m
21a00 65 74 61 64 61 74 61 2c 20 30 20 20 7d 2c 0a 23  etadata, 0  },.#
21a10 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
21a20 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
21a30 4f 42 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  OB.     { "sqlit
21a40 65 33 5f 62 6c 6f 62 5f 72 65 61 64 22 2c 20 20  e3_blob_read",  
21a50 74 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64 2c 20  test_blob_read, 
21a60 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  0  },.     { "sq
21a70 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
21a80 22 2c 20 74 65 73 74 5f 62 6c 6f 62 5f 77 72 69  ", test_blob_wri
21a90 74 65 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66  te, 0  },.#endif
21aa0 0a 20 20 20 20 20 7b 20 22 70 63 61 63 68 65 5f  .     { "pcache_
21ab0 73 74 61 74 73 22 2c 20 20 20 20 20 20 20 74 65  stats",       te
21ac0 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73 2c  st_pcache_stats,
21ad0 20 30 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74   0  },.  };.  st
21ae0 61 74 69 63 20 69 6e 74 20 62 69 74 6d 61 73 6b  atic int bitmask
21af0 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42  _size = sizeof(B
21b00 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20 69 6e 74  itmask)*8;.  int
21b10 20 69 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74   i;.  extern int
21b20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
21b30 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f 66 75 6c  unt, sqlite3_ful
21b40 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20 65  lsync_count;.  e
21b50 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
21b60 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
21b70 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
21b80 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e  qlite3_like_coun
21b90 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
21ba0 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f  sqlite3_xferopt_
21bb0 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
21bc0 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
21bd0 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 3b 0a  r_readdb_count;.
21be0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
21bf0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
21c00 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  db_count;.  exte
21c10 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
21c20 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
21c30 74 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  t;.#if SQLITE_OS
21c40 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64  _UNIX && defined
21c50 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
21c60 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
21c70 46 45 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  FE.  extern int 
21c80 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
21c90 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3b 0a  achOthersLocks;.
21ca0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
21cb0 45 5f 4f 53 5f 57 49 4e 0a 20 20 65 78 74 65 72  E_OS_WIN.  exter
21cc0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  n int sqlite3_os
21cd0 5f 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 23 69  _type;.#endif.#i
21ce0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
21cf0 47 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  G.  extern int s
21d00 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
21d10 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
21d20 71 6c 69 74 65 33 4f 53 54 72 61 63 65 3b 0a 20  qlite3OSTrace;. 
21d30 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
21d40 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63  te3VdbeAddopTrac
21d50 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  e;.#endif.#ifdef
21d60 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65   SQLITE_TEST.  e
21d70 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
21d80 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 3b  3_enable_in_opt;
21d90 0a 20 20 65 78 74 65 72 6e 20 63 68 61 72 20 73  .  extern char s
21da0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
21db0 6e 5b 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 68  n[];.  static ch
21dc0 61 72 20 2a 71 75 65 72 79 5f 70 6c 61 6e 20 3d  ar *query_plan =
21dd0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
21de0 6c 61 6e 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 66  lan;.#endif..  f
21df0 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
21e00 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43  (aCmd)/sizeof(aC
21e10 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  md[0]); i++){.  
21e20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d    Tcl_CreateComm
21e30 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43 6d 64  and(interp, aCmd
21e40 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b  [i].zName, aCmd[
21e50 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b  i].xProc, 0, 0);
21e60 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
21e70 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  i<sizeof(aObjCmd
21e80 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  )/sizeof(aObjCmd
21e90 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
21ea0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
21eb0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62  mand(interp, aOb
21ec0 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a  jCmd[i].zName, .
21ed0 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d 64 5b          aObjCmd[
21ee0 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a 43 6d  i].xProc, aObjCm
21ef0 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74 61 2c  d[i].clientData,
21f00 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c   0);.  }.  Tcl_L
21f10 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
21f20 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f  sqlite_search_co
21f30 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
21f40 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 65 61  ar*)&sqlite3_sea
21f50 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  rch_count, TCL_L
21f60 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
21f70 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
21f80 22 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75  "sqlite_sort_cou
21f90 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
21fa0 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 6f 72 74  r*)&sqlite3_sort
21fb0 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
21fc0 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
21fd0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
21fe0 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
21ff0 7a 65 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  ze", .      (cha
22000 72 2a 29 26 73 71 6c 69 74 65 33 5f 6d 61 78 5f  r*)&sqlite3_max_
22010 62 6c 6f 62 73 69 7a 65 2c 20 54 43 4c 5f 4c 49  blobsize, TCL_LI
22020 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
22030 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
22040 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
22050 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
22060 2a 29 26 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f  *)&sqlite3_like_
22070 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
22080 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
22090 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
220a0 69 74 65 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  ite_interrupt_co
220b0 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
220c0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 69 6e 74  ar*)&sqlite3_int
220d0 65 72 72 75 70 74 5f 63 6f 75 6e 74 2c 20 54 43  errupt_count, TC
220e0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
220f0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
22100 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 5f  p, "sqlite_open_
22110 66 69 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  file_count", .  
22120 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
22130 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  te3_open_file_co
22140 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
22150 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
22160 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
22170 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 22 2c  e_current_time",
22180 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
22190 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
221a0 74 69 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  time, TCL_LINK_I
221b0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
221c0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
221d0 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
221e0 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
221f0 29 26 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70  )&sqlite3_xferop
22200 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  t_count, TCL_LIN
22210 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
22220 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
22230 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
22240 64 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  ddb_count",.    
22250 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
22260 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
22270 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
22280 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
22290 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
222a0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
222b0 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  b_count",.      
222c0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
222d0 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
222e0 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
222f0 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
22300 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
22310 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
22320 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
22330 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61  har*)&sqlite3_pa
22340 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
22350 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
22360 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22370 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c  OMIT_UTF16.  Tcl
22380 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
22390 20 22 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69   "unaligned_stri
223a0 6e 67 5f 63 6f 75 6e 74 65 72 22 2c 0a 20 20 20  ng_counter",.   
223b0 20 20 20 28 63 68 61 72 2a 29 26 75 6e 61 6c 69     (char*)&unali
223c0 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  gned_string_coun
223d0 74 65 72 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ter, TCL_LINK_IN
223e0 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  T);.#endif.#if S
223f0 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26  QLITE_OS_UNIX &&
22400 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
22410 54 45 53 54 29 20 26 26 20 53 51 4c 49 54 45 5f  TEST) && SQLITE_
22420 54 48 52 45 41 44 53 41 46 45 0a 20 20 54 63 6c  THREADSAFE.  Tcl
22430 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
22440 20 22 74 68 72 65 61 64 73 4f 76 65 72 72 69 64   "threadsOverrid
22450 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
22460 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
22470 26 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65  &threadsOverride
22480 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 2c  EachOthersLocks,
22490 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
224a0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
224b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
224c0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
224d0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c  nterp, "sqlite_l
224e0 61 73 74 5f 6e 65 65 64 65 64 5f 63 6f 6c 6c 61  ast_needed_colla
224f0 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 28 63 68  tion",.      (ch
22500 61 72 2a 29 26 70 7a 4e 65 65 64 65 64 43 6f 6c  ar*)&pzNeededCol
22510 6c 61 74 69 6f 6e 2c 20 54 43 4c 5f 4c 49 4e 4b  lation, TCL_LINK
22520 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b  _STRING|TCL_LINK
22530 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e  _READ_ONLY);.#en
22540 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  dif.#if SQLITE_O
22550 53 5f 57 49 4e 0a 20 20 54 63 6c 5f 4c 69 6e 6b  S_WIN.  Tcl_Link
22560 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
22570 69 74 65 5f 6f 73 5f 74 79 70 65 22 2c 0a 20 20  ite_os_type",.  
22580 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
22590 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 54 43 4c  te3_os_type, TCL
225a0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64  _LINK_INT);.#end
225b0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
225c0 5f 54 45 53 54 0a 20 20 54 63 6c 5f 4c 69 6e 6b  _TEST.  Tcl_Link
225d0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
225e0 69 74 65 5f 71 75 65 72 79 5f 70 6c 61 6e 22 2c  ite_query_plan",
225f0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 71  .      (char*)&q
22600 75 65 72 79 5f 70 6c 61 6e 2c 20 54 43 4c 5f 4c  uery_plan, TCL_L
22610 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c  INK_STRING|TCL_L
22620 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a  INK_READ_ONLY);.
22630 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
22640 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 54 63 6c  LITE_DEBUG.  Tcl
22650 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
22660 20 22 73 71 6c 69 74 65 5f 61 64 64 6f 70 5f 74   "sqlite_addop_t
22670 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68  race",.      (ch
22680 61 72 2a 29 26 73 71 6c 69 74 65 33 56 64 62 65  ar*)&sqlite3Vdbe
22690 41 64 64 6f 70 54 72 61 63 65 2c 20 54 43 4c 5f  AddopTrace, TCL_
226a0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
226b0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
226c0 20 22 73 71 6c 69 74 65 5f 77 68 65 72 65 5f 74   "sqlite_where_t
226d0 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68  race",.      (ch
226e0 61 72 2a 29 26 73 71 6c 69 74 65 33 57 68 65 72  ar*)&sqlite3Wher
226f0 65 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b  eTrace, TCL_LINK
22700 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
22710 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
22720 6c 69 74 65 5f 6f 73 5f 74 72 61 63 65 22 2c 0a  lite_os_trace",.
22730 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
22740 6c 69 74 65 33 4f 53 54 72 61 63 65 2c 20 54 43  lite3OSTrace, TC
22750 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e  L_LINK_INT);.#en
22760 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
22770 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
22780 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
22790 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65  erp, "sqlite_ope
227a0 6e 74 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a 20 20  ntemp_count",.  
227b0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
227c0 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
227d0 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
227e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f  );.#endif.  Tcl_
227f0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
22800 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  "sqlite_static_b
22810 69 6e 64 5f 76 61 6c 75 65 22 2c 0a 20 20 20 20  ind_value",.    
22820 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
22830 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
22840 75 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52  ue, TCL_LINK_STR
22850 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  ING);.  Tcl_Link
22860 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
22870 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
22880 6e 62 79 74 65 22 2c 0a 20 20 20 20 20 20 28 63  nbyte",.      (c
22890 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61  har*)&sqlite_sta
228a0 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20  tic_bind_nbyte, 
228b0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
228c0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
228d0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d  erp, "sqlite_tem
228e0 70 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20  p_directory",.  
228f0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
22900 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
22910 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52  ry, TCL_LINK_STR
22920 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  ING);.  Tcl_Link
22930 56 61 72 28 69 6e 74 65 72 70 2c 20 22 62 69 74  Var(interp, "bit
22940 6d 61 73 6b 5f 73 69 7a 65 22 2c 0a 20 20 20 20  mask_size",.    
22950 20 20 28 63 68 61 72 2a 29 26 62 69 74 6d 61 73    (char*)&bitmas
22960 6b 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b  k_size, TCL_LINK
22970 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45  _INT|TCL_LINK_RE
22980 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f  AD_ONLY);.  Tcl_
22990 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
229a0 22 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75  "sqlite_sync_cou
229b0 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
229c0 2a 29 26 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  *)&sqlite3_sync_
229d0 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
229e0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
229f0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
22a00 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  ite_fullsync_cou
22a10 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
22a20 2a 29 26 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  *)&sqlite3_fulls
22a30 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ync_count, TCL_L
22a40 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 64 65 66  INK_INT);.#ifdef
22a50 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 54   SQLITE_TEST.  T
22a60 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
22a70 70 2c 20 22 73 71 6c 69 74 65 5f 65 6e 61 62 6c  p, "sqlite_enabl
22a80 65 5f 69 6e 5f 6f 70 74 22 2c 0a 20 20 20 20 20  e_in_opt",.     
22a90 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
22aa0 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 2c 20  _enable_in_opt, 
22ab0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
22ac0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
22ad0 43 4c 5f 4f 4b 3b 0a 7d 0a                       CL_OK;.}.