/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact c4de690aad182606e5914f6f3c8f43869fbdaaa8:


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 35 20 32 30 30 38 2f 30 39 2f 31   1.325 2008/09/1
0240: 31 20 31 30 3a 32 39 3a 31 36 20 64 61 6e 69 65  1 10:29:16 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: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 63 6f  .**.**   This co
b180: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
b190: 20 74 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   test the sqlite
b1a0: 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29 20 69  3_blob_write() i
b1b0: 6e 20 77 61 79 73 20 74 68 61 74 0a 2a 2a 20 20  n ways that.**  
b1c0: 20 74 68 65 20 54 63 6c 20 63 68 61 6e 6e 65 6c   the Tcl channel
b1d0: 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20   interface does 
b1e0: 6e 6f 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  not. The first a
b1f0: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 0a 2a  rgument should.*
b200: 2a 20 20 20 62 65 20 74 68 65 20 6e 61 6d 65 20  *   be the name 
b210: 6f 66 20 61 20 76 61 6c 69 64 20 63 68 61 6e 6e  of a valid chann
b220: 65 6c 20 63 72 65 61 74 65 64 20 62 79 20 74 68  el created by th
b230: 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d 65 74  e [incrblob] met
b240: 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61 20 64 61  hod.**   of a da
b250: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54  tabase handle. T
b260: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
b270: 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  ls sqlite3_blob_
b280: 77 72 69 74 65 28 29 0a 2a 2a 20 20 20 74 6f 20  write().**   to 
b290: 77 72 69 74 65 20 74 68 65 20 44 41 54 41 20 62  write the DATA b
b2a0: 79 74 65 2d 61 72 72 61 79 20 74 6f 20 74 68 65  yte-array to the
b2b0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 53 51 4c 69   underlying SQLi
b2c0: 74 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a  te blob handle..
b2d0: 2a 2a 20 20 20 61 74 20 6f 66 66 73 65 74 20 4f  **   at offset O
b2e0: 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f  FFSET..**.**   O
b2f0: 6e 20 73 75 63 63 65 73 73 2c 20 61 6e 20 65 6d  n success, an em
b300: 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 72 65  pty string is re
b310: 74 75 72 6e 65 64 2e 20 4f 6e 20 66 61 69 6c 75  turned. On failu
b320: 72 65 2c 20 74 68 65 20 69 6e 74 65 72 70 72 65  re, the interpre
b330: 74 65 72 0a 2a 2a 20 20 20 72 65 73 75 6c 74 20  ter.**   result 
b340: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 74 65  is set to the te
b350: 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
b360: 6e 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  n of the returne
b370: 64 20 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a  d error code .**
b380: 20 20 20 28 69 2e 65 2e 20 22 53 51 4c 49 54 45     (i.e. "SQLITE
b390: 5f 4e 4f 4d 45 4d 22 29 20 61 6e 64 20 61 20 54  _NOMEM") and a T
b3a0: 63 6c 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  cl exception is 
b3b0: 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69  thrown..*/.stati
b3c0: 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f  c int test_blob_
b3d0: 77 72 69 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  write(.  ClientD
b3e0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
b3f0: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
b400: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
b410: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
b420: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
b430: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
b440: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
b450: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
b460: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b470: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
b480: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
b490: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
b4a0: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
b4b0: 29 7b 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  ){.  Tcl_Channel
b4c0: 20 63 68 61 6e 6e 65 6c 3b 0a 20 20 43 6c 69 65   channel;.  Clie
b4d0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
b4e0: 61 74 61 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  ata;.  sqlite3_b
b4f0: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  lob *pBlob;.  in
b500: 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 69 6e 74  t notUsed;.  int
b510: 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
b520: 72 63 3b 0a 0a 20 20 75 6e 73 69 67 6e 65 64 20  rc;..  unsigned 
b530: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 69 6e  char *zBuf;.  in
b540: 74 20 6e 42 75 66 3b 0a 20 20 0a 20 20 69 66 28  t nBuf;.  .  if(
b550: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
b560: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
b570: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
b580: 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  , "CHANNEL OFFSE
b590: 54 20 44 41 54 41 22 29 3b 0a 20 20 20 20 72 65  T DATA");.    re
b5a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b5b0: 20 20 7d 0a 0a 20 20 63 68 61 6e 6e 65 6c 20 3d    }..  channel =
b5c0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
b5d0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
b5e0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
b5f0: 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  &notUsed);.  if(
b600: 20 21 63 68 61 6e 6e 65 6c 0a 20 20 20 7c 7c 20   !channel.   || 
b610: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
b620: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
b630: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 4f 66 66  , objv[2], &iOff
b640: 73 65 74 29 0a 20 20 20 7c 7c 20 69 4f 66 66 73  set).   || iOffs
b650: 65 74 3c 30 0a 20 20 29 7b 20 0a 20 20 20 20 72  et<0.  ){ .    r
b660: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b670: 0a 20 20 7d 0a 0a 20 20 69 6e 73 74 61 6e 63 65  .  }..  instance
b680: 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 43 68  Data = Tcl_GetCh
b690: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
b6a0: 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 70 42  a(channel);.  pB
b6b0: 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69 74 65 33  lob = *((sqlite3
b6c0: 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74 61 6e 63  _blob **)instanc
b6d0: 65 44 61 74 61 29 3b 0a 0a 20 20 7a 42 75 66 20  eData);..  zBuf 
b6e0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
b6f0: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ayFromObj(objv[3
b700: 5d 2c 20 26 6e 42 75 66 29 3b 0a 20 20 72 63 20  ], &nBuf);.  rc 
b710: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77  = sqlite3_blob_w
b720: 72 69 74 65 28 70 42 6c 6f 62 2c 20 7a 42 75 66  rite(pBlob, zBuf
b730: 2c 20 6e 42 75 66 2c 20 69 4f 66 66 73 65 74 29  , nBuf, iOffset)
b740: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b750: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
b760: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
b770: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
b780: 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28  e3TestErrorName(
b790: 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  rc), TCL_VOLATIL
b7a0: 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  E);.  }..  retur
b7b0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
b7c0: 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f   ? TCL_OK : TCL_
b7d0: 45 52 52 4f 52 29 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR);.}.#endif
b7e0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
b7f0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
b800: 6c 6c 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48 41  llation_v2 DB-HA
b810: 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52  NDLE NAME CMP-PR
b820: 4f 43 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a  OC DEL-PROC.**.*
b830: 2a 20 20 20 54 68 69 73 20 54 63 6c 20 70 72 6f  *   This Tcl pro
b840: 63 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  c is used for te
b850: 73 74 69 6e 67 20 74 68 65 20 65 78 70 65 72 69  sting the experi
b860: 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c 69  mental.**   sqli
b870: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
b880: 74 69 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72 66  tion_v2() interf
b890: 61 63 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54  ace..*/.struct T
b8a0: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b 0a  estCollationX {.
b8b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
b8c0: 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
b8d0: 2a 70 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  *pCmp;.  Tcl_Obj
b8e0: 20 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65 64   *pDel;.};.typed
b8f0: 65 66 20 73 74 72 75 63 74 20 54 65 73 74 43 6f  ef struct TestCo
b900: 6c 6c 61 74 69 6f 6e 58 20 54 65 73 74 43 6f 6c  llationX TestCol
b910: 6c 61 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63 20  lationX;.static 
b920: 76 6f 69 64 20 74 65 73 74 43 72 65 61 74 65 43  void testCreateC
b930: 6f 6c 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69 64  ollationDel(void
b940: 20 2a 70 43 74 78 29 7b 0a 20 20 54 65 73 74 43   *pCtx){.  TestC
b950: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28  ollationX *p = (
b960: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
b970: 29 70 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72 63  )pCtx;..  int rc
b980: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
b990: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70  (p->interp, p->p
b9a0: 44 65 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Del, TCL_EVAL_DI
b9b0: 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c  RECT|TCL_EVAL_GL
b9c0: 4f 42 41 4c 29 3b 0a 20 20 69 66 28 20 72 63 21  OBAL);.  if( rc!
b9d0: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  =TCL_OK ){.    T
b9e0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
b9f0: 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  or(p->interp);. 
ba00: 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65   }..  Tcl_DecrRe
ba10: 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b  fCount(p->pCmp);
ba20: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
ba30: 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20 20  unt(p->pDel);.  
ba40: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f  sqlite3_free((vo
ba50: 69 64 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74 69  id *)p);.}.stati
ba60: 63 20 69 6e 74 20 74 65 73 74 43 72 65 61 74 65  c int testCreate
ba70: 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20 20  CollationCmp(.  
ba80: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e  void *pCtx,.  in
ba90: 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73 74  t nLeft,.  const
baa0: 20 76 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20 20   void *zLeft,.  
bab0: 69 6e 74 20 6e 52 69 67 68 74 2c 0a 20 20 63 6f  int nRight,.  co
bac0: 6e 73 74 20 76 6f 69 64 20 2a 7a 52 69 67 68 74  nst void *zRight
bad0: 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74  .){.  TestCollat
bae0: 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43  ionX *p = (TestC
baf0: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78  ollationX *)pCtx
bb00: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63  ;.  Tcl_Obj *pSc
bb10: 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69  ript = Tcl_Dupli
bb20: 63 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70 29  cateObj(p->pCmp)
bb30: 3b 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20 30  ;.  int iRes = 0
bb40: 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  ;..  Tcl_IncrRef
bb50: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
bb60: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
bb70: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53  endElement(0, pS
bb80: 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74  cript, Tcl_NewSt
bb90: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
bba0: 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b 0a  zLeft, nLeft));.
bbb0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
bbc0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53  endElement(0, pS
bbd0: 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74  cript, Tcl_NewSt
bbe0: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
bbf0: 7a 52 69 67 68 74 2c 6e 52 69 67 68 74 29 29 3b  zRight,nRight));
bc00: 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ..  if( TCL_OK!=
bc10: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
bc20: 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  >interp, pScript
bc30: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
bc40: 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  T|TCL_EVAL_GLOBA
bc50: 4c 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21  L).   || TCL_OK!
bc60: 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
bc70: 62 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54 63  bj(p->interp, Tc
bc80: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70  l_GetObjResult(p
bc90: 2d 3e 69 6e 74 65 72 70 29 2c 20 26 69 52 65 73  ->interp), &iRes
bca0: 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42  ).  ){.    Tcl_B
bcb0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70  ackgroundError(p
bcc0: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20  ->interp);.  }. 
bcd0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
bce0: 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20 72  t(pScript);..  r
bcf0: 65 74 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73 74  eturn iRes;.}.st
bd00: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72  atic int test_cr
bd10: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
bd20: 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  2(.  ClientData 
bd30: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
bd40: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
bd50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
bd60: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
bd70: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
bd80: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
bd90: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
bda0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
bdb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
bdc0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
bdd0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
bde0: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
bdf0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
be00: 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20   TestCollationX 
be10: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *p;.  sqlite3 *d
be20: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
be30: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
be40: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
be50: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
be60: 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20  bjv, "DB-HANDLE 
be70: 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45  NAME CMP-PROC DE
be80: 4c 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65  L-PROC");.    re
be90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bea0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
beb0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
bec0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
bed0: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
bee0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bef0: 0a 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c  .  p = (TestColl
bf00: 61 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33  ationX *)sqlite3
bf10: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54  _malloc(sizeof(T
bf20: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b  estCollationX));
bf30: 0a 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a  .  p->pCmp = obj
bf40: 76 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20  v[3];.  p->pDel 
bf50: 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e  = objv[4];.  p->
bf60: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
bf70: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
bf80: 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20  unt(p->pCmp);.  
bf90: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
bfa0: 28 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63  (p->pDel);..  rc
bfb0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
bfc0: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64  e_collation_v2(d
bfd0: 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  b, Tcl_GetString
bfe0: 28 6f 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a  (objv[2]), 16, .
bff0: 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c        (void *)p,
c000: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
c010: 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65  tionCmp, testCre
c020: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a  ateCollationDel.
c030: 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53    );.  if( rc!=S
c040: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a  QLITE_MISUSE ){.
c050: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
c060: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71  sult(interp, "sq
c070: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
c080: 6c 61 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64  late_v2() failed
c090: 20 74 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20   to detect ".   
c0a0: 20 20 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65     "an invalid e
c0b0: 6e 63 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a  ncoding", (char*
c0c0: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
c0d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
c0e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
c0f0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
c100: 32 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72  2(db, Tcl_GetStr
c110: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51  ing(objv[2]), SQ
c120: 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
c130: 20 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73    (void *)p, tes
c140: 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e  tCreateCollation
c150: 43 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43  Cmp, testCreateC
c160: 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b  ollationDel.  );
c170: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
c180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
c190: 3a 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  : sqlite3_load_e
c1a0: 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44  xtension DB-HAND
c1b0: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 0a 2a  LE FILE ?PROC?.*
c1c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
c1d0: 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  t_load_extension
c1e0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
c1f0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
c200: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
c210: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
c220: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
c230: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
c240: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
c250: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
c260: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c270: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
c280: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
c290: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c2a0: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
c2b0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
c2c0: 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
c2d0: 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
c2e0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
c2f0: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 68 61  char *zDb;.  cha
c300: 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72  r *zFile;.  char
c310: 20 2a 7a 50 72 6f 63 20 3d 20 30 3b 0a 20 20 63   *zProc = 0;.  c
c320: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a  har *zErr = 0;..
c330: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26    if( objc!=4 &&
c340: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
c350: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
c360: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
c370: 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c  , "DB-HANDLE FIL
c380: 45 20 3f 50 52 4f 43 3f 22 29 3b 0a 20 20 20 20  E ?PROC?");.    
c390: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c3a0: 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63  ;.  }.  zDb = Tc
c3b0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c3c0: 5b 31 5d 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20  [1]);.  zFile = 
c3d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
c3e0: 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 6f 62  jv[2]);.  if( ob
c3f0: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 50 72  jc==4 ){.    zPr
c400: 6f 63 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  oc = Tcl_GetStri
c410: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d  ng(objv[3]);.  }
c420: 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74  ..  /* Extract t
c430: 68 65 20 43 20 64 61 74 61 62 61 73 65 20 68 61  he C database ha
c440: 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 54 63  ndle from the Tc
c450: 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a  l command name *
c460: 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74  /.  if( !Tcl_Get
c470: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
c480: 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66  rp, zDb, &cmdInf
c490: 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  o) ){.    Tcl_Ap
c4a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
c4b0: 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20  p, "command not 
c4c0: 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28  found: ", zDb, (
c4d0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
c4e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c4f0: 20 20 7d 0a 20 20 64 62 20 3d 20 28 28 73 74 72    }.  db = ((str
c500: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
c510: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
c520: 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65  ata)->db;.  asse
c530: 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 61  rt(db);..  /* Ca
c540: 6c 6c 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ll the underlyin
c550: 67 20 43 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  g C function. If
c560: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c570: 2c 20 73 65 74 20 72 63 20 74 6f 20 0a 20 20 2a  , set rc to .  *
c580: 2a 20 54 43 4c 5f 45 52 52 4f 52 20 61 6e 64 20  * TCL_ERROR and 
c590: 6c 6f 61 64 20 61 6e 79 20 65 72 72 6f 72 20 73  load any error s
c5a0: 74 72 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 69  tring into the i
c5b0: 6e 74 65 72 70 72 65 74 65 72 2e 20 49 66 20 6e  nterpreter. If n
c5c0: 6f 20 0a 20 20 2a 2a 20 65 72 72 6f 72 20 6f 63  o .  ** error oc
c5d0: 63 75 72 73 2c 20 73 65 74 20 72 63 20 74 6f 20  curs, set rc to 
c5e0: 54 43 4c 5f 4f 4b 2e 0a 20 20 2a 2f 0a 23 69 66  TCL_OK..  */.#if
c5f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c600: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
c610: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
c620: 4f 52 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c  OR;.  zErr = sql
c630: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 68  ite3_mprintf("th
c640: 69 73 20 62 75 69 6c 64 20 6f 6d 69 74 73 20 73  is build omits s
c650: 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
c660: 6e 73 69 6f 6e 28 29 22 29 3b 0a 23 65 6c 73 65  nsion()");.#else
c670: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
c680: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64  load_extension(d
c690: 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c  b, zFile, zProc,
c6a0: 20 26 7a 45 72 72 29 3b 0a 23 65 6e 64 69 66 0a   &zErr);.#endif.
c6b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c6c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
c6d0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
c6e0: 20 7a 45 72 72 20 3f 20 7a 45 72 72 20 3a 20 22   zErr ? zErr : "
c6f0: 22 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ", TCL_VOLATILE)
c700: 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45  ;.    rc = TCL_E
c710: 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
c720: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
c730: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
c740: 65 65 28 7a 45 72 72 29 3b 0a 0a 20 20 72 65 74  ee(zErr);..  ret
c750: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c760: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
c770: 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
c780: 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20  nsion DB-HANDLE 
c790: 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61 74 69 63 20  ONOFF.*/.static 
c7a0: 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  int test_enable_
c7b0: 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  load(.  ClientDa
c7c0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
c7d0: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
c7e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c7f0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
c800: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
c810: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
c820: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
c830: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
c840: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c850: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
c860: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
c870: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
c880: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
c890: 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  {.  Tcl_CmdInfo 
c8a0: 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  cmdInfo;.  sqlit
c8b0: 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a  e3 *db;.  char *
c8c0: 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66  zDb;.  int onoff
c8d0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
c8e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
c8f0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
c900: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41   1, objv, "DB-HA
c910: 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a 20 20  NDLE ONOFF");.  
c920: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c930: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20  OR;.  }.  zDb = 
c940: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
c950: 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20 45 78  jv[1]);..  /* Ex
c960: 74 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61  tract the C data
c970: 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  base handle from
c980: 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   the Tcl command
c990: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21   name */.  if( !
c9a0: 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
c9b0: 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20  fo(interp, zDb, 
c9c0: 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20  &cmdInfo) ){.   
c9d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
c9e0: 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61  t(interp, "comma
c9f0: 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c  nd not found: ",
ca00: 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b   zDb, (char*)0);
ca10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ca20: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20  ERROR;.  }.  db 
ca30: 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74  = ((struct Sqlit
ca40: 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a  eDb*)cmdInfo.obj
ca50: 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b  ClientData)->db;
ca60: 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a  .  assert(db);..
ca70: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6f 6e 6f    /* Get the ono
ca80: 66 66 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  ff parameter */.
ca90: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
caa0: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
cab0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e  rp, objv[2], &on
cac0: 6f 66 66 29 20 29 7b 0a 20 20 20 20 72 65 74 75  off) ){.    retu
cad0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cae0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
caf0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
cb00: 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70 65 6e  SION.  Tcl_Appen
cb10: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
cb20: 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d 69 74  "this build omit
cb30: 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  s sqlite3_load_e
cb40: 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 20 20  xtension()");.  
cb50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cb60: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
cb70: 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
cb80: 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e 6f 66  tension(db, onof
cb90: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  f);.  return TCL
cba0: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  _OK;.#endif.}../
cbb0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
cbc0: 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20  ite_abort.**.** 
cbd0: 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 72 6f  Shutdown the pro
cbe0: 63 65 73 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  cess immediately
cbf0: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  .  This is not a
cc00: 20 63 6c 65 61 6e 20 73 68 75 74 64 6f 77 6e 2e   clean shutdown.
cc10: 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
cc20: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
cc30: 20 74 68 65 20 72 65 63 6f 76 65 72 61 62 69 6c   the recoverabil
cc40: 69 74 79 20 6f 66 20 61 20 64 61 74 61 62 61 73  ity of a databas
cc50: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76 65 6e  e in.** the even
cc60: 74 20 6f 66 20 61 20 70 72 6f 67 72 61 6d 20 63  t of a program c
cc70: 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rash..*/.static 
cc80: 69 6e 74 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  int sqlite_abort
cc90: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
cca0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
ccb0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
ccc0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
ccd0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
cce0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
ccf0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
cd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
cd10: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
cd20: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cd40: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
cd50: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  ment */.){.  ass
cd60: 65 72 74 28 20 69 6e 74 65 72 70 3d 3d 30 20 29  ert( interp==0 )
cd70: 3b 20 20 20 2f 2a 20 54 68 69 73 20 77 69 6c 6c  ;   /* This will
cd80: 20 61 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f 0a   always fail */.
cd90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
cda0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
cdb0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
cdc0: 69 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e 65  is a user-define
cdd0: 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77  d SQL function w
cde0: 68 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a 20  hose purpose.** 
cdf0: 69 73 20 74 6f 20 74 65 73 74 20 74 68 65 20 73  is to test the s
ce00: 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74  qlite_set_result
ce10: 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69  () API..*/.stati
ce20: 63 20 76 6f 69 64 20 74 65 73 74 46 75 6e 63 28  c void testFunc(
ce30: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
ce40: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
ce50: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
ce60: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68 69  e **argv){.  whi
ce70: 6c 65 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20  le( argc>=2 ){. 
ce80: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ce90: 41 72 67 30 20 3d 20 28 63 68 61 72 2a 29 73 71  Arg0 = (char*)sq
cea0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
ceb0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
cec0: 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20 20  f( zArg0 ){.    
ced0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
cee0: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20 22  StrICmp(zArg0, "
cef0: 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20  int") ){.       
cf00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
cf10: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
cf20: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
cf30: 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20  rgv[1]));.      
cf40: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
cf50: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
cf60: 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20  int64")==0 ){.  
cf70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
cf80: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
cf90: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
cfa0: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29  e_int64(argv[1])
cfb0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
cfc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
cfd0: 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67 22  p(zArg0,"string"
cfe0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
cff0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
d000: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68  ext(context, (ch
d010: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
d020: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 2c  e_text(argv[1]),
d030: 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20   -1,.           
d040: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d050: 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  T);.      }else 
d060: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
d070: 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c 65  mp(zArg0,"double
d080: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
d090: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
d0a0: 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20  double(context, 
d0b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
d0c0: 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b 0a  uble(argv[1]));.
d0d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d0e0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
d0f0: 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20  Arg0,"null")==0 
d100: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d110: 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63  e3_result_null(c
d120: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
d130: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
d140: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 76  StrICmp(zArg0,"v
d150: 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  alue")==0 ){.   
d160: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
d170: 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78  ult_value(contex
d180: 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65 33 5f  t, argv[sqlite3_
d190: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31  value_int(argv[1
d1a0: 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ])]);.      }els
d1b0: 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  e{.        goto 
d1c0: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20  error_out;.     
d1d0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
d1e0: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
d1f0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 72  ut;.    }.    ar
d200: 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72 67  gc -= 2;.    arg
d210: 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65  v += 2;.  }.  re
d220: 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74  turn;..error_out
d230: 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  :.  sqlite3_resu
d240: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
d250: 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  ,"first argument
d260: 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
d270: 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e 74 20  f: ".      "int 
d280: 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64 6f 75  int64 string dou
d290: 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22 2c  ble null value",
d2a0: 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   -1);.}../*.** U
d2b0: 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 5f 72  sage:   sqlite_r
d2c0: 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e  egister_test_fun
d2d0: 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45 0a  ction  DB  NAME.
d2e0: 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74  **.** Register t
d2f0: 68 65 20 74 65 73 74 20 53 51 4c 20 66 75 6e 63  he test SQL func
d300: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
d310: 62 61 73 65 20 44 42 20 75 6e 64 65 72 20 74 68  base DB under th
d320: 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f 0a  e name NAME..*/.
d330: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
d340: 72 65 67 69 73 74 65 72 5f 66 75 6e 63 28 0a 20  register_func(. 
d350: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
d360: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d370: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
d380: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
d390: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
d3a0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
d3b0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
d3c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d3d0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d3e0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
d3f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
d400: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
d410: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
d420: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
d430: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
d440: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
d450: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d460: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
d470: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
d480: 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20  v[0], .       " 
d490: 44 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45  DB FUNCTION-NAME
d4a0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
d4b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
d4c0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
d4d0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
d4e0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
d4f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d500: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
d510: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
d520: 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51   argv[2], -1, SQ
d530: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20  LITE_UTF8, 0, . 
d540: 20 20 20 20 20 74 65 73 74 46 75 6e 63 2c 20 30       testFunc, 0
d550: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
d560: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
d570: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d580: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
d590: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
d5a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d5b0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
d5c0: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
d5d0: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
d5e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d5f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
d600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
d610: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
d620: 7a 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  ze  STMT .**.** 
d630: 46 69 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65  Finalize a state
d640: 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  ment handle..*/.
d650: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
d660: 66 69 6e 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64  finalize(.  void
d670: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
d680: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
d690: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
d6a0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
d6b0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
d6c0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
d6d0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  t;.  int rc;.  s
d6e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a  qlite3 *db = 0;.
d6f0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
d700: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
d710: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d720: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
d730: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
d740: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
d750: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
d760: 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22  ], 0), " <STMT>"
d770: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
d780: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d790: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
d7a0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
d7b0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
d7c0: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
d7d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d7e0: 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  ;..  if( pStmt )
d7f0: 7b 0a 20 20 20 20 64 62 20 3d 20 53 74 6d 74 54  {.    db = StmtT
d800: 6f 44 62 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  oDb(pStmt);.  }.
d810: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
d820: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
d830: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
d840: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
d850: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
d860: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
d870: 69 66 28 20 64 62 20 26 26 20 73 71 6c 69 74 65  if( db && sqlite
d880: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
d890: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
d8a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d8b0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
d8c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
d8d0: 3a 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f  :  sqlite3_next_
d8e0: 73 74 6d 74 20 20 44 42 20 20 53 54 4d 54 0a 2a  stmt  DB  STMT.*
d8f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
d900: 6e 65 78 74 20 73 74 61 74 6d 65 6e 74 20 69 6e  next statment in
d910: 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20   sequence after 
d920: 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  STMT..*/.static 
d930: 69 6e 74 20 74 65 73 74 5f 6e 65 78 74 5f 73 74  int test_next_st
d940: 6d 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  mt(.  void * cli
d950: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
d960: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
d970: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
d980: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
d990: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
d9a0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 73  stmt *pStmt;.  s
d9b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a  qlite3 *db = 0;.
d9c0: 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
d9d0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
d9e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
d9f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
da00: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
da10: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
da20: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
da30: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
da40: 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 53 54 4d  0], 0), " DB STM
da50: 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
da60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
da70: 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  }..  if( getDbPo
da80: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
da90: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
daa0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
dab0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
dac0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
dad0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
dae0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
daf0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
db00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
db10: 20 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    pStmt = sqlite
db20: 33 5f 6e 65 78 74 5f 73 74 6d 74 28 64 62 2c 20  3_next_stmt(db, 
db30: 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53  pStmt);.  if( pS
db40: 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
db50: 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
db60: 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
db70: 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
db80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
db90: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
dba0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
dbb0: 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
dbc0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
dbd0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
dbe0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 20 53  sqlite3_reset  S
dbf0: 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74  TMT .**.** Reset
dc00: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e   a statement han
dc10: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
dc20: 6e 74 20 74 65 73 74 5f 72 65 73 65 74 28 0a 20  nt test_reset(. 
dc30: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
dc40: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
dc50: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
dc60: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
dc70: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
dc80: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
dc90: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
dca0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
dcb0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
dcc0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
dcd0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
dce0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
dcf0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
dd00: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
dd10: 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
dd20: 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  >", 0);.    retu
dd30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dd40: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
dd50: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
dd60: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
dd70: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
dd80: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
dd90: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
dda0: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
ddb0: 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 26 26  ;.  if( pStmt &&
ddc0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
ddd0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
dde0: 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
ddf0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
de00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
de10: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
de20: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
de30: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
de40: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 2f 2a 0a 20  CL_STATIC);./*. 
de50: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
de60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
de70: 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65 74 75 72 6e  .  }.*/.  return
de80: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
de90: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
dea0: 33 5f 65 78 70 69 72 65 64 20 53 54 4d 54 20 0a  3_expired STMT .
deb0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  **.** Return TRU
dec0: 45 20 69 66 20 61 20 72 65 63 6f 6d 70 69 6c 61  E if a recompila
ded0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
dee0: 65 6d 65 6e 74 20 69 73 20 72 65 63 6f 6d 6d 65  ement is recomme
def0: 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nded..*/.static 
df00: 69 6e 74 20 74 65 73 74 5f 65 78 70 69 72 65 64  int test_expired
df10: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
df20: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
df30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
df40: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
df50: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
df60: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
df70: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 66 28  mt *pStmt;.  if(
df80: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
df90: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
dfa0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
dfb0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
dfc0: 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
dfd0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
dfe0: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
dff0: 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a   " <STMT>", 0);.
e000: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e010: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
e020: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
e030: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
e040: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
e050: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
e060: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
e070: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
e080: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
e090: 6c 65 61 6e 4f 62 6a 28 73 71 6c 69 74 65 33 5f  leanObj(sqlite3_
e0a0: 65 78 70 69 72 65 64 28 70 53 74 6d 74 29 29 29  expired(pStmt)))
e0b0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
e0c0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
e0d0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 74 72 61 6e  e:  sqlite3_tran
e0e0: 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 20 46 52  sfer_bindings FR
e0f0: 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a  OMSTMT TOSTMT.**
e100: 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 61 6c 6c  .** Transfer all
e110: 20 62 69 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46   bindings from F
e120: 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20 74 6f 20  ROMSTMT over to 
e130: 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63  TOSTMT.*/.static
e140: 20 69 6e 74 20 74 65 73 74 5f 74 72 61 6e 73 66   int test_transf
e150: 65 72 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20  er_bind(.  void 
e160: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
e170: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
e180: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
e190: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
e1a0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
e1b0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
e1c0: 31 2c 20 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66  1, *pStmt2;.  if
e1d0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
e1e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e1f0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
e200: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
e210: 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
e220: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
e230: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
e240: 2c 20 22 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f  , " FROM-STMT TO
e250: 2d 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20  -STMT", 0);.    
e260: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e270: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
e280: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
e290: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
e2a0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
e2b0: 74 31 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t1)) return TCL_
e2c0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74  ERROR;.  if( get
e2d0: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
e2e0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
e2f0: 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74  g(objv[2]), &pSt
e300: 6d 74 32 29 29 20 72 65 74 75 72 6e 20 54 43 4c  mt2)) return TCL
e310: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
e320: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
e330: 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77  p, .     Tcl_New
e340: 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74  IntObj(sqlite3_t
e350: 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73  ransfer_bindings
e360: 28 70 53 74 6d 74 31 2c 70 53 74 6d 74 32 29 29  (pStmt1,pStmt2))
e370: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
e380: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
e390: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 68 61  ge:  sqlite3_cha
e3a0: 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  nges DB.**.** Re
e3b0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
e3c0: 6f 66 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  of changes made 
e3d0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
e3e0: 62 79 20 74 68 65 20 6c 61 73 74 20 53 51 4c 0a  by the last SQL.
e3f0: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f  ** execution..*/
e400: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
e410: 5f 63 68 61 6e 67 65 73 28 0a 20 20 76 6f 69 64  _changes(.  void
e420: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
e430: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e440: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
e450: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
e460: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
e470: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
e480: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
e490: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e4a0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
e4b0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
e4c0: 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 54 63  e \"",.       Tc
e4d0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e4e0: 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
e4f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e500: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
e510: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
e520: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
e530: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
e540: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
e550: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
e560: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
e570: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
e580: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
e590: 64 62 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  db)));.  return 
e5a0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
e5b0: 20 54 68 69 73 20 69 73 20 74 68 65 20 22 73 74   This is the "st
e5c0: 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22  atic_bind_value"
e5d0: 20 74 68 61 74 20 76 61 72 69 61 62 6c 65 73 20   that variables 
e5e0: 61 72 65 20 62 6f 75 6e 64 20 74 6f 20 77 68 65  are bound to whe
e5f0: 6e 0a 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f 70  n.** the FLAG op
e600: 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 5f  tion of sqlite3_
e610: 62 69 6e 64 20 69 73 20 22 73 74 61 74 69 63 22  bind is "static"
e620: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
e630: 2a 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  *sqlite_static_b
e640: 69 6e 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 73  ind_value = 0;.s
e650: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
e660: 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79  _static_bind_nby
e670: 74 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55  te = 0;../*.** U
e680: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 62  sage:  sqlite3_b
e690: 69 6e 64 20 20 56 4d 20 20 49 44 58 20 20 56 41  ind  VM  IDX  VA
e6a0: 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a  LUE  FLAGS.**.**
e6b0: 20 53 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   Sets the value 
e6c0: 6f 66 20 74 68 65 20 49 44 58 2d 74 68 20 6f 63  of the IDX-th oc
e6d0: 63 75 72 61 6e 63 65 20 6f 66 20 22 3f 22 20 69  curance of "?" i
e6e0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
e6f0: 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56  QL.** string.  V
e700: 41 4c 55 45 20 69 73 20 74 68 65 20 6e 65 77 20  ALUE is the new 
e710: 76 61 6c 75 65 2e 20 20 49 66 20 46 4c 41 47 53  value.  If FLAGS
e720: 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41  =="null" then VA
e730: 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  LUE is.** ignore
e740: 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
e750: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
e760: 20 49 66 20 46 4c 41 47 53 3d 3d 22 73 74 61 74   If FLAGS=="stat
e770: 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ic" then.** the 
e780: 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
e790: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
e7a0: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 6e  tatic variable n
e7b0: 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  amed.** "sqlite_
e7c0: 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
e7d0: 65 22 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  e".  If FLAGS=="
e7e0: 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20 61 20 63  normal" then a c
e7f0: 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41  opy.** of the VA
e800: 4c 55 45 20 69 73 20 6d 61 64 65 2e 20 20 49 66  LUE is made.  If
e810: 20 46 4c 41 47 53 3d 3d 22 62 6c 6f 62 31 30 22   FLAGS=="blob10"
e820: 20 74 68 65 6e 20 61 20 56 41 4c 55 45 20 69 73   then a VALUE is
e830: 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 20 61   ignored.** an a
e840: 20 31 30 2d 62 79 74 65 20 62 6c 6f 62 20 22 61   10-byte blob "a
e850: 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22  bc\000xyz\000pq"
e860: 20 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   is inserted..*/
e870: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
e880: 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 4e  _bind(.  void *N
e890: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
e8a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
e8b0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
e8c0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
e8d0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
e8e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e900: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
e910: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
e920: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
e930: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
e940: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
e950: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
e960: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
e970: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66  .  int idx;.  if
e980: 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  ( argc!=5 ){.   
e990: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e9a0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
e9b0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
e9c0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
e9d0: 20 0a 20 20 20 20 20 20 20 22 20 56 4d 20 49 44   .       " VM ID
e9e0: 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c 73 74  X VALUE (null|st
e9f0: 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c  atic|normal)\"",
ea00: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
ea10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
ea20: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
ea30: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
ea40: 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20 29 20 72  [1], &pStmt) ) r
ea50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ea60: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
ea70: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
ea80: 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
ea90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
eaa0: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
eab0: 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a  ],"null")==0 ){.
eac0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ead0: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
eae0: 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65 20  , idx);.  }else 
eaf0: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
eb00: 34 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d 30 20  4],"static")==0 
eb10: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
eb20: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
eb30: 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65  tmt, idx, sqlite
eb40: 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
eb50: 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 65  ue, -1, 0);.  }e
eb60: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
eb70: 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 2d 6e  rgv[4],"static-n
eb80: 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  bytes")==0 ){.  
eb90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
eba0: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
ebb0: 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74  idx, sqlite_stat
ebc0: 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 0a 20  ic_bind_value,. 
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebf0: 20 20 20 20 20 20 73 71 6c 69 74 65 5f 73 74 61        sqlite_sta
ec00: 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20  tic_bind_nbyte, 
ec10: 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
ec20: 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
ec30: 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20  normal")==0 ){. 
ec40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
ec50: 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
ec60: 20 69 64 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d   idx, argv[3], -
ec70: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
ec80: 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ENT);.  }else if
ec90: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
eca0: 2c 22 62 6c 6f 62 31 30 22 29 3d 3d 30 20 29 7b  ,"blob10")==0 ){
ecb0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ecc0: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
ecd0: 74 2c 20 69 64 78 2c 20 22 61 62 63 5c 30 30 30  t, idx, "abc\000
ece0: 78 79 7a 5c 30 30 30 70 71 22 2c 20 31 30 2c 20  xyz\000pq", 10, 
ecf0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
ed00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
ed10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ed20: 74 65 72 70 2c 20 22 34 74 68 20 61 72 67 75 6d  terp, "4th argum
ed30: 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  ent should be ".
ed40: 20 20 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c          "\"null\
ed50: 22 20 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20  " or \"static\" 
ed60: 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20  or \"normal\"", 
ed70: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
ed80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
ed90: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
eda0: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
edb0: 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
edc0: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
edd0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
ede0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
edf0: 66 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e  f[50];.    sprin
ee00: 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22  tf(zBuf, "(%d) "
ee10: 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
ee20: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ee30: 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
ee40: 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
ee50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ee60: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
ee70: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
ee80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ee90: 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55  IT_UTF16./*.** U
eea0: 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
eeb0: 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20  ollate <db ptr> 
eec0: 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
eed0: 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a   <utf16be>.**.**
eee0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
eef0: 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
ef00: 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63  hat SQLite selec
ef10: 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  ts the correct c
ef20: 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75  ollation.** sequ
ef30: 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68  ence callback wh
ef40: 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73  en multiple vers
ef50: 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72  ions (for differ
ef60: 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ent text encodin
ef70: 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c  gs).** are avail
ef80: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  able..**.** Call
ef90: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
efa0: 20 72 65 67 69 73 74 65 72 73 20 74 68 65 20 63   registers the c
efb0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
efc0: 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  e "test_collate"
efd0: 0a 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61 73  .** with databas
efe0: 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54  e handle <db>. T
eff0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
f000: 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73  nt must be a lis
f010: 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f  t of three.** bo
f020: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66  olean values. If
f030: 20 74 68 65 20 66 69 72 73 74 20 69 73 20 74 72   the first is tr
f040: 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69  ue, then a versi
f050: 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61  on of test_colla
f060: 74 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65  te is.** registe
f070: 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
f080: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  f the second is 
f090: 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20  true, a version 
f0a0: 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  is registered fo
f0b0: 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69  r.** UTF-16le, i
f0c0: 66 20 74 68 65 20 74 68 69 72 64 20 69 73 20 74  f the third is t
f0d0: 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20  rue, a UTF-16be 
f0e0: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
f0f0: 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75  able..** Previou
f100: 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65  s versions of te
f110: 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64  st_collate are d
f120: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
f130: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
f140: 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74  ence test_collat
f150: 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  e is implemented
f160: 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a   by calling the.
f170: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  ** following TCL
f180: 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
f190: 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c   "test_collate <
f1a0: 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e  enc> <lhs> <rhs>
f1b0: 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73  ".**.** The <lhs
f1c0: 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20  > and <rhs> are 
f1d0: 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62  the two values b
f1e0: 65 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65  eing compared, e
f1f0: 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e  ncoded in UTF-8.
f200: 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61  .** The <enc> pa
f210: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
f220: 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63  ncoding of the c
f230: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
f240: 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65  n that.** SQLite
f250: 20 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c   selected to cal
f260: 6c 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74 20  l. The TCL test 
f270: 73 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74  script implement
f280: 73 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63  s the.** "test_c
f290: 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a  ollate" proc..**
f2a0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
f2b0: 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72  is will only wor
f2c0: 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 70  k with one intep
f2d0: 72 65 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c  reter at a time,
f2e0: 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72   as the.** inter
f2f0: 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65  p pointer to use
f300: 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67   when evaluating
f310: 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   the TCL script 
f320: 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
f330: 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
f340: 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  rp..*/.static Tc
f350: 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43  l_Interp* pTestC
f360: 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74  ollateInterp;.st
f370: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
f380: 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f  llate_func(.  vo
f390: 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  id *pCtx, .  int
f3a0: 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nA, const void 
f3b0: 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63  *zA,.  int nB, c
f3c0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
f3d0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
f3e0: 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49   = pTestCollateI
f3f0: 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63  nterp;.  int enc
f400: 69 6e 20 3d 20 28 69 6e 74 29 70 43 74 78 3b 0a  in = (int)pCtx;.
f410: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74    int res;.  int
f420: 20 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76   n;..  sqlite3_v
f430: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63  alue *pVal;.  Tc
f440: 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58  l_Obj *pX;..  pX
f450: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
f460: 4f 62 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74  Obj("test_collat
f470: 65 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  e", -1);.  Tcl_I
f480: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ncrRefCount(pX);
f490: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 6e 63 69  ..  switch( enci
f4a0: 6e 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  n ){.    case SQ
f4b0: 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20  LITE_UTF8:.     
f4c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f4d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54  ndElement(i,pX,T
f4e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f4f0: 22 55 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20  "UTF-8",-1));.  
f500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
f510: 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ase SQLITE_UTF16
f520: 4c 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  LE:.      Tcl_Li
f530: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f540: 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53  nt(i,pX,Tcl_NewS
f550: 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36  tringObj("UTF-16
f560: 4c 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20  LE",-1));.      
f570: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
f580: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3a 0a  SQLITE_UTF16BE:.
f590: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
f5a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f5b0: 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ,pX,Tcl_NewStrin
f5c0: 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c  gObj("UTF-16BE",
f5d0: 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  -1));.      brea
f5e0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
f5f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
f600: 0a 20 20 7d 0a 0a 20 20 70 56 61 6c 20 3d 20 73  .  }..  pVal = s
f610: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
f620: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
f630: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 41  eSetStr(pVal, nA
f640: 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c  , zA, encin, SQL
f650: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 6e  ITE_STATIC);.  n
f660: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
f670: 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20  _bytes(pVal);.  
f680: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f690: 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20  dElement(i,pX,. 
f6a0: 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
f6b0: 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
f6c0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
f6d0: 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 73 71 6c  pVal),n));.  sql
f6e0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
f6f0: 70 56 61 6c 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e  pVal, nB, zB, en
f700: 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  cin, SQLITE_STAT
f710: 49 43 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  IC);.  n = sqlit
f720: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
f730: 56 61 6c 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Val);.  Tcl_List
f740: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f750: 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 54 63 6c  (i,pX,.      Tcl
f760: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
f770: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
f780: 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29  ue_text(pVal),n)
f790: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
f7a0: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
f7b0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 2c  Tcl_EvalObjEx(i,
f7c0: 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44   pX, 0);.  Tcl_D
f7d0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ecrRefCount(pX);
f7e0: 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  .  Tcl_GetIntFro
f7f0: 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47 65 74 4f  mObj(i, Tcl_GetO
f800: 62 6a 52 65 73 75 6c 74 28 69 29 2c 20 26 72 65  bjResult(i), &re
f810: 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  s);.  return res
f820: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ;.}.static int t
f830: 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76  est_collate(.  v
f840: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
f850: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
f860: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
f870: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
f880: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
f890: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
f8a0: 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71 6c 69 74  int val;.  sqlit
f8b0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
f8c0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
f8d0: 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20   objc!=5 ) goto 
f8e0: 62 61 64 5f 61 72 67 73 3b 0a 20 20 70 54 65 73  bad_args;.  pTes
f8f0: 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 20 3d  tCollateInterp =
f900: 20 69 6e 74 65 72 70 3b 0a 20 20 69 66 28 20 67   interp;.  if( g
f910: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
f920: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
f930: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
f940: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
f950: 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f  ROR;..  if( TCL_
f960: 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
f970: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
f980: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29  , objv[2], &val)
f990: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
f9a0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
f9b0: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
f9c0: 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63  tion(db, "test_c
f9d0: 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
f9e0: 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 20  UTF8, .         
f9f0: 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f   (void *)SQLITE_
fa00: 55 54 46 38 2c 20 76 61 6c 3f 74 65 73 74 5f 63  UTF8, val?test_c
fa10: 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
fa20: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
fa30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
fa40: 20 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20   void *zUtf16;. 
fa50: 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
fa60: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
fa70: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
fa80: 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[3], &val) ) re
fa90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
faa0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fab0: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
fac0: 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c  n(db, "test_coll
fad0: 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ate", SQLITE_UTF
fae0: 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20  16LE, .         
faf0: 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54     (void *)SQLIT
fb00: 45 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74  E_UTF16LE, val?t
fb10: 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
fb20: 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 54 43 4c  :0);.    if( TCL
fb30: 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
fb40: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
fb50: 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c  p, objv[4], &val
fb60: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
fb70: 52 52 4f 52 3b 0a 0a 23 69 66 20 30 0a 20 20 20  RROR;..#if 0.   
fb80: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 4d 61   if( sqlite3_iMa
fb90: 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a 20 20  llocFail>0 ){.  
fba0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c      sqlite3_iMal
fbb0: 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d  locFail++;.    }
fbc0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
fbd0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
fbe0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
fbf0: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
fc00: 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20  lueNew(db);.    
fc10: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
fc20: 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 74 65  tr(pVal, -1, "te
fc30: 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c  st_collate", SQL
fc40: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
fc50: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55  _STATIC);.    zU
fc60: 74 66 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61  tf16 = sqlite3Va
fc70: 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
fc80: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
fc90: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
fca0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
fcb0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
fcc0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
fcd0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
fce0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
fcf0: 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74  lation16(db, zUt
fd00: 66 31 36 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  f16, SQLITE_UTF1
fd10: 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  6BE, .          
fd20: 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55  (void *)SQLITE_U
fd30: 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73 74  TF16BE, val?test
fd40: 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29  _collate_func:0)
fd50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
fd60: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
fd70: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
fd80: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
fd90: 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 69 66  mutex);.  }.  if
fda0: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
fdb0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
fdc0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
fdd0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a 20 20 69 66  L_ERROR;.  .  if
fde0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fdf0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
fe00: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
fe10: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72  sqlite3TestError
fe20: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
fe30: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
fe40: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
fe50: 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72   TCL_OK;..bad_ar
fe60: 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  gs:.  Tcl_Append
fe70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
fe80: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
fe90: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
fea0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
feb0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
fec0: 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66   0), " <DB> <utf
fed0: 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74  8> <utf16le> <ut
fee0: 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72  f16be>", 0);.  r
fef0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ff00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
ff10: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65  he collation nee
ff20: 64 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ded callback is 
ff30: 69 6e 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64 20  invoked, record 
ff40: 74 68 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20  the name of .** 
ff50: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
ff60: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
ff70: 20 68 65 72 65 2e 20 20 54 68 65 20 72 65 63 6f   here.  The reco
ff80: 72 64 65 64 20 6e 61 6d 65 20 69 73 20 6c 69 6e  rded name is lin
ff90: 6b 65 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c 20  ked.** to a TCL 
ffa0: 76 61 72 69 61 62 6c 65 20 61 6e 64 20 75 73 65  variable and use
ffb0: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
ffc0: 68 61 74 20 74 68 65 20 72 65 71 75 65 73 74 65  hat the requeste
ffd0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e  d collation.** n
ffe0: 61 6d 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ame is correct..
fff0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  */.static char z
10000 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
10010 32 30 30 5d 3b 0a 73 74 61 74 69 63 20 63 68 61  200];.static cha
10020 72 20 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  r *pzNeededColla
10030 74 69 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43 6f  tion = zNeededCo
10040 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a  llation;.../*.**
10050 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   Called when a c
10060 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10070 65 20 69 73 20 6e 65 65 64 65 64 2e 20 20 52 65  e is needed.  Re
10080 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 0a 2a  gistered using.*
10090 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  * sqlite3_collat
100a0 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e 0a  ion_needed16()..
100b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
100c0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
100d0 65 64 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70  ed_cb(.  void *p
100e0 43 74 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  Ctx, .  sqlite3 
100f0 2a 64 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  *db,.  int eText
10100 52 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Rep,.  const voi
10110 64 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e  d *pName.){.  in
10120 74 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  t enc = ENC(db);
10130 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
10140 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20 28   *z;.  for(z = (
10150 63 68 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d 30  char*)pName, i=0
10160 3b 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b  ; *z || z[1]; z+
10170 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20 29  +){.    if( *z )
10180 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f   zNeededCollatio
10190 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d  n[i++] = *z;.  }
101a0 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74  .  zNeededCollat
101b0 69 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71  ion[i] = 0;.  sq
101c0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
101d0 6c 61 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62  lation(.      db
101e0 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
101f0 2c 20 45 4e 43 28 64 62 29 2c 20 28 76 6f 69 64  , ENC(db), (void
10200 20 2a 29 65 6e 63 2c 20 74 65 73 74 5f 63 6f 6c   *)enc, test_col
10210 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f  late_func);.}../
10220 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f  *.** Usage: add_
10230 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
10240 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63  ded DB.*/.static
10250 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74   int test_collat
10260 65 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69 64  e_needed(.  void
10270 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
10280 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10290 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
102a0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
102b0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
102c0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
102d0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
102e0 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=2 ) goto bad_a
102f0 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62  rgs;.  if( getDb
10300 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
10310 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10320 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
10330 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10340 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10350 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
10360 31 36 28 64 62 2c 20 30 2c 20 74 65 73 74 5f 63  16(db, 0, test_c
10370 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62  ollate_needed_cb
10380 29 3b 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c  );.  zNeededColl
10390 61 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20  ation[0] = 0;.  
103a0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
103b0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
103c0 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
103d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
103e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64  urn TCL_OK;..bad
103f0 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72 6f  _args:.  Tcl_Wro
10400 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10410 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29  , 1, objv, "DB")
10420 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
10430 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  RROR;.}../*.** t
10440 63 6c 63 6d 64 3a 20 20 20 61 64 64 5f 61 6c 69  clcmd:   add_ali
10450 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
10460 61 74 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a 2a 2a  ations  DB.**.**
10470 20 41 64 64 20 74 77 6f 20 6e 65 77 20 63 6f 6c   Add two new col
10480 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
10490 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
104a0 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20 75 74   DB.**.**     ut
104b0 66 31 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a 20 20  f16_aligned.**  
104c0 20 20 20 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e     utf16_unalign
104d0 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 63 6f  ed.**.** Both co
104e0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
104f0 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 73  s use the same s
10500 6f 72 74 20 6f 72 64 65 72 20 61 73 20 42 49 4e  ort order as BIN
10510 41 52 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  ARY..** The only
10520 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 74   difference is t
10530 68 61 74 20 74 68 65 20 75 74 66 31 36 5f 61 6c  hat the utf16_al
10540 69 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 0a  igned collating.
10550 2a 2a 20 73 65 71 75 65 6e 63 65 20 69 73 20 64  ** sequence is d
10560 65 63 6c 61 72 65 64 20 77 69 74 68 20 74 68 65  eclared with the
10570 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
10580 49 47 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a 20 42  IGNED flag..** B
10590 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  oth collating fu
105a0 6e 63 74 69 6f 6e 73 20 69 6e 63 72 65 6d 65 6e  nctions incremen
105b0 74 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20  t the unaligned 
105c0 75 74 66 31 36 20 63 6f 75 6e 74 65 72 0a 2a 2a  utf16 counter.**
105d0 20 77 68 65 6e 65 76 65 72 20 74 68 65 79 20 73   whenever they s
105e0 65 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  ee a string that
105f0 20 62 65 67 69 6e 73 20 6f 6e 20 61 6e 20 6f 64   begins on an od
10600 64 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  d byte boundary.
10610 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
10620 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
10630 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 73 74 61  counter = 0;.sta
10640 74 69 63 20 69 6e 74 20 61 6c 69 67 6e 6d 65 6e  tic int alignmen
10650 74 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69  tCollFunc(.  voi
10660 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
10670 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
10680 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
10690 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
106a0 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
106b0 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d  int rc, n;.  n =
106c0 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e   nKey1<nKey2 ? n
106d0 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20  Key1 : nKey2;.  
106e0 69 66 28 20 6e 4b 65 79 31 3e 30 20 26 26 20 31  if( nKey1>0 && 1
106f0 3d 3d 28 31 26 28 69 6e 74 29 70 4b 65 79 31 29  ==(1&(int)pKey1)
10700 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72   ) unaligned_str
10710 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  ing_counter++;. 
10720 20 69 66 28 20 6e 4b 65 79 32 3e 30 20 26 26 20   if( nKey2>0 && 
10730 31 3d 3d 28 31 26 28 69 6e 74 29 70 4b 65 79 32  1==(1&(int)pKey2
10740 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74  ) ) unaligned_st
10750 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ring_counter++;.
10760 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b    rc = memcmp(pK
10770 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a  ey1, pKey2, n);.
10780 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
10790 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20     rc = nKey1 - 
107a0 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
107b0 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
107c0 20 69 6e 74 20 61 64 64 5f 61 6c 69 67 6e 6d 65   int add_alignme
107d0 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f  nt_test_collatio
107e0 6e 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ns(.  void * cli
107f0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
10800 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
10810 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
10820 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
10830 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
10840 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e  *db;.  if( objc>
10850 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =2 ){.    if( ge
10860 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
10870 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
10880 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
10890 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
108a0 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  OR;.    sqlite3_
108b0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
108c0 28 64 62 2c 20 22 75 74 66 31 36 5f 75 6e 61 6c  (db, "utf16_unal
108d0 69 67 6e 65 64 22 2c 0a 20 20 20 20 20 20 20 20  igned",.        
108e0 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a 20  SQLITE_UTF16, . 
108f0 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d         0, alignm
10900 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20  entCollFunc);.  
10910 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
10920 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
10930 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c 0a  utf16_aligned",.
10940 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55          SQLITE_U
10950 54 46 31 36 20 7c 20 53 51 4c 49 54 45 5f 55 54  TF16 | SQLITE_UT
10960 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20 0a 20 20  F16_ALIGNED, .  
10970 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65        0, alignme
10980 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 7d  ntCollFunc);.  }
10990 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
109a0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
109b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
109c0 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20 2a 2f 0a  _OMIT_UTF16) */.
109d0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64  ./*.** Usage: ad
109e0 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  d_test_function 
109f0 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20  <db ptr> <utf8> 
10a00 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
10a10 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  be>.**.** This f
10a20 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
10a30 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
10a40 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20  ite selects the 
10a50 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a 2a 20  correct user.** 
10a60 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63  function callbac
10a70 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  k when multiple 
10a80 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69  versions (for di
10a90 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63  fferent text enc
10aa0 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61  odings).** are a
10ab0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
10ac0 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
10ad0 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 75  tine registers u
10ae0 70 20 74 6f 20 74 68 72 65 65 20 76 65 72 73 69  p to three versi
10af0 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65 72 20  ons of the user 
10b00 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74 65 73  function.** "tes
10b10 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69 74 68  t_function" with
10b20 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
10b30 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65 20 73   <db>.  If the s
10b40 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
10b50 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20  s.** true, then 
10b60 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73  a version of tes
10b70 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  t_function is re
10b80 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
10b90 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20 74 68  -8, if the.** th
10ba0 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20 76  ird is true, a v
10bb0 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74  ersion is regist
10bc0 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31 36 6c  ered for UTF-16l
10bd0 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72 74 68  e, if the fourth
10be0 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61 20 55   is.** true, a U
10bf0 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20  TF-16be version 
10c00 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 50  is available.  P
10c10 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
10c20 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75 6e 63   of.** test_func
10c30 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74 65 64  tion are deleted
10c40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73 65 72  ..**.** The user
10c50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
10c60 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c  lemented by call
10c70 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
10c80 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a  g TCL script:.**
10c90 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75 6e 63  .**   "test_func
10ca0 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72 67 3e  tion <enc> <arg>
10cb0 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 3c 65  ".**.** Where <e
10cc0 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 54  nc> is one of UT
10cd0 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20 6f 72  F-8, UTF-16LE or
10ce0 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20 3c 61   UTF16BE, and <a
10cf0 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20 73 69  rg> is the.** si
10d00 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 70 61  ngle argument pa
10d10 73 73 65 64 20 74 6f 20 74 68 65 20 53 51 4c 20  ssed to the SQL 
10d20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61  function. The va
10d30 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 0a  lue returned by.
10d40 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72 69 70  ** the TCL scrip
10d50 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  t is used as the
10d60 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
10d70 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f   the SQL functio
10d80 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61 73 73  n. It.** is pass
10d90 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75 73 69  ed to SQLite usi
10da0 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f 72 20  ng UTF-16BE for 
10db0 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66 75 6e  a UTF-8 test_fun
10dc0 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38 0a 2a  ction(), UTF-8.*
10dd0 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36 4c 45  * for a UTF-16LE
10de0 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29   test_function()
10df0 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45 20 66  , and UTF-16LE f
10e00 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  or an implementa
10e10 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70 72 65  tion that.** pre
10e20 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e 0a 2a  fers UTF-16BE..*
10e30 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
10e40 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74 61 74  _OMIT_UTF16.stat
10e50 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
10e60 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20 20 73 71  ction_utf8(.  sq
10e70 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
10e80 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
10e90 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
10ea0 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63  e **argv.){.  Tc
10eb0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10ec0 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
10ed0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
10ee0 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70   *pVal;.  interp
10ef0 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a   = (Tcl_Interp *
10f00 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
10f10 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d  ta(pCtx);.  pX =
10f20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10f30 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  j("test_function
10f40 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
10f50 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
10f60 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10f70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10f80 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74  p, pX, Tcl_NewSt
10f90 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c  ringObj("UTF-8",
10fa0 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
10fb0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10fc0 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20  t(interp, pX, . 
10fd0 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
10fe0 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
10ff0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
11000 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a  argv[0]), -1));.
11010 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
11020 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a  interp, pX, 0);.
11030 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
11040 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69 74 65  nt(pX);.  sqlite
11050 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
11060 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  tx, Tcl_GetStrin
11070 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
11080 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
11090 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c 20 3d  SIENT);.  pVal =
110a0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
110b0 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
110c0 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
110d0 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
110e0 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
110f0 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
11100 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
11110 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
11120 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70  esult_text16be(p
11130 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
11140 75 65 5f 74 65 78 74 31 36 62 65 28 70 56 61 6c  ue_text16be(pVal
11150 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
11160 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
11170 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
11180 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74  ee(pVal);.}.stat
11190 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
111a0 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28 0a 20  ction_utf16le(. 
111b0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
111c0 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
111d0 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
111e0 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
111f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
11200 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
11210 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
11220 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
11230 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
11240 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
11250 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
11260 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
11270 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
11280 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
11290 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
112a0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
112b0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
112c0 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
112d0 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
112e0 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54  16LE", -1));.  T
112f0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11300 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11310 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e  pX, .      Tcl_N
11320 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
11330 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
11340 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20  _text(argv[0]), 
11350 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
11360 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58  ObjEx(interp, pX
11370 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
11380 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
11390 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
113a0 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c  lueNew(0);.  sql
113b0 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
113c0 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65  pVal, -1, Tcl_Ge
113d0 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
113e0 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51  terp), .      SQ
113f0 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
11400 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  E_STATIC);.  sql
11410 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
11420 28 70 43 74 78 2c 28 63 68 61 72 2a 29 73 71 6c  (pCtx,(char*)sql
11430 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
11440 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54 45 5f  pVal),-1,SQLITE_
11450 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
11460 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
11470 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Val);.}.static v
11480 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  oid test_functio
11490 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73 71 6c  n_utf16be(.  sql
114a0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
114b0 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
114c0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
114d0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c   **argv.){.  Tcl
114e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
114f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a  .  Tcl_Obj *pX;.
11500 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
11510 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20  *pVal;.  interp 
11520 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  = (Tcl_Interp *)
11530 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
11540 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20  a(pCtx);.  pX = 
11550 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11560 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  ("test_function"
11570 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
11580 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
11590 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
115a0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
115b0 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72  , pX, Tcl_NewStr
115c0 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45  ingObj("UTF-16BE
115d0 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
115e0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
115f0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
11600 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
11610 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
11620 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
11630 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29  t(argv[0]), -1))
11640 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
11650 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29  x(interp, pX, 0)
11660 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
11670 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c  ount(pX);.  pVal
11680 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
11690 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
116a0 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
116b0 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
116c0 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
116d0 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
116e0 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
116f0 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
11700 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 28 70  _result_text16(p
11710 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
11720 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c  ue_text16le(pVal
11730 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
11740 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
11750 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
11760 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
11770 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
11780 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
11790 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
117a0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
117b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
117c0 31 36 6c 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16le(pCtx, sqlit
117d0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
117e0 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
117f0 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
11800 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ENT);.  sqlite3V
11810 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
11820 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11830 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
11840 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
11850 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69  _function(.  voi
11860 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
11870 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
11880 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
11890 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
118a0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
118b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
118c0 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
118d0 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b   *db;.  int val;
118e0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
118f0 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b  ) goto bad_args;
11900 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
11910 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
11920 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
11930 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
11940 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
11950 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
11960 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
11970 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
11980 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
11990 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
119a0 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71  f( val ){.    sq
119b0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
119c0 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ction(db, "test_
119d0 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51  function", 1, SQ
119e0 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
119f0 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74      interp, test
11a00 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 2c 20  _function_utf8, 
11a10 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
11a20 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
11a30 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
11a40 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
11a50 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
11a60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
11a70 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  val ){.    sqlit
11a80 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
11a90 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e  on(db, "test_fun
11aa0 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54  ction", 1, SQLIT
11ab0 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20  E_UTF16LE, .    
11ac0 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74      interp, test
11ad0 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c  _function_utf16l
11ae0 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  e, 0, 0);.  }.  
11af0 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
11b00 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
11b10 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
11b20 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
11b30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
11b40 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71  f( val ){.    sq
11b50 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11b60 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ction(db, "test_
11b70 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51  function", 1, SQ
11b80 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20  LITE_UTF16BE, . 
11b90 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74         interp, t
11ba0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
11bb0 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  16be, 0, 0);.  }
11bc0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
11bd0 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  K;.bad_args:.  T
11be0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11bf0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
11c00 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
11c10 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f   \"",.      Tcl_
11c20 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
11c30 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
11c40 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  <DB> <utf8> <utf
11c50 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22  16le> <utf16be>"
11c60 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
11c70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
11c80 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
11c90 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  L_ERROR;.}../*.*
11ca0 2a 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20  * Usage:        
11cb0 20 74 65 73 74 5f 65 72 72 73 74 72 20 3c 65 72   test_errstr <er
11cc0 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65  r code>.**.** Te
11cd0 73 74 20 74 68 61 74 20 74 68 65 20 65 6e 67 6c  st that the engl
11ce0 69 73 68 20 6c 61 6e 67 75 61 67 65 20 73 74 72  ish language str
11cf0 69 6e 67 20 65 71 75 69 76 61 6c 65 6e 74 73 20  ing equivalents 
11d00 66 6f 72 20 73 71 6c 69 74 65 20 65 72 72 6f 72  for sqlite error
11d10 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73 61   codes.** are sa
11d20 6e 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  ne. The paramete
11d30 72 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  r is an integer 
11d40 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
11d50 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
11d60 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  e..** The result
11d70 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 77   is a list of tw
11d80 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20  o elements, the 
11d90 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
11da0 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
11db0 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 74  error code and t
11dc0 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he english langu
11dd0 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e  age explanation.
11de0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
11df0 65 73 74 5f 65 72 72 73 74 72 28 0a 20 20 76 6f  est_errstr(.  vo
11e00 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
11e10 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11e20 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
11e30 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
11e40 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
11e50 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69  char *zCode;.  i
11e60 6e 74 20 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63  nt i;.  if( objc
11e70 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
11e80 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11e90 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65  rp, 1, objv, "<e
11ea0 72 72 6f 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20  rror code>");.  
11eb0 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c  }..  zCode = Tcl
11ec0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11ed0 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1]);.  for(i=0; 
11ee0 69 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<200; i++){.   
11ef0 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 74   if( 0==strcmp(t
11f00 31 45 72 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a  1ErrorName(i), z
11f10 43 6f 64 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Code) ) break;. 
11f20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75   }.  Tcl_SetResu
11f30 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
11f40 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72   *)sqlite3ErrStr
11f50 28 69 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  (i), 0);.  retur
11f60 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
11f70 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72 65  ** Usage:    bre
11f80 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68  akpoint.**.** Th
11f90 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74  is routine exist
11fa0 73 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73  s for one purpos
11fb0 65 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20 61  e - to provide a
11fc0 20 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61 0a   place to put a.
11fd0 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 69  ** breakpoint wi
11fe0 74 68 20 47 44 42 20 74 68 61 74 20 63 61 6e 20  th GDB that can 
11ff0 62 65 20 74 72 69 67 67 65 72 65 64 20 75 73 69  be triggered usi
12000 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54 68  ng TCL code.  Th
12010 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69  e use.** for thi
12020 73 20 69 73 20 77 68 65 6e 20 61 20 70 61 72 74  s is when a part
12030 69 63 75 6c 61 72 20 74 65 73 74 20 66 61 69 6c  icular test fail
12040 73 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20 31  s on (say) the 1
12050 34 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e 2e  485th iteration.
12060 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20 74  .** In the TCL t
12070 65 73 74 20 73 63 72 69 70 74 2c 20 77 65 20 63  est script, we c
12080 61 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b 65  an add code like
12090 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
120a0 20 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62   if {$i==1485} b
120b0 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20  reakpoint.**.** 
120c0 54 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69 78  Then run testfix
120d0 74 75 72 65 20 69 6e 20 74 68 65 20 64 65 62 75  ture in the debu
120e0 67 67 65 72 20 61 6e 64 20 77 61 69 74 20 66 6f  gger and wait fo
120f0 72 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e 74  r the breakpoint
12100 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68   to.** fire.  Th
12110 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 72  en additional br
12120 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62 65  eakpoints can be
12130 20 73 65 74 20 74 6f 20 74 72 61 63 65 20 64 6f   set to trace do
12140 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73  wn the bug..*/.s
12150 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
12160 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69  reakpoint(.  voi
12170 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
12180 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12190 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
121a0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
121b0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
121c0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
121d0 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
121e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
121f0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
12200 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
12210 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
12220 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
12230 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  .){.  return TCL
12240 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
12250 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a  Do nothing */.}.
12260 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
12270 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
12280 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49 44 58 20  oblob  STMT IDX 
12290 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  N.**.** Test the
122a0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
122b0 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65  roblob interface
122c0 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
122d0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
122e0 0a 2a 2a 20 49 44 58 20 69 73 20 74 68 65 20 69  .** IDX is the i
122f0 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
12300 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
12310 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
12320 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
12330 69 6e 64 73 20 61 20 4e 2d 62 79 74 65 20 7a 65  inds a N-byte ze
12340 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 20 74  ro-filled BLOB t
12350 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a  o the wildcard..
12360 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
12370 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  st_bind_zeroblob
12380 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
12390 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
123a0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
123b0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
123c0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
123d0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
123e0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
123f0 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20   idx;.  int n;. 
12400 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
12410 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
12420 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
12430 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
12440 20 22 53 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a   "STMT IDX N");.
12450 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12460 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
12470 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
12480 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
12490 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
124a0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
124b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
124c0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
124d0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
124e0 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
124f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12500 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
12510 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
12520 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72 65  bjv[3], &n) ) re
12530 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12540 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
12550 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 70 53  bind_zeroblob(pS
12560 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20 20  tmt, idx, n);.  
12570 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
12580 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
12590 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
125a0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
125b0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
125c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
125d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
125e0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
125f0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
12600 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
12610 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53  ite3_bind_int  S
12620 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a  TMT N VALUE.**.*
12630 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
12640 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65  e3_bind_int inte
12650 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
12660 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
12670 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
12680 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
12690 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
126a0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
126b0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
126c0 2a 20 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74  * binds a 32-bit
126d0 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74   integer VALUE t
126e0 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e  o that wildcard.
126f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
12700 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20  est_bind_int(.  
12710 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
12720 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
12730 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
12740 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
12750 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
12760 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
12770 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
12780 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20  ;.  int value;. 
12790 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
127a0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
127b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
127c0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
127d0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
127e0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
127f0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
12800 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
12810 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c  " STMT N VALUE",
12820 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
12830 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
12840 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
12850 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
12860 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12870 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
12880 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12890 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
128a0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
128b0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
128c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
128d0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
128e0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
128f0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
12900 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  lue) ) return TC
12910 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
12920 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
12930 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  t(pStmt, idx, va
12940 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
12950 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
12960 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
12970 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
12980 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12990 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
129a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
129b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
129c0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
129d0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
129e0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
129f0 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d 54 20 4e  nd_int64  STMT N
12a00 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73   VALUE.**.** Tes
12a10 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
12a20 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65 72 66 61  nd_int64 interfa
12a30 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
12a40 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
12a50 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
12a60 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
12a70 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
12a80 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
12a90 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
12aa0 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e  inds a 64-bit in
12ab0 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
12ac0 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
12ad0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
12ae0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76  _bind_int64(.  v
12af0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
12b00 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
12b10 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
12b20 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
12b30 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
12b40 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12b50 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
12b60 0a 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20  .  i64 value;.  
12b70 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
12b80 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
12b90 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
12ba0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
12bb0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
12bc0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
12bd0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
12be0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
12bf0 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20   STMT N VALUE", 
12c00 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
12c10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
12c20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
12c30 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
12c40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
12c50 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
12c60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12c70 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
12c80 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
12c90 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
12ca0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12cb0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
12cc0 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
12cd0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
12ce0 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e  &value) ) return
12cf0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
12d00 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
12d10 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 64  _int64(pStmt, id
12d20 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28  x, value);.  if(
12d30 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
12d40 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
12d50 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
12d60 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12d70 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
12d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12d90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12da0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
12db0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
12dc0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
12dd0 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 20  e3_bind_double  
12de0 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a  STMT N VALUE.**.
12df0 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
12e00 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20  te3_bind_double 
12e10 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
12e20 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
12e30 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
12e40 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
12e50 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
12e60 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
12e70 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
12e80 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34  nd.** binds a 64
12e90 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
12ea0 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
12eb0 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
12ec0 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75  nt test_bind_dou
12ed0 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ble(.  void * cl
12ee0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
12ef0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
12f00 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
12f10 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
12f20 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
12f30 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
12f40 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75 62 6c  int idx;.  doubl
12f50 65 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  e value;.  int r
12f60 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c;.  const char 
12f70 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  *zVal;.  int i;.
12f80 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
12f90 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
12fa0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
12fb0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
12fc0 65 20 73 70 65 63 69 61 6c 20 66 6c 6f 61 74 69  e special floati
12fd0 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 2a  ng point value *
12fe0 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  /.    unsigned i
12ff0 6e 74 20 69 55 70 70 65 72 3b 20 20 20 2f 2a 20  nt iUpper;   /* 
13000 55 70 70 65 72 20 33 32 20 62 69 74 73 20 2a 2f  Upper 32 bits */
13010 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
13020 74 20 69 4c 6f 77 65 72 3b 20 20 20 2f 2a 20 4c  t iLower;   /* L
13030 6f 77 65 72 20 33 32 20 62 69 74 73 20 2a 2f 0a  ower 32 bits */.
13040 20 20 7d 20 61 53 70 65 63 69 61 6c 46 70 5b 5d    } aSpecialFp[]
13050 20 3d 20 7b 0a 20 20 20 20 7b 20 20 22 4e 61 4e   = {.    {  "NaN
13060 22 2c 20 20 20 20 20 20 30 78 37 66 66 66 66 66  ",      0x7fffff
13070 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d  ff, 0xffffffff }
13080 2c 0a 20 20 20 20 7b 20 20 22 53 4e 61 4e 22 2c  ,.    {  "SNaN",
13090 20 20 20 20 20 30 78 37 66 66 37 66 66 66 66 2c       0x7ff7ffff,
130a0 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20   0xffffffff },. 
130b0 20 20 20 7b 20 20 22 2d 4e 61 4e 22 2c 20 20 20     {  "-NaN",   
130c0 20 20 30 78 66 66 66 66 66 66 66 66 2c 20 30 78    0xffffffff, 0x
130d0 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20  ffffffff },.    
130e0 7b 20 20 22 2d 53 4e 61 4e 22 2c 20 20 20 20 30  {  "-SNaN",    0
130f0 78 66 66 66 37 66 66 66 66 2c 20 30 78 66 66 66  xfff7ffff, 0xfff
13100 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20  fffff },.    {  
13110 22 2b 49 6e 66 22 2c 20 20 20 20 20 30 78 37 66  "+Inf",     0x7f
13120 66 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  f00000, 0x000000
13130 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 49  00 },.    {  "-I
13140 6e 66 22 2c 20 20 20 20 20 30 78 66 66 66 30 30  nf",     0xfff00
13150 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20  000, 0x00000000 
13160 7d 2c 0a 20 20 20 20 7b 20 20 22 45 70 73 69 6c  },.    {  "Epsil
13170 6f 6e 22 2c 20 20 30 78 30 30 30 30 30 30 30 30  on",  0x00000000
13180 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d 2c 0a  , 0x00000001 },.
13190 20 20 20 20 7b 20 20 22 2d 45 70 73 69 6c 6f 6e      {  "-Epsilon
131a0 22 2c 20 30 78 38 30 30 30 30 30 30 30 2c 20 30  ", 0x80000000, 0
131b0 78 30 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20  x00000001 },.   
131c0 20 7b 20 20 22 4e 61 4e 30 22 2c 20 20 20 20 20   {  "NaN0",     
131d0 30 78 37 66 66 38 30 30 30 30 2c 20 30 78 30 30  0x7ff80000, 0x00
131e0 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
131f0 20 22 2d 4e 61 4e 30 22 2c 20 20 20 20 30 78 66   "-NaN0",    0xf
13200 66 66 38 30 30 30 30 2c 20 30 78 30 30 30 30 30  ff80000, 0x00000
13210 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69  000 },.  };..  i
13220 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
13230 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13240 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
13250 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
13260 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
13270 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
13280 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
13290 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
132a0 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
132b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
132c0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
132d0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
132e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
132f0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
13300 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13310 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
13320 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
13330 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
13340 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
13350 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e 74  ERROR;..  /* Int
13360 65 72 63 65 70 74 20 74 68 65 20 73 74 72 69 6e  ercept the strin
13370 67 20 22 4e 61 4e 22 20 61 6e 64 20 67 65 6e 65  g "NaN" and gene
13380 72 61 74 65 20 61 20 4e 61 4e 20 76 61 6c 75 65  rate a NaN value
13390 20 66 6f 72 20 69 74 2e 0a 20 20 2a 2a 20 41 6c   for it..  ** Al
133a0 6c 20 6f 74 68 65 72 20 73 74 72 69 6e 67 73 20  l other strings 
133b0 61 72 65 20 70 61 73 73 65 64 20 74 68 72 6f 75  are passed throu
133c0 67 68 20 74 6f 20 54 63 6c 5f 47 65 74 44 6f 75  gh to Tcl_GetDou
133d0 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 2e 0a 20 20  bleFromObj()..  
133e0 2a 2a 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65  ** Tcl_GetDouble
133f0 46 72 6f 6d 4f 62 6a 28 29 20 73 68 6f 75 6c 64  FromObj() should
13400 20 75 6e 64 65 72 73 74 61 6e 64 20 22 4e 61 4e   understand "NaN
13410 22 20 62 75 74 20 73 6f 6d 65 20 76 65 72 73 69  " but some versi
13420 6f 6e 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  ons.  ** contain
13430 20 61 20 62 75 67 2e 0a 20 20 2a 2f 0a 20 20 7a   a bug..  */.  z
13440 56 61 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Val = Tcl_GetStr
13450 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
13460 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
13470 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73 69  f(aSpecialFp)/si
13480 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 5b  zeof(aSpecialFp[
13490 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
134a0 66 28 20 73 74 72 63 6d 70 28 61 53 70 65 63 69  f( strcmp(aSpeci
134b0 61 6c 46 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  alFp[i].zName, z
134c0 56 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Val)==0 ){.     
134d0 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
134e0 78 3b 0a 20 20 20 20 20 20 78 20 3d 20 61 53 70  x;.      x = aSp
134f0 65 63 69 61 6c 46 70 5b 69 5d 2e 69 55 70 70 65  ecialFp[i].iUppe
13500 72 3b 0a 20 20 20 20 20 20 78 20 3c 3c 3d 20 33  r;.      x <<= 3
13510 32 3b 0a 20 20 20 20 20 20 78 20 7c 3d 20 61 53  2;.      x |= aS
13520 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69 4c 6f 77  pecialFp[i].iLow
13530 65 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  er;.      assert
13540 28 20 73 69 7a 65 6f 66 28 76 61 6c 75 65 29 3d  ( sizeof(value)=
13550 3d 38 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =8 );.      asse
13560 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
13570 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
13580 28 26 76 61 6c 75 65 2c 20 26 78 2c 20 38 29 3b  (&value, &x, 8);
13590 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
135a0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e    }.  }.  if( i>
135b0 3d 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c  =sizeof(aSpecial
135c0 46 70 29 2f 73 69 7a 65 6f 66 28 61 53 70 65 63  Fp)/sizeof(aSpec
135d0 69 61 6c 46 70 5b 30 5d 29 20 26 26 0a 20 20 20  ialFp[0]) &&.   
135e0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75        Tcl_GetDou
135f0 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  bleFromObj(inter
13600 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
13610 75 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ue) ){.    retur
13620 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
13630 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
13640 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d  bind_double(pStm
13650 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a  t, idx, value);.
13660 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
13670 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
13680 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
13690 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
136a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
136b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
136c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
136d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
136e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
136f0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
13700 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
13710 20 20 53 54 4d 54 20 4e 0a 2a 2a 0a 2a 2a 20 54    STMT N.**.** T
13720 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
13730 62 69 6e 64 5f 6e 75 6c 6c 20 69 6e 74 65 72 66  bind_null interf
13740 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
13750 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
13760 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
13770 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
13780 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
13790 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
137a0 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
137b0 62 69 6e 64 73 20 61 20 4e 55 4c 4c 20 74 6f 20  binds a NULL to 
137c0 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  the wildcard..*/
137d0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
137e0 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a 20 20 76 6f  _bind_null(.  vo
137f0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
13800 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
13810 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
13820 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
13830 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
13840 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
13850 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
13860 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
13870 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
13880 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
13890 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
138a0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
138b0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
138c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
138d0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
138e0 20 22 20 53 54 4d 54 20 4e 22 2c 20 30 29 3b 0a   " STMT N", 0);.
138f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13900 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
13910 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
13920 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
13930 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
13940 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
13950 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
13960 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
13970 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
13980 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
13990 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
139a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
139b0 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
139c0 69 64 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  idx);.  if( sqli
139d0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
139e0 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
139f0 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
13a00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13a10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13a20 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
13a30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
13a40 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
13a50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
13a60 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
13a70 64 5f 74 65 78 74 20 20 53 54 4d 54 20 4e 20 53  d_text  STMT N S
13a80 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a  TRING BYTES.**.*
13a90 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
13aa0 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 69 6e 74  e3_bind_text int
13ab0 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
13ac0 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
13ad0 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
13ae0 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
13af0 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
13b00 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
13b10 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
13b20 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d 38  ** binds a UTF-8
13b30 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74   string STRING t
13b40 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20  o the wildcard. 
13b50 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 42   The string is B
13b60 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f  YTES bytes.** lo
13b70 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
13b80 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74  t test_bind_text
13b90 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
13ba0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
13bb0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
13bc0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
13bd0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
13be0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
13bf0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
13c00 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65   idx;.  int byte
13c10 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65  s;.  char *value
13c20 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
13c30 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
13c40 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13c50 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
13c60 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
13c70 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
13c80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
13c90 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
13ca0 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
13cb0 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20  E BYTES", 0);.  
13cc0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13cd0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
13ce0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
13cf0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
13d00 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
13d10 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
13d20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
13d30 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
13d40 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
13d50 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
13d60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76  n TCL_ERROR;.  v
13d70 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63  alue = (char*)Tc
13d80 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
13d90 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
13da0 62 79 74 65 73 29 3b 0a 20 20 69 66 28 20 54 63  bytes);.  if( Tc
13db0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
13dc0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
13dd0 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
13de0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
13df0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
13e00 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
13e10 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65 73 2c  x, value, bytes,
13e20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
13e30 54 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  T);.  if( sqlite
13e40 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
13e50 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
13e60 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
13e70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13e80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13e90 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
13ea0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13eb0 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  , sqlite3TestErr
13ec0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
13ed0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13ee0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
13ef0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
13f00 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
13f10 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
13f20 36 20 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54  6 ?-static? STMT
13f30 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a   N STRING BYTES.
13f40 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
13f50 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
13f60 31 36 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  16 interface.  S
13f70 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
13f80 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
13f90 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
13fa0 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
13fb0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
13fc0 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
13fd0 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
13fe0 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 53   UTF-16 string S
13ff0 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c  TRING to the wil
14000 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72 69  dcard.  The stri
14010 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74 65  ng is BYTES byte
14020 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74  s.** long..*/.st
14030 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
14040 6e 64 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69  nd_text16(.  voi
14050 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
14060 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
14070 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
14080 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
14090 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
140a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
140b0 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
140c0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
140d0 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62  int idx;.  int b
140e0 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61  ytes;.  char *va
140f0 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
14100 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 29    void (*xDel)()
14110 20 3d 20 28 6f 62 6a 63 3d 3d 36 3f 53 51 4c 49   = (objc==6?SQLI
14120 54 45 5f 53 54 41 54 49 43 3a 53 51 4c 49 54 45  TE_STATIC:SQLITE
14130 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 54  _TRANSIENT);.  T
14140 63 6c 5f 4f 62 6a 20 2a 6f 53 74 6d 74 20 20 20  cl_Obj *oStmt   
14150 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 34 5d 3b   = objv[objc-4];
14160 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 4e 20 20  .  Tcl_Obj *oN  
14170 20 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63       = objv[objc
14180 2d 33 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  -3];.  Tcl_Obj *
14190 6f 53 74 72 69 6e 67 20 20 3d 20 6f 62 6a 76 5b  oString  = objv[
141a0 6f 62 6a 63 2d 32 5d 3b 0a 20 20 54 63 6c 5f 4f  objc-2];.  Tcl_O
141b0 62 6a 20 2a 6f 42 79 74 65 73 20 20 20 3d 20 6f  bj *oBytes   = o
141c0 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20  bjv[objc-1];..  
141d0 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
141e0 62 6a 63 21 3d 36 29 7b 0a 20 20 20 20 54 63 6c  bjc!=6){.    Tcl
141f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
14200 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
14210 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
14220 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
14230 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
14240 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
14250 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54  STMT N VALUE BYT
14260 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ES", 0);.    ret
14270 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14280 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
14290 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
142a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
142b0 53 74 6d 74 29 2c 20 26 70 53 74 6d 74 29 20 29  Stmt), &pStmt) )
142c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
142d0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
142e0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
142f0 70 2c 20 6f 4e 2c 20 26 69 64 78 29 20 29 20 72  p, oN, &idx) ) r
14300 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14310 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72  .  value = (char
14320 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  *)Tcl_GetByteArr
14330 61 79 46 72 6f 6d 4f 62 6a 28 6f 53 74 72 69 6e  ayFromObj(oStrin
14340 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 54 63 6c  g, 0);.  if( Tcl
14350 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
14360 6e 74 65 72 70 2c 20 6f 42 79 74 65 73 2c 20 26  nterp, oBytes, &
14370 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
14380 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
14390 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
143a0 74 65 78 74 31 36 28 70 53 74 6d 74 2c 20 69 64  text16(pStmt, id
143b0 78 2c 20 28 76 6f 69 64 20 2a 29 76 61 6c 75 65  x, (void *)value
143c0 2c 20 62 79 74 65 73 2c 20 78 44 65 6c 29 3b 0a  , bytes, xDel);.
143d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
143e0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
143f0 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
14400 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
14410 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
14420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14430 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
14440 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
14450 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61  lite3TestErrorNa
14460 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
14470 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14480 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  ;.  }..#endif /*
14490 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
144a0 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
144b0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
144c0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
144d0 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74 61  _bind_blob ?-sta
144e0 74 69 63 3f 20 53 54 4d 54 20 4e 20 44 41 54 41  tic? STMT N DATA
144f0 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73   BYTES.**.** Tes
14500 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
14510 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63  nd_blob interfac
14520 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
14530 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
14540 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
14550 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
14560 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
14570 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
14580 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
14590 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f 20 74 68  nds a BLOB to th
145a0 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  e wildcard.  The
145b0 20 42 4c 4f 42 20 69 73 20 42 59 54 45 53 20 62   BLOB is BYTES b
145c0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
145d0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
145e0 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76 6f  _bind_blob(.  vo
145f0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
14600 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
14610 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
14620 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
14630 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
14640 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
14650 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
14660 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
14670 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e  har *value;.  in
14680 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
14690 64 65 73 74 72 75 63 74 6f 72 5f 74 79 70 65 20  destructor_type 
146a0 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51  xDestructor = SQ
146b0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 3b 0a  LITE_TRANSIENT;.
146c0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
146d0 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20 20  & objc!=6 ){.   
146e0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
146f0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
14700 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
14710 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
14720 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
14730 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
14740 2c 20 22 20 53 54 4d 54 20 4e 20 44 41 54 41 20  , " STMT N DATA 
14750 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20  BYTES", 0);.    
14760 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14770 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a  ;.  }..  if( obj
14780 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78 44 65 73  c==6 ){.    xDes
14790 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45  tructor = SQLITE
147a0 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 6f 62 6a  _STATIC;.    obj
147b0 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  v++;.  }..  if( 
147c0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
147d0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
147e0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
147f0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
14800 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
14810 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
14820 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
14830 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
14840 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14850 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 53  value = Tcl_GetS
14860 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
14870 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
14880 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
14890 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29  objv[4], &bytes)
148a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
148b0 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
148c0 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
148d0 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
148e0 2c 20 62 79 74 65 73 2c 20 78 44 65 73 74 72 75  , bytes, xDestru
148f0 63 74 6f 72 29 3b 0a 20 20 69 66 28 20 73 71 6c  ctor);.  if( sql
14900 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
14910 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
14920 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
14930 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14940 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14950 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
14960 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14970 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
14980 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
14990 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
149a0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
149b0 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52  nt  STMT.**.** R
149c0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
149d0 20 6f 66 20 77 69 6c 64 63 61 72 64 73 20 69 6e   of wildcards in
149e0 20 74 68 65 20 67 69 76 65 6e 20 73 74 61 74 65   the given state
149f0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
14a00 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  int test_bind_pa
14a10 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a 20  rameter_count(. 
14a20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
14a30 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
14a40 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
14a50 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
14a60 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
14a70 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
14a80 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
14a90 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
14aa0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
14ab0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
14ac0 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
14ad0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14ae0 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
14af0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
14b00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
14b10 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
14b20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
14b30 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
14b40 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
14b50 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
14b60 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
14b70 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ter_count(pStmt)
14b80 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
14b90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
14ba0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
14bb0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
14bc0 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a  me  STMT  N.**.*
14bd0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
14be0 65 20 6f 66 20 74 68 65 20 4e 74 68 20 77 69 6c  e of the Nth wil
14bf0 64 63 61 72 64 2e 20 20 54 68 65 20 66 69 72 73  dcard.  The firs
14c00 74 20 77 69 6c 64 63 61 72 64 20 69 73 20 31 2e  t wildcard is 1.
14c10 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20 73 74 72  .** An empty str
14c20 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 20  ing is returned 
14c30 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72  if N is out of r
14c40 61 6e 67 65 20 6f 72 20 69 66 20 74 68 65 20 77  ange or if the w
14c50 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e 61  ildcard.** is na
14c60 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  meless..*/.stati
14c70 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
14c80 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 0a  parameter_name(.
14c90 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
14ca0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
14cb0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
14cc0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
14cd0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
14ce0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
14cf0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
14d00 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
14d10 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
14d20 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
14d30 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
14d40 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
14d50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
14d60 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
14d70 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
14d80 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
14d90 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
14da0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14db0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
14dc0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
14dd0 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20 72  objv[2], &i) ) r
14de0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14df0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
14e00 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20  ult(interp, .   
14e10 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
14e20 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  bj(sqlite3_bind_
14e30 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
14e40 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29 3b  Stmt,i),-1).  );
14e50 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
14e60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
14e70 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
14e80 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
14e90 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a    STMT  NAME.**.
14ea0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
14eb0 64 65 78 20 6f 66 20 74 68 65 20 77 69 6c 64 63  dex of the wildc
14ec0 61 72 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ard called NAME.
14ed0 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
14ee0 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75 63  ere is.** no suc
14ef0 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  h wildcard..*/.s
14f00 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
14f10 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
14f20 64 65 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  dex(.  void * cl
14f30 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
14f40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
14f50 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
14f60 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
14f70 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
14f80 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
14f90 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
14fa0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
14fb0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
14fc0 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45  objv, "STMT NAME
14fd0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
14fe0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
14ff0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
15000 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
15010 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
15020 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
15030 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15040 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
15050 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  t(interp, .     
15060 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20  Tcl_NewIntObj(. 
15070 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
15080 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
15090 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74  ex(pStmt,Tcl_Get
150a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29  String(objv[2]))
150b0 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a 20 20 72  .     ).  );.  r
150c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
150d0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
150e0 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69  sqlite3_clear_bi
150f0 6e 64 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a  ndings STMT.**.*
15100 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
15110 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  t_clear_bindings
15120 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
15130 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
15140 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
15150 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
15160 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
15170 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
15180 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
15190 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
151a0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
151b0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
151c0 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
151d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
151e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
151f0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
15200 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
15210 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
15220 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
15230 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
15240 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
15250 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
15260 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69  sqlite3_clear_bi
15270 6e 64 69 6e 67 73 28 70 53 74 6d 74 29 29 29 3b  ndings(pStmt)));
15280 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
15290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
152a0 3a 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65  :   sqlite3_slee
152b0 70 20 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a  p MILLISECONDS.*
152c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
152d0 74 5f 73 6c 65 65 70 28 0a 20 20 76 6f 69 64 20  t_sleep(.  void 
152e0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
152f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15300 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
15310 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
15320 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
15330 20 6d 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   ms;..  if( objc
15340 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
15350 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
15360 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4d 49  rp, 1, objv, "MI
15370 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20  LLISECONDS");.  
15380 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15390 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
153a0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
153b0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
153c0 20 26 6d 73 29 20 29 7b 0a 20 20 20 20 72 65 74   &ms) ){.    ret
153d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
153e0 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
153f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
15400 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
15410 74 65 33 5f 73 6c 65 65 70 28 6d 73 29 29 29 3b  te3_sleep(ms)));
15420 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
15430 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
15440 3a 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  : sqlite3_errcod
15450 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  e DB.**.** Retur
15460 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  n the string rep
15470 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
15480 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
15490 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20  qlite3_* API.** 
154a0 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e  error code. e.g.
154b0 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e   "SQLITE_ERROR".
154c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
154d0 65 73 74 5f 65 72 72 63 6f 64 65 28 0a 20 20 76  est_errcode(.  v
154e0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
154f0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15500 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15510 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15520 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15530 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
15540 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
15550 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28 20  Buf[30];..  if( 
15560 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
15570 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15580 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
15590 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
155a0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
155b0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
155c0 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
155d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
155e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
155f0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
15600 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
15610 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
15620 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
15630 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
15640 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
15650 29 3b 0a 20 20 69 66 28 20 28 72 63 26 30 78 66  );.  if( (rc&0xf
15660 66 29 3d 3d 72 63 20 29 7b 0a 20 20 20 20 7a 42  f)==rc ){.    zB
15670 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c  uf[0] = 0;.  }el
15680 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  se{.    sprintf(
15690 7a 42 75 66 2c 22 2b 25 64 22 2c 20 72 63 3e 3e  zBuf,"+%d", rc>>
156a0 38 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70  8);.  }.  Tcl_Ap
156b0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
156c0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
156d0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 7a 42 75 66  orName(rc), zBuf
156e0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
156f0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
15700 55 73 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72  Usage:   test_er
15710 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  rmsg DB.**.** Re
15720 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 38 20  turns the UTF-8 
15730 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
15740 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
15750 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74  age string for t
15760 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
15770 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20  t sqlite3_* API 
15780 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
15790 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 28  int test_errmsg(
157a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
157b0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
157c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
157d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
157e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
157f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
15800 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
15810 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  zErr;..  if( obj
15820 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
15830 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
15840 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
15850 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
15860 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
15870 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
15880 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
15890 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
158a0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
158b0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
158c0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
158d0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
158e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
158f0 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71  OR;..  zErr = sq
15900 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
15910 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
15920 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
15930 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45  _NewStringObj(zE
15940 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74 75  rr, -1));.  retu
15950 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
15960 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65 73  .** Usage:   tes
15970 74 5f 65 72 72 6d 73 67 31 36 20 44 42 0a 2a 2a  t_errmsg16 DB.**
15980 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20  .** Returns the 
15990 55 54 46 2d 31 36 20 72 65 70 72 65 73 65 6e 74  UTF-16 represent
159a0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72  ation of the err
159b0 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e  or message strin
159c0 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73  g for the.** mos
159d0 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
159e0 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20 54 68 69  _* API call. Thi
159f0 73 20 69 73 20 61 20 62 79 74 65 20 61 72 72 61  s is a byte arra
15a00 79 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20  y object at the 
15a10 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c 20 61  TCL .** level, a
15a20 6e 64 20 69 74 20 69 6e 63 6c 75 64 65 73 20 74  nd it includes t
15a30 68 65 20 30 78 30 30 20 30 78 30 30 20 74 65 72  he 0x00 0x00 ter
15a40 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20 61 74  minator bytes at
15a50 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
15a60 2a 2a 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67  ** UTF-16 string
15a70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15a80 74 65 73 74 5f 65 72 72 6d 73 67 31 36 28 0a 20  test_errmsg16(. 
15a90 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
15aa0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
15ab0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
15ac0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
15ad0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
15ae0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15af0 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
15b00 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
15b10 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20 20  t void *zErr;.  
15b20 69 6e 74 20 62 79 74 65 73 20 3d 20 30 3b 0a 0a  int bytes = 0;..
15b30 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
15b40 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
15b50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
15b60 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
15b70 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
15b80 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
15b90 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
15ba0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
15bb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
15bc0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
15bd0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
15be0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
15bf0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
15c00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
15c10 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65  zErr = sqlite3_e
15c20 72 72 6d 73 67 31 36 28 64 62 29 3b 0a 20 20 69  rrmsg16(db);.  i
15c30 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 62  f( zErr ){.    b
15c40 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 55 74  ytes = sqlite3Ut
15c50 66 31 36 42 79 74 65 4c 65 6e 28 7a 45 72 72 2c  f16ByteLen(zErr,
15c60 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f   -1);.  }.  Tcl_
15c70 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
15c80 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  erp, Tcl_NewByte
15c90 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c 20 62  ArrayObj(zErr, b
15ca0 79 74 65 73 29 29 3b 0a 23 65 6e 64 69 66 20 2f  ytes));.#endif /
15cb0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
15cc0 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
15cd0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
15ce0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
15cf0 70 72 65 70 61 72 65 20 44 42 20 73 71 6c 20 62  prepare DB sql b
15d00 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a  ytes tailvar.**.
15d10 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f  ** Compile up to
15d20 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f   <bytes> bytes o
15d30 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53  f the supplied S
15d40 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20  QL string <sql> 
15d50 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  using.** databas
15d60 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54  e handle <DB>. T
15d70 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61  he parameter <ta
15d80 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61  ilval> is the na
15d90 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a  me of a global.*
15da0 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  * variable that 
15db0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e  is set to the un
15dc0 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  used portion of 
15dd0 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20  <sql> (if any). 
15de0 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65  A.** STMT handle
15df0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
15e00 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
15e10 5f 70 72 65 70 61 72 65 28 0a 20 20 76 6f 69 64  _prepare(.  void
15e20 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
15e30 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15e40 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
15e50 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
15e60 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
15e70 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
15e80 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
15e90 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f   int bytes;.  co
15ea0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20  nst char *zTail 
15eb0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
15ec0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
15ed0 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
15ee0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
15ef0 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
15f00 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
15f10 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
15f20 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
15f30 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
15f40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15f50 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
15f60 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c   bytes tailvar",
15f70 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
15f80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
15f90 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
15fa0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
15fb0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
15fc0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
15fd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
15fe0 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
15ff0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
16000 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
16010 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16020 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
16030 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16040 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
16050 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71  _prepare(db, zSq
16060 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74  l, bytes, &pStmt
16070 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28  , &zTail);.  if(
16080 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
16090 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
160a0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
160b0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54  _ERROR;.  if( zT
160c0 61 69 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 62  ail ){.    if( b
160d0 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ytes>=0 ){.     
160e0 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d   bytes = bytes -
160f0 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20   (zTail-zSql);. 
16100 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
16110 6c 65 6e 28 7a 54 61 69 6c 29 3c 62 79 74 65 73  len(zTail)<bytes
16120 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20   ){.      bytes 
16130 3d 20 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b  = strlen(zTail);
16140 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f  .    }.    Tcl_O
16150 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
16160 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63  , objv[4], 0, Tc
16170 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
16180 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29  Tail, bytes), 0)
16190 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
161a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
161b0 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d   assert( pStmt==
161c0 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  0 );.    sprintf
161d0 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20  (zBuf, "(%d) ", 
161e0 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  rc);.    Tcl_App
161f0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
16200 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f  , zBuf, sqlite3_
16210 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
16220 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16230 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
16240 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
16250 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
16260 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
16270 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
16280 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16290 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
162a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
162b0 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
162c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
162d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
162e0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
162f0 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65 73  _v2 DB sql bytes
16300 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43   tailvar.**.** C
16310 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
16320 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
16330 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
16340 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
16350 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
16360 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
16370 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
16380 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
16390 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
163a0 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
163b0 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
163c0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
163d0 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
163e0 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
163f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
16400 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
16410 70 61 72 65 5f 76 32 28 0a 20 20 76 6f 69 64 20  pare_v2(.  void 
16420 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
16430 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
16440 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
16450 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
16460 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
16470 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
16480 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
16490 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e  int bytes;.  con
164a0 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d  st char *zTail =
164b0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
164c0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
164d0 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
164e0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
164f0 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
16500 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
16510 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
16520 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
16530 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
16540 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
16550 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
16560 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
16570 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
16580 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
16590 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
165a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
165b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
165c0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
165d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
165e0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
165f0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
16600 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
16610 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
16620 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
16630 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16640 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
16650 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
16660 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
16670 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20 61  mt, &zTail);.  a
16680 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
16690 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29  _OK || pStmt==0)
166a0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
166b0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
166c0 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
166d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
166e0 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20   if( zTail ){.  
166f0 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29    if( bytes>=0 )
16700 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20  {.      bytes = 
16710 62 79 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d 7a  bytes - (zTail-z
16720 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
16730 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
16740 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
16750 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  0, Tcl_NewString
16760 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73  Obj(zTail, bytes
16770 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ), 0);.  }.  if(
16780 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16790 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
167a0 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70  tmt==0 );.    sp
167b0 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64  rintf(zBuf, "(%d
167c0 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
167d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
167e0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
167f0 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
16800 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
16810 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16820 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
16830 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
16840 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
16850 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
16860 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
16870 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63  CL_ERROR;.    Tc
16880 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16890 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
168a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
168b0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
168c0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
168d0 65 70 61 72 65 5f 74 6b 74 33 31 33 34 20 44 42  epare_tkt3134 DB
168e0 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
168f0 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
16900 6d 65 6e 74 20 66 6f 72 20 61 20 7a 65 72 6f 2d  ment for a zero-
16910 62 79 74 65 20 73 74 72 69 6e 67 20 61 73 20 61  byte string as a
16920 20 74 65 73 74 0a 2a 2a 20 66 6f 72 20 74 69 63   test.** for tic
16930 6b 65 74 20 23 33 31 33 34 2e 20 20 54 68 65 20  ket #3134.  The 
16940 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65  string should be
16950 20 70 72 65 63 65 65 64 65 64 20 62 79 20 61 20   preceeded by a 
16960 7a 65 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73 74  zero byte..*/.st
16970 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
16980 65 70 61 72 65 5f 74 6b 74 33 31 33 34 28 0a 20  epare_tkt3134(. 
16990 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
169a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
169b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
169c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
169d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
169e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
169f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
16a00 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c 30  har zSql[] = "\0
16a10 30 30 53 45 4c 45 43 54 20 31 22 3b 0a 20 20 73  00SELECT 1";.  s
16a20 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
16a30 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  mt = 0;.  char z
16a40 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72  Buf[50];.  int r
16a50 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
16a60 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
16a70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
16a80 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
16a90 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
16aa0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
16ab0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
16ac0 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  " DB sql bytes t
16ad0 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20  ailvar", 0);.   
16ae0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16af0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
16b00 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
16b10 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
16b20 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
16b30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16b40 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
16b50 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
16b60 20 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20 26 70   &zSql[1], 0, &p
16b70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 61 73 73 65  Stmt, 0);.  asse
16b80 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rt(rc==SQLITE_OK
16b90 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20   || pStmt==0);. 
16ba0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
16bb0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
16bc0 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
16bd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
16be0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16bf0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16c00 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
16c10 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25  printf(zBuf, "(%
16c20 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
16c30 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16c40 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
16c50 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
16c60 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
16c70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
16c80 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
16c90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
16ca0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
16cb0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
16cc0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
16cd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
16ce0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16cf0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
16d00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
16d10 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
16d20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
16d30 72 65 70 61 72 65 31 36 20 44 42 20 73 71 6c 20  repare16 DB sql 
16d40 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a  bytes tailvar.**
16d50 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74  .** Compile up t
16d60 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20  o <bytes> bytes 
16d70 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
16d80 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e  SQL string <sql>
16d90 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61   using.** databa
16da0 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20  se handle <DB>. 
16db0 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74  The parameter <t
16dc0 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e  ailval> is the n
16dd0 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a  ame of a global.
16de0 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  ** variable that
16df0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75   is set to the u
16e00 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  nused portion of
16e10 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e   <sql> (if any).
16e20 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c   A.** STMT handl
16e30 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
16e40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
16e50 74 5f 70 72 65 70 61 72 65 31 36 28 0a 20 20 76  t_prepare16(.  v
16e60 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16e70 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16e80 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16e90 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16ea0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
16eb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16ec0 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
16ed0 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
16ee0 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f  void *zSql;.  co
16ef0 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20  nst void *zTail 
16f00 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  = 0;.  Tcl_Obj *
16f10 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  pTail = 0;.  sql
16f20 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
16f30 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
16f40 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63  f[50]; .  int rc
16f50 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20  ;.  int bytes;  
16f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16f70 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70 65   The integer spe
16f80 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33 20  cified as arg 3 
16f90 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b  */.  int objlen;
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16fb0 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61 79  * The byte-array
16fc0 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32   length of arg 2
16fd0 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
16fe0 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
16ff0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17000 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
17010 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
17020 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
17030 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
17040 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
17050 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20  tailvar", 0);.  
17060 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17070 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
17080 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
17090 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
170a0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
170b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
170c0 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = Tcl
170d0 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
170e0 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f  mObj(objv[2], &o
170f0 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63  bjlen);.  if( Tc
17100 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
17110 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
17120 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
17130 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
17140 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
17150 70 61 72 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c  pare16(db, zSql,
17160 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
17170 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28 20 73  &zTail);.  if( s
17180 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
17190 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
171a0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
171b0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29  RROR;.  if( rc )
171c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
171d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
171e0 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20  f( zTail ){.    
171f0 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20  objlen = objlen 
17200 2d 20 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28  - ((u8 *)zTail-(
17210 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 7d 65  u8 *)zSql);.  }e
17220 6c 73 65 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20  lse{.    objlen 
17230 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 69 6c  = 0;.  }.  pTail
17240 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
17250 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61  rayObj((u8 *)zTa
17260 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 54  il, objlen);.  T
17270 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
17280 70 54 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 4f 62  pTail);.  Tcl_Ob
17290 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
172a0 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61   objv[4], 0, pTa
172b0 69 6c 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  il, 0);.  Tcl_De
172c0 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c  crRefCount(pTail
172d0 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20  );..  if( pStmt 
172e0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
172f0 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
17300 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
17310 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
17320 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17330 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
17340 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
17350 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  f, 0);.#endif /*
17360 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
17370 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
17380 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
17390 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
173a0 72 65 70 61 72 65 31 36 5f 76 32 20 44 42 20 73  repare16_v2 DB s
173b0 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
173c0 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
173d0 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
173e0 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
173f0 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
17400 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
17410 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
17420 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
17430 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
17440 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
17450 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
17460 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
17470 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
17480 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
17490 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
174a0 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
174b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
174c0 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76  test_prepare16_v
174d0 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  2(.  void * clie
174e0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
174f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
17500 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17510 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17520 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
17530 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
17540 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
17550 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c  const void *zSql
17560 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
17570 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c  zTail = 0;.  Tcl
17580 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b  _Obj *pTail = 0;
17590 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
175a0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
175b0 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20  ar zBuf[50]; .  
175c0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79  int rc;.  int by
175d0 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  tes;            
175e0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
175f0 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20  er specified as 
17600 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f  arg 3 */.  int o
17610 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  bjlen;          
17620 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
17630 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66  -array length of
17640 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28   arg 2 */..  if(
17650 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
17660 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17670 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
17680 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
17690 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
176a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
176b0 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
176c0 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
176d0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
176e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
176f0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
17700 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
17710 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
17720 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
17730 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
17740 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
17750 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
17760 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20  2], &objlen);.  
17770 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
17780 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
17790 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
177a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
177b0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
177c0 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28  e3_prepare16_v2(
177d0 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c  db, zSql, bytes,
177e0 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29   &pStmt, &zTail)
177f0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
17800 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
17810 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
17820 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17830 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
17840 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17850 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61 69  .  }..  if( zTai
17860 6c 20 29 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20  l ){.    objlen 
17870 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20  = objlen - ((u8 
17880 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53  *)zTail-(u8 *)zS
17890 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ql);.  }else{.  
178a0 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20    objlen = 0;.  
178b0 7d 0a 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f  }.  pTail = Tcl_
178c0 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
178d0 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a  (u8 *)zTail, obj
178e0 6c 65 6e 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  len);.  Tcl_Incr
178f0 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
17900 0a 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72  .  Tcl_ObjSetVar
17910 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
17920 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b  ], 0, pTail, 0);
17930 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
17940 75 6e 74 28 70 54 61 69 6c 29 3b 0a 0a 20 20 69  unt(pTail);..  i
17950 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
17960 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
17970 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
17980 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
17990 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
179a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
179b0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
179c0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
179d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
179e0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
179f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
17a00 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
17a10 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69 6c  sqlite3_open fil
17a20 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c  ename ?options-l
17a30 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist?.*/.static i
17a40 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20 20  nt test_open(.  
17a50 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
17a60 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
17a70 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
17a80 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
17a90 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
17aa0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
17ab0 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  ilename;.  sqlit
17ac0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
17ad0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
17ae0 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
17af0 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 26 26  =3 && objc!=2 &&
17b00 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
17b10 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17b20 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
17b30 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
17b40 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
17b50 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
17b60 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d  v[0]), " filenam
17b70 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c  e options-list",
17b80 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
17b90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
17ba0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6f 62    zFilename = ob
17bb0 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65 74 53 74  jc>1 ? Tcl_GetSt
17bc0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 20 3a 20  ring(objv[1]) : 
17bd0 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
17be0 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  3_open(zFilename
17bf0 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28  , &db);.  .  if(
17c00 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
17c10 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
17c20 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72  p, zBuf, db) ) r
17c30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17c40 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
17c50 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
17c60 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
17c70 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
17c80 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f  Usage: sqlite3_o
17c90 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f  pen16 filename o
17ca0 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63  ptions.*/.static
17cb0 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 31 36   int test_open16
17cc0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
17cd0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
17ce0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
17cf0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
17d00 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
17d10 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
17d20 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
17d30 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c  const void *zFil
17d40 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  ename;.  sqlite3
17d50 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
17d60 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
17d70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
17d80 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
17d90 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
17da0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
17db0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
17dc0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
17dd0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
17de0 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
17df0 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  s-list", 0);.   
17e00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17e10 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e  R;.  }..  zFilen
17e20 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ame = Tcl_GetByt
17e30 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
17e40 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 72 63 20  jv[1], 0);.  rc 
17e50 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  = sqlite3_open16
17e60 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29  (zFilename, &db)
17e70 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74  ;.  .  if( sqlit
17e80 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
17e90 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
17ea0 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e 20  f, db) ) return 
17eb0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
17ec0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
17ed0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
17ee0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
17ef0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
17f00 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
17f10 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
17f20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
17f30 31 36 20 3c 55 54 46 2d 31 36 20 73 74 72 69 6e  16 <UTF-16 strin
17f40 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  g>.**.** Return 
17f50 31 20 69 66 20 74 68 65 20 73 75 70 70 6c 69 65  1 if the supplie
17f60 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
17f70 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
17f80 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a  tement, or zero.
17f90 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
17fa0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
17fb0 5f 63 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20 76  _complete16(.  v
17fc0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17fd0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17fe0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17ff0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18000 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
18010 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
18020 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45  TE_OMIT_COMPLETE
18030 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
18040 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29  LITE_OMIT_UTF16)
18050 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a  .  char *zBuf;..
18060 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
18070 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
18080 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
18090 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20   objv, "<utf-16 
180a0 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72 65 74 75  sql>");.    retu
180b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
180c0 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 28 63 68 61  }..  zBuf = (cha
180d0 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72  r*)Tcl_GetByteAr
180e0 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
180f0 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65  1], 0);.  Tcl_Se
18100 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
18110 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
18120 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74  (sqlite3_complet
18130 65 31 36 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e  e16(zBuf)));.#en
18140 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
18150 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26 26 20 53  IT_COMPLETE && S
18160 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
18170 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
18180 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18190 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 74 65  age: sqlite3_ste
181a0 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76  p STMT.**.** Adv
181b0 61 6e 63 65 20 74 68 65 20 73 74 61 74 65 6d 65  ance the stateme
181c0 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  nt to the next r
181d0 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
181e0 74 20 74 65 73 74 5f 73 74 65 70 28 0a 20 20 76  t test_step(.  v
181f0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18200 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18210 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18220 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18230 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18240 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
18250 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
18260 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
18270 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
18280 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
18290 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
182a0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
182b0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
182c0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
182d0 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
182e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
182f0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
18300 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
18310 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
18320 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
18330 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18340 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
18350 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
18360 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63 21 3d  ;..  /* if( rc!=
18370 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72  SQLITE_DONE && r
18380 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20  c!=SQLITE_ROW ) 
18390 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
183a0 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65  ; */.  Tcl_SetRe
183b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
183c0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
183d0 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
183e0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
183f0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
18400 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20  e3_column_count 
18410 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75  STMT .**.** Retu
18420 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18430 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
18440 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61  d by the sql sta
18450 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a  tement STMT..*/.
18460 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
18470 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20  column_count(.  
18480 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18490 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
184a0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
184b0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
184c0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
184d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
184e0 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
184f0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
18500 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18510 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
18520 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
18530 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
18540 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
18550 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
18560 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
18570 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18580 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
18590 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
185a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
185b0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
185c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
185d0 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  OR;..  Tcl_SetOb
185e0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
185f0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
18600 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
18610 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72  nt(pStmt)));.  r
18620 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18630 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
18640 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
18650 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
18660 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
18670 79 70 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  ype of the data 
18680 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
18690 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
186a0 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t row..*/.static
186b0 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
186c0 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20  _type(.  void * 
186d0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
186e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
186f0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18700 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18710 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18720 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
18730 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74    int col;.  int
18740 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   tp;..  if( objc
18750 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
18760 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18770 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
18780 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
18790 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
187a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
187b0 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
187c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
187d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
187e0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
187f0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
18800 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
18810 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
18820 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18830 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
18840 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
18850 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
18860 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18870 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c  ROR;..  tp = sql
18880 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
18890 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
188a0 73 77 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20  switch( tp ){.  
188b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
188c0 54 45 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63  TEGER: .      Tc
188d0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
188e0 72 70 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54  rp, "INTEGER", T
188f0 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
18900 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
18910 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a  se SQLITE_NULL:.
18920 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
18930 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c  ult(interp, "NUL
18940 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  L", TCL_STATIC);
18950 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
18960 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
18970 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f  LOAT:.      Tcl_
18980 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
18990 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53  , "FLOAT", TCL_S
189a0 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
189b0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
189c0 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20  QLITE_TEXT:.    
189d0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
189e0 69 6e 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20  interp, "TEXT", 
189f0 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
18a00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
18a10 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
18a20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
18a30 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c  sult(interp, "BL
18a40 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  OB", TCL_STATIC)
18a50 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
18a60 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
18a70 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
18a80 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
18a90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
18aa0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
18ab0 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f  mn_int64 STMT co
18ac0 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lumn.**.** Retur
18ad0 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f  n the data in co
18ae0 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66  lumn 'column' of
18af0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
18b00 20 63 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77   cast as an.** w
18b10 69 64 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74  ide (64-bit) int
18b20 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
18b30 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
18b40 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  int64(.  void * 
18b50 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18b60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18b70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18b80 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18b90 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18ba0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
18bb0 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34    int col;.  i64
18bc0 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62   iVal;..  if( ob
18bd0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
18be0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18bf0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
18c00 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
18c10 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
18c20 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
18c30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
18c40 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
18c50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18c60 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
18c70 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
18c80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18c90 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
18ca0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18cb0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
18cc0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
18cd0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
18ce0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
18cf0 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d  ERROR;..  iVal =
18d00 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
18d10 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c  int64(pStmt, col
18d20 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
18d30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
18d40 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
18d50 69 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  iVal));.  return
18d60 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
18d70 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
18d80 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d  _column_blob STM
18d90 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74  T column.*/.stat
18da0 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
18db0 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20  mn_blob(.  void 
18dc0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18dd0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18de0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18df0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18e00 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
18e10 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
18e20 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20  ;.  int col;..  
18e30 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74  int len;.  const
18e40 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20   void *pBlob;.. 
18e50 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
18e60 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
18e70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
18e80 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
18e90 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
18ea0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
18eb0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
18ec0 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
18ed0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18ee0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
18ef0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
18f00 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
18f10 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
18f20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
18f30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
18f40 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
18f50 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
18f60 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
18f70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
18f80 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63   len = sqlite3_c
18f90 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
18fa0 74 2c 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62  t, col);.  pBlob
18fb0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
18fc0 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f  n_blob(pStmt, co
18fd0 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
18fe0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
18ff0 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
19000 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b  bj(pBlob, len));
19010 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
19020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
19030 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
19040 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c  _double STMT col
19050 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  umn.**.** Return
19060 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c   the data in col
19070 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20  umn 'column' of 
19080 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
19090 63 61 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65  cast as a double
190a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
190b0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  test_column_doub
190c0 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  le(.  void * cli
190d0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
190e0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
190f0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
19100 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
19110 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
19120 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
19130 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65  nt col;.  double
19140 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62   rVal;..  if( ob
19150 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
19160 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19170 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
19180 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
19190 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
191a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
191b0 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
191c0 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
191d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
191e0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
191f0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
19200 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19210 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
19220 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19230 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
19240 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
19250 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
19260 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
19270 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d  ERROR;..  rVal =
19280 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
19290 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f  double(pStmt, co
192a0 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
192b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
192c0 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28  cl_NewDoubleObj(
192d0 72 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  rVal));.  return
192e0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
192f0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
19300 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54  _data_count STMT
19310 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74   .**.** Return t
19320 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
19330 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
19340 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65   the sql stateme
19350 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74  nt STMT..*/.stat
19360 69 63 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61  ic int test_data
19370 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a  _count(.  void *
19380 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
19390 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
193a0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
193b0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
193c0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
193d0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
193e0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
193f0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
19400 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19410 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
19420 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
19430 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
19440 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
19450 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
19460 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
19470 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
19480 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
19490 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
194a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
194b0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
194c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
194d0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
194e0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
194f0 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
19500 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74  data_count(pStmt
19510 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
19520 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
19530 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
19540 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63  lumn_text STMT c
19550 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
19560 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
19570 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20  n_decltype STMT 
19580 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** 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 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c  mn_name STMT col
195b0 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
195c0 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  t test_stmt_utf8
195d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
195e0 74 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a  tData,        /*
195f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69   Pointer to SQLi
19600 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  te API function 
19610 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a  to be invoke */.
19620 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
19630 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
19640 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
19650 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
19660 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
19670 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
19680 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78   const char *(*x
19690 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
196a0 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e  mt*, int);.  con
196b0 73 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a  st char *zRet;..
196c0 20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74    xFunc = (const
196d0 20 63 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74   char *(*)(sqlit
196e0 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63  e3_stmt*, int))c
196f0 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28  lientData;.  if(
19700 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
19710 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19720 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
19730 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
19740 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
19750 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19760 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
19770 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
19780 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19790 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
197a0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
197b0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
197c0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
197d0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
197e0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
197f0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
19800 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
19810 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
19820 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74  CL_ERROR;.  zRet
19830 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20   = xFunc(pStmt, 
19840 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74  col);.  if( zRet
19850 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
19860 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
19870 68 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a  har *)zRet, 0);.
19880 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
19890 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
198a0 6e 74 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72  nt test_global_r
198b0 65 63 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a  ecover(.  void *
198c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
198d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
198e0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
198f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
19900 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
19910 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c  f SQLITE_OMIT_GL
19920 4f 42 41 4c 52 45 43 4f 56 45 52 0a 20 20 69 6e  OBALRECOVER.  in
19930 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63  t rc;.  if( objc
19940 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
19950 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
19960 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 1, objv, "")
19970 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
19980 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
19990 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61   = sqlite3_globa
199a0 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a 20 20 54  l_recover();.  T
199b0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
199c0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
199d0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
199e0 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e 64 69  L_STATIC);.#endi
199f0 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
19a00 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
19a10 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
19a20 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
19a30 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
19a40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
19a50 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
19a60 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
19a70 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
19a80 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
19a90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
19aa0 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a  est_stmt_utf16(.
19ab0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
19ac0 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ata,     /* Poin
19ad0 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
19ae0 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
19af0 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63   invoked */.  Tc
19b00 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19b10 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
19b20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
19b30 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
19b40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
19b50 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  16.  sqlite3_stm
19b60 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
19b70 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  col;.  Tcl_Obj *
19b80 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f  pRet;.  const vo
19b90 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63  id *zName16;.  c
19ba0 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46 75  onst void *(*xFu
19bb0 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
19bc0 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e  *, int);..  xFun
19bd0 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 20  c = (const void 
19be0 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  *(*)(sqlite3_stm
19bf0 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44  t*, int))clientD
19c00 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ata;.  if( objc!
19c10 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
19c20 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19c30 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
19c40 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
19c50 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
19c60 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
19c70 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
19c80 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
19c90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
19ca0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
19cb0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
19cc0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19cd0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
19ce0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19cf0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
19d00 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
19d10 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
19d20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19d30 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20 3d  OR;..  zName16 =
19d40 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
19d50 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 31  l);.  if( zName1
19d60 36 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  6 ){.    pRet = 
19d70 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
19d80 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 73 71 6c  Obj(zName16, sql
19d90 69 74 65 33 55 74 66 31 36 42 79 74 65 4c 65 6e  ite3Utf16ByteLen
19da0 28 7a 4e 61 6d 65 31 36 2c 20 2d 31 29 2b 32 29  (zName16, -1)+2)
19db0 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
19dc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
19dd0 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Ret);.  }.#endif
19de0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19df0 55 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74 75  UTF16 */..  retu
19e00 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
19e10 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
19e20 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54  e3_column_int ST
19e30 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
19e40 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
19e50 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54  olumn_bytes STMT
19e60 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
19e70 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
19e80 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54  umn_bytes16 STMT
19e90 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74   column.**.*/.st
19ea0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
19eb0 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  mt_int(.  void *
19ec0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20   clientData,    
19ed0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51  /* Pointer to SQ
19ee0 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f  Lite API functio
19ef0 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
19f00 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
19f10 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
19f20 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
19f30 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
19f40 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19f50 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
19f60 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  ;.  int (*xFunc)
19f70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
19f80 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d  int);..  xFunc =
19f90 20 28 69 6e 74 20 28 2a 29 28 73 71 6c 69 74 65   (int (*)(sqlite
19fa0 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c  3_stmt*, int))cl
19fb0 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20  ientData;.  if( 
19fc0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
19fd0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19fe0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
19ff0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1a000 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1a010 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1a020 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
1a030 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
1a040 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a050 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1a060 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1a070 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1a080 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1a090 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a0a0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1a0b0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1a0c0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1a0d0 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
1a0e0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f  L_ERROR;..  Tcl_
1a0f0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1a100 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1a110 62 6a 28 78 46 75 6e 63 28 70 53 74 6d 74 2c 20  bj(xFunc(pStmt, 
1a120 63 6f 6c 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  col)));.  return
1a130 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1a140 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
1a150 5f 73 65 74 5f 6d 61 67 69 63 20 20 44 42 20 20  _set_magic  DB  
1a160 4d 41 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a  MAGIC-NUMBER.**.
1a170 2a 2a 20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d  ** Set the db->m
1a180 61 67 69 63 20 76 61 6c 75 65 2e 20 20 54 68 69  agic value.  Thi
1a190 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
1a1a0 74 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79  t error recovery
1a1b0 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69   logic..*/.stati
1a1c0 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 65 74  c int sqlite_set
1a1d0 5f 6d 61 67 69 63 28 0a 20 20 76 6f 69 64 20 2a  _magic(.  void *
1a1e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1a1f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1a200 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1a210 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1a220 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1a230 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
1a240 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a250 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1a260 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1a270 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1a280 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 22 20 44  0],.         " D
1a290 42 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20 20  B MAGIC", 0);.  
1a2a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a2b0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1a2c0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1a2d0 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
1a2e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1a2f0 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  ROR;.  if( strcm
1a300 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49  p(argv[2], "SQLI
1a310 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29 3d  TE_MAGIC_OPEN")=
1a320 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
1a330 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
1a340 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65  IC_OPEN;.  }else
1a350 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
1a360 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
1a370 49 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20 29  IC_CLOSED")==0 )
1a380 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
1a390 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  = SQLITE_MAGIC_C
1a3a0 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  LOSED;.  }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 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20 20  _BUSY")==0 ){.  
1a3e0 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
1a3f0 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b  LITE_MAGIC_BUSY;
1a400 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
1a410 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
1a420 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52  LITE_MAGIC_ERROR
1a430 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
1a440 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
1a450 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 7d  MAGIC_ERROR;.  }
1a460 65 6c 73 65 20 69 66 28 20 54 63 6c 5f 47 65 74  else if( Tcl_Get
1a470 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
1a480 5b 32 5d 2c 20 26 64 62 2d 3e 6d 61 67 69 63 29  [2], &db->magic)
1a490 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1a4a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a4b0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1a4c0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1a4d0 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
1a4e0 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69  t  DB .**.** Tri
1a4f0 67 67 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70  gger an interrup
1a500 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69  t on DB.*/.stati
1a510 63 20 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72  c int test_inter
1a520 72 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  rupt(.  void * c
1a530 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1a540 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1a550 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1a560 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1a570 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1a580 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
1a590 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1a5a0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1a5b0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1a5c0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1a5d0 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
1a5e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a5f0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1a600 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1a610 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1a620 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a630 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  OR;.  sqlite3_in
1a640 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72  terrupt(db);.  r
1a650 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1a660 0a 73 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69  .static u8 *sqli
1a670 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69  te3_stack_baseli
1a680 6e 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46  ne = 0;../*.** F
1a690 69 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69  ill the stack wi
1a6a0 74 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61  th a known bitpa
1a6b0 74 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ttern..*/.static
1a6c0 20 76 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28   void prepStack(
1a6d0 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  void){.  int i;.
1a6e0 20 20 75 33 32 20 62 69 67 42 75 66 5b 36 35 35    u32 bigBuf[655
1a6f0 33 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  36];.  for(i=0; 
1a700 69 3c 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29  i<sizeof(bigBuf)
1a710 3b 20 69 2b 2b 29 20 62 69 67 42 75 66 5b 69 5d  ; i++) bigBuf[i]
1a720 20 3d 20 30 78 64 65 61 64 62 65 65 66 3b 0a 20   = 0xdeadbeef;. 
1a730 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62   sqlite3_stack_b
1a740 61 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a 29 26  aseline = (u8*)&
1a750 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 7d  bigBuf[65536];.}
1a760 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20  ../*.** Get the 
1a770 63 75 72 72 65 6e 74 20 73 74 61 63 6b 20 64 65  current stack de
1a780 70 74 68 2e 20 20 55 73 65 64 20 66 6f 72 20 64  pth.  Used for d
1a790 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
1a7a0 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 53 74 61  /.u64 sqlite3Sta
1a7b0 63 6b 44 65 70 74 68 28 76 6f 69 64 29 7b 0a 20  ckDepth(void){. 
1a7c0 20 75 38 20 78 3b 0a 20 20 72 65 74 75 72 6e 20   u8 x;.  return 
1a7d0 28 75 36 34 29 28 73 71 6c 69 74 65 33 5f 73 74  (u64)(sqlite3_st
1a7e0 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d 20 26  ack_baseline - &
1a7f0 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  x);.}../*.** Usa
1a800 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 61  ge:  sqlite3_sta
1a810 63 6b 5f 75 73 65 64 20 44 42 20 53 51 4c 0a 2a  ck_used DB SQL.*
1a820 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65 61 73  *.** Try to meas
1a830 75 72 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ure the amount o
1a840 66 20 73 74 61 63 6b 20 73 70 61 63 65 20 75 73  f stack space us
1a850 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
1a860 73 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a 2f 0a  sqlite3_exec.*/.
1a870 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1a880 73 74 61 63 6b 5f 75 73 65 64 28 0a 20 20 76 6f  stack_used(.  vo
1a890 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1a8a0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1a8b0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
1a8c0 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
1a8d0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1a8e0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  b;.  int i;.  if
1a8f0 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
1a900 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a910 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1a920 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1a930 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1a940 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 53   .        " DB S
1a950 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  QL", 0);.    ret
1a960 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a970 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1a980 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1a990 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1a9a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a9b0 20 20 70 72 65 70 53 74 61 63 6b 28 29 3b 0a 20    prepStack();. 
1a9c0 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
1a9d0 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  xec(db, argv[2],
1a9e0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72   0, 0, 0);.  for
1a9f0 28 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30 20 26  (i=65535; i>=0 &
1aa00 26 20 28 28 75 33 32 2a 29 73 71 6c 69 74 65 33  & ((u32*)sqlite3
1aa10 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 29  _stack_baseline)
1aa20 5b 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65 65 66  [-i]==0xdeadbeef
1aa30 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53  ; i--){}.  Tcl_S
1aa40 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1aa50 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1aa60 6a 28 69 2a 34 29 29 3b 0a 20 20 72 65 74 75 72  j(i*4));.  retur
1aa70 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1aa80 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1aa90 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e  _delete_function
1aaa0 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d   DB function-nam
1aab0 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  e.**.** Delete t
1aac0 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
1aad0 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27   'function-name'
1aae0 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68   from database h
1aaf0 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20  andle DB. It.** 
1ab00 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1ab10 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  the user functio
1ab20 6e 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73  n was created as
1ab30 20 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65   UTF8, any numbe
1ab40 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  r of.** argument
1ab50 73 20 28 74 68 65 20 77 61 79 20 74 68 65 20 54  s (the way the T
1ab60 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65  CL interface doe
1ab70 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  s it)..*/.static
1ab80 20 69 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e 63   int delete_func
1ab90 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
1aba0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1abb0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1abc0 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1abd0 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1abe0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1abf0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1ac00 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1ac10 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ac20 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1ac30 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1ac40 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1ac50 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69       " DB functi
1ac60 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20  on-name", 0);.  
1ac70 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1ac80 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1ac90 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1aca0 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
1acb0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1acc0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
1acd0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1ace0 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
1acf0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
1ad00 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
1ad10 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1ad20 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
1ad30 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
1ad40 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
1ad50 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1ad60 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1ad70 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c  lite_delete_coll
1ad80 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69  ation DB collati
1ad90 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65  on-name.**.** De
1ada0 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  lete the collati
1adb0 6f 6e 20 73 65 71 75 65 6e 63 65 20 27 63 6f 6c  on sequence 'col
1adc0 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f  lation-name' fro
1add0 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  m database handl
1ade0 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73 20  e .** DB. It is 
1adf0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1ae00 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1ae10 6e 63 65 20 77 61 73 20 63 72 65 61 74 65 64 20  nce was created 
1ae20 61 73 20 55 54 46 38 20 28 74 68 65 20 0a 2a 2a  as UTF8 (the .**
1ae30 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74   way the TCL int
1ae40 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e  erface does it).
1ae50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
1ae60 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  elete_collation(
1ae70 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1ae80 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1ae90 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1aea0 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1aeb0 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
1aec0 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
1aed0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
1aee0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1aef0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1af00 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1af10 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1af20 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
1af30 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61  " DB function-na
1af40 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  me", 0);.    ret
1af50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1af60 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1af70 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1af80 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1af90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1afa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
1afb0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
1afc0 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c  db, argv[2], SQL
1afd0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b  ITE_UTF8, 0, 0);
1afe0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1aff0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1b000 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1b010 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
1b020 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1b030 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1b040 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
1b050 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20  commit DB.**.** 
1b060 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1b070 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20 69  he database DB i
1b080 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61  s currently in a
1b090 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e  uto-commit mode.
1b0a0 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65  .** Return false
1b0b0 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
1b0c0 69 63 20 69 6e 74 20 67 65 74 5f 61 75 74 6f 63  ic int get_autoc
1b0d0 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20  ommit(.  void * 
1b0e0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1b0f0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b100 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1b110 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1b120 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
1b130 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1b140 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
1b150 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1b160 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1b170 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1b180 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1b190 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
1b1a0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
1b1b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b1c0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1b1d0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1b1e0 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1b1f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b200 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
1b210 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74  %d", sqlite3_get
1b220 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29  _autocommit(db))
1b230 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1b240 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1b250 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
1b260 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1b270 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1b280 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20  busy_timeout DB 
1b290 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65  MS.**.** Set the
1b2a0 20 62 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20   busy timeout.  
1b2b0 54 68 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73  This is more eas
1b2c0 69 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74  ily done using t
1b2d0 68 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65  he timeout.** me
1b2e0 74 68 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20  thod of the TCL 
1b2f0 69 6e 74 65 72 66 61 63 65 2e 20 20 42 75 74 20  interface.  But 
1b300 77 65 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f  we need a way to
1b310 20 74 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a   test the case.*
1b320 2a 20 77 68 65 72 65 20 69 74 20 72 65 74 75 72  * where it retur
1b330 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ns SQLITE_MISUSE
1b340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b350 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75  test_busy_timeou
1b360 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
1b370 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1b380 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1b390 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1b3a0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
1b3b0 20 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74   rc, ms;.  sqlit
1b3c0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1b3d0 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1b3e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1b3f0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1b400 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1b410 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1b420 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b        " DB", 0);
1b430 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b440 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1b450 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1b460 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1b470 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1b480 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1b490 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
1b4a0 20 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29   argv[2], &ms) )
1b4b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b4c0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1b4d0 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64  3_busy_timeout(d
1b4e0 62 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70  b, ms);.  Tcl_Ap
1b4f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1b500 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  p, sqlite3TestEr
1b510 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
1b520 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1b530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1b540 3a 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f  :  tcl_variable_
1b550 74 79 70 65 20 56 41 52 49 41 42 4c 45 4e 41 4d  type VARIABLENAM
1b560 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  E.**.** Return t
1b570 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
1b580 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e  nternal represen
1b590 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a  tation for the.*
1b5a0 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 67  * value of the g
1b5b0 69 76 65 6e 20 76 61 72 69 61 62 6c 65 2e 0a 2a  iven variable..*
1b5c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c  /.static int tcl
1b5d0 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 28 0a  _variable_type(.
1b5e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1b5f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1b600 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1b610 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1b620 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1b630 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61  {.  Tcl_Obj *pVa
1b640 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  r;.  if( objc!=2
1b650 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1b660 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1b670 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49 41   1, objv, "VARIA
1b680 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  BLE");.    retur
1b690 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b6a0 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  .  pVar = Tcl_Ge
1b6b0 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20  tVar2Ex(interp, 
1b6c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1b6d0 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f 4c  jv[1]), 0, TCL_L
1b6e0 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a 20  EAVE_ERR_MSG);. 
1b6f0 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29 20 72   if( pVar==0 ) r
1b700 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b710 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74 79 70  .  if( pVar->typ
1b720 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ePtr ){.    Tcl_
1b730 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1b740 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
1b750 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70 65  ngObj(pVar->type
1b760 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29 3b  Ptr->name, -1));
1b770 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1b780 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1b790 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72  sage:  sqlite3_r
1b7a0 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f 4e  elease_memory ?N
1b7b0 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ?.**.** Attempt 
1b7c0 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72  to release memor
1b7d0 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  y currently held
1b7e0 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c   but not actuall
1b7f0 79 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 54  y required..** T
1b800 68 65 20 69 6e 74 65 67 65 72 20 4e 20 69 73 20  he integer N is 
1b810 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1b820 74 65 73 20 77 65 20 61 72 65 20 74 72 79 69 6e  tes we are tryin
1b830 67 20 74 6f 20 72 65 6c 65 61 73 65 2e 20 20 54  g to release.  T
1b840 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  he .** return va
1b850 6c 75 65 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  lue is the amoun
1b860 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74 75  t of memory actu
1b870 61 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a  ally released..*
1b880 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1b890 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  t_release_memory
1b8a0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1b8b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1b8c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1b8d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1b8e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1b8f0 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .){.#if defined(
1b900 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
1b910 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29  MORY_MANAGEMENT)
1b920 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1b930 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
1b940 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20  .  int N;.  int 
1b950 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  amt;.  if( objc!
1b960 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b  =1 && objc!=2 ){
1b970 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1b980 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1b990 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20   objv, "?N?");. 
1b9a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b9b0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
1b9c0 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66  bjc==2 ){.    if
1b9d0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1b9e0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1b9f0 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72  [1], &N) ) retur
1ba00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1ba10 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d 31  else{.    N = -1
1ba20 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71  ;.  }.  amt = sq
1ba30 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
1ba40 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f 53  mory(N);.  Tcl_S
1ba50 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1ba60 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1ba70 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66 0a  j(amt));.#endif.
1ba80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ba90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1baa0 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68    sqlite3_soft_h
1bab0 65 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a  eap_limit ?N?.**
1bac0 0a 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74  .** Query or set
1bad0 20 74 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c   the soft heap l
1bae0 69 6d 69 74 20 66 6f 72 20 74 68 65 20 63 75 72  imit for the cur
1baf0 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 54 68  rent thread.  Th
1bb00 65 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e  e.** limit is on
1bb10 6c 79 20 63 68 61 6e 67 65 64 20 69 66 20 74 68  ly changed if th
1bb20 65 20 4e 20 69 73 20 70 72 65 73 65 6e 74 2e 20  e N is present. 
1bb30 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   The previous li
1bb40 6d 69 74 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  mit.** is return
1bb50 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1bb60 74 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70  t test_soft_heap
1bb70 5f 6c 69 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a  _limit(.  void *
1bb80 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1bb90 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1bba0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1bbb0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1bbc0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74  objv[].){.  stat
1bbd0 69 63 20 69 6e 74 20 73 6f 66 74 48 65 61 70 4c  ic int softHeapL
1bbe0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
1bbf0 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  amt;.  if( objc!
1bc00 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b  =1 && objc!=2 ){
1bc10 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1bc20 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1bc30 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20   objv, "?N?");. 
1bc40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1bc50 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d  ROR;.  }.  amt =
1bc60 20 73 6f 66 74 48 65 61 70 4c 69 6d 69 74 3b 0a   softHeapLimit;.
1bc70 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
1bc80 0a 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20  .    int N;.    
1bc90 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1bca0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1bcb0 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74  jv[1], &N) ) ret
1bcc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1bcd0 20 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f     sqlite3_soft_
1bce0 68 65 61 70 5f 6c 69 6d 69 74 28 4e 29 3b 0a 20  heap_limit(N);. 
1bcf0 20 20 20 73 6f 66 74 48 65 61 70 4c 69 6d 69 74     softHeapLimit
1bd00 20 3d 20 4e 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f   = N;.  }.  Tcl_
1bd10 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1bd20 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1bd30 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65 74 75  bj(amt));.  retu
1bd40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1bd50 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
1bd60 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
1bd70 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  nup.**.** Call t
1bd80 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  he sqlite3_threa
1bd90 64 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a  d_cleanup API..*
1bda0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1bdb0 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  t_thread_cleanup
1bdc0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1bdd0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1bde0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1bdf0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1be00 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1be10 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 68  .){.  sqlite3_th
1be20 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a  read_cleanup();.
1be30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1be40 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
1be50 3a 20 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65  :   sqlite3_page
1be60 72 5f 72 65 66 63 6f 75 6e 74 73 20 20 44 42 0a  r_refcounts  DB.
1be70 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c  **.** Return a l
1be80 69 73 74 20 6f 66 20 6e 75 6d 62 65 72 73 20 77  ist of numbers w
1be90 68 69 63 68 20 61 72 65 20 74 68 65 20 50 61 67  hich are the Pag
1bea0 65 72 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 61  erRefcount for a
1beb0 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20 6f 6e 20  ll.** pagers on 
1bec0 65 61 63 68 20 64 61 74 61 62 61 73 65 20 63 6f  each database co
1bed0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
1bee0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 61 67  tic int test_pag
1bef0 65 72 5f 72 65 66 63 6f 75 6e 74 73 28 0a 20 20  er_refcounts(.  
1bf00 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1bf10 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1bf20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1bf30 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1bf40 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1bf50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1bf60 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 76 2c   int i;.  int v,
1bf70 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a   *a;.  Tcl_Obj *
1bf80 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66 28 20  pResult;..  if( 
1bf90 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1bfa0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1bfb0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1bfc0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1bfd0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
1bfe0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
1bff0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
1c000 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1c010 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c020 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1c030 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1c040 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c050 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
1c060 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c070 0a 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c  .  pResult = Tcl
1c080 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 66 6f 72  _NewObj();.  for
1c090 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
1c0a0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64   i++){.    if( d
1c0b0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30  b->aDb[i].pBt==0
1c0c0 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 2d 31   ){.      v = -1
1c0d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c0e0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1c0f0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1c100 29 3b 0a 20 20 20 20 20 20 61 20 3d 20 73 71 6c  );.      a = sql
1c110 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28 73  ite3PagerStats(s
1c120 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
1c130 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  (db->aDb[i].pBt)
1c140 29 3b 0a 20 20 20 20 20 20 76 20 3d 20 61 5b 30  );.      v = a[0
1c150 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
1c160 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1c170 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
1c180 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1c190 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
1c1a0 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65 77 49  Result, Tcl_NewI
1c1b0 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 7d 0a 20  ntObj(v));.  }. 
1c1c0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1c1d0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73 75 6c  t(interp, pResul
1c1e0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
1c1f0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  _OK;.}.../*.** t
1c200 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b 69 6e 67  clcmd:   working
1c210 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a  _64bit_int.**.**
1c220 20 53 6f 6d 65 20 54 43 4c 20 62 75 69 6c 64 73   Some TCL builds
1c230 20 28 65 78 3a 20 63 79 67 77 69 6e 29 20 64 6f   (ex: cygwin) do
1c240 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 36 34 2d   not support 64-
1c250 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 54  bit integers.  T
1c260 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20 74 6f 20  his.** leads to 
1c270 61 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 73 74  a number of test
1c280 20 66 61 69 6c 75 72 65 73 2e 20 20 54 68 65 20   failures.  The 
1c290 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61 6e 64 20  present command 
1c2a0 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a 20 54 43  checks the.** TC
1c2b0 4c 20 62 75 69 6c 64 20 74 6f 20 73 65 65 20 77  L build to see w
1c2c0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74  hether or not it
1c2d0 20 73 75 70 70 6f 72 74 73 20 36 34 2d 62 69 74   supports 64-bit
1c2e0 20 69 6e 74 65 67 65 72 73 2e 20 20 49 74 0a 2a   integers.  It.*
1c2f0 2a 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 69  * returns TRUE i
1c300 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 46 41  f it does and FA
1c310 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a  LSE if not..**.*
1c320 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  * This command i
1c330 73 20 75 73 65 64 20 74 6f 20 77 61 72 6e 20 75  s used to warn u
1c340 73 65 72 73 20 74 68 61 74 20 74 68 65 69 72 20  sers that their 
1c350 54 43 4c 20 62 75 69 6c 64 20 69 73 20 64 65 66  TCL build is def
1c360 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64 20 74 68  ective.** and th
1c370 61 74 20 74 68 65 20 65 72 72 6f 72 73 20 74 68  at the errors th
1c380 65 79 20 61 72 65 20 73 65 65 69 6e 67 20 69 6e  ey are seeing in
1c390 20 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74   the test script
1c3a0 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20  s might be.** a 
1c3b0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 69 72 20  result of their 
1c3c0 64 65 66 65 63 74 69 76 65 20 54 43 4c 20 72 61  defective TCL ra
1c3d0 74 68 65 72 20 74 68 61 6e 20 70 72 6f 62 6c 65  ther than proble
1c3e0 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f  ms in SQLite..*/
1c3f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 6f 72 6b  .static int work
1c400 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28 0a 20  ing_64bit_int(. 
1c410 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
1c420 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
1c430 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
1c440 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
1c450 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
1c460 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1c470 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1c480 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1c490 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1c4a0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
1c4b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c4c0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1c4d0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
1c4e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
1c4f0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
1c500 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f  ts */.){.  Tcl_O
1c510 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a 20 20  bj *pTestObj;.  
1c520 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20 30 3b  int working = 0;
1c530 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d 20 54  ..  pTestObj = T
1c540 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
1c550 28 31 30 30 30 30 30 30 2a 28 69 36 34 29 31 32  (1000000*(i64)12
1c560 33 34 35 36 37 38 39 30 29 3b 0a 20 20 77 6f 72  34567890);.  wor
1c570 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70 28 54 63  king = strcmp(Tc
1c580 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 54 65 73  l_GetString(pTes
1c590 74 4f 62 6a 29 2c 20 22 31 32 33 34 35 36 37 38  tObj), "12345678
1c5a0 39 30 30 30 30 30 30 30 22 29 3d 3d 30 3b 0a 20  90000000")==0;. 
1c5b0 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
1c5c0 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20 20 54  t(pTestObj);.  T
1c5d0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1c5e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
1c5f0 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b 69 6e  ooleanObj(workin
1c600 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  g));.  return TC
1c610 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
1c620 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e  tclcmd:   vfs_un
1c630 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20  link_test.**.** 
1c640 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
1c650 20 75 6e 72 65 67 69 73 74 65 72 73 20 74 68 65   unregisters the
1c660 20 70 72 69 6d 61 72 79 20 56 46 53 20 61 6e 64   primary VFS and
1c670 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 73 0a   then registers.
1c680 2a 2a 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e  ** it back again
1c690 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
1c6a0 74 6f 20 74 65 73 74 20 74 68 65 20 61 62 69 6c  to test the abil
1c6b0 69 74 79 20 74 6f 20 72 65 67 69 73 74 65 72 20  ity to register 
1c6c0 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20 6e 6f  a.** VFS when no
1c6d0 6e 65 20 61 72 65 20 70 72 65 76 69 6f 75 73 6c  ne are previousl
1c6e0 79 20 72 65 67 69 73 74 65 72 65 64 2c 20 61 6e  y registered, an
1c6f0 64 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f  d the ability to
1c700 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65 72 20   .** unregister 
1c710 74 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  the only availab
1c720 6c 65 20 56 46 53 2e 20 20 54 69 63 6b 65 74 20  le VFS.  Ticket 
1c730 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69 63 20  #2738.*/.static 
1c740 69 6e 74 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74  int vfs_unlink_t
1c750 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
1c760 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
1c770 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
1c780 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
1c790 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
1c7a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c7b0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1c7c0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1c7d0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1c7e0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
1c7f0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
1c800 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1c810 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
1c820 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c830 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
1c840 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
1c850 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
1c860 33 5f 76 66 73 20 2a 70 4d 61 69 6e 3b 0a 20 20  3_vfs *pMain;.  
1c870 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56  sqlite3_vfs *apV
1c880 66 73 5b 32 30 5d 3b 0a 20 20 73 71 6c 69 74 65  fs[20];.  sqlite
1c890 33 5f 76 66 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a  3_vfs one, two;.
1c8a0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
1c8b0 6e 72 65 67 69 73 74 65 72 28 30 29 3b 20 20 20  nregister(0);   
1c8c0 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20 6f 66  /* Unregister of
1c8d0 20 4e 55 4c 4c 20 69 73 20 68 61 72 6d 6c 65 73   NULL is harmles
1c8e0 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65  s */.  one.zName
1c8f0 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77   = "__one";.  tw
1c900 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74 77 6f  o.zName = "__two
1c910 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  ";..  /* Calling
1c920 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
1c930 69 73 74 65 72 20 77 69 74 68 20 32 6e 64 20 61  ister with 2nd a
1c940 72 67 75 6d 65 6e 74 20 6f 66 20 30 20 64 6f 65  rgument of 0 doe
1c950 73 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 61 6e 67  s not.  ** chang
1c960 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  e the default VF
1c970 53 0a 20 20 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d  S.  */.  pMain =
1c980 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1c990 64 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  d(0);.  sqlite3_
1c9a0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e  vfs_register(&on
1c9b0 65 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  e, 0);.  assert(
1c9c0 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61   pMain==0 || pMa
1c9d0 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  in==sqlite3_vfs_
1c9e0 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 73 71 6c  find(0) );.  sql
1c9f0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1ca00 72 28 26 74 77 6f 2c 20 30 29 3b 0a 20 20 61 73  r(&two, 0);.  as
1ca10 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c  sert( pMain==0 |
1ca20 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33  | pMain==sqlite3
1ca30 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
1ca40 0a 20 20 2f 2a 20 57 65 20 63 61 6e 20 66 69 6e  .  /* We can fin
1ca50 64 20 61 20 56 46 53 20 62 79 20 69 74 73 20 6e  d a VFS by its n
1ca60 61 6d 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ame */.  assert(
1ca70 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1ca80 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65  d("__one")==&one
1ca90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1caa0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
1cab0 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
1cac0 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73  ..  /* Calling s
1cad0 71 6c 69 74 65 5f 76 66 73 5f 72 65 67 69 73 74  qlite_vfs_regist
1cae0 65 72 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f  er with non-zero
1caf0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
1cb00 72 20 63 68 61 6e 67 65 73 20 74 68 65 0a 20 20  r changes the.  
1cb10 2a 2a 20 64 65 66 61 75 6c 74 20 56 46 53 2c 20  ** default VFS, 
1cb20 65 76 65 6e 20 69 66 20 74 68 65 20 31 73 74 20  even if the 1st 
1cb30 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20  parameter is an 
1cb40 65 78 69 73 74 69 67 20 56 46 53 20 74 68 61 74  existig VFS that
1cb50 20 69 73 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75   is.  ** previou
1cb60 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 61  sly registered a
1cb70 73 20 74 68 65 20 6e 6f 6e 2d 64 65 66 61 75 6c  s the non-defaul
1cb80 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
1cb90 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
1cba0 6f 6e 65 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  one, 1);.  asser
1cbb0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
1cbc0 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
1cbd0 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
1cbe0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1cbf0 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20  ("__two")==&two 
1cc00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1cc10 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1cc20 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 73 71 6c 69  ==&one );.  sqli
1cc30 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1cc40 28 26 74 77 6f 2c 20 31 29 3b 0a 20 20 61 73 73  (&two, 1);.  ass
1cc50 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
1cc60 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d  _find("__one")==
1cc70 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  &one );.  assert
1cc80 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
1cc90 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
1cca0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
1ccb0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1ccc0 30 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 69 66  0)==&two );.  if
1ccd0 28 20 70 4d 61 69 6e 20 29 7b 0a 20 20 20 20 73  ( pMain ){.    s
1cce0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1ccf0 74 65 72 28 70 4d 61 69 6e 2c 20 31 29 3b 0a 20  ter(pMain, 1);. 
1cd00 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1cd10 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f  e3_vfs_find("__o
1cd20 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20  ne")==&one );.  
1cd30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1cd40 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77  3_vfs_find("__tw
1cd50 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 20  o")==&two );.   
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 30 29 3d 3d 70 4d  _vfs_find(0)==pM
1cd80 61 69 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  ain );.  }.  .  
1cd90 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 64 65  /* Unlink the de
1cda0 66 61 75 6c 74 20 56 46 53 2e 20 20 52 65 70 65  fault VFS.  Repe
1cdb0 61 74 20 75 6e 74 69 6c 20 74 68 65 72 65 20 61  at until there a
1cdc0 72 65 20 6e 6f 20 6d 6f 72 65 20 56 46 53 65 73  re no more VFSes
1cdd0 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 65 64  .  ** registered
1cde0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1cdf0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70 56 66 73  ; i<sizeof(apVfs
1ce00 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30  )/sizeof(apVfs[0
1ce10 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70  ]); i++){.    ap
1ce20 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Vfs[i] = sqlite3
1ce30 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
1ce40 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29    if( apVfs[i] )
1ce50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ce60 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65  apVfs[i]==sqlite
1ce70 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73  3_vfs_find(apVfs
1ce80 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20  [i]->zName) );. 
1ce90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
1cea0 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66  _unregister(apVf
1ceb0 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  s[i]);.      ass
1cec0 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f  ert( 0==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 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
1cf00 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f   0==sqlite3_vfs_
1cf10 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 0a 20 20  find(0) );.  .  
1cf20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  /* Register the 
1cf30 6d 61 69 6e 20 56 46 53 20 61 73 20 6e 6f 6e 2d  main VFS as non-
1cf40 64 65 66 61 75 6c 74 20 28 77 69 6c 6c 20 62 65  default (will be
1cf50 20 6d 61 64 65 20 64 65 66 61 75 6c 74 2c 20 73   made default, s
1cf60 69 6e 63 65 0a 20 20 2a 2a 20 69 74 27 6c 6c 20  ince.  ** it'll 
1cf70 62 65 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20  be the only one 
1cf80 69 6e 20 65 78 69 73 74 65 6e 63 65 29 2e 0a 20  in existence).. 
1cf90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
1cfa0 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e  s_register(pMain
1cfb0 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
1cfc0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1cfd0 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20  (0)==pMain );.  
1cfe0 0a 20 20 2f 2a 20 55 6e 2d 72 65 67 69 73 74 65  .  /* Un-registe
1cff0 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61  r the main VFS a
1d000 67 61 69 6e 20 74 6f 20 72 65 73 74 6f 72 65 20  gain to restore 
1d010 61 6e 20 65 6d 70 74 79 20 56 46 53 20 6c 69 73  an empty VFS lis
1d020 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  t */.  sqlite3_v
1d030 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70 4d  fs_unregister(pM
1d040 61 69 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ain);.  assert( 
1d050 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  0==sqlite3_vfs_f
1d060 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ind(0) );..  /* 
1d070 52 65 6c 69 6e 6b 20 61 6c 6c 20 56 46 53 65 73  Relink all VFSes
1d080 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
1d090 72 2e 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d  r. */  .  for(i=
1d0a0 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69  sizeof(apVfs)/si
1d0b0 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29 2d 31  zeof(apVfs[0])-1
1d0c0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
1d0d0 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29    if( apVfs[i] )
1d0e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1d0f0 76 66 73 5f 72 65 67 69 73 74 65 72 28 61 70 56  vfs_register(apV
1d100 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20  fs[i], 1);.     
1d110 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69   assert( apVfs[i
1d120 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  ]==sqlite3_vfs_f
1d130 69 6e 64 28 30 29 20 29 3b 0a 20 20 20 20 20 20  ind(0) );.      
1d140 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d  assert( apVfs[i]
1d150 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
1d160 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61  nd(apVfs[i]->zNa
1d170 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  me) );.    }.  }
1d180 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65  ..  /* Unregiste
1d190 72 20 6f 75 74 20 73 61 6d 70 6c 65 20 56 46 53  r out sample VFS
1d1a0 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
1d1b0 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
1d1c0 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  &one);.  sqlite3
1d1d0 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
1d1e0 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72  &two);..  /* Unr
1d1f0 65 67 69 73 74 65 72 69 6e 67 20 61 20 56 46 53  egistering a VFS
1d200 20 74 68 61 74 20 69 73 20 6e 6f 74 20 63 75 72   that is not cur
1d210 72 65 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65  rently registere
1d220 64 20 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f  d is harmless */
1d230 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
1d240 6e 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b  nregister(&one);
1d250 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
1d260 6e 72 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b  nregister(&two);
1d270 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1d280 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f  e3_vfs_find("__o
1d290 6e 65 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ne")==0 );.  ass
1d2a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
1d2b0 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
1d2c0 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68  0 );..  /* We sh
1d2d0 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 77 69 74  ould be left wit
1d2e0 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  h the original d
1d2f0 65 66 61 75 6c 74 20 56 46 53 20 62 61 63 6b 20  efault VFS back 
1d300 61 73 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  as the.  ** orig
1d310 69 6e 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  inal */.  assert
1d320 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
1d330 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a  nd(0)==pMain );.
1d340 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1d350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
1d360 64 3a 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69  d:   vfs_initfai
1d370 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69  l_test.**.** Thi
1d380 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 61 74  s TCL command at
1d390 74 65 6d 70 74 73 20 74 6f 20 76 66 73 5f 66 69  tempts to vfs_fi
1d3a0 6e 64 20 61 6e 64 20 76 66 73 5f 72 65 67 69 73  nd and vfs_regis
1d3b0 74 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ter when the.** 
1d3c0 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1d3d0 7a 65 28 29 20 69 6e 74 65 72 66 61 63 65 20 69  ze() interface i
1d3e0 73 20 66 61 69 6c 69 6e 67 2e 20 20 41 6c 6c 20  s failing.  All 
1d3f0 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20 66 61 69  calls should fai
1d400 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1d410 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65   vfs_initfail_te
1d420 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
1d430 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
1d440 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
1d450 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
1d460 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
1d470 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1d480 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1d490 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1d4a0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1d4b0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
1d4c0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1d4d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
1d4e0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
1d4f0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1d500 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
1d510 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
1d520 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 3b  sqlite3_vfs one;
1d530 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22  .  one.zName = "
1d540 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69 66 28 20 73  __one";..  if( s
1d550 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1d560 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  0) ) return TCL_
1d570 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
1d580 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f  _vfs_register(&o
1d590 6e 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71  ne, 0);.  if( sq
1d5a0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1d5b0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1d5c0 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
1d5d0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e  vfs_register(&on
1d5e0 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73 71 6c  e, 1);.  if( sql
1d5f0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1d600 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d610 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
1d620 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  L_OK;.}../*.** S
1d630 61 76 65 64 20 56 46 53 65 73 0a 2a 2f 0a 73 74  aved VFSes.*/.st
1d640 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
1d650 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 73 74 61   *apVfs[20];.sta
1d660 74 69 63 20 69 6e 74 20 6e 56 66 73 20 3d 20 30  tic int nVfs = 0
1d670 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  ;../*.** tclcmd:
1d680 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65     vfs_unregiste
1d690 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65  r_all.**.** Unre
1d6a0 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53 65 73  gister all VFSes
1d6b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d6c0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
1d6d0 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ll(.  ClientData
1d6e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
1d6f0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
1d700 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
1d710 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
1d720 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1d730 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1d740 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1d750 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1d760 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
1d770 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1d780 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
1d790 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
1d7a0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1d7b0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
1d7c0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
1d7d0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1d7e0 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 70  ; i<ArraySize(ap
1d7f0 56 66 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Vfs); i++){.    
1d800 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74  apVfs[i] = sqlit
1d810 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
1d820 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d      if( apVfs[i]
1d830 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
1d840 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
1d850 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d  egister(apVfs[i]
1d860 29 3b 0a 20 20 7d 0a 20 20 6e 56 66 73 20 3d 20  );.  }.  nVfs = 
1d870 69 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  i;.  return TCL_
1d880 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  OK;.}./*.** tclc
1d890 6d 64 3a 20 20 20 76 66 73 5f 72 65 72 65 67 69  md:   vfs_reregi
1d8a0 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52  ster_all.**.** R
1d8b0 65 73 74 6f 72 65 20 61 6c 6c 20 56 46 53 65 73  estore all VFSes
1d8c0 20 74 68 61 74 20 77 65 72 65 20 72 65 6d 6f 76   that were remov
1d8d0 65 64 20 75 73 69 6e 67 20 76 66 73 5f 75 6e 72  ed using vfs_unr
1d8e0 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2f 0a 73  egister_all.*/.s
1d8f0 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 72 65  tatic int vfs_re
1d900 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20  register_all(.  
1d910 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
1d920 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
1d930 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
1d940 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
1d950 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
1d960 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
1d970 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
1d980 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
1d990 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
1d9a0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
1d9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d9c0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
1d9d0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
1d9e0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
1d9f0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
1da00 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
1da10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
1da20 66 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  fs; i++){.    sq
1da30 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
1da40 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 69 3d 3d  er(apVfs[i], i==
1da50 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1da60 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
1da70 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
1da80 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 20 44  e_control_test D
1da90 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  B.**.** This TCL
1daa0 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
1dab0 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
1dac0 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
1dad0 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
1dae0 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
1daf0 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a  on of the same..
1db00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
1db10 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 28  le_control_test(
1db20 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
1db30 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
1db40 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
1db50 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
1db60 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
1db70 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
1db80 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
1db90 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
1dba0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
1dbb0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dbd0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
1dbe0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
1dbf0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
1dc00 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
1dc10 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
1dc20 20 69 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c   iArg = 0;.  sql
1dc30 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
1dc40 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
1dc50 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1dc60 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1dc70 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1dc80 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1dc90 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
1dca0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
1dcb0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22  jv[0], 0), " DB"
1dcc0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1dcd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1dce0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1dcf0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1dd00 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1dd10 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1dd20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1dd30 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
1dd40 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20 30  control(db, 0, 0
1dd50 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65  , &iArg);.  asse
1dd60 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  rt( rc==SQLITE_E
1dd70 52 52 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20 73  RROR );.  rc = s
1dd80 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
1dd90 72 6f 6c 28 64 62 2c 20 22 6e 6f 74 61 64 61 74  rol(db, "notadat
1dda0 61 62 61 73 65 22 2c 20 53 51 4c 49 54 45 5f 46  abase", SQLITE_F
1ddb0 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20  CNTL_LOCKSTATE, 
1ddc0 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74  &iArg);.  assert
1ddd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ( rc==SQLITE_ERR
1dde0 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  OR );.  rc = sql
1ddf0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
1de00 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 2d 31  l(db, "main", -1
1de10 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65  , &iArg);.  asse
1de20 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  rt( rc==SQLITE_E
1de30 52 52 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20 73  RROR );.  rc = s
1de40 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
1de50 72 6f 6c 28 64 62 2c 20 22 74 65 6d 70 22 2c 20  rol(db, "temp", 
1de60 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73  -1, &iArg);.  as
1de70 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1de80 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 65 74 75  _ERROR );.  retu
1de90 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
1dea0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
1deb0 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74  sqlite3_vfs_list
1dec0 0a 2a 2a 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20  .**.**   Return 
1ded0 61 20 74 63 6c 20 6c 69 73 74 20 63 6f 6e 74 61  a tcl list conta
1dee0 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ining the names 
1def0 6f 66 20 61 6c 6c 20 72 65 67 69 73 74 65 72 65  of all registere
1df00 64 20 76 66 73 27 73 2e 0a 2a 2f 0a 73 74 61 74  d vfs's..*/.stat
1df10 69 63 20 69 6e 74 20 76 66 73 5f 6c 69 73 74 28  ic int vfs_list(
1df20 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
1df30 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
1df40 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
1df50 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
1df60 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
1df70 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
1df80 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
1df90 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
1dfa0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
1dfb0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dfd0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
1dfe0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
1dff0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
1e000 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
1e010 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
1e020 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a  ite3_vfs *pVfs;.
1e030 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20    Tcl_Obj *pRet 
1e040 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
1e050 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
1e060 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1e070 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1e080 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
1e090 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e0a0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 56 66 73  ;.  }.  for(pVfs
1e0b0 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
1e0c0 64 28 30 29 3b 20 70 56 66 73 3b 20 70 56 66 73  d(0); pVfs; pVfs
1e0d0 3d 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pVfs->pNext){. 
1e0e0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1e0f0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1e100 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
1e110 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 66 73 2d  wStringObj(pVfs-
1e120 3e 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20  >zName, -1));.  
1e130 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
1e140 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
1e150 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
1e160 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
1e170 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65  tclcmd:   sqlite
1e180 33 5f 6c 69 6d 69 74 20 44 42 20 49 44 20 56 41  3_limit DB ID VA
1e190 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  LUE.**.** This T
1e1a0 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
1e1b0 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  the sqlite3_limi
1e1c0 74 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a  t interface and.
1e1d0 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72  ** verifies corr
1e1e0 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
1e1f0 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74   the same..*/.st
1e200 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69  atic int test_li
1e210 6d 69 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  mit(.  ClientDat
1e220 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
1e230 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
1e240 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
1e250 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
1e260 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1e270 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1e280 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1e290 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1e2a0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
1e2b0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
1e2c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1e2d0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
1e2e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1e2f0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
1e300 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
1e310 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e320 69 6e 74 20 72 63 3b 0a 20 20 73 74 61 74 69 63  int rc;.  static
1e330 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
1e340 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
1e350 3b 0a 20 20 20 20 20 69 6e 74 20 69 64 3b 0a 20  ;.     int id;. 
1e360 20 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a 20 20 20   } aId[] = {.   
1e370 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
1e380 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20  _LENGTH",       
1e390 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
1e3a0 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20  MIT_LENGTH      
1e3b0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1e3c0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
1e3d0 53 51 4c 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20  SQL_LENGTH",    
1e3e0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
1e3f0 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20  IT_SQL_LENGTH   
1e400 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
1e410 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43   "SQLITE_LIMIT_C
1e420 4f 4c 55 4d 4e 22 2c 20 20 20 20 20 20 20 20 20  OLUMN",         
1e430 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
1e440 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20  T_COLUMN        
1e450 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
1e460 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  "SQLITE_LIMIT_EX
1e470 50 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20  PR_DEPTH",      
1e480 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
1e490 5f 45 58 50 52 5f 44 45 50 54 48 20 20 20 20 20  _EXPR_DEPTH     
1e4a0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
1e4b0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
1e4c0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 22 2c 20 20  POUND_SELECT",  
1e4d0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
1e4e0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
1e4f0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
1e500 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
1e510 5f 4f 50 22 2c 20 20 20 20 20 20 20 20 20 20 20  _OP",           
1e520 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56    SQLITE_LIMIT_V
1e530 44 42 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20  DBE_OP          
1e540 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
1e550 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
1e560 49 4f 4e 5f 41 52 47 22 2c 20 20 20 20 20 20 20  ION_ARG",       
1e570 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55   SQLITE_LIMIT_FU
1e580 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20  NCTION_ARG      
1e590 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
1e5a0 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48  ITE_LIMIT_ATTACH
1e5b0 45 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ED",            
1e5c0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
1e5d0 41 43 48 45 44 20 20 20 20 20 20 20 20 20 20 20  ACHED           
1e5e0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
1e5f0 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
1e600 54 54 45 52 4e 5f 4c 45 4e 47 54 48 22 2c 20 53  TTERN_LENGTH", S
1e610 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
1e620 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
1e630 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
1e640 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
1e650 5f 4e 55 4d 42 45 52 22 2c 20 20 20 20 20 53 51  _NUMBER",     SQ
1e660 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
1e670 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20  BLE_NUMBER      
1e680 7d 2c 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4f  },.    .    /* O
1e690 75 74 20 6f 66 20 72 61 6e 67 65 20 74 65 73 74  ut of range test
1e6a0 20 63 61 73 65 73 20 2a 2f 0a 20 20 20 20 7b 20   cases */.    { 
1e6b0 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f  "SQLITE_LIMIT_TO
1e6c0 4f 53 4d 41 4c 4c 22 2c 20 20 20 20 20 20 20 20  OSMALL",        
1e6d0 20 20 20 20 2d 31 2c 20 20 20 20 20 20 20 20 20      -1,         
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
1e700 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f  SQLITE_LIMIT_TOO
1e710 42 49 47 22 2c 20 20 20 20 20 20 20 20 20 20 20  BIG",           
1e720 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
1e730 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2b  VARIABLE_NUMBER+
1e740 31 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69  1    },.  };.  i
1e750 6e 74 20 69 2c 20 69 64 3b 0a 20 20 69 6e 74 20  nt i, id;.  int 
1e760 76 61 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  val;.  const cha
1e770 72 20 2a 7a 49 64 3b 0a 0a 20 20 69 66 28 20 6f  r *zId;..  if( o
1e780 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
1e790 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1e7a0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1e7b0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1e7c0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
1e7d0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
1e7e0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
1e7f0 20 44 42 20 49 44 20 56 41 4c 55 45 22 2c 20 30   DB ID VALUE", 0
1e800 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1e810 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1e820 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1e830 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1e840 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1e850 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1e860 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 49 64 20 3d  L_ERROR;.  zId =
1e870 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1e880 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[2]);.  for(i
1e890 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 49 64  =0; i<sizeof(aId
1e8a0 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29  )/sizeof(aId[0])
1e8b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1e8c0 73 74 72 63 6d 70 28 7a 49 64 2c 20 61 49 64 5b  strcmp(zId, aId[
1e8d0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
1e8e0 20 20 20 20 20 20 69 64 20 3d 20 61 49 64 5b 69        id = aId[i
1e8f0 5d 2e 69 64 3b 0a 20 20 20 20 20 20 62 72 65 61  ].id;.      brea
1e900 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1e910 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 49 64  f( i>=sizeof(aId
1e920 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29  )/sizeof(aId[0])
1e930 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1e940 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1e950 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 20   "unknown limit 
1e960 74 79 70 65 3a 20 22 2c 20 7a 49 64 2c 20 28 63  type: ", zId, (c
1e970 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
1e980 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e990 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
1e9a0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1e9b0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
1e9c0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e9d0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
1e9e0 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 69  ite3_limit(db, i
1e9f0 64 2c 20 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 53  d, val);.  Tcl_S
1ea00 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1ea10 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1ea20 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e  j(rc));.  return
1ea30 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
1ea40 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 61 76  .** tclcmd:  sav
1ea50 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2a 0a  e_prng_state.**.
1ea60 2a 2a 20 53 61 76 65 20 74 68 65 20 73 74 61 74  ** Save the stat
1ea70 65 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  e of the pseudo-
1ea80 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65  random number ge
1ea90 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20 41 74 20 74  nerator..** At t
1eaa0 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 76 65  he same time, ve
1eab0 72 69 66 79 20 74 68 61 74 20 73 71 6c 69 74 65  rify that sqlite
1eac0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 77  3_test_control w
1ead0 6f 72 6b 73 20 65 76 65 6e 20 77 68 65 6e 0a 2a  orks even when.*
1eae0 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  * called with an
1eaf0 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 6f 70   out-of-range op
1eb00 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
1eb10 69 6e 74 20 73 61 76 65 5f 70 72 6e 67 5f 73 74  int save_prng_st
1eb20 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ate(.  ClientDat
1eb30 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
1eb40 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
1eb50 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
1eb60 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
1eb70 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1eb80 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1eb90 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1eba0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1ebb0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
1ebc0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
1ebd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1ebe0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
1ebf0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1ec00 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
1ec10 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
1ec20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1ec30 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 39  3_test_control(9
1ec40 39 39 39 29 3b 0a 20 20 61 73 73 65 72 74 28 20  999);.  assert( 
1ec50 72 63 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  rc==0 );.  rc = 
1ec60 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1ec70 74 72 6f 6c 28 2d 31 29 3b 0a 20 20 61 73 73 65  trol(-1);.  asse
1ec80 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 73  rt( rc==0 );.  s
1ec90 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1eca0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1ecb0 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 29 3b 0a  TRL_PRNG_SAVE);.
1ecc0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ecd0 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .}./*.** tclcmd:
1ece0 20 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73    restore_prng_s
1ecf0 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tate.*/.static i
1ed00 6e 74 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f  nt restore_prng_
1ed10 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  state(.  ClientD
1ed20 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
1ed30 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
1ed40 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
1ed50 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
1ed60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1ed70 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
1ed80 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
1ed90 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
1eda0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
1edb0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
1edc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1edd0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
1ede0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1edf0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
1ee00 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
1ee10 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
1ee20 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1ee30 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
1ee40 54 4f 52 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TORE);.  return 
1ee50 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  TCL_OK;.}./*.** 
1ee60 74 63 6c 63 6d 64 3a 20 20 72 65 73 65 74 5f 70  tclcmd:  reset_p
1ee70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61  rng_state.*/.sta
1ee80 74 69 63 20 69 6e 74 20 72 65 73 65 74 5f 70 72  tic int reset_pr
1ee90 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65  ng_state(.  Clie
1eea0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
1eeb0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
1eec0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
1eed0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
1eee0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1eef0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1ef00 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1ef10 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1ef20 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1ef30 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
1ef40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1ef50 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1ef60 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1ef70 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
1ef80 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
1ef90 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65  .){.  sqlite3_te
1efa0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1efb0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
1efc0 52 45 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e  RESET);.  return
1efd0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1efe0 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63 61 63 68  * tclcmd:  pcach
1eff0 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61 74 69  e_stats.*/.stati
1f000 63 20 69 6e 74 20 74 65 73 74 5f 70 63 61 63 68  c int test_pcach
1f010 65 5f 73 74 61 74 73 28 0a 20 20 43 6c 69 65 6e  e_stats(.  Clien
1f020 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
1f030 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
1f040 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
1f050 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
1f060 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f070 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1f080 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1f090 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1f0a0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1f0b0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
1f0c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f0d0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1f0e0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1f0f0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
1f100 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
1f110 29 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20  ){.  int nMin;. 
1f120 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 69 6e 74   int nMax;.  int
1f130 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74   nCurrent;.  int
1f140 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b 0a 20 20   nRecyclable;.  
1f150 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a  Tcl_Obj *pRet;..
1f160 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
1f170 74 61 74 73 28 26 6e 43 75 72 72 65 6e 74 2c 20  tats(&nCurrent, 
1f180 26 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e  &nMax, &nMin, &n
1f190 52 65 63 79 63 6c 61 62 6c 65 29 3b 0a 0a 20 20  Recyclable);..  
1f1a0 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
1f1b0 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  j();.  Tcl_ListO
1f1c0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1f1d0 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
1f1e0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
1f1f0 63 75 72 72 65 6e 74 22 2c 20 2d 31 29 29 3b 0a  current", -1));.
1f200 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1f210 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1f220 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
1f230 49 6e 74 4f 62 6a 28 6e 43 75 72 72 65 6e 74 29  IntObj(nCurrent)
1f240 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
1f250 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1f260 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
1f270 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61  NewStringObj("ma
1f280 78 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  x", -1));.  Tcl_
1f290 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1f2a0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
1f2b0 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
1f2c0 28 6e 4d 61 78 29 29 3b 0a 20 20 54 63 6c 5f 4c  (nMax));.  Tcl_L
1f2d0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1f2e0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
1f2f0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1f300 62 6a 28 22 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a  bj("min", -1));.
1f310 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1f320 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1f330 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
1f340 49 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20  IntObj(nMin));. 
1f350 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1f360 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1f370 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
1f380 74 72 69 6e 67 4f 62 6a 28 22 72 65 63 79 63 6c  tringObj("recycl
1f390 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20 54  able", -1));.  T
1f3a0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1f3b0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1f3c0 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
1f3d0 4f 62 6a 28 6e 52 65 63 79 63 6c 61 62 6c 65 29  Obj(nRecyclable)
1f3e0 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  );..  Tcl_SetObj
1f3f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
1f400 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Ret);..  return 
1f410 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
1f420 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61  * Register comma
1f430 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c  nds with the TCL
1f440 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f   interpreter..*/
1f450 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31  .int Sqlitetest1
1f460 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1f470 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65 78 74   *interp){.  ext
1f480 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1f490 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20  search_count;.  
1f4a0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1f4b0 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  e3_interrupt_cou
1f4c0 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
1f4d0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69   sqlite3_open_fi
1f4e0 6c 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  le_count;.  exte
1f4f0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
1f500 6f 72 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ort_count;.  ext
1f510 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1f520 63 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a 20 20  current_time;.  
1f530 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1f540 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b  e3_max_blobsize;
1f550 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
1f560 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 65 64  lite3BtreeShared
1f570 43 61 63 68 65 52 65 70 6f 72 74 28 76 6f 69 64  CacheReport(void
1f580 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  *,.             
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
1f5b0 5f 49 6e 74 65 72 70 2a 2c 69 6e 74 2c 54 63 6c  _Interp*,int,Tcl
1f5c0 5f 4f 62 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20  _Obj*CONST*);.  
1f5d0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a  static struct {.
1f5e0 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
1f5f0 3b 0a 20 20 20 20 20 54 63 6c 5f 43 6d 64 50 72  ;.     Tcl_CmdPr
1f600 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61  oc *xProc;.  } a
1f610 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  Cmd[] = {.     {
1f620 20 22 64 62 5f 65 6e 74 65 72 22 2c 20 20 20 20   "db_enter",    
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f640 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1f650 64 62 5f 65 6e 74 65 72 20 20 20 20 20 20 20 20  db_enter        
1f660 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
1f670 20 22 64 62 5f 6c 65 61 76 65 22 2c 20 20 20 20   "db_leave",    
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f690 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1f6a0 64 62 5f 6c 65 61 76 65 20 20 20 20 20 20 20 20  db_leave        
1f6b0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
1f6c0 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
1f6d0 66 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20  f_int",         
1f6e0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1f6f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1f700 69 6e 74 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  int    },.     {
1f710 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
1f720 66 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20  f_int64",       
1f730 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1f740 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1f750 69 6e 74 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b  int64  },.     {
1f760 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
1f770 66 5f 73 74 72 22 2c 20 20 20 20 20 20 20 20 20  f_str",         
1f780 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1f790 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1f7a0 73 74 72 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  str    },.     {
1f7b0 20 22 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e   "sqlite3_snprin
1f7c0 74 66 5f 73 74 72 22 2c 20 20 20 20 20 20 20 20  tf_str",        
1f7d0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1f7e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1f7f0 5f 73 74 72 20 20 20 7d 2c 0a 20 20 20 20 20 7b  _str   },.     {
1f800 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
1f810 66 5f 73 74 72 6f 6e 6c 79 22 2c 20 20 20 20 20  f_stronly",     
1f820 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1f830 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1f840 73 74 72 6f 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b  stronly},.     {
1f850 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
1f860 66 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  f_double",      
1f870 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1f880 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1f890 64 6f 75 62 6c 65 20 7d 2c 0a 20 20 20 20 20 7b  double },.     {
1f8a0 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
1f8b0 66 5f 73 63 61 6c 65 64 22 2c 20 20 20 20 20 20  f_scaled",      
1f8c0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1f8d0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
1f8e0 73 63 61 6c 65 64 20 7d 2c 0a 20 20 20 20 20 7b  scaled },.     {
1f8f0 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
1f900 66 5f 68 65 78 64 6f 75 62 6c 65 22 2c 20 20 20  f_hexdouble",   
1f910 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
1f920 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
1f930 78 64 6f 75 62 6c 65 7d 2c 0a 20 20 20 20 20 7b  xdouble},.     {
1f940 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
1f950 66 5f 7a 5f 74 65 73 74 22 2c 20 20 20 20 20 20  f_z_test",      
1f960 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1f970 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 20 20  test_mprintf_z  
1f980 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
1f990 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
1f9a0 5f 6e 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20  _n_test",       
1f9b0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
1f9c0 65 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 20 20 20  est_mprintf_n   
1f9d0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
1f9e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1f9f0 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
1fa00 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
1fa10 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20  st_snprintf_int 
1fa20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
1fa30 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
1fa40 72 74 5f 72 6f 77 69 64 22 2c 20 20 20 20 20 28  rt_rowid",     (
1fa50 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
1fa60 74 5f 6c 61 73 74 5f 72 6f 77 69 64 20 20 20 20  t_last_rowid    
1fa70 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1fa80 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74  lite3_exec_print
1fa90 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  f",           (T
1faa0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
1fab0 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20 20 20  _exec_printf    
1fac0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1fad0 69 74 65 33 5f 65 78 65 63 22 2c 20 20 20 20 20  ite3_exec",     
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
1faf0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
1fb00 65 78 65 63 20 20 20 20 20 20 20 20 20 20 20 20  exec            
1fb10 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1fb20 74 65 33 5f 65 78 65 63 5f 6e 72 22 2c 20 20 20  te3_exec_nr",   
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
1fb40 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65  _CmdProc*)test_e
1fb50 78 65 63 5f 6e 72 20 20 20 20 20 20 20 20 20 20  xec_nr          
1fb60 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  },.#ifndef SQLIT
1fb70 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45  E_OMIT_GET_TABLE
1fb80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1fb90 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
1fba0 66 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  f",      (Tcl_Cm
1fbb0 64 50 72 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f  dProc*)test_get_
1fbc0 74 61 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a  table_printf },.
1fbd0 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
1fbe0 71 6c 69 74 65 33 5f 63 6c 6f 73 65 22 2c 20 20  qlite3_close",  
1fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1fc00 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1fc10 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 20 20  ite_test_close  
1fc20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1fc30 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1fc40 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54  ction",       (T
1fc50 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
1fc60 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1fc70 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1fc80 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72  ite3_create_aggr
1fc90 65 67 61 74 65 22 2c 20 20 20 20 20 20 28 54 63  egate",      (Tc
1fca0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
1fcb0 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
1fcc0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1fcd0 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74  te_register_test
1fce0 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 28 54 63 6c  _function", (Tcl
1fcf0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72  _CmdProc*)test_r
1fd00 65 67 69 73 74 65 72 5f 66 75 6e 63 20 20 20 20  egister_func    
1fd10 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1fd20 65 5f 61 62 6f 72 74 22 2c 20 20 20 20 20 20 20  e_abort",       
1fd30 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
1fd40 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f  CmdProc*)sqlite_
1fd50 61 62 6f 72 74 20 20 20 20 20 20 20 20 20 20 7d  abort          }
1fd60 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1fd70 5f 62 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20  _bind",         
1fd80 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
1fd90 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e  mdProc*)test_bin
1fda0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  d             },
1fdb0 0a 20 20 20 20 20 7b 20 22 62 72 65 61 6b 70 6f  .     { "breakpo
1fdc0 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
1fdd0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
1fde0 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 72 65 61  dProc*)test_brea
1fdf0 6b 70 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a  kpoint       },.
1fe00 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1fe10 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  key",           
1fe20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1fe30 50 72 6f 63 2a 29 74 65 73 74 5f 6b 65 79 20 20  Proc*)test_key  
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1fe50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72      { "sqlite3_r
1fe60 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20  ekey",          
1fe70 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1fe80 72 6f 63 2a 29 74 65 73 74 5f 72 65 6b 65 79 20  roc*)test_rekey 
1fe90 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1fea0 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 65 74     { "sqlite_set
1feb0 5f 6d 61 67 69 63 22 2c 20 20 20 20 20 20 20 20  _magic",        
1fec0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
1fed0 6f 63 2a 29 73 71 6c 69 74 65 5f 73 65 74 5f 6d  oc*)sqlite_set_m
1fee0 61 67 69 63 20 20 20 20 20 20 7d 2c 0a 20 20 20  agic      },.   
1fef0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 69 6e 74    { "sqlite3_int
1ff00 65 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 20  errupt",        
1ff10 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
1ff20 63 2a 29 74 65 73 74 5f 69 6e 74 65 72 72 75 70  c*)test_interrup
1ff30 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  t        },.    
1ff40 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c 65 74   { "sqlite_delet
1ff50 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20  e_function",    
1ff60 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1ff70 2a 29 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f  *)delete_functio
1ff80 6e 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  n       },.     
1ff90 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c 65 74 65  { "sqlite_delete
1ffa0 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 20 20 20 20  _collation",    
1ffb0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
1ffc0 29 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f  )delete_collatio
1ffd0 6e 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  n      },.     {
1ffe0 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75   "sqlite3_get_au
1fff0 74 6f 63 6f 6d 6d 69 74 22 2c 20 20 20 20 20 20  tocommit",      
20000 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
20010 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 20  get_autocommit  
20020 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
20030 22 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 75  "sqlite3_stack_u
20040 73 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  sed",           
20050 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
20060 65 73 74 5f 73 74 61 63 6b 5f 75 73 65 64 20 20  est_stack_used  
20070 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
20080 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
20090 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20  eout",          
200a0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
200b0 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 20  st_busy_timeout 
200c0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 70      },.     { "p
200d0 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20  rintf",         
200e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
200f0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
20100 74 5f 70 72 69 6e 74 66 20 20 20 20 20 20 20 20  t_printf        
20110 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
20120 6c 69 74 65 33 49 6f 54 72 61 63 65 22 2c 20 20  lite3IoTrace",  
20130 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
20140 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69  _CmdProc*)test_i
20150 6f 5f 74 72 61 63 65 20 20 20 20 20 20 20 20 20  o_trace         
20160 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  },.  };.  static
20170 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63   struct {.     c
20180 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
20190 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20   Tcl_ObjCmdProc 
201a0 2a 78 50 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69  *xProc;.     voi
201b0 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  d *clientData;. 
201c0 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b   } aObjCmd[] = {
201d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
201e0 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e  _connection_poin
201f0 74 65 72 22 2c 20 20 20 20 67 65 74 5f 73 71 6c  ter",    get_sql
20200 69 74 65 5f 70 6f 69 6e 74 65 72 2c 20 30 20 7d  ite_pointer, 0 }
20210 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
20220 33 5f 62 69 6e 64 5f 69 6e 74 22 2c 20 20 20 20  3_bind_int",    
20230 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
20240 69 6e 64 5f 69 6e 74 2c 20 20 20 20 20 20 30 20  ind_int,      0 
20250 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
20260 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
20270 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
20280 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 2c 20 30  bind_zeroblob, 0
20290 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
202a0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 22 2c  te3_bind_int64",
202b0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
202c0 5f 62 69 6e 64 5f 69 6e 74 36 34 2c 20 20 20 20  _bind_int64,    
202d0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
202e0 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
202f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
20300 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 2c 20 20  t_bind_double,  
20310 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
20320 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22  lite3_bind_null"
20330 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
20340 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 20 20  st_bind_null    
20350 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
20360 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
20370 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
20380 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 20 20 20  est_bind_text   
20390 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
203a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
203b0 74 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  t16",           
203c0 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36  test_bind_text16
203d0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
203e0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c  "sqlite3_bind_bl
203f0 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ob",            
20400 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 20   test_bind_blob 
20410 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
20420 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70   "sqlite3_bind_p
20430 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 22 2c  arameter_count",
20440 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61    test_bind_para
20450 6d 65 74 65 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c  meter_count, 0},
20460 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
20470 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
20480 6e 61 6d 65 22 2c 20 20 20 74 65 73 74 5f 62 69  name",   test_bi
20490 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
204a0 65 2c 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  e,  0},.     { "
204b0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
204c0 61 6d 65 74 65 72 5f 69 6e 64 65 78 22 2c 20 20  ameter_index",  
204d0 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
204e0 74 65 72 5f 69 6e 64 65 78 2c 20 30 7d 2c 0a 20  ter_index, 0},. 
204f0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
20500 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20  lear_bindings", 
20510 20 20 20 20 20 20 20 74 65 73 74 5f 63 6c 65 61         test_clea
20520 72 5f 62 69 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a  r_bindings, 0},.
20530 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20540 73 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20  sleep",         
20550 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 6c 65          test_sle
20560 65 70 2c 20 20 20 20 20 20 20 20 20 20 30 7d 2c  ep,          0},
20570 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
20580 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20 20 20  _errcode",      
20590 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72           test_er
205a0 72 63 6f 64 65 20 20 20 20 20 20 20 2c 30 20 7d  rcode       ,0 }
205b0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
205c0 33 5f 65 72 72 6d 73 67 22 2c 20 20 20 20 20 20  3_errmsg",      
205d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65            test_e
205e0 72 72 6d 73 67 20 20 20 20 20 20 20 20 2c 30 20  rrmsg        ,0 
205f0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
20600 65 33 5f 65 72 72 6d 73 67 31 36 22 2c 20 20 20  e3_errmsg16",   
20610 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
20620 65 72 72 6d 73 67 31 36 20 20 20 20 20 20 2c 30  errmsg16      ,0
20630 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
20640 74 65 33 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20  te3_open",      
20650 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
20660 5f 6f 70 65 6e 20 20 20 20 20 20 20 20 20 20 2c  _open          ,
20670 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
20680 69 74 65 33 5f 6f 70 65 6e 31 36 22 2c 20 20 20  ite3_open16",   
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
206a0 74 5f 6f 70 65 6e 31 36 20 20 20 20 20 20 20 20  t_open16        
206b0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
206c0 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36  lite3_complete16
206d0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
206e0 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 20 20 20  st_complete16   
206f0 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22   ,0 },..     { "
20700 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 22  sqlite3_prepare"
20710 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20720 74 65 73 74 5f 70 72 65 70 61 72 65 20 20 20 20  test_prepare    
20730 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
20740 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
20750 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  16",            
20760 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 20   test_prepare16 
20770 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
20780 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   "sqlite3_prepar
20790 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  e_v2",          
207a0 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76    test_prepare_v
207b0 32 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  2    ,0 },.     
207c0 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61  { "sqlite3_prepa
207d0 72 65 5f 74 6b 74 33 31 33 34 22 2c 20 20 20 20  re_tkt3134",    
207e0 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f     test_prepare_
207f0 74 6b 74 33 31 33 34 2c 20 30 7d 2c 0a 20 20 20  tkt3134, 0},.   
20800 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65    { "sqlite3_pre
20810 70 61 72 65 31 36 5f 76 32 22 2c 20 20 20 20 20  pare16_v2",     
20820 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72       test_prepar
20830 65 31 36 5f 76 32 20 20 2c 30 20 7d 2c 0a 20 20  e16_v2  ,0 },.  
20840 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69     { "sqlite3_fi
20850 6e 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20  nalize",        
20860 20 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c        test_final
20870 69 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  ize      ,0 },. 
20880 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72      { "sqlite3_r
20890 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20  eset",          
208a0 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 73 65         test_rese
208b0 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  t         ,0 },.
208c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
208d0 65 78 70 69 72 65 64 22 2c 20 20 20 20 20 20 20  expired",       
208e0 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 78 70          test_exp
208f0 69 72 65 64 20 20 20 20 20 20 20 2c 30 20 7d 2c  ired       ,0 },
20900 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
20910 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e  _transfer_bindin
20920 67 73 22 2c 20 20 20 20 20 74 65 73 74 5f 74 72  gs",     test_tr
20930 61 6e 73 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d  ansfer_bind ,0 }
20940 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
20950 33 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20  3_changes",     
20960 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
20970 68 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20  hanges       ,0 
20980 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
20990 65 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20  e3_step",       
209a0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
209b0 73 74 65 70 20 20 20 20 20 20 20 20 20 20 2c 30  step          ,0
209c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
209d0 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20  te3_next_stmt", 
209e0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
209f0 5f 6e 65 78 74 5f 73 74 6d 74 20 20 20 20 20 2c  _next_stmt     ,
20a00 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71  0 },..     { "sq
20a10 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
20a20 6d 6f 72 79 22 2c 20 20 20 20 20 20 20 20 74 65  mory",        te
20a30 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  st_release_memor
20a40 79 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  y,     0},.     
20a50 7b 20 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f  { "sqlite3_soft_
20a60 68 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20  heap_limit",    
20a70 20 20 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61     test_soft_hea
20a80 70 5f 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a  p_limit,    0},.
20a90 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20aa0 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c  thread_cleanup",
20ab0 20 20 20 20 20 20 20 20 74 65 73 74 5f 74 68 72          test_thr
20ac0 65 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20  ead_cleanup,    
20ad0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
20ae0 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f  ite3_pager_refco
20af0 75 6e 74 73 22 2c 20 20 20 20 20 20 20 74 65 73  unts",       tes
20b00 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  t_pager_refcount
20b10 73 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20  s,    0},..     
20b20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f  { "sqlite3_load_
20b30 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20  extension",     
20b40 20 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74     test_load_ext
20b50 65 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a  ension,     0},.
20b60 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20b70 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
20b80 6e 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61  nsion", test_ena
20b90 62 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20  ble_load,       
20ba0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
20bb0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
20bc0 73 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73  sult_codes", tes
20bd0 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  t_extended_resul
20be0 74 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20  t_codes, 0},.   
20bf0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d    { "sqlite3_lim
20c00 69 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  it",            
20c10 20 20 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c       test_limit,
20c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c30 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61   0},..     { "sa
20c40 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20  ve_prng_state", 
20c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61                sa
20c60 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20  ve_prng_state,  
20c70 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72    0 },.     { "r
20c80 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74  estore_prng_stat
20c90 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 72  e",            r
20ca0 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74  estore_prng_stat
20cb0 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  e, 0 },.     { "
20cc0 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65  reset_prng_state
20cd0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
20ce0 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65  reset_prng_state
20cf0 2c 20 20 20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f  ,   0 },..     /
20d00 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
20d10 5f 2a 28 29 20 41 50 49 20 2a 2f 0a 20 20 20 20  _*() API */.    
20d20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
20d30 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20  mn_count",      
20d40 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
20d50 63 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a 20 20 20  count  ,0 },.   
20d60 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 61 74    { "sqlite3_dat
20d70 61 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20  a_count",       
20d80 20 20 20 20 20 74 65 73 74 5f 64 61 74 61 5f 63       test_data_c
20d90 6f 75 6e 74 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ount    ,0 },.  
20da0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
20db0 6c 75 6d 6e 5f 74 79 70 65 22 2c 20 20 20 20 20  lumn_type",     
20dc0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
20dd0 6e 5f 74 79 70 65 20 20 20 2c 30 20 7d 2c 0a 20  n_type   ,0 },. 
20de0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
20df0 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20 20  olumn_blob",    
20e00 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
20e10 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a  mn_blob   ,0 },.
20e20 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20e30 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20  column_double", 
20e40 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
20e50 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30 20 7d 2c  umn_double ,0 },
20e60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
20e70 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c 20  _column_int64", 
20e80 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
20e90 6c 75 6d 6e 5f 69 6e 74 36 34 20 20 2c 30 20 7d  lumn_int64  ,0 }
20ea0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
20eb0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20  3_column_text", 
20ec0 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38    test_stmt_utf8
20ed0 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  ,  (void*)sqlite
20ee0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c  3_column_text },
20ef0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
20f00 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20  _column_name",  
20f10 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c   test_stmt_utf8,
20f20 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33    (void*)sqlite3
20f30 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a  _column_name },.
20f40 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
20f50 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20 20  column_int",    
20f60 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
20f70 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
20f80 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20  column_int  },. 
20f90 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
20fa0 6f 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20 74  olumn_bytes",  t
20fb0 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20  est_stmt_int,   
20fc0 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
20fd0 6f 6c 75 6d 6e 5f 62 79 74 65 73 7d 2c 0a 23 69  olumn_bytes},.#i
20fe0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20ff0 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20  T_DECLTYPE.     
21000 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
21010 6e 5f 64 65 63 6c 74 79 70 65 22 2c 74 65 73 74  n_decltype",test
21020 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64  _stmt_utf8,(void
21030 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
21040 5f 64 65 63 6c 74 79 70 65 7d 2c 0a 23 65 6e 64  _decltype},.#end
21050 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
21060 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
21070 45 54 41 44 41 54 41 0a 7b 20 22 73 71 6c 69 74  ETADATA.{ "sqlit
21080 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
21090 73 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74  se_name",test_st
210a0 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73  mt_utf8,(void*)s
210b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
210c0 74 61 62 61 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20  tabase_name},.{ 
210d0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
210e0 74 61 62 6c 65 5f 6e 61 6d 65 22 2c 74 65 73 74  table_name",test
210f0 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64  _stmt_utf8,(void
21100 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
21110 5f 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20  _table_name},.{ 
21120 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
21130 6f 72 69 67 69 6e 5f 6e 61 6d 65 22 2c 74 65 73  origin_name",tes
21140 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69  t_stmt_utf8,(voi
21150 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
21160 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a  n_origin_name},.
21170 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
21180 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
21190 36 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  6.     { "sqlite
211a0 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36  3_column_bytes16
211b0 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74  ", test_stmt_int
211c0 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
211d0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20  _column_bytes16 
211e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
211f0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
21200 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  ",  test_stmt_ut
21210 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69  f16, (void*)sqli
21220 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
21230 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  6},.     { "sqli
21240 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31  te3_column_name1
21250 36 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75  6",  test_stmt_u
21260 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c  tf16, (void*)sql
21270 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
21280 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64  16},.     { "add
21290 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f  _alignment_test_
212a0 63 6f 6c 6c 61 74 69 6f 6e 73 22 2c 20 61 64 64  collations", add
212b0 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f  _alignment_test_
212c0 63 6f 6c 6c 61 74 69 6f 6e 73 2c 20 30 20 20 20  collations, 0   
212d0 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51     },.#ifndef SQ
212e0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
212f0 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  PE.     { "sqlit
21300 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
21310 70 65 31 36 22 2c 74 65 73 74 5f 73 74 6d 74 5f  pe16",test_stmt_
21320 75 74 66 31 36 2c 28 76 6f 69 64 2a 29 73 71 6c  utf16,(void*)sql
21330 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
21340 74 79 70 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a  type16},.#endif.
21350 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
21360 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
21370 44 41 54 41 0a 7b 22 73 71 6c 69 74 65 33 5f 63  DATA.{"sqlite3_c
21380 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
21390 61 6d 65 31 36 22 2c 0a 20 20 74 65 73 74 5f 73  ame16",.  test_s
213a0 74 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74  tmt_utf16, sqlit
213b0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
213c0 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71  se_name16},.{"sq
213d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
213e0 6c 65 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74  le_name16", test
213f0 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f  _stmt_utf16, (vo
21400 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
21410 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d  mn_table_name16}
21420 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,.{"sqlite3_colu
21430 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36  mn_origin_name16
21440 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ", test_stmt_utf
21450 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  16, (void*)sqlit
21460 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
21470 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66  _name16},.#endif
21480 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
21490 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
214a0 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65  ollation_v2", te
214b0 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  st_create_collat
214c0 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20  ion_v2, 0 },.   
214d0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f    { "sqlite3_glo
214e0 62 61 6c 5f 72 65 63 6f 76 65 72 22 2c 20 20 20  bal_recover",   
214f0 20 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65    test_global_re
21500 63 6f 76 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20  cover, 0   },.  
21510 20 20 20 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34     { "working_64
21520 62 69 74 5f 69 6e 74 22 2c 20 20 20 20 20 20 20  bit_int",       
21530 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74     working_64bit
21540 5f 69 6e 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20  _int,   0   },. 
21550 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 6c 69 6e      { "vfs_unlin
21560 6b 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  k_test",        
21570 20 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74      vfs_unlink_t
21580 65 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a  est,     0   },.
21590 20 20 20 20 20 7b 20 22 76 66 73 5f 69 6e 69 74       { "vfs_init
215a0 66 61 69 6c 5f 74 65 73 74 22 2c 20 20 20 20 20  fail_test",     
215b0 20 20 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69       vfs_initfai
215c0 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c  l_test,   0   },
215d0 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 72  .     { "vfs_unr
215e0 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20  egister_all",   
215f0 20 20 20 20 20 20 76 66 73 5f 75 6e 72 65 67 69        vfs_unregi
21600 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d  ster_all,  0   }
21610 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 72 65  ,.     { "vfs_re
21620 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20  register_all",  
21630 20 20 20 20 20 20 20 76 66 73 5f 72 65 72 65 67         vfs_rereg
21640 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20  ister_all,  0   
21650 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
21660 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 22 2c 20 20  control_test",  
21670 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e          file_con
21680 74 72 6f 6c 5f 74 65 73 74 2c 20 20 20 30 20 20  trol_test,   0  
21690 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
216a0 74 65 33 5f 76 66 73 5f 6c 69 73 74 22 2c 20 20  te3_vfs_list",  
216b0 20 20 20 20 20 20 20 20 20 76 66 73 5f 6c 69 73           vfs_lis
216c0 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 0a 20  t,     0   },.. 
216d0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73      /* Functions
216e0 20 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69   from os.h */.#i
216f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21700 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22  T_UTF16.     { "
21710 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  add_test_collate
21720 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 63  ",        test_c
21730 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20  ollate, 0       
21740 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
21750 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  add_test_collate
21760 5f 6e 65 65 64 65 64 22 2c 20 74 65 73 74 5f 63  _needed", test_c
21770 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20 30  ollate_needed, 0
21780 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
21790 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  add_test_functio
217a0 6e 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 66  n",       test_f
217b0 75 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20 20 20  unction, 0      
217c0 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20       },.#endif. 
217d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74      { "sqlite3_t
217e0 65 73 74 5f 65 72 72 73 74 72 22 2c 20 20 20 20  est_errstr",    
217f0 20 74 65 73 74 5f 65 72 72 73 74 72 2c 20 30 20   test_errstr, 0 
21800 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
21810 20 20 20 20 7b 20 22 74 63 6c 5f 76 61 72 69 61      { "tcl_varia
21820 62 6c 65 5f 74 79 70 65 22 2c 20 20 20 20 20 20  ble_type",      
21830 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79   tcl_variable_ty
21840 70 65 2c 20 30 20 20 20 20 20 20 20 7d 2c 0a 23  pe, 0       },.#
21850 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21860 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
21870 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
21880 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
21890 63 68 65 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c  che", test_enabl
218a0 65 5f 73 68 61 72 65 64 2c 20 30 20 20 7d 2c 0a  e_shared, 0  },.
218b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
218c0 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72 65 70  shared_cache_rep
218d0 6f 72 74 22 2c 20 73 71 6c 69 74 65 33 42 74 72  ort", sqlite3Btr
218e0 65 65 53 68 61 72 65 64 43 61 63 68 65 52 65 70  eeSharedCacheRep
218f0 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e 64 69 66 0a  ort, 0},.#endif.
21900 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
21910 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
21920 72 22 2c 20 74 65 73 74 5f 6c 69 62 76 65 72 73  r", test_libvers
21930 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30 20 20 7d  ion_number, 0  }
21940 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
21950 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
21960 54 41 44 41 54 41 0a 20 20 20 20 20 7b 20 22 73  TADATA.     { "s
21970 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
21980 75 6d 6e 5f 6d 65 74 61 64 61 74 61 22 2c 20 74  umn_metadata", t
21990 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  est_table_column
219a0 5f 6d 65 74 61 64 61 74 61 2c 20 30 20 20 7d 2c  _metadata, 0  },
219b0 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
219c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
219d0 42 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73 71 6c  BLOB.     { "sql
219e0 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 22 2c  ite3_blob_read",
219f0 20 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64    test_blob_read
21a00 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  , 0  },.     { "
21a10 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
21a20 74 65 22 2c 20 74 65 73 74 5f 62 6c 6f 62 5f 77  te", test_blob_w
21a30 72 69 74 65 2c 20 30 20 20 7d 2c 0a 23 65 6e 64  rite, 0  },.#end
21a40 69 66 0a 20 20 20 20 20 7b 20 22 70 63 61 63 68  if.     { "pcach
21a50 65 5f 73 74 61 74 73 22 2c 20 20 20 20 20 20 20  e_stats",       
21a60 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74  test_pcache_stat
21a70 73 2c 20 30 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20  s, 0  },.  };.  
21a80 73 74 61 74 69 63 20 69 6e 74 20 62 69 74 6d 61  static int bitma
21a90 73 6b 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66  sk_size = sizeof
21aa0 28 42 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20 69  (Bitmask)*8;.  i
21ab0 6e 74 20 69 3b 0a 20 20 65 78 74 65 72 6e 20 69  nt i;.  extern i
21ac0 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  nt sqlite3_sync_
21ad0 63 6f 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f 66  count, sqlite3_f
21ae0 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20  ullsync_count;. 
21af0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
21b00 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
21b10 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
21b20 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f   sqlite3_like_co
21b30 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
21b40 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70  t sqlite3_xferop
21b50 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  t_count;.  exter
21b60 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  n int sqlite3_pa
21b70 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
21b80 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
21b90 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
21ba0 74 65 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  tedb_count;.  ex
21bb0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
21bc0 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
21bd0 75 6e 74 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  unt;.#if SQLITE_
21be0 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e  OS_UNIX && defin
21bf0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
21c00 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
21c10 53 41 46 45 0a 20 20 65 78 74 65 72 6e 20 69 6e  SAFE.  extern in
21c20 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  t threadsOverrid
21c30 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
21c40 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
21c50 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 65 78 74  ITE_OS_WIN.  ext
21c60 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
21c70 6f 73 5f 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a  os_type;.#endif.
21c80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
21c90 42 55 47 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  BUG.  extern int
21ca0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
21cb0 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  ce;.  extern int
21cc0 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 3b   sqlite3OSTrace;
21cd0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
21ce0 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72  lite3VdbeAddopTr
21cf0 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  ace;.#endif.#ifd
21d00 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
21d10 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
21d20 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70  te3_enable_in_op
21d30 74 3b 0a 20 20 65 78 74 65 72 6e 20 63 68 61 72  t;.  extern char
21d40 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
21d50 6c 61 6e 5b 5d 3b 0a 20 20 73 74 61 74 69 63 20  lan[];.  static 
21d60 63 68 61 72 20 2a 71 75 65 72 79 5f 70 6c 61 6e  char *query_plan
21d70 20 3d 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79   = sqlite3_query
21d80 5f 70 6c 61 6e 3b 0a 23 65 6e 64 69 66 0a 0a 20  _plan;.#endif.. 
21d90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
21da0 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28  of(aCmd)/sizeof(
21db0 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aCmd[0]); i++){.
21dc0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f      Tcl_CreateCo
21dd0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43  mmand(interp, aC
21de0 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d  md[i].zName, aCm
21df0 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30  d[i].xProc, 0, 0
21e00 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
21e10 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43  ; i<sizeof(aObjC
21e20 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43  md)/sizeof(aObjC
21e30 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  md[0]); i++){.  
21e40 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
21e50 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61  ommand(interp, a
21e60 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  ObjCmd[i].zName,
21e70 20 0a 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d   .        aObjCm
21e80 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a  d[i].xProc, aObj
21e90 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74  Cmd[i].clientDat
21ea0 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  a, 0);.  }.  Tcl
21eb0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
21ec0 20 22 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f   "sqlite_search_
21ed0 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
21ee0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73  char*)&sqlite3_s
21ef0 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c  earch_count, TCL
21f00 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
21f10 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
21f20 2c 20 22 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63  , "sqlite_sort_c
21f30 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63  ount", .      (c
21f40 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 6f  har*)&sqlite3_so
21f50 72 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  rt_count, TCL_LI
21f60 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
21f70 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
21f80 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
21f90 73 69 7a 65 22 2c 20 0a 20 20 20 20 20 20 28 63  size", .      (c
21fa0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6d 61  har*)&sqlite3_ma
21fb0 78 5f 62 6c 6f 62 73 69 7a 65 2c 20 54 43 4c 5f  x_blobsize, TCL_
21fc0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
21fd0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
21fe0 20 22 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f   "sqlite_like_co
21ff0 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
22000 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6c 69 6b  ar*)&sqlite3_lik
22010 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  e_count, TCL_LIN
22020 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
22030 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
22040 71 6c 69 74 65 5f 69 6e 74 65 72 72 75 70 74 5f  qlite_interrupt_
22050 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
22060 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 69  char*)&sqlite3_i
22070 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 2c 20  nterrupt_count, 
22080 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
22090 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
220a0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65  erp, "sqlite_ope
220b0 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a  n_file_count", .
220c0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
220d0 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f  lite3_open_file_
220e0 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
220f0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
22100 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
22110 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  ite_current_time
22120 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
22130 29 26 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  )&sqlite3_curren
22140 74 5f 74 69 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b  t_time, TCL_LINK
22150 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
22160 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
22170 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f  lite3_xferopt_co
22180 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
22190 72 2a 29 26 73 71 6c 69 74 65 33 5f 78 66 65 72  r*)&sqlite3_xfer
221a0 6f 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  opt_count, TCL_L
221b0 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
221c0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
221d0 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  "sqlite3_pager_r
221e0 65 61 64 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20  eaddb_count",.  
221f0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
22200 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
22210 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
22220 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
22230 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
22240 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
22250 65 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  edb_count",.    
22260 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
22270 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
22280 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
22290 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
222a0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
222b0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
222c0 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  j_count",.      
222d0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
222e0 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
222f0 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
22300 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
22310 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54  E_OMIT_UTF16.  T
22320 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
22330 70 2c 20 22 75 6e 61 6c 69 67 6e 65 64 5f 73 74  p, "unaligned_st
22340 72 69 6e 67 5f 63 6f 75 6e 74 65 72 22 2c 0a 20  ring_counter",. 
22350 20 20 20 20 20 28 63 68 61 72 2a 29 26 75 6e 61       (char*)&una
22360 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
22370 75 6e 74 65 72 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  unter, TCL_LINK_
22380 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  INT);.#endif.#if
22390 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
223a0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
223b0 45 5f 54 45 53 54 29 20 26 26 20 53 51 4c 49 54  E_TEST) && SQLIT
223c0 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 54  E_THREADSAFE.  T
223d0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
223e0 70 2c 20 22 74 68 72 65 61 64 73 4f 76 65 72 72  p, "threadsOverr
223f0 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
22400 6b 73 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ks",.      (char
22410 2a 29 26 74 68 72 65 61 64 73 4f 76 65 72 72 69  *)&threadsOverri
22420 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
22430 73 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  s, TCL_LINK_INT)
22440 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ;.#endif.#ifndef
22450 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
22460 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  16.  Tcl_LinkVar
22470 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
22480 5f 6c 61 73 74 5f 6e 65 65 64 65 64 5f 63 6f 6c  _last_needed_col
22490 6c 61 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 28  lation",.      (
224a0 63 68 61 72 2a 29 26 70 7a 4e 65 65 64 65 64 43  char*)&pzNeededC
224b0 6f 6c 6c 61 74 69 6f 6e 2c 20 54 43 4c 5f 4c 49  ollation, TCL_LI
224c0 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49  NK_STRING|TCL_LI
224d0 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23  NK_READ_ONLY);.#
224e0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
224f0 5f 4f 53 5f 57 49 4e 0a 20 20 54 63 6c 5f 4c 69  _OS_WIN.  Tcl_Li
22500 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
22510 71 6c 69 74 65 5f 6f 73 5f 74 79 70 65 22 2c 0a  qlite_os_type",.
22520 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
22530 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 54  lite3_os_type, T
22540 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
22550 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
22560 54 45 5f 54 45 53 54 0a 20 20 54 63 6c 5f 4c 69  TE_TEST.  Tcl_Li
22570 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
22580 71 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c 61 6e  qlite_query_plan
22590 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
225a0 26 71 75 65 72 79 5f 70 6c 61 6e 2c 20 54 43 4c  &query_plan, TCL
225b0 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c  _LINK_STRING|TCL
225c0 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29  _LINK_READ_ONLY)
225d0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
225e0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 54  SQLITE_DEBUG.  T
225f0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
22600 70 2c 20 22 73 71 6c 69 74 65 5f 61 64 64 6f 70  p, "sqlite_addop
22610 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28  _trace",.      (
22620 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 56 64  char*)&sqlite3Vd
22630 62 65 41 64 64 6f 70 54 72 61 63 65 2c 20 54 43  beAddopTrace, TC
22640 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
22650 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
22660 70 2c 20 22 73 71 6c 69 74 65 5f 77 68 65 72 65  p, "sqlite_where
22670 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28  _trace",.      (
22680 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 57 68  char*)&sqlite3Wh
22690 65 72 65 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49  ereTrace, TCL_LI
226a0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
226b0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
226c0 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63 65 22  sqlite_os_trace"
226d0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
226e0 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 2c 20  sqlite3OSTrace, 
226f0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
22700 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
22710 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
22720 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
22730 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
22740 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a  pentemp_count",.
22750 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
22760 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
22770 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
22780 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63  NT);.#endif.  Tc
22790 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
227a0 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63  , "sqlite_static
227b0 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2c 0a 20 20  _bind_value",.  
227c0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
227d0 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
227e0 61 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  alue, TCL_LINK_S
227f0 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69  TRING);.  Tcl_Li
22800 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
22810 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
22820 64 5f 6e 62 79 74 65 22 2c 0a 20 20 20 20 20 20  d_nbyte",.      
22830 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73  (char*)&sqlite_s
22840 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65  tatic_bind_nbyte
22850 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
22860 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
22870 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 74  nterp, "sqlite_t
22880 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a  emp_directory",.
22890 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
228a0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
228b0 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  tory, TCL_LINK_S
228c0 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69  TRING);.  Tcl_Li
228d0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 62  nkVar(interp, "b
228e0 69 74 6d 61 73 6b 5f 73 69 7a 65 22 2c 0a 20 20  itmask_size",.  
228f0 20 20 20 20 28 63 68 61 72 2a 29 26 62 69 74 6d      (char*)&bitm
22900 61 73 6b 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49  ask_size, TCL_LI
22910 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f  NK_INT|TCL_LINK_
22920 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63  READ_ONLY);.  Tc
22930 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
22940 2c 20 22 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63  , "sqlite_sync_c
22950 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
22960 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 79 6e  ar*)&sqlite3_syn
22970 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  c_count, TCL_LIN
22980 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
22990 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
229a0 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63  qlite_fullsync_c
229b0 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
229c0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 75 6c  ar*)&sqlite3_ful
229d0 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c  lsync_count, TCL
229e0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 64  _LINK_INT);.#ifd
229f0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
22a00 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
22a10 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 65 6e 61  erp, "sqlite_ena
22a20 62 6c 65 5f 69 6e 5f 6f 70 74 22 2c 0a 20 20 20  ble_in_opt",.   
22a30 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
22a40 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74  e3_enable_in_opt
22a50 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
22a60 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
22a70 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a                  TCL_OK;.}.