/ Hex Artifact Content
Login

Artifact 9a4ee438435acfcf6418991a33e08bfe99e602bf:


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 35 34 20 32 30 30 39 2f 30 38 2f 31   1.354 2009/08/1
0240: 30 20 30 34 3a 33 37 3a 35 30 20 64 61 6e 69 65  0 04:37:50 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 29 7b 0a 20 20 20 20 63 61  ch( rc ){.    ca
0b60: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20  se SQLITE_OK:   
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
0b80: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f  Name = "SQLITE_O
0b90: 4b 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  K";             
0ba0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0bb0: 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a  se SQLITE_ERROR:
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
0bd0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
0be0: 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20  RROR";          
0bf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0c00: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  se SQLITE_INTERN
0c10: 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  AL:            z
0c20: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
0c30: 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20  NTERNAL";       
0c40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0c50: 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20  se SQLITE_PERM: 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
0c70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
0c80: 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20  ERM";           
0c90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0ca0: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a  se SQLITE_ABORT:
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
0cc0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
0cd0: 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20  BORT";          
0ce0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0cf0: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20  se SQLITE_BUSY: 
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
0d10: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
0d20: 55 53 59 22 3b 20 20 20 20 20 20 20 20 20 20 20  USY";           
0d30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0d40: 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  se SQLITE_LOCKED
0d50: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
0d60: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c  Name = "SQLITE_L
0d70: 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20  OCKED";         
0d80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0d90: 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  se SQLITE_LOCKED
0da0: 5f 53 48 41 52 45 44 43 41 43 48 45 3a 20 20 7a  _SHAREDCACHE:  z
0db0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c  Name = "SQLITE_L
0dc0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
0dd0: 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  E";break;.    ca
0de0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  se SQLITE_NOMEM:
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
0e00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
0e10: 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20  OMEM";          
0e20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0e30: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
0e40: 4c 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  LY:            z
0e50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
0e60: 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20  EADONLY";       
0e70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0e80: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  se SQLITE_INTERR
0e90: 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20 7a  UPT:           z
0ea0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
0eb0: 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20  NTERRUPT";      
0ec0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0ed0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a  se SQLITE_IOERR:
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
0ef0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
0f00: 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20 20 20  OERR";          
0f10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0f20: 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  se SQLITE_CORRUP
0f30: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  T:             z
0f40: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
0f50: 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20  ORRUPT";        
0f60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0f70: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  se SQLITE_NOTFOU
0f80: 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ND:            z
0f90: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
0fa0: 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20  OTFOUND";       
0fb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0fc0: 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20  se SQLITE_FULL: 
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
0fe0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
0ff0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20  ULL";           
1000: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1010: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
1020: 45 4e 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  EN:            z
1030: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
1040: 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20 20  ANTOPEN";       
1050: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1060: 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  se SQLITE_PROTOC
1070: 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  OL:            z
1080: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
1090: 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20  ROTOCOL";       
10a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
10b0: 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a  se SQLITE_EMPTY:
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
10d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
10e0: 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20 20  MPTY";          
10f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1100: 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  se SQLITE_SCHEMA
1110: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
1120: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53  Name = "SQLITE_S
1130: 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20 20  CHEMA";         
1140: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1150: 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  se SQLITE_TOOBIG
1160: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
1170: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54  Name = "SQLITE_T
1180: 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20 20 20  OOBIG";         
1190: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11a0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
11b0: 41 49 4e 54 3a 20 20 20 20 20 20 20 20 20 20 7a  AINT:          z
11c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
11d0: 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20  ONSTRAINT";     
11e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11f0: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  se SQLITE_MISMAT
1200: 43 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  CH:            z
1210: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
1220: 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20  ISMATCH";       
1230: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1240: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  se SQLITE_MISUSE
1250: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
1260: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
1270: 49 53 55 53 45 22 3b 20 20 20 20 20 20 20 20 20  ISUSE";         
1280: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1290: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a  se SQLITE_NOLFS:
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
12b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
12c0: 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20 20 20  OLFS";          
12d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
12e0: 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20  se SQLITE_AUTH: 
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1300: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
1310: 55 54 48 22 3b 20 20 20 20 20 20 20 20 20 20 20  UTH";           
1320: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1330: 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  se SQLITE_FORMAT
1340: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
1350: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
1360: 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20  ORMAT";         
1370: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1380: 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a  se SQLITE_RANGE:
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
13a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
13b0: 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20 20  ANGE";          
13c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
13d0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  se SQLITE_NOTADB
13e0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
13f0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
1400: 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20  OTADB";         
1410: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1420: 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20  se SQLITE_ROW:  
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1440: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
1450: 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  OW";            
1460: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1470: 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20  se SQLITE_DONE: 
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1490: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44  Name = "SQLITE_D
14a0: 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  ONE";           
14b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
14c0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
14d0: 52 45 41 44 3a 20 20 20 20 20 20 20 20 20 20 7a  READ:          z
14e0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
14f0: 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20  OERR_READ";     
1500: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1510: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
1520: 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 20 7a  SHORT_READ:    z
1530: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
1540: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22  OERR_SHORT_READ"
1550: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
1560: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
1570: 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 20 7a  WRITE:         z
1580: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
1590: 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20  OERR_WRITE";    
15a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
15b0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
15c0: 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20 20 7a  FSYNC:         z
15d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
15e0: 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20  OERR_FSYNC";    
15f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1600: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
1610: 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 7a  DIR_FSYNC:     z
1620: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
1630: 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b  OERR_DIR_FSYNC";
1640: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1650: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
1660: 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20 20 7a  TRUNCATE:      z
1670: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
1680: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20  OERR_TRUNCATE"; 
1690: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
16a0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
16b0: 46 53 54 41 54 3a 20 20 20 20 20 20 20 20 20 7a  FSTAT:         z
16c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
16d0: 4f 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20  OERR_FSTAT";    
16e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
16f0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
1700: 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 7a  UNLOCK:        z
1710: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
1720: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20  OERR_UNLOCK";   
1730: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1740: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
1750: 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 7a  RDLOCK:        z
1760: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
1770: 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20  OERR_RDLOCK";   
1780: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1790: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
17a0: 44 45 4c 45 54 45 3a 20 20 20 20 20 20 20 20 7a  DELETE:        z
17b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
17c0: 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20  OERR_DELETE";   
17d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
17e0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
17f0: 42 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 7a  BLOCKED:       z
1800: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
1810: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 22 3b 20 20  OERR_BLOCKED";  
1820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1830: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
1840: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 7a  NOMEM:         z
1850: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
1860: 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20  OERR_NOMEM";    
1870: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1880: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
1890: 41 43 43 45 53 53 3a 20 20 20 20 20 20 20 20 7a  ACCESS:        z
18a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
18b0: 4f 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20  OERR_ACCESS";   
18c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
18d0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
18e0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
18f0: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1910: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
1920: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
1930: 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61  ERVEDLOCK"; brea
1940: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1950: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20  TE_IOERR_LOCK:  
1960: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
1970: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f  "SQLITE_IOERR_LO
1980: 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  CK";        brea
1990: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
19c0: 22 53 51 4c 49 54 45 5f 55 6e 6b 6e 6f 77 6e 22  "SQLITE_Unknown"
19d0: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
19e0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
19f0: 7a 4e 61 6d 65 3b 0a 7d 0a 23 64 65 66 69 6e 65  zName;.}.#define
1a00: 20 74 31 45 72 72 6f 72 4e 61 6d 65 20 73 71 6c   t1ErrorName sql
1a10: 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d  ite3TestErrorNam
1a20: 65 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  e../*.** Convert
1a30: 20 61 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   an sqlite3_stmt
1a40: 2a 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65  * into an sqlite
1a50: 33 2a 2e 20 20 54 68 69 73 20 64 65 70 65 6e 64  3*.  This depend
1a60: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 66 61 63 74  s on the.** fact
1a70: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
1a80: 33 2a 20 69 73 20 74 68 65 20 66 69 72 73 74 20  3* is the first 
1a90: 66 69 65 6c 64 20 69 6e 20 74 68 65 20 56 64 62  field in the Vdb
1aa0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
1ab0: 23 64 65 66 69 6e 65 20 53 74 6d 74 54 6f 44 62  #define StmtToDb
1ac0: 28 58 29 20 20 20 73 71 6c 69 74 65 33 5f 64 62  (X)   sqlite3_db
1ad0: 5f 68 61 6e 64 6c 65 28 58 29 0a 0a 2f 2a 0a 2a  _handle(X)../*.*
1ae0: 2a 20 43 68 65 63 6b 20 61 20 72 65 74 75 72 6e  * Check a return
1af0: 20 76 61 6c 75 65 20 74 6f 20 6d 61 6b 65 20 73   value to make s
1b00: 75 72 65 20 69 74 20 61 67 72 65 65 73 20 77 69  ure it agrees wi
1b10: 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  th the results.*
1b20: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65  * from sqlite3_e
1b30: 72 72 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  rrcode..*/.int s
1b40: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
1b50: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
1b60: 74 65 72 70 2c 20 73 71 6c 69 74 65 33 20 2a 64  terp, sqlite3 *d
1b70: 62 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 66  b, int rc){.  if
1b80: 28 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  ( sqlite3_thread
1b90: 73 61 66 65 28 29 3d 3d 30 20 26 26 20 72 63 21  safe()==0 && rc!
1ba0: 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 26  =SQLITE_MISUSE &
1bb0: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a  & rc!=SQLITE_OK.
1bc0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 65 72     && sqlite3_er
1bd0: 72 63 6f 64 65 28 64 62 29 21 3d 72 63 20 29 7b  rcode(db)!=rc ){
1be0: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32  .    char zBuf[2
1bf0: 30 30 5d 3b 0a 20 20 20 20 69 6e 74 20 72 32 20  00];.    int r2 
1c00: 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
1c10: 65 28 64 62 29 3b 0a 20 20 20 20 73 70 72 69 6e  e(db);.    sprin
1c20: 74 66 28 7a 42 75 66 2c 20 22 65 72 72 6f 72 20  tf(zBuf, "error 
1c30: 63 6f 64 65 20 25 73 20 28 25 64 29 20 64 6f 65  code %s (%d) doe
1c40: 73 20 6e 6f 74 20 6d 61 74 63 68 20 73 71 6c 69  s not match sqli
1c50: 74 65 33 5f 65 72 72 63 6f 64 65 20 25 73 20 28  te3_errcode %s (
1c60: 25 64 29 22 2c 0a 20 20 20 20 20 20 20 74 31 45  %d)",.       t1E
1c70: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 72 63  rrorName(rc), rc
1c80: 2c 20 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 32  , t1ErrorName(r2
1c90: 29 2c 20 72 32 29 3b 0a 20 20 20 20 54 63 6c 5f  ), r2);.    Tcl_
1ca0: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
1cb0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  rp);.    Tcl_App
1cc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1cd0: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20  , zBuf, 0);.    
1ce0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
1cf0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1d00: 2a 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e  ** Decode a poin
1d10: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
1d20: 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a  3_stmt object..*
1d30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
1d40: 53 74 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20 54  StmtPointer(.  T
1d50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1d60: 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p, .  const char
1d70: 20 2a 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c 69   *zArg,  .  sqli
1d80: 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
1d90: 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d  t.){.  *ppStmt =
1da0: 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29   (sqlite3_stmt*)
1db0: 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54  sqlite3TestTextT
1dc0: 6f 50 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65  oPtr(zArg);.  re
1dd0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1de0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
1df0: 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
1e00: 74 69 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65  tion of a pointe
1e10: 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 6e  r that can be un
1e20: 64 65 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74  derstood.** by t
1e30: 68 65 20 67 65 74 44 62 50 6f 69 6e 74 65 72 20  he getDbPointer 
1e40: 61 6e 64 20 67 65 74 56 6d 50 6f 69 6e 74 65 72  and getVmPointer
1e50: 20 72 6f 75 74 69 6e 65 73 20 61 62 6f 76 65 2e   routines above.
1e60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c  .**.** The probl
1e70: 65 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d  em is, on some m
1e80: 61 63 68 69 6e 65 73 20 28 53 6f 6c 61 72 69 73  achines (Solaris
1e90: 29 20 69 66 20 79 6f 75 20 64 6f 20 61 20 70 72  ) if you do a pr
1ea0: 69 6e 74 66 20 77 69 74 68 0a 2a 2a 20 22 25 70  intf with.** "%p
1eb0: 22 20 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72  " you cannot tur
1ec0: 6e 20 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20  n around and do 
1ed0: 61 20 73 63 61 6e 66 20 77 69 74 68 20 74 68 65  a scanf with the
1ee0: 20 73 61 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a   same "%p" and.*
1ef0: 2a 20 67 65 74 20 79 6f 75 72 20 70 6f 69 6e 74  * get your point
1f00: 65 72 20 62 61 63 6b 2e 20 20 59 6f 75 20 68 61  er back.  You ha
1f10: 76 65 20 74 6f 20 70 72 65 70 65 6e 64 20 61 20  ve to prepend a 
1f20: 22 30 78 22 20 62 65 66 6f 72 65 20 69 74 20 77  "0x" before it w
1f30: 69 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72  ill.** work.  Or
1f40: 20 61 74 20 6c 65 61 73 74 20 74 68 61 74 20 69   at least that i
1f50: 73 20 77 68 61 74 20 69 73 20 72 65 70 6f 72 74  s what is report
1f60: 65 64 20 74 6f 20 6d 65 20 28 64 72 68 29 2e 20  ed to me (drh). 
1f70: 20 42 75 74 20 74 68 69 73 0a 2a 2a 20 62 65 68   But this.** beh
1f80: 61 76 69 6f 72 20 76 61 72 69 65 73 20 66 72 6f  avior varies fro
1f90: 6d 20 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61 63  m machine to mac
1fa0: 68 69 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75 74  hine.  The solut
1fb0: 69 6f 6e 20 75 73 65 64 20 68 65 72 20 69 73 0a  ion used her is.
1fc0: 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 73  ** to test the s
1fd0: 74 72 69 6e 67 20 72 69 67 68 74 20 61 66 74 65  tring right afte
1fe0: 72 20 69 74 20 69 73 20 67 65 6e 65 72 61 74 65  r it is generate
1ff0: 64 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 63  d to see if it c
2000: 61 6e 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74  an be.** underst
2010: 6f 6f 64 20 62 79 20 73 63 61 6e 66 2c 20 61 6e  ood by scanf, an
2020: 64 20 69 66 20 6e 6f 74 2c 20 74 72 79 20 70 72  d if not, try pr
2030: 65 70 65 6e 64 69 6e 67 20 61 6e 20 22 30 78 22  epending an "0x"
2040: 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74 68   to see if.** th
2050: 61 74 20 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f  at helps.  If no
2060: 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66  thing works, a f
2070: 61 74 61 6c 20 65 72 72 6f 72 20 69 73 20 67 65  atal error is ge
2080: 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nerated..*/.int 
2090: 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
20a0: 6f 69 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e  ointerStr(Tcl_In
20b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68  terp *interp, ch
20c0: 61 72 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a  ar *zPtr, void *
20d0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  p){.  sqlite3_sn
20e0: 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72  printf(100, zPtr
20f0: 2c 20 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65  , "%p", p);.  re
2100: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2110: 2f 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  /*.** The callba
2120: 63 6b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73  ck routine for s
2130: 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e  qlite3_exec_prin
2140: 74 66 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tf()..*/.static 
2150: 69 6e 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f  int exec_printf_
2160: 63 62 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  cb(void *pArg, i
2170: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
2180: 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d  argv, char **nam
2190: 65 29 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  e){.  Tcl_DStrin
21a0: 67 20 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53  g *str = (Tcl_DS
21b0: 74 72 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69  tring*)pArg;.  i
21c0: 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c  nt i;..  if( Tcl
21d0: 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73  _DStringLength(s
21e0: 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f  tr)==0 ){.    fo
21f0: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
2200: 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  ++){.      Tcl_D
2210: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
2220: 65 6e 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d  ent(str, name[i]
2230: 20 3f 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55   ? name[i] : "NU
2240: 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LL");.    }.  }.
2250: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
2260: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  c; i++){.    Tcl
2270: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
2280: 65 6d 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b  ement(str, argv[
2290: 69 5d 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22  i] ? argv[i] : "
22a0: 4e 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65  NULL");.  }.  re
22b0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
22c0: 20 54 68 65 20 49 2f 4f 20 74 72 61 63 69 6e 67   The I/O tracing
22d0: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 23 69   callback..*/.#i
22e0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
22f0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
2300: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2310: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a  ENABLE_IOTRACE).
2320: 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74  static FILE *iot
2330: 72 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 73  race_file = 0;.s
2340: 74 61 74 69 63 20 76 6f 69 64 20 69 6f 5f 74 72  tatic void io_tr
2350: 61 63 65 5f 63 61 6c 6c 62 61 63 6b 28 63 6f 6e  ace_callback(con
2360: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
2370: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
2380: 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
2390: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
23a0: 20 76 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63   vfprintf(iotrac
23b0: 65 5f 66 69 6c 65 2c 20 7a 46 6f 72 6d 61 74 2c  e_file, zFormat,
23c0: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
23d0: 70 29 3b 0a 20 20 66 66 6c 75 73 68 28 69 6f 74  p);.  fflush(iot
23e0: 72 61 63 65 5f 66 69 6c 65 29 3b 0a 7d 0a 23 65  race_file);.}.#e
23f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ndif../*.** Usag
2400: 65 3a 20 20 69 6f 5f 74 72 61 63 65 20 46 49 4c  e:  io_trace FIL
2410: 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 75 72 6e  ENAME.**.** Turn
2420: 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 6f 6e 20   I/O tracing on 
2430: 6f 72 20 6f 66 66 2e 20 20 49 66 20 46 49 4c 45  or off.  If FILE
2440: 4e 41 4d 45 20 69 73 20 6e 6f 74 20 61 6e 20 65  NAME is not an e
2450: 6d 70 74 79 20 73 74 72 69 6e 67 2c 0a 2a 2a 20  mpty string,.** 
2460: 49 2f 4f 20 74 72 61 63 69 6e 67 20 62 65 67 69  I/O tracing begi
2470: 6e 73 20 67 6f 69 6e 67 20 69 6e 74 6f 20 46 49  ns going into FI
2480: 4c 45 4e 41 4d 45 2e 20 49 66 20 46 49 4c 45 4e  LENAME. If FILEN
2490: 41 4d 45 20 69 73 20 61 6e 20 65 6d 70 74 79 0a  AME is an empty.
24a0: 2a 2a 20 73 74 72 69 6e 67 2c 20 49 2f 4f 20 74  ** string, I/O t
24b0: 72 61 63 69 6e 67 20 69 73 20 74 75 72 6e 65 64  racing is turned
24c0: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
24d0: 69 6e 74 20 74 65 73 74 5f 69 6f 5f 74 72 61 63  int test_io_trac
24e0: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
24f0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
2500: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2510: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2520: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2530: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2540: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
2550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2560: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2570: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
2580: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
2590: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
25a0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20  ument */.){.#if 
25b0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
25c0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
25d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
25e0: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 20 20  ABLE_IOTRACE).  
25f0: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
2600: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2610: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
2620: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
2630: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
2640: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 46  ],.          " F
2650: 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
2660: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2670: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2680: 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 29 7b 0a  iotrace_file ){.
2690: 20 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f      if( iotrace_
26a0: 66 69 6c 65 21 3d 73 74 64 6f 75 74 20 26 26 20  file!=stdout && 
26b0: 69 6f 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74  iotrace_file!=st
26c0: 64 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 63  derr ){.      fc
26d0: 6c 6f 73 65 28 69 6f 74 72 61 63 65 5f 66 69 6c  lose(iotrace_fil
26e0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6f  e);.    }.    io
26f0: 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a  trace_file = 0;.
2700: 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
2710: 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ce = 0;.  }.  if
2720: 28 20 61 72 67 76 5b 31 5d 5b 30 5d 20 29 7b 0a  ( argv[1][0] ){.
2730: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
2740: 72 67 76 5b 31 5d 2c 22 73 74 64 6f 75 74 22 29  rgv[1],"stdout")
2750: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74  ==0 ){.      iot
2760: 72 61 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 6f  race_file = stdo
2770: 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ut;.    }else if
2780: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d  ( strcmp(argv[1]
2790: 2c 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b  ,"stderr")==0 ){
27a0: 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66  .      iotrace_f
27b0: 69 6c 65 20 3d 20 73 74 64 65 72 72 3b 0a 20 20  ile = stderr;.  
27c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
27d0: 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 66 6f  otrace_file = fo
27e0: 70 65 6e 28 61 72 67 76 5b 31 5d 2c 20 22 77 22  pen(argv[1], "w"
27f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2800: 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f  ite3IoTrace = io
2810: 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 3b  _trace_callback;
2820: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2830: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2840: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
2850: 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e  qlite3_exec_prin
2860: 74 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20 20  tf  DB  FORMAT  
2870: 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 49 6e 76  STRING.**.** Inv
2880: 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  oke the sqlite3_
2890: 65 78 65 63 5f 70 72 69 6e 74 66 28 29 20 69 6e  exec_printf() in
28a0: 74 65 72 66 61 63 65 20 75 73 69 6e 67 20 74 68  terface using th
28b0: 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  e open database.
28c0: 2a 2a 20 44 42 2e 20 20 54 68 65 20 53 51 4c 20  ** DB.  The SQL 
28d0: 69 73 20 74 68 65 20 73 74 72 69 6e 67 20 46 4f  is the string FO
28e0: 52 4d 41 54 2e 20 20 54 68 65 20 66 6f 72 6d 61  RMAT.  The forma
28f0: 74 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20  t string should 
2900: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e 65 20 25  contain.** one %
2910: 73 20 6f 72 20 25 71 2e 20 20 53 54 52 49 4e 47  s or %q.  STRING
2920: 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e   is the value in
2930: 73 65 72 74 65 64 20 69 6e 74 6f 20 25 73 20 6f  serted into %s o
2940: 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  r %q..*/.static 
2950: 69 6e 74 20 74 65 73 74 5f 65 78 65 63 5f 70 72  int test_exec_pr
2960: 69 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  intf(.  void *No
2970: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
2980: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2990: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
29a0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
29b0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
29c0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
29f0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
2a00: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
2a10: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
2a20: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
2a30: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2a40: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
2a50: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
2a60: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63  r *zErr = 0;.  c
2a70: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
2a80: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66  r zBuf[30];.  if
2a90: 28 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20  ( argc!=4 ){.   
2aa0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2ab0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
2ac0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
2ad0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
2ae0: 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 46 4f   .       " DB FO
2af0: 52 4d 41 54 20 53 54 52 49 4e 47 22 2c 20 30 29  RMAT STRING", 0)
2b00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2b10: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2b20: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2b30: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
2b40: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2b50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44  L_ERROR;.  Tcl_D
2b60: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
2b70: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
2b80: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
2b90: 32 5d 2c 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20  2], argv[3]);.  
2ba0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
2bb0: 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65 63  c(db, zSql, exec
2bc0: 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74 72  _printf_cb, &str
2bd0: 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c 69  , &zErr);.  sqli
2be0: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
2bf0: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
2c00: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
2c10: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
2c20: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
2c30: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
2c40: 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51  t(interp, rc==SQ
2c50: 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53  LITE_OK ? Tcl_DS
2c60: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
2c70: 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f   : zErr);.  Tcl_
2c80: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
2c90: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20  );.  if( zErr ) 
2ca0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
2cb0: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
2cc0: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
2cd0: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
2ce0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2cf0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2d00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
2d10: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
2d20: 68 65 78 20 20 44 42 20 20 48 45 58 0a 2a 2a 0a  hex  DB  HEX.**.
2d30: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
2d40: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 6f 6e 20  lite3_exec() on 
2d50: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  a string that is
2d60: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 72 61   obtained by tra
2d70: 6e 73 6c 61 74 69 6e 67 0a 2a 2a 20 48 45 58 20  nslating.** HEX 
2d80: 69 6e 74 6f 20 41 53 43 49 49 2e 20 20 4d 6f 73  into ASCII.  Mos
2d90: 74 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65  t characters are
2da0: 20 74 72 61 6e 73 6c 61 74 65 64 20 61 73 20 69   translated as i
2db0: 73 2e 20 20 25 48 48 20 62 65 63 6f 6d 65 73 0a  s.  %HH becomes.
2dc0: 2a 2a 20 61 20 68 65 78 20 63 68 61 72 61 63 74  ** a hex charact
2dd0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2de0: 74 20 74 65 73 74 5f 65 78 65 63 5f 68 65 78 28  t test_exec_hex(
2df0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
2e00: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2e10: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2e20: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2e30: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2e40: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2e50: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
2e60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e70: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2e80: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
2e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
2ea0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
2eb0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
2ec0: 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44  te3 *db;.  Tcl_D
2ed0: 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e  String str;.  in
2ee0: 74 20 72 63 2c 20 69 2c 20 6a 3b 0a 20 20 63 68  t rc, i, j;.  ch
2ef0: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
2f00: 63 68 61 72 20 2a 7a 48 65 78 3b 0a 20 20 63 68  char *zHex;.  ch
2f10: 61 72 20 7a 53 71 6c 5b 35 30 30 5d 3b 0a 20 20  ar zSql[500];.  
2f20: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
2f30: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
2f40: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2f50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
2f60: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
2f70: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
2f80: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
2f90: 20 48 45 58 22 2c 20 30 29 3b 0a 20 20 20 20 72   HEX", 0);.    r
2fa0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2fb0: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
2fc0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2fd0: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
2fe0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2ff0: 3b 0a 20 20 7a 48 65 78 20 3d 20 61 72 67 76 5b  ;.  zHex = argv[
3000: 32 5d 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  2];.  for(i=j=0;
3010: 20 69 3c 73 69 7a 65 6f 66 28 7a 53 71 6c 29 20   i<sizeof(zSql) 
3020: 26 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c  && zHex[j]; i++,
3030: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   j++){.    if( z
3040: 48 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a  Hex[j]=='%' && z
3050: 48 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78  Hex[j+2] && zHex
3060: 5b 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a  [j+2] ){.      z
3070: 53 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65  Sql[i] = (testHe
3080: 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d  xToInt(zHex[j+1]
3090: 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  )<<4) + testHexT
30a0: 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b  oInt(zHex[j+2]);
30b0: 0a 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20  .      j += 2;. 
30c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30d0: 7a 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a  zSql[i] = zHex[j
30e0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  ];.    }.  }.  z
30f0: 53 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63  Sql[i] = 0;.  Tc
3100: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
3110: 74 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  tr);.  rc = sqli
3120: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
3130: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
3140: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
3150: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
3160: 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63   "%d", rc);.  Tc
3170: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
3180: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
3190: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
31a0: 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53  nt(interp, rc==S
31b0: 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44  QLITE_OK ? Tcl_D
31c0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
31d0: 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c  ) : zErr);.  Tcl
31e0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
31f0: 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29  r);.  if( zErr )
3200: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
3210: 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rr);.  if( sqlit
3220: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
3230: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
3240: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3250: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
3260: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
3270: 65 3a 20 20 64 62 5f 65 6e 74 65 72 20 44 42 0a  e:  db_enter DB.
3280: 2a 2a 20 20 20 20 20 20 20 20 20 64 62 5f 6c 65  **         db_le
3290: 61 76 65 20 44 42 0a 2a 2a 0a 2a 2a 20 45 6e 74  ave DB.**.** Ent
32a0: 65 72 20 6f 72 20 6c 65 61 76 65 20 74 68 65 20  er or leave the 
32b0: 6d 75 74 65 78 20 6f 6e 20 61 20 64 61 74 61 62  mutex on a datab
32c0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
32d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
32e0: 5f 65 6e 74 65 72 28 0a 20 20 76 6f 69 64 20 2a  _enter(.  void *
32f0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
3300: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
3310: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
3320: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
3330: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
3340: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
3350: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
3360: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
3370: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
3380: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
3390: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
33a0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
33b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
33c0: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
33d0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
33e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
33f0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
3400: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
3410: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
3420: 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
3430: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3440: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
3450: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
3460: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
3470: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3480: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
3490: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
34a0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
34b0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 64  ;.}.static int d
34c0: 62 5f 6c 65 61 76 65 28 0a 20 20 76 6f 69 64 20  b_leave(.  void 
34d0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
34e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
34f0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
3500: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
3510: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
3520: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
3530: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
3540: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
3550: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
3560: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
3570: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
3580: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
3590: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
35a0: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
35b0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
35c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
35d0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
35e0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
35f0: 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20  v[0], .       " 
3600: 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
3610: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3620: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
3630: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
3640: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
3650: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3660: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
3670: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
3680: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
3690: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
36a0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  e:  sqlite3_exec
36b0: 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a 20    DB  SQL.**.** 
36c0: 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74  Invoke the sqlit
36d0: 65 33 5f 65 78 65 63 20 69 6e 74 65 72 66 61 63  e3_exec interfac
36e0: 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e  e using the open
36f0: 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2f 0a   database DB.*/.
3700: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
3710: 65 78 65 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  exec(.  void *No
3720: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
3730: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
3740: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
3750: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
3760: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
3770: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3790: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
37a0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
37b0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
37c0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
37d0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
37e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
37f0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
3800: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
3810: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63  r *zErr = 0;.  c
3820: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
3830: 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 42   i, j;.  char zB
3840: 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72  uf[30];.  if( ar
3850: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
3860: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
3870: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
3880: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
3890: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
38a0: 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20       " DB SQL", 
38b0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
38c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
38d0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
38e0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
38f0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
3900: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
3910: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
3920: 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  r);.  zSql = sql
3930: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
3940: 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20 66  ", argv[2]);.  f
3950: 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53 71 6c 5b 69  or(i=j=0; zSql[i
3960: 5d 3b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71  ];){.    if( zSq
3970: 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20  l[i]=='%' ){.   
3980: 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 28     zSql[j++] = (
3990: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53 71  testHexToInt(zSq
39a0: 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b 20 74 65  l[i+1])<<4) + te
39b0: 73 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c 5b  stHexToInt(zSql[
39c0: 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 20 2b  i+2]);.      i +
39d0: 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 3;.    }else{.
39e0: 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
39f0: 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a 20 20 20  = zSql[i++];.   
3a00: 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 6a 5d   }.  }.  zSql[j]
3a10: 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
3a20: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
3a30: 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f  ql, exec_printf_
3a40: 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29  cb, &str, &zErr)
3a50: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
3a60: 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74  (zSql);.  sprint
3a70: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  f(zBuf, "%d", rc
3a80: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
3a90: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
3aa0: 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  Buf);.  Tcl_Appe
3ab0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3ac0: 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , rc==SQLITE_OK 
3ad0: 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  ? Tcl_DStringVal
3ae0: 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29  ue(&str) : zErr)
3af0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
3b00: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28  ree(&str);.  if(
3b10: 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f   zErr ) sqlite3_
3b20: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66  free(zErr);.  if
3b30: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
3b40: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
3b50: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
3b60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
3b70: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
3b80: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
3b90: 65 33 5f 65 78 65 63 5f 6e 72 20 20 44 42 20 20  e3_exec_nr  DB  
3ba0: 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  SQL.**.** Invoke
3bb0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65   the sqlite3_exe
3bc0: 63 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  c interface usin
3bd0: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
3be0: 61 73 65 20 44 42 2e 20 20 44 69 73 63 61 72 64  ase DB.  Discard
3bf0: 0a 2a 2a 20 61 6c 6c 20 72 65 73 75 6c 74 73 0a  .** all results.
3c00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
3c10: 73 74 5f 65 78 65 63 5f 6e 72 28 0a 20 20 76 6f  st_exec_nr(.  vo
3c20: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
3c30: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3c40: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
3c50: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
3c60: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
3c70: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3c80: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3c90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3ca0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3cb0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3cc0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3cd0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3ce0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
3cf0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
3d00: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
3d10: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
3d20: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
3d30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
3d40: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
3d50: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
3d60: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
3d70: 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20  B SQL", 0);.    
3d80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3d90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
3da0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
3db0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
3dc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3dd0: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
3de0: 33 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76 5b  3_exec(db, argv[
3df0: 32 5d 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29  2], 0, 0, &zErr)
3e00: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
3e10: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
3e20: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
3e30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3e40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
3e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
3e60: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
3e70: 5f 7a 5f 74 65 73 74 20 20 53 45 50 41 52 41 54  _z_test  SEPARAT
3e80: 4f 52 20 20 41 52 47 30 20 20 41 52 47 31 20 2e  OR  ARG0  ARG1 .
3e90: 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ...**.** Test th
3ea0: 65 20 25 7a 20 66 6f 72 6d 61 74 20 6f 66 20 73  e %z format of s
3eb0: 71 6c 69 74 65 5f 6d 70 72 69 6e 74 66 28 29 2e  qlite_mprintf().
3ec0: 20 20 55 73 65 20 6d 75 6c 74 69 70 6c 65 20 6d    Use multiple m
3ed0: 70 72 69 6e 74 66 28 29 20 63 61 6c 6c 73 20 74  printf() calls t
3ee0: 6f 20 0a 2a 2a 20 63 6f 6e 63 61 74 65 6e 61 74  o .** concatenat
3ef0: 65 20 61 72 67 30 20 74 68 72 6f 75 67 68 20 61  e arg0 through a
3f00: 72 67 6e 20 75 73 69 6e 67 20 73 65 70 61 72 61  rgn using separa
3f10: 74 6f 72 20 61 73 20 74 68 65 20 73 65 70 61 72  tor as the separ
3f20: 61 74 6f 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  ator..** Return 
3f30: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  the result..*/.s
3f40: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d  tatic int test_m
3f50: 70 72 69 6e 74 66 5f 7a 28 0a 20 20 76 6f 69 64  printf_z(.  void
3f60: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
3f70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3f80: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
3f90: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
3fa0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
3fb0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
3fc0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
3fd0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
3fe0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
3ff0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
4000: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
4010: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
4020: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75  ){.  char *zResu
4030: 6c 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  lt = 0;.  int i;
4040: 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 61  ..  for(i=2; i<a
4050: 72 67 63 20 26 26 20 28 69 3d 3d 32 20 7c 7c 20  rgc && (i==2 || 
4060: 7a 52 65 73 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a  zResult); i++){.
4070: 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 73 71      zResult = sq
4080: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
4090: 7a 25 73 25 73 22 2c 20 7a 52 65 73 75 6c 74 2c  z%s%s", zResult,
40a0: 20 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 69   argv[1], argv[i
40b0: 5d 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70  ]);.  }.  Tcl_Ap
40c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
40d0: 70 2c 20 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a  p, zResult, 0);.
40e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
40f0: 52 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72  Result);.  retur
4100: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4110: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
4120: 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73  e3_mprintf_n_tes
4130: 74 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20  t  STRING.**.** 
4140: 54 65 73 74 20 74 68 65 20 25 6e 20 66 6f 72 6d  Test the %n form
4150: 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72  at of sqlite_mpr
4160: 69 6e 74 66 28 29 2e 20 20 52 65 74 75 72 6e 20  intf().  Return 
4170: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
4180: 65 0a 2a 2a 20 69 6e 70 75 74 20 73 74 72 69 6e  e.** input strin
4190: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
41a0: 20 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 28   test_mprintf_n(
41b0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
41c0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
41d0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
41e0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
41f0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
4200: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
4210: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
4220: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4230: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
4240: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
4250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
4260: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
4270: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
4280: 20 2a 7a 53 74 72 3b 0a 20 20 69 6e 74 20 6e 20   *zStr;.  int n 
4290: 3d 20 30 3b 0a 20 20 7a 53 74 72 20 3d 20 73 71  = 0;.  zStr = sq
42a0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
42b0: 73 25 6e 22 2c 20 61 72 67 76 5b 31 5d 2c 20 26  s%n", argv[1], &
42c0: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  n);.  sqlite3_fr
42d0: 65 65 28 7a 53 74 72 29 3b 0a 20 20 54 63 6c 5f  ee(zStr);.  Tcl_
42e0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
42f0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
4300: 62 6a 28 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e  bj(n));.  return
4310: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
4320: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
4330: 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20  3_snprintf_int  
4340: 53 49 5a 45 20 46 4f 52 4d 41 54 20 20 49 4e 54  SIZE FORMAT  INT
4350: 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
4360: 6f 66 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  of sqlite3_snpri
4370: 6e 74 66 28 29 20 72 6f 75 74 69 6e 65 2e 20 20  ntf() routine.  
4380: 53 49 5a 45 20 69 73 20 74 68 65 20 73 69 7a 65  SIZE is the size
4390: 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75   of the.** outpu
43a0: 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
43b0: 73 2e 20 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  s.  The maximum 
43c0: 73 69 7a 65 20 69 73 20 31 30 30 2e 20 20 46 4f  size is 100.  FO
43d0: 52 4d 41 54 20 69 73 20 74 68 65 0a 2a 2a 20 66  RMAT is the.** f
43e0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20 20 49  ormat string.  I
43f0: 4e 54 20 69 73 20 61 20 73 69 6e 67 6c 65 20 69  NT is a single i
4400: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e  nteger argument.
4410: 20 20 54 68 65 20 46 4f 52 4d 41 54 0a 2a 2a 20    The FORMAT.** 
4420: 73 74 72 69 6e 67 20 6d 75 73 74 20 72 65 71 75  string must requ
4430: 69 72 65 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  ire no more than
4440: 20 74 68 69 73 20 6f 6e 65 20 69 6e 74 65 67 65   this one intege
4450: 72 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 0a  r argument.  If.
4460: 2a 2a 20 59 6f 75 20 70 61 73 73 20 69 6e 20 61  ** You pass in a
4470: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 74   format string t
4480: 68 61 74 20 72 65 71 75 69 72 65 73 20 6d 6f 72  hat requires mor
4490: 65 20 74 68 61 6e 20 6f 6e 65 20 61 72 67 75 6d  e than one argum
44a0: 65 6e 74 2c 0a 2a 2a 20 62 61 64 20 74 68 69 6e  ent,.** bad thin
44b0: 67 73 20 77 69 6c 6c 20 68 61 70 70 65 6e 2e 0a  gs will happen..
44c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
44d0: 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28  st_snprintf_int(
44e0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
44f0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
4500: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
4510: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
4520: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
4530: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
4540: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
4550: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4560: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
4570: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
4580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
4590: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
45a0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
45b0: 20 7a 53 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e   zStr[100];.  in
45c0: 74 20 6e 20 3d 20 61 74 6f 69 28 61 72 67 76 5b  t n = atoi(argv[
45d0: 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  1]);.  const cha
45e0: 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67  r *zFormat = arg
45f0: 76 5b 32 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d  v[2];.  int a1 =
4600: 20 61 74 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a   atoi(argv[3]);.
4610: 20 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a    if( n>sizeof(z
4620: 53 74 72 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f  Str) ) n = sizeo
4630: 66 28 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  f(zStr);.  sqlit
4640: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
4650: 6f 66 28 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20  of(zStr), zStr, 
4660: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
4670: 70 71 72 73 74 75 76 77 78 79 7a 22 29 3b 0a 20  pqrstuvwxyz");. 
4680: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4690: 66 28 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d  f(n, zStr, zForm
46a0: 61 74 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41  at, a1);.  Tcl_A
46b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
46c0: 72 70 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20  rp, zStr, 0);.  
46d0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
46e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
46f0: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a  _OMIT_GET_TABLE.
4700: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
4710: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
4720: 5f 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52  _printf  DB  FOR
4730: 4d 41 54 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d  MAT  STRING  ?--
4740: 6e 6f 2d 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a  no-counts?.**.**
4750: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
4760: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
4770: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
4780: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
4790: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
47a0: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
47b0: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
47c0: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
47d0: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
47e0: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
47f0: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
4800: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
4810: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
4820: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
4830: 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e  t_get_table_prin
4840: 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  tf(.  void *NotU
4850: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4860: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4870: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4880: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4890: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
48a0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
48b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
48c0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
48d0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
48e0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
48f0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4900: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
4910: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63  qlite3 *db;.  Tc
4920: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
4930: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
4940: 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74  *zErr = 0;.  int
4950: 20 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63   nRow, nCol;.  c
4960: 68 61 72 20 2a 2a 61 52 65 73 75 6c 74 3b 0a 20  har **aResult;. 
4970: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a   int i;.  char z
4980: 42 75 66 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20  Buf[30];.  char 
4990: 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 65 73  *zSql;.  int res
49a0: 43 6f 75 6e 74 20 3d 20 2d 31 3b 0a 20 20 69 66  Count = -1;.  if
49b0: 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20 20  ( argc==5 ){.   
49c0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
49d0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c  interp, argv[4],
49e0: 20 26 72 65 73 43 6f 75 6e 74 29 20 29 20 72 65   &resCount) ) re
49f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4a00: 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 21 3d    }.  if( argc!=
4a10: 34 20 26 26 20 61 72 67 63 21 3d 35 20 29 7b 0a  4 && argc!=5 ){.
4a20: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4a30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
4a40: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
4a50: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
4a60: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
4a70: 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 20 3f   FORMAT STRING ?
4a80: 43 4f 55 4e 54 3f 22 2c 20 30 29 3b 0a 20 20 20  COUNT?", 0);.   
4a90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4aa0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
4ab0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
4ac0: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
4ad0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
4ae0: 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  OR;.  Tcl_DStrin
4af0: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a  gInit(&str);.  z
4b00: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
4b10: 72 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 61 72  rintf(argv[2],ar
4b20: 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 61 72  gv[3]);.  if( ar
4b30: 67 63 3d 3d 35 20 29 7b 0a 20 20 20 20 72 63 20  gc==5 ){.    rc 
4b40: 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61  = sqlite3_get_ta
4b50: 62 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61  ble(db, zSql, &a
4b60: 52 65 73 75 6c 74 2c 20 30 2c 20 30 2c 20 26 7a  Result, 0, 0, &z
4b70: 45 72 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Err);.  }else{. 
4b80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4b90: 67 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53  get_table(db, zS
4ba0: 71 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 26 6e  ql, &aResult, &n
4bb0: 52 6f 77 2c 20 26 6e 43 6f 6c 2c 20 26 7a 45 72  Row, &nCol, &zEr
4bc0: 72 29 3b 0a 20 20 20 20 72 65 73 43 6f 75 6e 74  r);.    resCount
4bd0: 20 3d 20 28 6e 52 6f 77 2b 31 29 2a 6e 43 6f 6c   = (nRow+1)*nCol
4be0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
4bf0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70  free(zSql);.  sp
4c00: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
4c10: 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70  , rc);.  Tcl_App
4c20: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4c30: 70 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20  p, zBuf);.  if( 
4c40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4c50: 0a 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d 34  .    if( argc==4
4c60: 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74   ){.      sprint
4c70: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 52  f(zBuf, "%d", nR
4c80: 6f 77 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ow);.      Tcl_A
4c90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4ca0: 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  erp, zBuf);.    
4cb0: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
4cc0: 22 25 64 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  "%d", nCol);.   
4cd0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65     Tcl_AppendEle
4ce0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  ment(interp, zBu
4cf0: 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  f);.    }.    fo
4d00: 72 28 69 3d 30 3b 20 69 3c 72 65 73 43 6f 75 6e  r(i=0; i<resCoun
4d10: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  t; i++){.      T
4d20: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
4d30: 28 69 6e 74 65 72 70 2c 20 61 52 65 73 75 6c 74  (interp, aResult
4d40: 5b 69 5d 20 3f 20 61 52 65 73 75 6c 74 5b 69 5d  [i] ? aResult[i]
4d50: 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20   : "NULL");.    
4d60: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  }.  }else{.    T
4d70: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
4d80: 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 29 3b 0a  (interp, zErr);.
4d90: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
4da0: 65 65 5f 74 61 62 6c 65 28 61 52 65 73 75 6c 74  ee_table(aResult
4db0: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20  );.  if( zErr ) 
4dc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
4dd0: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
4de0: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
4df0: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
4e00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4e10: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
4e20: 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
4e30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54  QLITE_OMIT_GET_T
4e40: 41 42 4c 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  ABLE */.../*.** 
4e50: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
4e60: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
4e70: 64 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  d DB.**.** Retur
4e80: 6e 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 52  ns the integer R
4e90: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
4ea0: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a   recent insert..
4eb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
4ec0: 73 74 5f 6c 61 73 74 5f 72 6f 77 69 64 28 0a 20  st_last_rowid(. 
4ed0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4ee0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4ef0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4f00: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4f10: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4f20: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4f30: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4f40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4f50: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4f60: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
4f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
4f80: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4f90: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
4fa0: 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42  3 *db;.  char zB
4fb0: 75 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28 20 61  uf[30];..  if( a
4fc0: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
4fd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4fe0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
4ff0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
5000: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20  \"", argv[0], " 
5010: 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  DB\"", 0);.    r
5020: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5030: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
5040: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
5050: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
5060: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5070: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
5080: 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65  , "%lld", sqlite
5090: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
50a0: 77 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f  wid(db));.  Tcl_
50b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
50c0: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
50d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
50e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
50f0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 20  e:  sqlite3_key 
5100: 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74  DB KEY.**.** Set
5110: 20 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a   the codec key..
5120: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
5130: 73 74 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a  st_key(.  void *
5140: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
5150: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
5160: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
5170: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
5180: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
5190: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
51a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
51b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
51c0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
51d0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
51e0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
51f0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
5200: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
5210: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b    const char *zK
5220: 65 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a  ey;.  int nKey;.
5230: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
5240: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
5250: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
5260: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
5270: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
5280: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49  [0],.       " FI
5290: 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20  LENAME\"", 0);. 
52a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
52b0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
52c0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
52d0: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
52e0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
52f0: 52 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61  RROR;.  zKey = a
5300: 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d  rgv[2];.  nKey =
5310: 20 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23   strlen(zKey);.#
5320: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
5330: 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33  _CODEC.  sqlite3
5340: 5f 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e  _key(db, zKey, n
5350: 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  Key);.#endif.  r
5360: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
5370: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
5380: 71 6c 69 74 65 33 5f 72 65 6b 65 79 20 44 42 20  qlite3_rekey DB 
5390: 4b 45 59 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65  KEY.**.** Change
53a0: 20 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a   the codec key..
53b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
53c0: 73 74 5f 72 65 6b 65 79 28 0a 20 20 76 6f 69 64  st_rekey(.  void
53d0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
53e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
53f0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
5400: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
5410: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
5420: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
5430: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
5440: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
5450: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
5460: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
5470: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
5480: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
5490: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
54a0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
54b0: 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  zKey;.  int nKey
54c0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
54d0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
54e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
54f0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
5500: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
5510: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
5520: 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b  FILENAME\"", 0);
5530: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5540: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
5550: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
5560: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
5570: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
5580: 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d  _ERROR;.  zKey =
5590: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79   argv[2];.  nKey
55a0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b   = strlen(zKey);
55b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
55c0: 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69 74  AS_CODEC.  sqlit
55d0: 65 33 5f 72 65 6b 65 79 28 64 62 2c 20 7a 4b 65  e3_rekey(db, zKe
55e0: 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66  y, nKey);.#endif
55f0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
5600: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
5610: 3a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  :  sqlite3_close
5620: 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73   DB.**.** Closes
5630: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
5640: 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ened by sqlite3_
5650: 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  open..*/.static 
5660: 69 6e 74 20 73 71 6c 69 74 65 5f 74 65 73 74 5f  int sqlite_test_
5670: 63 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e  close(.  void *N
5680: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
5690: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
56a0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
56b0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
56c0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
56d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
56f0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
5700: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
5710: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
5720: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
5730: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
5740: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
5750: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
5760: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
5770: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
5780: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
5790: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
57a0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
57b0: 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c       " FILENAME\
57c0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
57d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
57e0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
57f0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
5800: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
5810: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5820: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c   rc = sqlite3_cl
5830: 6f 73 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53  ose(db);.  Tcl_S
5840: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
5850: 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
5860: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
5870: 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
5880: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
5890: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
58a0: 6f 66 20 74 68 65 20 78 5f 63 6f 61 6c 65 73 63  of the x_coalesc
58b0: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  e() function..**
58c0: 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 72 73   Return the firs
58d0: 74 20 61 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e  t argument non-N
58e0: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
58f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 5f  .static void t1_
5900: 69 66 6e 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71  ifnullFunc(.  sq
5910: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5920: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
5930: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
5940: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5950: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
5960: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
5970: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
5980: 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL!=sqlite3_val
5990: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29  ue_type(argv[i])
59a0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
59b0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
59c0: 62 79 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a  bytes(argv[i]);.
59d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
59e0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
59f0: 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  t, (char*)sqlite
5a00: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
5a10: 76 5b 69 5d 29 2c 0a 20 20 20 20 20 20 20 20 20  v[i]),.         
5a20: 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   n, SQLITE_TRANS
5a30: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65  IENT);.      bre
5a40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
5a50: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
5a60: 20 74 65 73 74 20 66 75 6e 63 74 69 6f 6e 73 2e   test functions.
5a70: 20 20 20 20 68 65 78 38 28 29 20 69 6e 74 65 72      hex8() inter
5a80: 70 72 65 74 73 20 69 74 73 20 61 72 67 75 6d 65  prets its argume
5a90: 6e 74 20 61 73 0a 2a 2a 20 55 54 46 38 20 61 6e  nt as.** UTF8 an
5aa0: 64 20 72 65 74 75 72 6e 73 20 61 20 68 65 78 20  d returns a hex 
5ab0: 65 6e 63 6f 64 69 6e 67 2e 20 20 68 65 78 31 36  encoding.  hex16
5ac0: 6c 65 28 29 20 69 6e 74 65 72 70 72 65 74 73 20  le() interprets 
5ad0: 69 74 73 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  its argument.** 
5ae0: 61 73 20 55 54 46 31 36 6c 65 20 61 6e 64 20 72  as UTF16le and r
5af0: 65 74 75 72 6e 73 20 61 20 68 65 78 20 65 6e 63  eturns a hex enc
5b00: 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  oding..*/.static
5b10: 20 76 6f 69 64 20 68 65 78 38 46 75 6e 63 28 73   void hex8Func(s
5b20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5b30: 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  p, int argc, sql
5b40: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5b50: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  v){.  const unsi
5b60: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
5b70: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42  int i;.  char zB
5b80: 75 66 5b 32 30 30 5d 3b 0a 20 20 7a 20 3d 20 73  uf[200];.  z = s
5b90: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5ba0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f  t(argv[0]);.  fo
5bb0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
5bc0: 7a 42 75 66 29 2f 32 20 2d 20 32 20 26 26 20 7a  zBuf)/2 - 2 && z
5bd0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  [i]; i++){.    s
5be0: 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69 2a 32  printf(&zBuf[i*2
5bf0: 5d 2c 20 22 25 30 32 78 22 2c 20 7a 5b 69 5d 26  ], "%02x", z[i]&
5c00: 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20 7a 42 75  0xff);.  }.  zBu
5c10: 66 5b 69 2a 32 5d 20 3d 20 30 3b 0a 20 20 73 71  f[i*2] = 0;.  sq
5c20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
5c30: 74 28 70 2c 20 28 63 68 61 72 2a 29 7a 42 75 66  t(p, (char*)zBuf
5c40: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
5c50: 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 69 66 6e 64  NSIENT);.}.#ifnd
5c60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
5c70: 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64  TF16.static void
5c80: 20 68 65 78 31 36 46 75 6e 63 28 73 71 6c 69 74   hex16Func(sqlit
5c90: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c 20 69  e3_context *p, i
5ca0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
5cb0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
5cc0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
5cd0: 20 73 68 6f 72 74 20 69 6e 74 20 2a 7a 3b 0a 20   short int *z;. 
5ce0: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a   int i;.  char z
5cf0: 42 75 66 5b 34 30 30 5d 3b 0a 20 20 7a 20 3d 20  Buf[400];.  z = 
5d00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
5d10: 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 20  xt16(argv[0]);. 
5d20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
5d30: 6f 66 28 7a 42 75 66 29 2f 34 20 2d 20 34 20 26  of(zBuf)/4 - 4 &
5d40: 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  & z[i]; i++){.  
5d50: 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b    sprintf(&zBuf[
5d60: 69 2a 34 5d 2c 20 22 25 30 34 78 22 2c 20 7a 5b  i*4], "%04x", z[
5d70: 69 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20  i]&0xff);.  }.  
5d80: 7a 42 75 66 5b 69 2a 34 5d 20 3d 20 30 3b 0a 20  zBuf[i*4] = 0;. 
5d90: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5da0: 74 65 78 74 28 70 2c 20 28 63 68 61 72 2a 29 7a  text(p, (char*)z
5db0: 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Buf, -1, SQLITE_
5dc0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65  TRANSIENT);.}.#e
5dd0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  ndif../*.** A st
5de0: 72 75 63 74 75 72 65 20 69 6e 74 6f 20 77 68 69  ructure into whi
5df0: 63 68 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65  ch to accumulate
5e00: 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 72 75 63 74   text..*/.struct
5e10: 20 64 73 74 72 20 7b 0a 20 20 69 6e 74 20 6e 41   dstr {.  int nA
5e20: 6c 6c 6f 63 3b 20 20 2f 2a 20 53 70 61 63 65 20  lloc;  /* Space 
5e30: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
5e40: 6e 74 20 6e 55 73 65 64 3b 20 20 20 2f 2a 20 53  nt nUsed;   /* S
5e50: 70 61 63 65 20 75 73 65 64 20 2a 2f 0a 20 20 63  pace used */.  c
5e60: 68 61 72 20 2a 7a 3b 20 20 20 20 20 2f 2a 20 54  har *z;     /* T
5e70: 68 65 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a  he space */.};..
5e80: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78  /*.** Append tex
5e90: 74 20 74 6f 20 61 20 64 73 74 72 0a 2a 2f 0a 73  t to a dstr.*/.s
5ea0: 74 61 74 69 63 20 76 6f 69 64 20 64 73 74 72 41  tatic void dstrA
5eb0: 70 70 65 6e 64 28 73 74 72 75 63 74 20 64 73 74  ppend(struct dst
5ec0: 72 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  r *p, const char
5ed0: 20 2a 7a 2c 20 69 6e 74 20 64 69 76 69 64 65 72   *z, int divider
5ee0: 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72  ){.  int n = str
5ef0: 6c 65 6e 28 7a 29 3b 0a 20 20 69 66 28 20 70 2d  len(z);.  if( p-
5f00: 3e 6e 55 73 65 64 20 2b 20 6e 20 2b 20 32 20 3e  >nUsed + n + 2 >
5f10: 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20   p->nAlloc ){.  
5f20: 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20    char *zNew;.  
5f30: 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d    p->nAlloc = p-
5f40: 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 20 2b 20  >nAlloc*2 + n + 
5f50: 32 30 30 3b 0a 20 20 20 20 7a 4e 65 77 20 3d 20  200;.    zNew = 
5f60: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
5f70: 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29  p->z, p->nAlloc)
5f80: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d  ;.    if( zNew==
5f90: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
5fa0: 65 33 5f 66 72 65 65 28 70 2d 3e 7a 29 3b 0a 20  e3_free(p->z);. 
5fb0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
5fc0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
5fd0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
5fe0: 20 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e   }.    p->z = zN
5ff0: 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 69  ew;.  }.  if( di
6000: 76 69 64 65 72 20 26 26 20 70 2d 3e 6e 55 73 65  vider && p->nUse
6010: 64 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 5b  d>0 ){.    p->z[
6020: 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 64 69  p->nUsed++] = di
6030: 76 69 64 65 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d  vider;.  }.  mem
6040: 63 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73  cpy(&p->z[p->nUs
6050: 65 64 5d 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20  ed], z, n+1);.  
6060: 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e 3b 0a 7d  p->nUsed += n;.}
6070: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 64 20  ../*.** Invoked 
6080: 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 62 61 63  for each callbac
6090: 6b 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 45 78  k from sqlite3Ex
60a0: 65 63 46 75 6e 63 0a 2a 2f 0a 73 74 61 74 69 63  ecFunc.*/.static
60b0: 20 69 6e 74 20 65 78 65 63 46 75 6e 63 43 61 6c   int execFuncCal
60c0: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74  lback(void *pDat
60d0: 61 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61  a, int argc, cha
60e0: 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a  r **argv, char *
60f0: 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 73 74 72  *NotUsed){.  str
6100: 75 63 74 20 64 73 74 72 20 2a 70 20 3d 20 28 73  uct dstr *p = (s
6110: 74 72 75 63 74 20 64 73 74 72 2a 29 70 44 61 74  truct dstr*)pDat
6120: 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  a;.  int i;.  fo
6130: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
6140: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67  ++){.    if( arg
6150: 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  v[i]==0 ){.     
6160: 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20 22   dstrAppend(p, "
6170: 4e 55 4c 4c 22 2c 20 27 20 27 29 3b 0a 20 20 20  NULL", ' ');.   
6180: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 73   }else{.      ds
6190: 74 72 41 70 70 65 6e 64 28 70 2c 20 61 72 67 76  trAppend(p, argv
61a0: 5b 69 5d 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d  [i], ' ');.    }
61b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
61c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
61d0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
61e0: 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20  x_sqlite_exec() 
61f0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
6200: 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 0a 2a  function takes.*
6210: 2a 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d  * a single argum
6220: 65 6e 74 20 61 6e 64 20 61 74 74 65 6d 70 74 73  ent and attempts
6230: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74   to execute that
6240: 20 61 72 67 75 6d 65 6e 74 20 61 73 20 53 51 4c   argument as SQL
6250: 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 69   code..** This i
6260: 73 20 69 6c 6c 65 67 61 6c 20 61 6e 64 20 73 68  s illegal and sh
6270: 6f 75 6c 64 20 73 65 74 20 74 68 65 20 53 51 4c  ould set the SQL
6280: 49 54 45 5f 4d 49 53 55 53 45 20 66 6c 61 67 20  ITE_MISUSE flag 
6290: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
62a0: 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d  .**.** 2004-Jan-
62b0: 30 37 3a 20 20 57 65 20 68 61 76 65 20 63 68 61  07:  We have cha
62c0: 6e 67 65 64 20 74 68 69 73 20 74 6f 20 6d 61 6b  nged this to mak
62d0: 65 20 69 74 20 6c 65 67 61 6c 20 74 6f 20 63 61  e it legal to ca
62e0: 6c 6c 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  ll sqlite3_exec(
62f0: 29 0a 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e  ).** from within
6300: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
6310: 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  .  .** .** This 
6320: 72 6f 75 74 69 6e 65 20 73 69 6d 75 6c 61 74 65  routine simulate
6330: 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
6340: 68 61 76 69 6e 67 20 74 77 6f 20 74 68 72 65 61  having two threa
6350: 64 73 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  ds attempt to.**
6360: 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 61   use the same da
6370: 74 61 62 61 73 65 20 61 74 20 74 68 65 20 73 61  tabase at the sa
6380: 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74  me time..*/.stat
6390: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  ic void sqlite3E
63a0: 78 65 63 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  xecFunc(.  sqlit
63b0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
63c0: 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63  ext, .  int argc
63d0: 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ,  .  sqlite3_va
63e0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
63f0: 73 74 72 75 63 74 20 64 73 74 72 20 78 3b 0a 20  struct dstr x;. 
6400: 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73   memset(&x, 0, s
6410: 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 28 76 6f  izeof(x));.  (vo
6420: 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
6430: 28 73 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65  (sqlite3*)sqlite
6440: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
6450: 65 78 74 29 2c 0a 20 20 20 20 20 20 28 63 68 61  ext),.      (cha
6460: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
6470: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a  _text(argv[0]),.
6480: 20 20 20 20 20 20 65 78 65 63 46 75 6e 63 43 61        execFuncCa
6490: 6c 6c 62 61 63 6b 2c 20 26 78 2c 20 30 29 3b 0a  llback, &x, 0);.
64a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
64b0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 78  _text(context, x
64c0: 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c 20 53 51 4c  .z, x.nUsed, SQL
64d0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
64e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 78    sqlite3_free(x
64f0: 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  .z);.}../*.** Im
6500: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
6510: 74 6b 74 32 32 31 33 66 75 6e 63 28 29 2c 20 61  tkt2213func(), a
6520: 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
6530: 20 74 68 61 74 20 74 61 6b 65 73 20 65 78 61 63   that takes exac
6540: 74 6c 79 0a 2a 2a 20 6f 6e 65 20 61 72 67 75 6d  tly.** one argum
6550: 65 6e 74 2e 20 49 74 20 68 61 73 20 74 77 6f 20  ent. It has two 
6560: 69 6e 74 65 72 65 73 74 69 6e 67 20 66 65 61 74  interesting feat
6570: 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 74  ures:.**.** * It
6580: 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 76   calls sqlite3_v
6590: 61 6c 75 65 5f 74 65 78 74 28 29 20 33 20 74 69  alue_text() 3 ti
65a0: 6d 65 73 20 6f 6e 20 74 68 65 20 61 72 67 75 6d  mes on the argum
65b0: 65 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ent sqlite3_valu
65c0: 65 2a 2e 0a 2a 2a 20 20 20 49 66 20 74 68 65 20  e*..**   If the 
65d0: 74 68 72 65 65 20 70 6f 69 6e 74 65 72 73 20 72  three pointers r
65e0: 65 74 75 72 6e 65 64 20 61 72 65 20 6e 6f 74 20  eturned are not 
65f0: 74 68 65 20 73 61 6d 65 20 61 6e 20 53 51 4c 20  the same an SQL 
6600: 65 72 72 6f 72 20 69 73 20 72 61 69 73 65 64 2e  error is raised.
6610: 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74 68 65 72 77 69  .**.** * Otherwi
6620: 73 65 20 69 74 20 72 65 74 75 72 6e 73 20 61 20  se it returns a 
6630: 63 6f 70 79 20 6f 66 20 74 68 65 20 74 65 78 74  copy of the text
6640: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6650: 6f 66 20 69 74 73 20 0a 2a 2a 20 20 20 61 72 67  of its .**   arg
6660: 75 6d 65 6e 74 20 69 6e 20 73 75 63 68 20 61 20  ument in such a 
6670: 77 61 79 20 61 73 20 74 68 65 20 56 44 42 45 20  way as the VDBE 
6680: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
6690: 73 20 61 20 4d 65 6d 2a 20 63 65 6c 6c 20 0a 2a  s a Mem* cell .*
66a0: 2a 20 20 20 77 69 74 68 20 74 68 65 20 4d 45 4d  *   with the MEM
66b0: 5f 54 65 72 6d 20 66 6c 61 67 20 63 6c 65 61 72  _Term flag clear
66c0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20  . .**.** Ticket 
66d0: 23 32 32 31 33 20 63 61 6e 20 74 68 65 72 65 66  #2213 can theref
66e0: 6f 72 65 20 62 65 20 74 65 73 74 65 64 20 62 79  ore be tested by
66f0: 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20   evaluating the 
6700: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 53 51 4c  following.** SQL
6710: 20 65 78 70 72 65 73 73 69 6f 6e 3a 0a 2a 2a 0a   expression:.**.
6720: 2a 2a 20 20 20 74 6b 74 32 32 31 33 66 75 6e 63  **   tkt2213func
6730: 28 74 6b 74 32 32 31 33 66 75 6e 63 28 27 61 20  (tkt2213func('a 
6740: 73 74 72 69 6e 67 27 29 29 3b 0a 2a 2f 0a 73 74  string'));.*/.st
6750: 61 74 69 63 20 76 6f 69 64 20 74 6b 74 32 32 31  atic void tkt221
6760: 33 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  3Function(.  sql
6770: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
6780: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72  ntext, .  int ar
6790: 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f  gc,  .  sqlite3_
67a0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
67b0: 20 20 69 6e 74 20 6e 54 65 78 74 3b 0a 20 20 75    int nText;.  u
67c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e  nsigned char con
67d0: 73 74 20 2a 7a 54 65 78 74 31 3b 0a 20 20 75 6e  st *zText1;.  un
67e0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73  signed char cons
67f0: 74 20 2a 7a 54 65 78 74 32 3b 0a 20 20 75 6e 73  t *zText2;.  uns
6800: 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74  igned char const
6810: 20 2a 7a 54 65 78 74 33 3b 0a 0a 20 20 6e 54 65   *zText3;..  nTe
6820: 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  xt = sqlite3_val
6830: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
6840: 29 3b 0a 20 20 7a 54 65 78 74 31 20 3d 20 73 71  );.  zText1 = sq
6850: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6860: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65  (argv[0]);.  zTe
6870: 78 74 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  xt2 = sqlite3_va
6880: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
6890: 29 3b 0a 20 20 7a 54 65 78 74 33 20 3d 20 73 71  );.  zText3 = sq
68a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
68b0: 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 69 66  (argv[0]);..  if
68c0: 28 20 7a 54 65 78 74 31 21 3d 7a 54 65 78 74 32  ( zText1!=zText2
68d0: 20 7c 7c 20 7a 54 65 78 74 32 21 3d 7a 54 65 78   || zText2!=zTex
68e0: 74 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t3 ){.    sqlite
68f0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
6900: 6f 6e 74 65 78 74 2c 20 22 74 6b 74 32 32 31 33  ontext, "tkt2213
6910: 20 69 73 20 6e 6f 74 20 66 69 78 65 64 22 2c 20   is not fixed", 
6920: 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
6930: 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20    char *zCopy = 
6940: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
6950: 6d 61 6c 6c 6f 63 28 6e 54 65 78 74 29 3b 0a 20  malloc(nText);. 
6960: 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c     memcpy(zCopy,
6970: 20 7a 54 65 78 74 31 2c 20 6e 54 65 78 74 29 3b   zText1, nText);
6980: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
6990: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
69a0: 2c 20 7a 43 6f 70 79 2c 20 6e 54 65 78 74 2c 20  , zCopy, nText, 
69b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
69c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
69d0: 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 66 75  following SQL fu
69e0: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 34 20 61  nction takes 4 a
69f0: 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 32  rguments.  The 2
6a00: 6e 64 20 61 6e 64 0a 2a 2a 20 34 74 68 20 61 72  nd and.** 4th ar
6a10: 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 6f  gument must be o
6a20: 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 69  ne of these stri
6a30: 6e 67 73 3a 20 20 27 74 65 78 74 27 2c 20 27 74  ngs:  'text', 't
6a40: 65 78 74 31 36 27 2c 0a 2a 2a 20 6f 72 20 27 62  ext16',.** or 'b
6a50: 6c 6f 62 27 20 63 6f 72 72 65 73 70 6f 6e 64 69  lob' correspondi
6a60: 6e 67 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69  ng to API functi
6a70: 6f 6e 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  ons.**.**      s
6a80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6a90: 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
6aa0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
6ab0: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
6ac0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 29 0a  e3_value_blob().
6ad0: 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20  **.** The third 
6ae0: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 74  argument is a st
6af0: 72 69 6e 67 2c 20 65 69 74 68 65 72 20 27 62 79  ring, either 'by
6b00: 74 65 73 27 20 6f 72 20 27 62 79 74 65 73 31 36  tes' or 'bytes16
6b10: 27 20 6f 72 20 27 6e 6f 6f 70 27 2c 0a 2a 2a 20  ' or 'noop',.** 
6b20: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
6b30: 20 41 50 49 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   APIs:.**.**    
6b40: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
6b50: 62 79 74 65 73 28 29 0a 2a 2a 20 20 20 20 20 20  bytes().**      
6b60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
6b70: 74 65 73 31 36 28 29 0a 2a 2a 20 20 20 20 20 20  tes16().**      
6b80: 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 41  noop.**.** The A
6b90: 50 49 73 20 64 65 73 69 67 6e 61 74 65 64 20 62  PIs designated b
6ba0: 79 20 74 68 65 20 32 6e 64 20 74 68 72 6f 75 67  y the 2nd throug
6bb0: 68 20 34 74 68 20 61 72 67 75 6d 65 6e 74 73 20  h 4th arguments 
6bc0: 61 72 65 20 61 70 70 6c 69 65 64 0a 2a 2a 20 74  are applied.** t
6bd0: 6f 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  o the first argu
6be0: 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 2e 20 20  ment in order.  
6bf0: 49 66 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  If the pointers 
6c00: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a  returned by the.
6c10: 2a 2a 20 73 65 63 6f 6e 64 20 61 6e 64 20 66 6f  ** second and fo
6c20: 75 72 74 68 20 61 72 65 20 64 69 66 66 65 72 65  urth are differe
6c30: 6e 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nt, this routine
6c40: 20 72 65 74 75 72 6e 73 20 31 2e 20 20 4f 74 68   returns 1.  Oth
6c50: 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68 69 73 20  erwise,.** this 
6c60: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6c70: 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  0..**.** This fu
6c80: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
6c90: 6f 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68  o test to see wh
6ca0: 65 6e 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  en returned poin
6cb0: 74 65 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ters from.** the
6cc0: 20 5f 74 65 78 74 28 29 2c 20 5f 74 65 78 74 31   _text(), _text1
6cd0: 36 28 29 20 61 6e 64 20 5f 62 6c 6f 62 28 29 20  6() and _blob() 
6ce0: 41 50 49 73 20 62 65 63 6f 6d 65 20 69 6e 76 61  APIs become inva
6cf0: 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  lidated..*/.stat
6d00: 69 63 20 76 6f 69 64 20 70 74 72 43 68 6e 67 46  ic void ptrChngF
6d10: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
6d20: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
6d30: 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63  ext, .  int argc
6d40: 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ,  .  sqlite3_va
6d50: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
6d60: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20  const void *p1, 
6d70: 2a 70 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *p2;.  const cha
6d80: 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 66 28 20 61  r *zCmd;.  if( a
6d90: 72 67 63 21 3d 34 20 29 20 72 65 74 75 72 6e 3b  rgc!=4 ) return;
6da0: 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74  .  zCmd = (const
6db0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
6dc0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
6dd0: 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  ]);.  if( zCmd==
6de0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
6df0: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74  ( strcmp(zCmd,"t
6e00: 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ext")==0 ){.    
6e10: 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p1 = (const void
6e20: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6e30: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23  text(argv[0]);.#
6e40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6e50: 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65  IT_UTF16.  }else
6e60: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6e70: 2c 20 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29  , "text16")==0 )
6e80: 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73  {.    p1 = (cons
6e90: 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  t void*)sqlite3_
6ea0: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67  value_text16(arg
6eb0: 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  v[0]);.#endif.  
6ec0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6ed0: 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d  (zCmd, "blob")==
6ee0: 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63  0 ){.    p1 = (c
6ef0: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
6f00: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
6f10: 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  gv[0]);.  }else{
6f20: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6f30: 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74  .  zCmd = (const
6f40: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
6f50: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32  alue_text(argv[2
6f60: 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  ]);.  if( zCmd==
6f70: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
6f80: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 62  ( strcmp(zCmd,"b
6f90: 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ytes")==0 ){.   
6fa0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
6fb0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 23  ytes(argv[0]);.#
6fc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6fd0: 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65  IT_UTF16.  }else
6fe0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6ff0: 2c 20 22 62 79 74 65 73 31 36 22 29 3d 3d 30 20  , "bytes16")==0 
7000: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
7010: 61 6c 75 65 5f 62 79 74 65 73 31 36 28 61 72 67  alue_bytes16(arg
7020: 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  v[0]);.#endif.  
7030: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
7040: 28 7a 43 6d 64 2c 20 22 6e 6f 6f 70 22 29 3d 3d  (zCmd, "noop")==
7050: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 20 6e  0 ){.    /* do n
7060: 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73  othing */.  }els
7070: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  e{.    return;. 
7080: 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e   }.  zCmd = (con
7090: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
70a0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
70b0: 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64  [3]);.  if( zCmd
70c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
70d0: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
70e0: 22 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "text")==0 ){.  
70f0: 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f    p2 = (const vo
7100: 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  id*)sqlite3_valu
7110: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
7120: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7130: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c  OMIT_UTF16.  }el
7140: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  se if( strcmp(zC
7150: 6d 64 2c 20 22 74 65 78 74 31 36 22 29 3d 3d 30  md, "text16")==0
7160: 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f   ){.    p2 = (co
7170: 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65  nst void*)sqlite
7180: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61  3_value_text16(a
7190: 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a  rgv[0]);.#endif.
71a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
71b0: 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29  mp(zCmd, "blob")
71c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  ==0 ){.    p2 = 
71d0: 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c  (const void*)sql
71e0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
71f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73  argv[0]);.  }els
7200: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  e{.    return;. 
7210: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
7220: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
7230: 20 70 31 21 3d 70 32 29 3b 0a 7d 0a 0a 0a 2f 2a   p1!=p2);.}.../*
7240: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
7250: 74 65 5f 74 65 73 74 5f 63 72 65 61 74 65 5f 66  te_test_create_f
7260: 75 6e 63 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a  unction DB.**.**
7270: 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65   Call the sqlite
7280: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7290: 6e 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76  n API on the giv
72a0: 65 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f  en database in o
72b0: 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74  rder.** to creat
72c0: 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  e a function nam
72d0: 65 64 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e  ed "x_coalesce".
72e0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
72f0: 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 74 68  does the same th
7300: 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20 22 63  ing.** as the "c
7310: 6f 61 6c 65 73 63 65 22 20 66 75 6e 63 74 69 6f  oalesce" functio
7320: 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  n.  This functio
7330: 6e 20 61 6c 73 6f 20 72 65 67 69 73 74 65 72 73  n also registers
7340: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
7350: 0a 2a 2a 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c  .** named "x_sql
7360: 69 74 65 5f 65 78 65 63 22 20 74 68 61 74 20 69  ite_exec" that i
7370: 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 65  nvokes sqlite3_e
7380: 78 65 63 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67  xec().  Invoking
7390: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a   sqlite3_exec().
73a0: 2a 2a 20 69 6e 20 74 68 69 73 20 77 61 79 20 69  ** in this way i
73b0: 73 20 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73  s illegal recurs
73c0: 69 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 72  ion and should r
73d0: 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d  aise an SQLITE_M
73e0: 49 53 55 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20  ISUSE error..** 
73f0: 54 68 65 20 65 66 66 65 63 74 20 69 73 20 73 69  The effect is si
7400: 6d 69 6c 61 72 20 74 6f 20 74 72 79 69 6e 67 20  milar to trying 
7410: 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  to use the same 
7420: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
7430: 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20  ion from.** two 
7440: 74 68 72 65 61 64 73 20 61 74 20 74 68 65 20 73  threads at the s
7450: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
7460: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74  The original mot
7470: 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  ivation for this
7480: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20   routine was to 
7490: 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20  be able to call 
74a0: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63  the.** sqlite3_c
74b0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66  reate_function f
74c0: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20  unction while a 
74d0: 71 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67  query is in prog
74e0: 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  ress in order.**
74f0: 20 74 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c   to test the SQL
7500: 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63  ITE_MISUSE detec
7510: 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73  tion logic..*/.s
7520: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
7530: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
7540: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
7550: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
7560: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
7570: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
7580: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
7590: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
75a0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
75b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
75c0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
75d0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
75e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
75f0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
7600: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
7610: 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
7620: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
7630: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
7640: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7650: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
7660: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
7670: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
7680: 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20   DB\"", 0);.    
7690: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
76a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
76b0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
76c0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
76d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
76e0: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
76f0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7700: 6e 28 64 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63  n(db, "x_coalesc
7710: 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41  e", -1, SQLITE_A
7720: 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  NY, 0, .        
7730: 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30  t1_ifnullFunc, 0
7740: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
7750: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7760: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7770: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7780: 2c 20 22 68 65 78 38 22 2c 20 31 2c 20 53 51 4c  , "hex8", 1, SQL
7790: 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20  ITE_ANY, 0, .   
77a0: 20 20 20 20 20 20 20 68 65 78 38 46 75 6e 63 2c         hex8Func,
77b0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 6e   0, 0);.  }.#ifn
77c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
77d0: 55 54 46 31 36 0a 20 20 69 66 28 20 72 63 3d 3d  UTF16.  if( rc==
77e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
77f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7800: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7810: 2c 20 22 68 65 78 31 36 22 2c 20 31 2c 20 53 51  , "hex16", 1, SQ
7820: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20  LITE_ANY, 0, .  
7830: 20 20 20 20 20 20 20 20 68 65 78 31 36 46 75 6e          hex16Fun
7840: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  c, 0, 0);.  }.#e
7850: 6e 64 69 66 0a 20 20 69 66 28 20 72 63 3d 3d 53  ndif.  if( rc==S
7860: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7870: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7880: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7890: 20 22 74 6b 74 32 32 31 33 66 75 6e 63 22 2c 20   "tkt2213func", 
78a0: 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30  1, SQLITE_ANY, 0
78b0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 74 6b 74  , .          tkt
78c0: 32 32 31 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  2213Function, 0,
78d0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
78e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
78f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7900: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7910: 28 64 62 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68  (db, "pointer_ch
7920: 61 6e 67 65 22 2c 20 34 2c 20 53 51 4c 49 54 45  ange", 4, SQLITE
7930: 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20  _ANY, 0, .      
7940: 20 20 20 20 70 74 72 43 68 6e 67 46 75 6e 63 74      ptrChngFunct
7950: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ion, 0, 0);.  }.
7960: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7970: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20  OMIT_UTF16.  /* 
7980: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  Use the sqlite3_
7990: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31  create_function1
79a0: 36 28 29 20 41 50 49 20 68 65 72 65 2e 20 4d 61  6() API here. Ma
79b0: 69 6e 6c 79 20 66 6f 72 20 66 75 6e 2c 20 62 75  inly for fun, bu
79c0: 74 20 61 6c 73 6f 20 0a 20 20 2a 2a 20 62 65 63  t also .  ** bec
79d0: 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 74  ause it is not t
79e0: 65 73 74 65 64 20 61 6e 79 77 68 65 72 65 20 65  ested anywhere e
79f0: 6c 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  lse. */.  if( rc
7a00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7a10: 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
7a20: 55 74 66 31 36 3b 0a 20 20 20 20 73 71 6c 69 74  Utf16;.    sqlit
7a30: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
7a40: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
7a50: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
7a60: 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  x);.    pVal = s
7a70: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
7a80: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
7a90: 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
7aa0: 20 2d 31 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65   -1, "x_sqlite_e
7ab0: 78 65 63 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  xec", SQLITE_UTF
7ac0: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
7ad0: 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d 20  );.    zUtf16 = 
7ae0: 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
7af0: 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
7b00: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20  F16NATIVE);.    
7b10: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7b20: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
7b30: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7b40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7b50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
7b60: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
7b70: 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 0a 20 20  (db, zUtf16, .  
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
7b90: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 64   SQLITE_UTF16, d
7ba0: 62 2c 20 73 71 6c 69 74 65 33 45 78 65 63 46 75  b, sqlite3ExecFu
7bb0: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  nc, 0, 0);.    }
7bc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
7bd0: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20  eFree(pVal);.   
7be0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
7bf0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
7c00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
7c10: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
7c20: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
7c30: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
7c40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
7c50: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
7c60: 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
7c70: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
7c80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
7c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  }../*.** Routine
7ca0: 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
7cb0: 68 65 20 78 5f 63 6f 75 6e 74 28 29 20 61 67 67  he x_count() agg
7cc0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
7cd0: 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f 75 6e 74 28 29  .**.** x_count()
7ce0: 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62   counts the numb
7cf0: 65 72 20 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c 20 61  er of non-null a
7d00: 72 67 75 6d 65 6e 74 73 2e 20 20 42 75 74 20 74  rguments.  But t
7d10: 68 65 72 65 20 61 72 65 0a 2a 2a 20 73 6f 6d 65  here are.** some
7d20: 20 74 77 69 73 74 73 20 66 6f 72 20 74 65 73 74   twists for test
7d30: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a  ing purposes..**
7d40: 0a 2a 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d  .** If the argum
7d50: 65 6e 74 20 74 6f 20 78 5f 63 6f 75 6e 74 28 29  ent to x_count()
7d60: 20 69 73 20 34 30 20 74 68 65 6e 20 61 20 55 54   is 40 then a UT
7d70: 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65 70  F-8 error is rep
7d80: 6f 72 74 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  orted.** on the 
7d90: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20  step function.  
7da0: 49 66 20 78 5f 63 6f 75 6e 74 28 34 31 29 20 69  If x_count(41) i
7db0: 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 61 20 55  s seen, then a U
7dc0: 54 46 2d 31 36 20 65 72 72 6f 72 0a 2a 2a 20 69  TF-16 error.** i
7dd0: 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68  s reported on th
7de0: 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e  e step function.
7df0: 20 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 63    If the total c
7e00: 6f 75 6e 74 20 69 73 20 34 32 2c 20 74 68 65 6e  ount is 42, then
7e10: 0a 2a 2a 20 61 20 55 54 46 2d 38 20 65 72 72 6f  .** a UTF-8 erro
7e20: 72 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f 6e  r is reported on
7e30: 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 20 66 75   the finalize fu
7e40: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  nction..*/.typed
7e50: 65 66 20 73 74 72 75 63 74 20 74 31 43 6f 75 6e  ef struct t1Coun
7e60: 74 43 74 78 20 74 31 43 6f 75 6e 74 43 74 78 3b  tCtx t1CountCtx;
7e70: 0a 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74 43  .struct t1CountC
7e80: 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b  tx {.  int n;.};
7e90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 43  .static void t1C
7ea0: 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c 69  ountStep(.  sqli
7eb0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
7ec0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
7ed0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
7ee0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 74 31  e **argv.){.  t1
7ef0: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
7f00: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
7f10: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
7f20: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
7f30: 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d  );.  if( (argc==
7f40: 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  0 || SQLITE_NULL
7f50: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
7f60: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20  type(argv[0]) ) 
7f70: 26 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  && p ){.    p->n
7f80: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72  ++;.  }.  if( ar
7f90: 67 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  gc>0 ){.    int 
7fa0: 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
7fb0: 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a  e_int(argv[0]);.
7fc0: 20 20 20 20 69 66 28 20 76 3d 3d 34 30 20 29 7b      if( v==40 ){
7fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7fe0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
7ff0: 65 78 74 2c 20 22 76 61 6c 75 65 20 6f 66 20 34  ext, "value of 4
8000: 30 20 68 61 6e 64 65 64 20 74 6f 20 78 5f 63 6f  0 handed to x_co
8010: 75 6e 74 22 2c 20 2d 31 29 3b 0a 23 69 66 6e 64  unt", -1);.#ifnd
8020: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
8030: 54 46 31 36 0a 20 20 20 20 7d 65 6c 73 65 20 69  TF16.    }else i
8040: 66 28 20 76 3d 3d 34 31 20 29 7b 0a 20 20 20 20  f( v==41 ){.    
8050: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 55 74    const char zUt
8060: 66 31 36 45 72 72 4d 73 67 5b 5d 20 3d 20 7b 20  f16ErrMsg[] = { 
8070: 30 2c 20 30 78 36 31 2c 20 30 2c 20 30 78 36 32  0, 0x61, 0, 0x62
8080: 2c 20 30 2c 20 30 78 36 33 2c 20 30 2c 20 30 2c  , 0, 0x63, 0, 0,
8090: 20 30 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0};.      sqlit
80a0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 31  e3_result_error1
80b0: 36 28 63 6f 6e 74 65 78 74 2c 20 26 7a 55 74 66  6(context, &zUtf
80c0: 31 36 45 72 72 4d 73 67 5b 31 2d 53 51 4c 49 54  16ErrMsg[1-SQLIT
80d0: 45 5f 42 49 47 45 4e 44 49 41 4e 5d 2c 20 2d 31  E_BIGENDIAN], -1
80e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
80f0: 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20    }.}   .static 
8100: 76 6f 69 64 20 74 31 43 6f 75 6e 74 46 69 6e 61  void t1CountFina
8110: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
8120: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
8130: 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b    t1CountCtx *p;
8140: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
8150: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
8160: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
8170: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
8180: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d  {.    if( p->n==
8190: 34 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  42 ){.      sqli
81a0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
81b0: 28 63 6f 6e 74 65 78 74 2c 20 22 78 5f 63 6f 75  (context, "x_cou
81c0: 6e 74 20 74 6f 74 61 6c 73 20 74 6f 20 34 32 22  nt totals to 42"
81d0: 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , -1);.    }else
81e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
81f0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
8200: 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30  xt, p ? p->n : 0
8210: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
8220: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8230: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 73  MIT_DEPRECATED.s
8240: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63  tatic void legac
8250: 79 43 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71  yCountStep(.  sq
8260: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
8270: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
8280: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
8290: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
82a0: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73  /* no-op */.}..s
82b0: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63  tatic void legac
82c0: 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73  yCountFinalize(s
82d0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
82e0: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69  context){.  sqli
82f0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
8300: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
8310: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
8320: 63 6f 6e 74 65 78 74 29 29 3b 0a 7d 0a 23 65 6e  context));.}.#en
8330: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
8340: 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  :  sqlite3_creat
8350: 65 5f 61 67 67 72 65 67 61 74 65 20 44 42 0a 2a  e_aggregate DB.*
8360: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
8370: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
8380: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
8390: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
83a0: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
83b0: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
83c0: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22   named "x_count"
83d0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
83e0: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
83f0: 6f 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63  o the built-in c
8400: 6f 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2c  ount() function,
8410: 20 77 69 74 68 20 61 20 66 65 77 20 73 70 65 63   with a few spec
8420: 69 61 6c 20 71 75 69 72 6b 73 0a 2a 2a 20 66 6f  ial quirks.** fo
8430: 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 73 71  r testing the sq
8440: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
8450: 6f 72 28 29 20 41 50 49 73 2e 0a 2a 2a 0a 2a 2a  or() APIs..**.**
8460: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f   The original mo
8470: 74 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69  tivation for thi
8480: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f  s routine was to
8490: 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c   be able to call
84a0: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
84b0: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
84c0: 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
84d0: 61 20 71 75 65 72 79 20 69 73 20 69 6e 20 70 72  a query is in pr
84e0: 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a  ogress in order.
84f0: 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 53  ** to test the S
8500: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74  QLITE_MISUSE det
8510: 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 53  ection logic.  S
8520: 65 65 20 6d 69 73 75 73 65 2e 74 65 73 74 2e 0a  ee misuse.test..
8530: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8540: 6e 65 20 77 61 73 20 6c 61 74 65 72 20 65 78 74  ne was later ext
8550: 65 6e 64 65 64 20 74 6f 20 74 65 73 74 20 74 68  ended to test th
8560: 65 20 75 73 65 20 6f 66 20 73 71 6c 69 74 65 33  e use of sqlite3
8570: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 0a  _result_error().
8580: 2a 2a 20 77 69 74 68 69 6e 20 61 67 67 72 65 67  ** within aggreg
8590: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
85a0: 2a 0a 2a 2a 20 4c 61 74 65 72 3a 20 49 74 20 69  *.** Later: It i
85b0: 73 20 6e 6f 77 20 61 6c 73 6f 20 65 78 74 65 6e  s now also exten
85c0: 64 65 64 20 74 6f 20 72 65 67 69 73 74 65 72 20  ded to register 
85d0: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
85e0: 6e 63 74 69 6f 6e 0a 2a 2a 20 22 6c 65 67 61 63  nction.** "legac
85f0: 79 5f 63 6f 75 6e 74 28 29 22 20 77 69 74 68 20  y_count()" with 
8600: 74 68 65 20 73 75 70 70 6c 69 65 64 20 64 61 74  the supplied dat
8610: 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68  abase handle. Th
8620: 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  is is used.** to
8630: 20 74 65 73 74 20 74 68 65 20 64 65 70 72 65 63   test the deprec
8640: 61 74 65 64 20 73 71 6c 69 74 65 33 5f 61 67 67  ated sqlite3_agg
8650: 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 29 20 41  regate_count() A
8660: 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  PI..*/.static in
8670: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  t test_create_ag
8680: 67 72 65 67 61 74 65 28 0a 20 20 76 6f 69 64 20  gregate(.  void 
8690: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
86a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
86b0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
86c0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
86d0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
86e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
86f0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
8700: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
8710: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
8720: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
8730: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
8740: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
8750: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
8760: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
8770: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
8780: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8790: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
87a0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
87b0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
87c0: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
87d0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
87e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
87f0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
8800: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
8810: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
8820: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8830: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
8840: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
8850: 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30  db, "x_count", 0
8860: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
8870: 2c 20 30 2c 0a 20 20 20 20 20 20 74 31 43 6f 75  , 0,.      t1Cou
8880: 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69  ntStep,t1CountFi
8890: 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  nalize);.  if( r
88a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
88b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
88c0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
88d0: 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20  (db, "x_count", 
88e0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
88f0: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 74 31  0, 0,.        t1
8900: 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e  CountStep,t1Coun
8910: 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 7d 0a  tFinalize);.  }.
8920: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8930: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
8940: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8950: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
8960: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
8970: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c 65 67 61  nction(db, "lega
8980: 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51  cy_count", 0, SQ
8990: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 30 2c 0a  LITE_ANY, 0, 0,.
89a0: 20 20 20 20 20 20 20 20 6c 65 67 61 63 79 43 6f          legacyCo
89b0: 75 6e 74 53 74 65 70 2c 20 6c 65 67 61 63 79 43  untStep, legacyC
89c0: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a 20 20 20  ountFinalize.   
89d0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
89e0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
89f0: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
8a00: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
8a10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
8a20: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
8a30: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
8a40: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
8a50: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
8a60: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
8a70: 65 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54 0a  e:  printf TEXT.
8a80: 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70 75  **.** Send outpu
8a90: 74 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55 73  t to printf.  Us
8aa0: 65 20 74 68 69 73 20 72 61 74 68 65 72 20 74 68  e this rather th
8ab0: 61 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67 65  an puts to merge
8ac0: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
8ad0: 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 65  n the correct se
8ae0: 71 75 65 6e 63 65 20 77 69 74 68 20 64 65 62 75  quence with debu
8af0: 67 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69 6e  gging printfs in
8b00: 73 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63 6f  serted into C co
8b10: 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65 73  de..** Puts uses
8b20: 20 61 20 73 65 70 61 72 61 74 65 20 62 75 66 66   a separate buff
8b30: 65 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  er and debugging
8b40: 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c 6c   statements will
8b50: 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73 65   be out of.** se
8b60: 71 75 65 6e 63 65 20 69 66 20 69 74 20 69 73 20  quence if it is 
8b70: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
8b80: 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 66 28  int test_printf(
8b90: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
8ba0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
8bb0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
8bc0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
8bd0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
8be0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
8bf0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
8c00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8c10: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
8c20: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
8c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
8c40: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
8c50: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ent */.){.  if( 
8c60: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
8c70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8c80: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
8c90: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
8ca0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
8cb0: 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c        " TEXT\"",
8cc0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8cd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8ce0: 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20   printf("%s\n", 
8cf0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74 75  argv[1]);.  retu
8d00: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  rn TCL_OK;.}....
8d10: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8d20: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8d30: 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  t FORMAT INTEGER
8d40: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
8d50: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
8d60: 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20 69  ntf with three i
8d70: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
8d80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8d90: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
8da0: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
8db0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
8dc0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
8dd0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
8de0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
8df0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
8e00: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
8e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8e20: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8e30: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
8e40: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
8e50: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
8e60: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
8e70: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68  nt a[3], i;.  ch
8e80: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
8e90: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
8ea0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8eb0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
8ec0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
8ed0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
8ee0: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
8ef0: 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a  INT INT\"", 0);.
8f00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8f10: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
8f20: 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a  i=2; i<5; i++){.
8f30: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
8f40: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
8f50: 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72  i], &a[i-2]) ) r
8f60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8f70: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
8f80: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
8f90: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
8fa0: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
8fb0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8fc0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
8fd0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
8fe0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8ff0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
9000: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
9010: 74 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  t64 FORMAT INTEG
9020: 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  ER INTEGER INTEG
9030: 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  ER.**.** Call mp
9040: 72 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65  rintf with three
9050: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
9060: 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  arguments.*/.sta
9070: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
9080: 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20  mprintf_int64(. 
9090: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
90a0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
90b0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
90c0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
90d0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
90e0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
90f0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
9100: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9110: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
9120: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
9130: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
9140: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
9150: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
9160: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
9170: 61 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  a[3];.  char *z;
9180: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
9190: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
91a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
91b0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
91c0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
91d0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
91e0: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e  ORMAT INT INT IN
91f0: 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T\"", 0);.    re
9200: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9210: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
9220: 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <5; i++){.    if
9230: 28 20 21 73 71 6c 69 74 65 33 41 74 6f 69 36 34  ( !sqlite3Atoi64
9240: 28 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32  (argv[i], &a[i-2
9250: 5d 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ]) ){.      Tcl_
9260: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9270: 65 72 70 2c 20 22 61 72 67 75 6d 65 6e 74 20 69  erp, "argument i
9280: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 36 34  s not a valid 64
9290: 2d 62 69 74 20 69 6e 74 65 67 65 72 22 2c 20 30  -bit integer", 0
92a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
92b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
92c0: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
92d0: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
92e0: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
92f0: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
9300: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9310: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
9320: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
9330: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9340: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
9350: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
9360: 6e 67 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ng FORMAT INTEGE
9370: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
9380: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
9390: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
93a0: 6c 6f 6e 67 20 69 6e 74 65 67 65 72 20 61 72 67  long integer arg
93b0: 75 6d 65 6e 74 73 2e 20 20 20 54 68 69 73 20 6d  uments.   This m
93c0: 69 67 68 74 20 62 65 20 74 68 65 0a 2a 2a 20 73  ight be the.** s
93d0: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 6d  ame as sqlite3_m
93e0: 70 72 69 6e 74 66 5f 69 6e 74 20 6f 72 20 73 71  printf_int or sq
93f0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
9400: 74 36 34 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  t64, depending o
9410: 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 2e 0a 2a  n.** platform..*
9420: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
9430: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e  ite3_mprintf_lon
9440: 67 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  g(.  void *NotUs
9450: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
9460: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
9470: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
9480: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
9490: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
94a0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
94b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
94c0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
94d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
94e0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
94f0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
9500: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
9510: 74 20 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74 20  t i;.  long int 
9520: 61 5b 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33 5d  a[3];.  int b[3]
9530: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
9540: 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20  f( argc!=5 ){.  
9550: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9560: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
9570: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
9580: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
9590: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
95a0: 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22  T INT INT INT\""
95b0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
95c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
95d0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20    for(i=2; i<5; 
95e0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
95f0: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
9600: 20 61 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d 32   argv[i], &b[i-2
9610: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
9620: 45 52 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d 32  ERROR;.    a[i-2
9630: 5d 20 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62 5b  ] = (long int)b[
9640: 69 2d 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32 5d  i-2];.    a[i-2]
9650: 20 26 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 28   &= (((u64)1)<<(
9660: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29 2d  sizeof(int)*8))-
9670: 31 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  1;.  }.  z = sql
9680: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
9690: 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[1], a[0], a[1]
96a0: 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[2]);.  Tcl_A
96b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
96c0: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
96d0: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
96e0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
96f0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
9700: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
9710: 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  str FORMAT INTEG
9720: 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e  ER INTEGER STRIN
9730: 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  G.**.** Call mpr
9740: 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e  intf with two in
9750: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20  teger arguments 
9760: 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61  and one string a
9770: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  rgument.*/.stati
9780: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
9790: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
97a0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
97b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
97c0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
97d0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
97e0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
97f0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9800: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9810: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9820: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9830: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9840: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
9850: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
9860: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
9870: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
9880: 69 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72  if( argc<4 || ar
9890: 67 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  gc>5 ){.    Tcl_
98a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
98b0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
98c0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
98d0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
98e0: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
98f0: 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c  INT ?STRING?\"",
9900: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
9910: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9920: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
9930: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
9940: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
9950: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
9960: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
9970: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
9980: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9990: 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61  argv[1], a[0], a
99a0: 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72  [1], argc>4 ? ar
99b0: 67 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20  gv[4] : NULL);. 
99c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
99d0: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
99e0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
99f0: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
9a00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
9a10: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e  age:  sqlite3_sn
9a20: 70 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47  printf_str INTEG
9a30: 45 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ER FORMAT INTEGE
9a40: 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47  R INTEGER STRING
9a50: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
9a60: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
9a70: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
9a80: 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72  nd one string ar
9a90: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
9aa0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 70   int sqlite3_snp
9ab0: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
9ac0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9ad0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9ae0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9af0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9b00: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9b10: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9b20: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9b30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9b40: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9b50: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9b60: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
9b70: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
9b80: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
9b90: 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68  i;.  int n;.  ch
9ba0: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
9bb0: 63 3c 35 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b  c<5 || argc>6 ){
9bc0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9bd0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
9be0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
9bf0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
9c00: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 4e  [0],.       " IN
9c10: 54 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  T FORMAT INT INT
9c20: 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29   ?STRING?\"", 0)
9c30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9c40: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
9c50: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
9c60: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e  erp, argv[1], &n
9c70: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
9c80: 52 52 4f 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20  RROR;.  if( n<0 
9c90: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
9ca0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9cb0: 22 4e 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e  "N must be non-n
9cc0: 65 67 61 74 69 76 65 22 2c 20 30 29 3b 0a 20 20  egative", 0);.  
9cd0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9ce0: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
9cf0: 33 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20  3; i<5; i++){.  
9d00: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
9d10: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
9d20: 2c 20 26 61 5b 69 2d 33 5d 29 20 29 20 72 65 74  , &a[i-3]) ) ret
9d30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9d40: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
9d50: 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a  _malloc( n+1 );.
9d60: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9d70: 74 66 28 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d  tf(n, z, argv[2]
9d80: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72  , a[0], a[1], ar
9d90: 67 63 3e 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a  gc>4 ? argv[5] :
9da0: 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70   NULL);.  Tcl_Ap
9db0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9dc0: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
9dd0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
9de0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
9df0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
9e00: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
9e10: 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54  ouble FORMAT INT
9e20: 45 47 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55  EGER INTEGER DOU
9e30: 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  BLE.**.** Call m
9e40: 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20  printf with two 
9e50: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
9e60: 73 20 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65  s and one double
9e70: 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61   argument.*/.sta
9e80: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
9e90: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a  mprintf_double(.
9ea0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
9eb0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9ec0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9ed0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9ee0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9ef0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9f00: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9f10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9f20: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
9f30: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
9f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
9f50: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
9f60: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
9f70: 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65  [3], i;.  double
9f80: 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   r;.  char *z;. 
9f90: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
9fa0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9fb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
9fc0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
9fd0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
9fe0: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
9ff0: 4d 41 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42  MAT INT INT DOUB
a000: 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  LE\"", 0);.    r
a010: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a020: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
a030: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
a040: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
a050: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
a060: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
a070: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a080: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75    if( Tcl_GetDou
a090: 62 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ble(interp, argv
a0a0: 5b 34 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72  [4], &r) ) retur
a0b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
a0c0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
a0d0: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
a0e0: 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63  , a[1], r);.  Tc
a0f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a100: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
a110: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
a120: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
a130: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
a140: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
a150: 74 66 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54  tf_scaled FORMAT
a160: 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a   DOUBLE DOUBLE.*
a170: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
a180: 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  f with a single 
a190: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20  double argument 
a1a0: 77 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f  which is the pro
a1b0: 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  duct of the.** t
a1c0: 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76  wo arguments giv
a1d0: 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20  en above.  This 
a1e0: 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  is used to gener
a1f0: 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64  ate overflow and
a200: 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f   underflow.** do
a210: 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68  ubles to test th
a220: 61 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76  at they are conv
a230: 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a  erted properly..
a240: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
a250: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
a260: 61 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  aled(.  void *No
a270: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
a280: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
a290: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
a2a0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
a2b0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
a2c0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2e0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
a2f0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
a300: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
a310: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
a320: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
a330: 20 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65   int i;.  double
a340: 20 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a   r[2];.  char *z
a350: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ;.  if( argc!=4 
a360: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
a370: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a380: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
a390: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
a3a0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
a3b0: 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f  FORMAT DOUBLE DO
a3c0: 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  UBLE\"", 0);.   
a3d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a3e0: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
a3f0: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
a400: 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
a410: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
a420: 69 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72  i], &r[i-2]) ) r
a430: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a440: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
a450: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
a460: 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a  1], r[0]*r[1]);.
a470: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a480: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
a490: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
a4a0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
a4b0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
a4c0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
a4d0: 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46  printf_stronly F
a4e0: 4f 52 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a  ORMAT STRING.**.
a4f0: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
a500: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f  with a single do
a510: 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  uble argument wh
a520: 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75  ich is the produ
a530: 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ct of the.** two
a540: 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e   arguments given
a550: 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73   above.  This is
a560: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
a570: 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75  e overflow and u
a580: 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62  nderflow.** doub
a590: 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74  les to test that
a5a0: 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72   they are conver
a5b0: 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  ted properly..*/
a5c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a5d0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
a5e0: 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  nly(.  void *Not
a5f0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
a600: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
a610: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
a620: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
a630: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
a640: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
a650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a660: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a670: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
a680: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
a690: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
a6a0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
a6b0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
a6c0: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
a6d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a6e0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
a6f0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
a700: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
a710: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54       " FORMAT ST
a720: 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20  RING\"", 0);.   
a730: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a740: 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  R;.  }.  z = sql
a750: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
a760: 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  v[1], argv[2]);.
a770: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a780: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
a790: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
a7a0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
a7b0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
a7c0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
a7d0: 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
a7e0: 20 46 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a   FORMAT HEX.**.*
a7f0: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
a800: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75  ith a single dou
a810: 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  ble argument whi
a820: 63 68 20 69 73 20 64 65 72 69 76 65 64 20 66 72  ch is derived fr
a830: 6f 6d 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65  om the.** hexade
a840: 63 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f  cimal encoding o
a850: 66 20 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65  f an IEEE double
a860: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a870: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a880: 68 65 78 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  hexdouble(.  voi
a890: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
a8a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
a8b0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
a8c0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
a8d0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
a8e0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
a8f0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
a900: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
a910: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
a920: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
a930: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
a940: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
a950: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
a960: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73   double r;.  uns
a970: 69 67 6e 65 64 20 69 6e 74 20 78 31 2c 20 78 32  igned int x1, x2
a980: 3b 0a 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36  ;.  sqlite_uint6
a990: 34 20 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21  4 d;.  if( argc!
a9a0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
a9b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a9c0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
a9d0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
a9e0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
a9f0: 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47   " FORMAT STRING
aa00: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
aa10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
aa20: 20 7d 0a 20 20 69 66 28 20 73 73 63 61 6e 66 28   }.  if( sscanf(
aa30: 61 72 67 76 5b 32 5d 2c 20 22 25 30 38 78 25 30  argv[2], "%08x%0
aa40: 38 78 22 2c 20 26 78 32 2c 20 26 78 31 29 21 3d  8x", &x2, &x1)!=
aa50: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
aa60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
aa70: 2c 20 22 32 6e 64 20 61 72 67 75 6d 65 6e 74 20  , "2nd argument 
aa80: 73 68 6f 75 6c 64 20 62 65 20 31 36 2d 63 68 61  should be 16-cha
aa90: 72 61 63 74 65 72 73 20 6f 66 20 68 65 78 22 2c  racters of hex",
aaa0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
aab0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
aac0: 20 64 20 3d 20 78 32 3b 0a 20 20 64 20 3d 20 28   d = x2;.  d = (
aad0: 64 3c 3c 33 32 29 20 2b 20 78 31 3b 0a 20 20 6d  d<<32) + x1;.  m
aae0: 65 6d 63 70 79 28 26 72 2c 20 26 64 2c 20 73 69  emcpy(&r, &d, si
aaf0: 7a 65 6f 66 28 72 29 29 3b 0a 20 20 7a 20 3d 20  zeof(r));.  z = 
ab00: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
ab10: 61 72 67 76 5b 31 5d 2c 20 72 29 3b 0a 20 20 54  argv[1], r);.  T
ab20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ab30: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
ab40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
ab50: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
ab60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
ab70: 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  e: sqlite3_enabl
ab80: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 3f  e_shared_cache ?
ab90: 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2f 0a 23  BOOLEAN?.**.*/.#
aba0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
abb0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
abc0: 41 43 48 45 29 0a 73 74 61 74 69 63 20 69 6e 74  ACHE).static int
abd0: 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61   test_enable_sha
abe0: 72 65 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  red(.  ClientDat
abf0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
ac00: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
ac10: 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
ac20: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
ac30: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
ac40: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
ac50: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
ac60: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
ac70: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
ac80: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
ac90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
aca0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
acb0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
acc0: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
acd0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
ace0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65   int rc;.  int e
acf0: 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72 65 74  nable;.  int ret
ad00: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   = 0;..  if( obj
ad10: 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20  c!=2 && objc!=1 
ad20: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
ad30: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
ad40: 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45  1, objv, "?BOOLE
ad50: 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AN?");.    retur
ad60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
ad70: 0a 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33  .  ret = sqlite3
ad80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
ad90: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 3b  redCacheEnabled;
ada0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  ..  if( objc==2 
adb0: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
adc0: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
add0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
ade0: 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b 0a 20 20  , &enable) ){.  
adf0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ae00: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
ae10: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 6e 61  rc = sqlite3_ena
ae20: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
ae30: 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20 20 69 66  (enable);.    if
ae40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ae50: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
ae60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
ae70: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
ae80: 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f 53 54  rStr(rc), TCL_ST
ae90: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74  ATIC);.      ret
aea0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
aeb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53     }.  }.  Tcl_S
aec0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
aed0: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
aee0: 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 72  anObj(ret));.  r
aef0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
af00: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
af10: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
af20: 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
af30: 6f 64 65 73 20 20 20 44 42 20 20 20 20 42 4f 4f  odes   DB    BOO
af40: 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  LEAN.**.*/.stati
af50: 63 20 69 6e 74 20 74 65 73 74 5f 65 78 74 65 6e  c int test_exten
af60: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
af70: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
af80: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
af90: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
afa0: 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
afb0: 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
afc0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
afd0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
afe0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
aff0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
b000: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b020: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
b030: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
b040: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
b050: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
b060: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
b070: 74 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69  t enable;.  sqli
b080: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
b090: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
b0a0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
b0b0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
b0c0: 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a   "DB BOOLEAN");.
b0d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b0e0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
b0f0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
b100: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
b110: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
b120: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
b130: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
b140: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
b150: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
b160: 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 20 72 65  ], &enable) ) re
b170: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b180: 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
b190: 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
b1a0: 64 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20 72  db, enable);.  r
b1b0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
b1c0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
b1d0: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
b1e0: 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74  _number.**.*/.st
b1f0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69  atic int test_li
b200: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
b210: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
b220: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
b230: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
b240: 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
b250: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
b260: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
b270: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
b280: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
b290: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
b2a0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b2c0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
b2d0: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
b2e0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
b2f0: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
b300: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
b310: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
b320: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
b330: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76  Obj(sqlite3_libv
b340: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29  ersion_number())
b350: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
b360: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
b370: 67 65 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  ge: sqlite3_tabl
b380: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
b390: 61 20 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e  a DB dbname tbln
b3a0: 61 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a  ame colname.**.*
b3b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
b3c0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
b3d0: 54 41 44 41 54 41 0a 73 74 61 74 69 63 20 69 6e  TADATA.static in
b3e0: 74 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c  t test_table_col
b3f0: 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
b400: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
b410: 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
b420: 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
b430: 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
b440: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
b450: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
b460: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
b470: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
b480: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
b490: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
b4a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b4b0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
b4c0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
b4d0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
b4e0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
b4f0: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
b500: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
b510: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73  har *zDb;.  cons
b520: 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20  t char *zTbl;.  
b530: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
b540: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 63  ;.  int rc;.  Tc
b550: 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
b560: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
b570: 61 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63  atype;.  const c
b580: 68 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20  har *zCollseq;. 
b590: 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20   int notnull;.  
b5a0: 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  int primarykey;.
b5b0: 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d    int autoincrem
b5c0: 65 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ent;..  if( objc
b5d0: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
b5e0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
b5f0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
b600: 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20   dbname tblname 
b610: 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72  colname");.    r
b620: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b630: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
b640: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
b650: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b660: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
b670: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b680: 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74  .  zDb = Tcl_Get
b690: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
b6a0: 0a 20 20 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65  .  zTbl = Tcl_Ge
b6b0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
b6c0: 3b 0a 20 20 7a 43 6f 6c 20 3d 20 54 63 6c 5f 47  ;.  zCol = Tcl_G
b6d0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d  etString(objv[4]
b6e0: 29 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c 65 6e  );..  if( strlen
b6f0: 28 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62 20 3d  (zDb)==0 ) zDb =
b700: 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   0;..  rc = sqli
b710: 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
b720: 5f 6d 65 74 61 64 61 74 61 28 64 62 2c 20 7a 44  _metadata(db, zD
b730: 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a  b, zTbl, zCol, .
b740: 20 20 20 20 20 20 26 7a 44 61 74 61 74 79 70 65        &zDatatype
b750: 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f  , &zCollseq, &no
b760: 74 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79 6b  tnull, &primaryk
b770: 65 79 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d 65  ey, &autoincreme
b780: 6e 74 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  nt);..  if( rc!=
b790: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b7a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b7b0: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
b7c0: 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29  3_errmsg(db), 0)
b7d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
b7e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
b7f0: 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
b800: 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ();.  Tcl_ListOb
b810: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
b820: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
b830: 74 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74 79  tringObj(zDataty
b840: 70 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  pe, -1));.  Tcl_
b850: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
b860: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
b870: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
b880: 43 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a 20  Collseq, -1));. 
b890: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
b8a0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
b8b0: 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
b8c0: 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54 63  (notnull));.  Tc
b8d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b8e0: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
b8f0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 72  Tcl_NewIntObj(pr
b900: 69 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20 54 63  imarykey));.  Tc
b910: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b920: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
b930: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 75  Tcl_NewIntObj(au
b940: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a 20  toincrement));. 
b950: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
b960: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
b970: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
b980: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
b990: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b9a0: 5f 49 4e 43 52 42 4c 4f 42 0a 0a 2f 2a 0a 2a 2a  _INCRBLOB../*.**
b9b0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
b9c0: 61 64 20 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53  ad  CHANNEL OFFS
b9d0: 45 54 20 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  ET N.**.**   Thi
b9e0: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  s command is use
b9f0: 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 71  d to test the sq
ba00: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
ba10: 29 20 69 6e 20 77 61 79 73 20 74 68 61 74 0a 2a  ) in ways that.*
ba20: 2a 20 20 20 74 68 65 20 54 63 6c 20 63 68 61 6e  *   the Tcl chan
ba30: 6e 65 6c 20 69 6e 74 65 72 66 61 63 65 20 64 6f  nel interface do
ba40: 65 73 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73  es not. The firs
ba50: 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  t argument shoul
ba60: 64 0a 2a 2a 20 20 20 62 65 20 74 68 65 20 6e 61  d.**   be the na
ba70: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 20 63 68  me of a valid ch
ba80: 61 6e 6e 65 6c 20 63 72 65 61 74 65 64 20 62 79  annel created by
ba90: 20 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20   the [incrblob] 
baa0: 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61  method.**   of a
bab0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
bac0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
bad0: 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c  calls sqlite3_bl
bae0: 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20 20 20 74  ob_read().**   t
baf0: 6f 20 72 65 61 64 20 4e 20 62 79 74 65 73 20 66  o read N bytes f
bb00: 72 6f 6d 20 6f 66 66 73 65 74 20 4f 46 46 53 45  rom offset OFFSE
bb10: 54 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  T from the under
bb20: 6c 79 69 6e 67 20 53 51 4c 69 74 65 0a 2a 2a 20  lying SQLite.** 
bb30: 20 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a    blob handle..*
bb40: 2a 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73  *.**   On succes
bb50: 73 2c 20 61 20 62 79 74 65 2d 61 72 72 61 79 20  s, a byte-array 
bb60: 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e  object containin
bb70: 67 20 74 68 65 20 72 65 61 64 20 64 61 74 61 20  g the read data 
bb80: 69 73 20 0a 2a 2a 20 20 20 72 65 74 75 72 6e 65  is .**   returne
bb90: 64 2e 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74  d. On failure, t
bba0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 72  he interpreter r
bbb0: 65 73 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20  esult is set to 
bbc0: 74 68 65 0a 2a 2a 20 20 20 74 65 78 74 20 72 65  the.**   text re
bbd0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
bbe0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 65 72 72  the returned err
bbf0: 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 22 53  or code (i.e. "S
bc00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 0a 2a 2a  QLITE_NOMEM").**
bc10: 20 20 20 61 6e 64 20 61 20 54 63 6c 20 65 78 63     and a Tcl exc
bc20: 65 70 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e  eption is thrown
bc30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bc40: 74 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64 28 0a  test_blob_read(.
bc50: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
bc60: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20  entData, /* Not 
bc70: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
bc80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
bc90: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
bca0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
bcb0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
bcc0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bce0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
bcf0: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
bd00: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
bd10: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
bd20: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
bd30: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65  l_Channel channe
bd40: 6c 3b 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  l;.  ClientData 
bd50: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
bd60: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
bd70: 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e 6f 74 55 73  lob;.  int notUs
bd80: 65 64 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  ed;.  int nByte;
bd90: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
bda0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
bdb0: 2a 7a 42 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b  *zBuf;.  int rc;
bdc0: 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
bdd0: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
bde0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
bdf0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e  , 1, objv, "CHAN
be00: 4e 45 4c 20 4f 46 46 53 45 54 20 4e 22 29 3b 0a  NEL OFFSET N");.
be10: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
be20: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 63 68 61  RROR;.  }..  cha
be30: 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68  nnel = Tcl_GetCh
be40: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
be50: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
be60: 5b 31 5d 29 2c 20 26 6e 6f 74 55 73 65 64 29 3b  [1]), &notUsed);
be70: 0a 20 20 69 66 28 20 21 63 68 61 6e 6e 65 6c 0a  .  if( !channel.
be80: 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63     || TCL_OK!=Tc
be90: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
bea0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
beb0: 20 26 69 4f 66 66 73 65 74 29 0a 20 20 20 7c 7c   &iOffset).   ||
bec0: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
bed0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
bee0: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 79  p, objv[3], &nBy
bef0: 74 65 29 0a 20 20 20 7c 7c 20 6e 42 79 74 65 3c  te).   || nByte<
bf00: 30 20 7c 7c 20 69 4f 66 66 73 65 74 3c 30 0a 20  0 || iOffset<0. 
bf10: 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
bf20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
bf30: 20 20 69 6e 73 74 61 6e 63 65 44 61 74 61 20 3d    instanceData =
bf40: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49   Tcl_GetChannelI
bf50: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
bf60: 6e 65 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20  nel);.  pBlob = 
bf70: 2a 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  *((sqlite3_blob 
bf80: 2a 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 29  **)instanceData)
bf90: 3b 0a 0a 20 20 7a 42 75 66 20 3d 20 28 75 6e 73  ;..  zBuf = (uns
bfa0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
bfb0: 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  _Alloc(nByte);. 
bfc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
bfd0: 6f 62 5f 72 65 61 64 28 70 42 6c 6f 62 2c 20 7a  ob_read(pBlob, z
bfe0: 42 75 66 2c 20 6e 42 79 74 65 2c 20 69 4f 66 66  Buf, nByte, iOff
bff0: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
c000: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c010: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
c020: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
c030: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 42  wByteArrayObj(zB
c040: 75 66 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 7d  uf, nByte));.  }
c050: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 53 65  else{.    Tcl_Se
c060: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
c070: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54  (char *)sqlite3T
c080: 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  estErrorName(rc)
c090: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
c0a0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28  .  }.  Tcl_Free(
c0b0: 28 63 68 61 72 20 2a 29 7a 42 75 66 29 3b 0a 0a  (char *)zBuf);..
c0c0: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
c0d0: 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b  LITE_OK ? TCL_OK
c0e0: 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d   : TCL_ERROR);.}
c0f0: 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ../*.** sqlite3_
c100: 62 6c 6f 62 5f 77 72 69 74 65 20 43 48 41 4e 4e  blob_write CHANN
c110: 45 4c 20 4f 46 46 53 45 54 20 44 41 54 41 20 3f  EL OFFSET DATA ?
c120: 4e 44 41 54 41 3f 0a 2a 2a 0a 2a 2a 20 20 20 54  NDATA?.**.**   T
c130: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
c140: 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  sed to test the 
c150: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
c160: 74 65 28 29 20 69 6e 20 77 61 79 73 20 74 68 61  te() in ways tha
c170: 74 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20 63  t.**   the Tcl c
c180: 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63 65  hannel interface
c190: 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20 66   does not. The f
c1a0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68  irst argument sh
c1b0: 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68 65  ould.**   be the
c1c0: 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64   name of a valid
c1d0: 20 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65 64   channel created
c1e0: 20 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c 6f   by the [incrblo
c1f0: 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 6f  b] method.**   o
c200: 66 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e  f a database han
c210: 64 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  dle. This functi
c220: 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33  on calls sqlite3
c230: 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29 0a 2a 2a  _blob_write().**
c240: 20 20 20 74 6f 20 77 72 69 74 65 20 74 68 65 20     to write the 
c250: 44 41 54 41 20 62 79 74 65 2d 61 72 72 61 79 20  DATA byte-array 
c260: 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  to the underlyin
c270: 67 20 53 51 4c 69 74 65 20 62 6c 6f 62 20 68 61  g SQLite blob ha
c280: 6e 64 6c 65 2e 0a 2a 2a 20 20 20 61 74 20 6f 66  ndle..**   at of
c290: 66 73 65 74 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a  fset OFFSET..**.
c2a0: 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73 2c  **   On success,
c2b0: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
c2c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e   is returned. On
c2d0: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 69 6e   failure, the in
c2e0: 74 65 72 70 72 65 74 65 72 0a 2a 2a 20 20 20 72  terpreter.**   r
c2f0: 65 73 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20  esult is set to 
c300: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
c310: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ntation of the r
c320: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 63 6f  eturned error co
c330: 64 65 20 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 22  de .**   (i.e. "
c340: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 20 61  SQLITE_NOMEM") a
c350: 6e 64 20 61 20 54 63 6c 20 65 78 63 65 70 74 69  nd a Tcl excepti
c360: 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f  on is thrown..*/
c370: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
c380: 5f 62 6c 6f 62 5f 77 72 69 74 65 28 0a 20 20 43  _blob_write(.  C
c390: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
c3a0: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
c3b0: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
c3c0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
c3d0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
c3e0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
c3f0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
c400: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
c410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c420: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
c430: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
c440: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
c450: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
c460: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43  ts */.){.  Tcl_C
c470: 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a  hannel channel;.
c480: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
c490: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 73 71 6c  tanceData;.  sql
c4a0: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
c4b0: 3b 0a 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b  ;.  int notUsed;
c4c0: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
c4d0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 75 6e 73    int rc;..  uns
c4e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66  igned char *zBuf
c4f0: 3b 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20  ;.  int nBuf;.  
c500: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26  .  if( objc!=4 &
c510: 26 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  & objc!=5 ){.   
c520: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
c530: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
c540: 76 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53  v, "CHANNEL OFFS
c550: 45 54 20 44 41 54 41 20 3f 4e 44 41 54 41 3f 22  ET DATA ?NDATA?"
c560: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c570: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
c580: 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65  channel = Tcl_Ge
c590: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
c5a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c5b0: 62 6a 76 5b 31 5d 29 2c 20 26 6e 6f 74 55 73 65  bjv[1]), &notUse
c5c0: 64 29 3b 0a 20 20 69 66 28 20 21 63 68 61 6e 6e  d);.  if( !chann
c5d0: 65 6c 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63  el || TCL_OK!=Tc
c5e0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
c5f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
c600: 20 26 69 4f 66 66 73 65 74 29 20 29 7b 20 0a 20   &iOffset) ){ . 
c610: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
c620: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 73 74  ROR;.  }..  inst
c630: 61 6e 63 65 44 61 74 61 20 3d 20 54 63 6c 5f 47  anceData = Tcl_G
c640: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
c650: 65 44 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a  eData(channel);.
c660: 20 20 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c    pBlob = *((sql
c670: 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73  ite3_blob **)ins
c680: 74 61 6e 63 65 44 61 74 61 29 3b 0a 0a 20 20 7a  tanceData);..  z
c690: 42 75 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Buf = Tcl_GetByt
c6a0: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
c6b0: 6a 76 5b 33 5d 2c 20 26 6e 42 75 66 29 3b 0a 20  jv[3], &nBuf);. 
c6c0: 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20   if( objc==5 && 
c6d0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
c6e0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
c6f0: 5d 2c 20 26 6e 42 75 66 29 20 29 7b 0a 20 20 20  ], &nBuf) ){.   
c700: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c710: 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
c720: 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
c730: 28 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42  (pBlob, zBuf, nB
c740: 75 66 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  uf, iOffset);.  
c750: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c760: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
c770: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
c780: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65  char *)sqlite3Te
c790: 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  stErrorName(rc),
c7a0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
c7b0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72    }..  return (r
c7c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54  c==SQLITE_OK ? T
c7d0: 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f  CL_OK : TCL_ERRO
c7e0: 52 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  R);.}.#endif../*
c7f0: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
c800: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
c810: 69 6f 6e 5f 76 32 20 44 42 2d 48 41 4e 44 4c 45  ion_v2 DB-HANDLE
c820: 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44   NAME CMP-PROC D
c830: 45 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20  EL-PROC.**.**   
c840: 54 68 69 73 20 54 63 6c 20 70 72 6f 63 20 69 73  This Tcl proc is
c850: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
c860: 67 20 74 68 65 20 65 78 70 65 72 69 6d 65 6e 74  g the experiment
c870: 61 6c 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f  al.**   sqlite3_
c880: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
c890: 5f 76 32 28 29 20 69 6e 74 65 72 66 61 63 65 2e  _v2() interface.
c8a0: 0a 2a 2f 0a 73 74 72 75 63 74 20 54 65 73 74 43  .*/.struct TestC
c8b0: 6f 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20 20 54 63  ollationX {.  Tc
c8c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c8d0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
c8e0: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44  p;.  Tcl_Obj *pD
c8f0: 65 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73  el;.};.typedef s
c900: 74 72 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74  truct TestCollat
c910: 69 6f 6e 58 20 54 65 73 74 43 6f 6c 6c 61 74 69  ionX TestCollati
c920: 6f 6e 58 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  onX;.static void
c930: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
c940: 74 69 6f 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43  tionDel(void *pC
c950: 74 78 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61  tx){.  TestColla
c960: 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74  tionX *p = (Test
c970: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74  CollationX *)pCt
c980: 78 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 54  x;..  int rc = T
c990: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
c9a0: 69 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 6c 2c  interp, p->pDel,
c9b0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
c9c0: 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c  |TCL_EVAL_GLOBAL
c9d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
c9e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42  _OK ){.    Tcl_B
c9f0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70  ackgroundError(p
ca00: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a  ->interp);.  }..
ca10: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
ca20: 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54  nt(p->pCmp);.  T
ca30: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
ca40: 70 2d 3e 70 44 65 6c 29 3b 0a 20 20 73 71 6c 69  p->pDel);.  sqli
ca50: 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20 2a  te3_free((void *
ca60: 29 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  )p);.}.static in
ca70: 74 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c  t testCreateColl
ca80: 61 74 69 6f 6e 43 6d 70 28 0a 20 20 76 6f 69 64  ationCmp(.  void
ca90: 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 4c   *pCtx,.  int nL
caa0: 65 66 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  eft,.  const voi
cab0: 64 20 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e 74 20  d *zLeft,.  int 
cac0: 6e 52 69 67 68 74 2c 0a 20 20 63 6f 6e 73 74 20  nRight,.  const 
cad0: 76 6f 69 64 20 2a 7a 52 69 67 68 74 0a 29 7b 0a  void *zRight.){.
cae0: 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58    TestCollationX
caf0: 20 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61   *p = (TestColla
cb00: 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 20 20  tionX *)pCtx;.  
cb10: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
cb20: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
cb30: 4f 62 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20  Obj(p->pCmp);.  
cb40: 69 6e 74 20 69 52 65 73 20 3d 20 30 3b 0a 0a 20  int iRes = 0;.. 
cb50: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
cb60: 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63  t(pScript);.  Tc
cb70: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
cb80: 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70  lement(0, pScrip
cb90: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
cba0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 4c 65 66  Obj((char *)zLef
cbb0: 74 2c 20 6e 4c 65 66 74 29 29 3b 0a 20 20 54 63  t, nLeft));.  Tc
cbc0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
cbd0: 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70  lement(0, pScrip
cbe0: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
cbf0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 52 69 67  Obj((char *)zRig
cc00: 68 74 2c 6e 52 69 67 68 74 29 29 3b 0a 0a 20 20  ht,nRight));..  
cc10: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
cc20: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
cc30: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 54 43  erp, pScript, TC
cc40: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43  L_EVAL_DIRECT|TC
cc50: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20  L_EVAL_GLOBAL). 
cc60: 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c    || TCL_OK!=Tcl
cc70: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 70  _GetIntFromObj(p
cc80: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  ->interp, Tcl_Ge
cc90: 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e  tObjResult(p->in
cca0: 74 65 72 70 29 2c 20 26 69 52 65 73 29 0a 20 20  terp), &iRes).  
ccb0: 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67  ){.    Tcl_Backg
ccc0: 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e  roundError(p->in
ccd0: 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  terp);.  }.  Tcl
cce0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _DecrRefCount(pS
ccf0: 63 72 69 70 74 29 3b 0a 0a 20 20 72 65 74 75 72  cript);..  retur
cd00: 6e 20 69 52 65 73 3b 0a 7d 0a 73 74 61 74 69 63  n iRes;.}.static
cd10: 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65   int test_create
cd20: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20  _collation_v2(. 
cd30: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
cd40: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
cd50: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
cd60: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
cd70: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
cd80: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
cd90: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
cda0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cdc0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
cdd0: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
cde0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
cdf0: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
ce00: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 65 73  ents */.){.  Tes
ce10: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a  tCollationX *p;.
ce20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
ce30: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
ce40: 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  objc!=5 ){.    T
ce50: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
ce60: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
ce70: 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45   "DB-HANDLE NAME
ce80: 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52   CMP-PROC DEL-PR
ce90: 4f 43 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OC");.    return
cea0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
ceb0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
cec0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
ced0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
cee0: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
cef0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70   TCL_ERROR;..  p
cf00: 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f   = (TestCollatio
cf10: 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  nX *)sqlite3_mal
cf20: 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65 73 74 43  loc(sizeof(TestC
cf30: 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20 70  ollationX));.  p
cf40: 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d  ->pCmp = objv[3]
cf50: 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f 62  ;.  p->pDel = ob
cf60: 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65  jv[4];.  p->inte
cf70: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 54  rp = interp;.  T
cf80: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
cf90: 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f  p->pCmp);.  Tcl_
cfa0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  IncrRefCount(p->
cfb0: 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73  pDel);..  rc = s
cfc0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
cfd0: 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54  llation_v2(db, T
cfe0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
cff0: 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20 20 20 20  v[2]), 16, .    
d000: 20 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73    (void *)p, tes
d010: 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e  tCreateCollation
d020: 43 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43  Cmp, testCreateC
d030: 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b  ollationDel.  );
d040: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d050: 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20  E_MISUSE ){.    
d060: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d070: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
d080: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 65  3_create_collate
d090: 5f 76 32 28 29 20 66 61 69 6c 65 64 20 74 6f 20  _v2() failed to 
d0a0: 64 65 74 65 63 74 20 22 0a 20 20 20 20 20 20 22  detect ".      "
d0b0: 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e 63 6f 64  an invalid encod
d0c0: 69 6e 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  ing", (char*)0);
d0d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
d0e0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
d0f0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
d100: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
d110: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
d120: 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c 49 54 45  objv[2]), SQLITE
d130: 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28 76  _UTF8, .      (v
d140: 6f 69 64 20 2a 29 70 2c 20 74 65 73 74 43 72 65  oid *)p, testCre
d150: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c  ateCollationCmp,
d160: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
d170: 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 72  tionDel.  );.  r
d180: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
d190: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
d1a0: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
d1b0: 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20 46  sion DB-HANDLE F
d1c0: 49 4c 45 20 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74  ILE ?PROC?.*/.st
d1d0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 6f  atic int test_lo
d1e0: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 0a 20 20  ad_extension(.  
d1f0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
d200: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
d210: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
d220: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
d230: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
d240: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
d250: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
d260: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
d270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d280: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
d290: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
d2a0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
d2b0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
d2c0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
d2d0: 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b  CmdInfo cmdInfo;
d2e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
d2f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
d300: 20 2a 7a 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a   *zDb;.  char *z
d310: 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 50  File;.  char *zP
d320: 72 6f 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  roc = 0;.  char 
d330: 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66  *zErr = 0;..  if
d340: 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a  ( objc!=4 && obj
d350: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
d360: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
d370: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
d380: 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50  B-HANDLE FILE ?P
d390: 52 4f 43 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  ROC?");.    retu
d3a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d3b0: 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
d3c0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
d3d0: 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
d3e0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
d3f0: 5d 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ]);.  if( objc==
d400: 34 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d  4 ){.    zProc =
d410: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
d420: 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20  bjv[3]);.  }..  
d430: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 43  /* Extract the C
d440: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
d450: 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f   from the Tcl co
d460: 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20  mmand name */.  
d470: 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
d480: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
d490: 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  zDb, &cmdInfo) )
d4a0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
d4b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d4c0: 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e  command not foun
d4d0: 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72  d: ", zDb, (char
d4e0: 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
d4f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d500: 20 20 64 62 20 3d 20 28 28 73 74 72 75 63 74 20    db = ((struct 
d510: 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
d520: 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29  o.objClientData)
d530: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64  ->db;.  assert(d
d540: 62 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74  b);..  /* Call t
d550: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 43 20  he underlying C 
d560: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20  function. If an 
d570: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
d580: 74 20 72 63 20 74 6f 20 0a 20 20 2a 2a 20 54 43  t rc to .  ** TC
d590: 4c 5f 45 52 52 4f 52 20 61 6e 64 20 6c 6f 61 64  L_ERROR and load
d5a0: 20 61 6e 79 20 65 72 72 6f 72 20 73 74 72 69 6e   any error strin
d5b0: 67 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72  g into the inter
d5c0: 70 72 65 74 65 72 2e 20 49 66 20 6e 6f 20 0a 20  preter. If no . 
d5d0: 20 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73   ** error occurs
d5e0: 2c 20 73 65 74 20 72 63 20 74 6f 20 54 43 4c 5f  , set rc to TCL_
d5f0: 4f 4b 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  OK..  */.#ifdef 
d600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
d610: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 72 63 20  _EXTENSION.  rc 
d620: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
d630: 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
d640: 5f 6d 70 72 69 6e 74 66 28 22 74 68 69 73 20 62  _mprintf("this b
d650: 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74  uild omits sqlit
d660: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
d670: 6e 28 29 22 29 3b 0a 23 65 6c 73 65 0a 20 20 72  n()");.#else.  r
d680: 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  c = sqlite3_load
d690: 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a  _extension(db, z
d6a0: 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45  File, zProc, &zE
d6b0: 72 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  rr);.#endif.  if
d6c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d6d0: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
d6e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
d6f0: 72 20 3f 20 7a 45 72 72 20 3a 20 22 22 2c 20 54  r ? zErr : "", T
d700: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
d710: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
d720: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
d730: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a  c = TCL_OK;.  }.
d740: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
d750: 45 72 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Err);..  return 
d760: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  rc;.}../*.** Usa
d770: 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  ge: sqlite3_enab
d780: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
d790: 6e 20 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46  n DB-HANDLE ONOF
d7a0: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
d7b0: 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  test_enable_load
d7c0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
d7d0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
d7e0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
d7f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
d800: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
d810: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
d820: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
d830: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
d840: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
d850: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
d860: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
d870: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
d880: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
d890: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
d8a0: 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
d8b0: 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
d8c0: 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  db;.  char *zDb;
d8d0: 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 0a 20  .  int onoff;.. 
d8e0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
d8f0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
d900: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
d910: 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45  objv, "DB-HANDLE
d920: 20 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 72 65   ONOFF");.    re
d930: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d940: 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
d950: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
d960: 5d 29 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63  ]);..  /* Extrac
d970: 74 20 74 68 65 20 43 20 64 61 74 61 62 61 73 65  t the C database
d980: 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65   handle from the
d990: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   Tcl command nam
d9a0: 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f  e */.  if( !Tcl_
d9b0: 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
d9c0: 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64  nterp, zDb, &cmd
d9d0: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c  Info) ){.    Tcl
d9e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d9f0: 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e  terp, "command n
da00: 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62  ot found: ", zDb
da10: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
da20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
da30: 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28  R;.  }.  db = ((
da40: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a  struct SqliteDb*
da50: 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  )cmdInfo.objClie
da60: 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61  ntData)->db;.  a
da70: 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  ssert(db);..  /*
da80: 20 47 65 74 20 74 68 65 20 6f 6e 6f 66 66 20 70   Get the onoff p
da90: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 66  arameter */.  if
daa0: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
dab0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
dac0: 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29  objv[2], &onoff)
dad0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
dae0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23  CL_ERROR;.  }..#
daf0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
db00: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
db10: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
db20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 74 68 69  ult(interp, "thi
db30: 73 20 62 75 69 6c 64 20 6f 6d 69 74 73 20 73 71  s build omits sq
db40: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
db50: 73 69 6f 6e 28 29 22 29 3b 0a 20 20 72 65 74 75  sion()");.  retu
db60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
db70: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e  lse.  sqlite3_en
db80: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
db90: 69 6f 6e 28 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a  ion(db, onoff);.
dba0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
dbb0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
dbc0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
dbd0: 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20 53 68 75 74  abort.**.** Shut
dbe0: 64 6f 77 6e 20 74 68 65 20 70 72 6f 63 65 73 73  down the process
dbf0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54   immediately.  T
dc00: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6c 65  his is not a cle
dc10: 61 6e 20 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 20  an shutdown..** 
dc20: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
dc30: 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
dc40: 20 72 65 63 6f 76 65 72 61 62 69 6c 69 74 79 20   recoverability 
dc50: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 69 6e  of a database in
dc60: 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74 20 6f 66  .** the event of
dc70: 20 61 20 70 72 6f 67 72 61 6d 20 63 72 61 73 68   a program crash
dc80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dc90: 73 71 6c 69 74 65 5f 61 62 6f 72 74 28 0a 20 20  sqlite_abort(.  
dca0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
dcb0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
dcc0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
dcd0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
dce0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
dcf0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
dd00: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
dd10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
dd20: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
dd30: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
dd40: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
dd50: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
dd60: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
dd70: 20 69 6e 74 65 72 70 3d 3d 30 20 29 3b 20 20 20   interp==0 );   
dd80: 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 61 6c 77  /* This will alw
dd90: 61 79 73 20 66 61 69 6c 20 2a 2f 0a 20 20 72 65  ays fail */.  re
dda0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
ddb0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
ddc0: 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 61  ing routine is a
ddd0: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 53 51   user-defined SQ
dde0: 4c 20 66 75 6e 63 74 69 6f 6e 20 77 68 6f 73 65  L function whose
ddf0: 20 70 75 72 70 6f 73 65 0a 2a 2a 20 69 73 20 74   purpose.** is t
de00: 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69 74  o test the sqlit
de10: 65 5f 73 65 74 5f 72 65 73 75 6c 74 28 29 20 41  e_set_result() A
de20: 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  PI..*/.static vo
de30: 69 64 20 74 65 73 74 46 75 6e 63 28 73 71 6c 69  id testFunc(sqli
de40: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
de50: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
de60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
de70: 61 72 67 76 29 7b 0a 20 20 77 68 69 6c 65 28 20  argv){.  while( 
de80: 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 63  argc>=2 ){.    c
de90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 30  onst char *zArg0
dea0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
deb0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
dec0: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a  v[0]);.    if( z
ded0: 41 72 67 30 20 29 7b 0a 20 20 20 20 20 20 69 66  Arg0 ){.      if
dee0: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  ( 0==sqlite3StrI
def0: 43 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e 74 22  Cmp(zArg0, "int"
df00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
df10: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
df20: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
df30: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
df40: 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  1]));.      }els
df50: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
df60: 49 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e 74 36  ICmp(zArg0,"int6
df70: 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  4")==0 ){.      
df80: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
df90: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
dfa0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
dfb0: 74 36 34 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20  t64(argv[1]));. 
dfc0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
dfd0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
dfe0: 72 67 30 2c 22 73 74 72 69 6e 67 22 29 3d 3d 30  rg0,"string")==0
dff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e000: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
e010: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
e020: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
e030: 78 74 28 61 72 67 76 5b 31 5d 29 2c 20 2d 31 2c  xt(argv[1]), -1,
e040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
e050: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
e060: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e070: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
e080: 41 72 67 30 2c 22 64 6f 75 62 6c 65 22 29 3d 3d  Arg0,"double")==
e090: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
e0a0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
e0b0: 6c 65 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  le(context, sqli
e0c0: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
e0d0: 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20  (argv[1]));.    
e0e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
e0f0: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
e100: 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20  ,"null")==0 ){. 
e110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
e120: 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65  esult_null(conte
e130: 78 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xt);.      }else
e140: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
e150: 43 6d 70 28 7a 41 72 67 30 2c 22 76 61 6c 75 65  Cmp(zArg0,"value
e160: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e170: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e180: 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61  value(context, a
e190: 72 67 76 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75  rgv[sqlite3_valu
e1a0: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 5d 29  e_int(argv[1])])
e1b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e1c0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f         goto erro
e1d0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
e1e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e1f0: 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
e200: 20 20 20 20 7d 0a 20 20 20 20 61 72 67 63 20 2d      }.    argc -
e210: 3d 20 32 3b 0a 20 20 20 20 61 72 67 76 20 2b 3d  = 2;.    argv +=
e220: 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   2;.  }.  return
e230: 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20  ;..error_out:.  
e240: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
e250: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 66 69  rror(context,"fi
e260: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  rst argument sho
e270: 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22  uld be one of: "
e280: 0a 20 20 20 20 20 20 22 69 6e 74 20 69 6e 74 36  .      "int int6
e290: 34 20 73 74 72 69 6e 67 20 64 6f 75 62 6c 65 20  4 string double 
e2a0: 6e 75 6c 6c 20 76 61 6c 75 65 22 2c 20 2d 31 29  null value", -1)
e2b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
e2c0: 3a 20 20 20 73 71 6c 69 74 65 5f 72 65 67 69 73  :   sqlite_regis
e2d0: 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  ter_test_functio
e2e0: 6e 20 20 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a  n  DB  NAME.**.*
e2f0: 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 74  * Register the t
e300: 65 73 74 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  est SQL function
e310: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
e320: 20 44 42 20 75 6e 64 65 72 20 74 68 65 20 6e 61   DB under the na
e330: 6d 65 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74  me NAME..*/.stat
e340: 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 67 69  ic int test_regi
e350: 73 74 65 72 5f 66 75 6e 63 28 0a 20 20 76 6f 69  ster_func(.  voi
e360: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
e370: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
e380: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
e390: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
e3a0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
e3b0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
e3c0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
e3d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
e3e0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
e3f0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
e400: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
e410: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
e420: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
e430: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
e440: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
e450: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
e460: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
e470: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
e480: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
e490: 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 46  , .       " DB F
e4a0: 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22 2c 20 30  UNCTION-NAME", 0
e4b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
e4c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
e4d0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
e4e0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
e4f0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
e500: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
e510: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
e520: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72 67  function(db, arg
e530: 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  v[2], -1, SQLITE
e540: 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20  _UTF8, 0, .     
e550: 20 74 65 73 74 46 75 6e 63 2c 20 30 2c 20 30 29   testFunc, 0, 0)
e560: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
e570: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e580: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
e590: 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c  lite3ErrStr(rc),
e5a0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
e5b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
e5c0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
e5d0: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
e5e0: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
e5f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
e600: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
e610: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
e620: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 20  lite3_finalize  
e630: 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61  STMT .**.** Fina
e640: 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74  lize a statement
e650: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
e660: 69 63 20 69 6e 74 20 74 65 73 74 5f 66 69 6e 61  ic int test_fina
e670: 6c 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  lize(.  void * c
e680: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
e690: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
e6a0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
e6b0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
e6c0: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
e6d0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
e6e0: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
e6f0: 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20 69  e3 *db = 0;..  i
e700: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
e710: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
e720: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
e730: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
e740: 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
e750: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
e760: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
e770: 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29  ), " <STMT>", 0)
e780: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
e790: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
e7a0: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
e7b0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
e7c0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
e7d0: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
e7e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
e7f0: 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
e800: 20 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62 28    db = StmtToDb(
e810: 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 63  pStmt);.  }.  rc
e820: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
e830: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54 63  ize(pStmt);.  Tc
e840: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
e850: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
e860: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
e870: 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20  _STATIC);.  if( 
e880: 64 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 73  db && sqlite3Tes
e890: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
e8a0: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
e8b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
e8c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
e8d0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
e8e0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
e8f0: 75 73 20 20 53 54 4d 54 20 20 43 4f 44 45 20 20  us  STMT  CODE  
e900: 52 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a 20  RESETFLAG.**.** 
e910: 47 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Get the value of
e920: 20 61 20 73 74 61 74 75 73 20 63 6f 75 6e 74 65   a status counte
e930: 72 20 66 72 6f 6d 20 61 20 73 74 61 74 65 6d 65  r from a stateme
e940: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
e950: 74 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74  t test_stmt_stat
e960: 75 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  us(.  void * cli
e970: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
e980: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
e990: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
e9a0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
e9b0: 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c  [].){.  int iVal
e9c0: 75 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 70 2c  ue;.  int i, op,
e9d0: 20 72 65 73 65 74 46 6c 61 67 3b 0a 20 20 63 6f   resetFlag;.  co
e9e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  nst char *zOpNam
e9f0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  e;.  sqlite3_stm
ea00: 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 73 74 61  t *pStmt;..  sta
ea10: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
ea20: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
ea30: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
ea40: 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70 5b 5d 20  t op;.  } aOp[] 
ea50: 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54  = {.    { "SQLIT
ea60: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
ea70: 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20 20 20 53  LSCAN_STEP",   S
ea80: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
ea90: 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20 20  _FULLSCAN_STEP  
eaa0: 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
eab0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
eac0: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  T",            S
ead0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
eae0: 5f 53 4f 52 54 20 20 20 20 20 20 20 20 20 20 20  _SORT           
eaf0: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66 28 20 6f   },.  };.  if( o
eb00: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
eb10: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
eb20: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
eb30: 22 53 54 4d 54 20 50 41 52 41 4d 45 54 45 52 20  "STMT PARAMETER 
eb40: 52 45 53 45 54 46 4c 41 47 22 29 3b 0a 20 20 20  RESETFLAG");.   
eb50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
eb60: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
eb70: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
eb80: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
eb90: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
eba0: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
ebb0: 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 4e 61 6d  _ERROR;.  zOpNam
ebc0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
ebd0: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f  g(objv[2]);.  fo
ebe0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
ebf0: 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20  ze(aOp); i++){. 
ec00: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 4f     if( strcmp(aO
ec10: 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4f 70 4e  p[i].zName, zOpN
ec20: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
ec30: 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e 6f 70 3b   op = aOp[i].op;
ec40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ec50: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e    }.  }.  if( i>
ec60: 3d 41 72 72 61 79 53 69 7a 65 28 61 4f 70 29 20  =ArraySize(aOp) 
ec70: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
ec80: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
ec90: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f  erp, objv[2], &o
eca0: 70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  p) ) return TCL_
ecb0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
ecc0: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
ecd0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
ece0: 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65 74 46 6c  bjv[3], &resetFl
ecf0: 61 67 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ag) ) return TCL
ed00: 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61 6c 75 65  _ERROR;.  iValue
ed10: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
ed20: 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 6f 70  status(pStmt, op
ed30: 2c 20 72 65 73 65 74 46 6c 61 67 29 3b 0a 20 20  , resetFlag);.  
ed40: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
ed50: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
ed60: 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65 29 29 3b  IntObj(iValue));
ed70: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
ed80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
ed90: 3a 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f  :  sqlite3_next_
eda0: 73 74 6d 74 20 20 44 42 20 20 53 54 4d 54 0a 2a  stmt  DB  STMT.*
edb0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
edc0: 6e 65 78 74 20 73 74 61 74 6d 65 6e 74 20 69 6e  next statment in
edd0: 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20   sequence after 
ede0: 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  STMT..*/.static 
edf0: 69 6e 74 20 74 65 73 74 5f 6e 65 78 74 5f 73 74  int test_next_st
ee00: 6d 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  mt(.  void * cli
ee10: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
ee20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
ee30: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
ee40: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
ee50: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
ee60: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 73  stmt *pStmt;.  s
ee70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a  qlite3 *db = 0;.
ee80: 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
ee90: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
eea0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
eeb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
eec0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
eed0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
eee0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
eef0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
ef00: 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 53 54 4d  0], 0), " DB STM
ef10: 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
ef20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ef30: 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  }..  if( getDbPo
ef40: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
ef50: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
ef60: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
ef70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ef80: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
ef90: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
efa0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
efb0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
efc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
efd0: 20 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    pStmt = sqlite
efe0: 33 5f 6e 65 78 74 5f 73 74 6d 74 28 64 62 2c 20  3_next_stmt(db, 
eff0: 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53  pStmt);.  if( pS
f000: 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
f010: 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
f020: 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
f030: 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
f040: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f050: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
f060: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
f070: 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
f080: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
f090: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
f0a0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 20 53  sqlite3_reset  S
f0b0: 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74  TMT .**.** Reset
f0c0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e   a statement han
f0d0: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
f0e0: 6e 74 20 74 65 73 74 5f 72 65 73 65 74 28 0a 20  nt test_reset(. 
f0f0: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
f100: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
f110: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
f120: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
f130: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
f140: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
f150: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
f160: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
f170: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
f180: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f190: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
f1a0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
f1b0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
f1c0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f1d0: 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
f1e0: 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  >", 0);.    retu
f1f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f200: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
f210: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
f220: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
f230: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
f240: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
f250: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
f260: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
f270: 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 26 26  ;.  if( pStmt &&
f280: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
f290: 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
f2a0: 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
f2b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
f2c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
f2d0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
f2e0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
f2f0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
f300: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 2f 2a 0a 20  CL_STATIC);./*. 
f310: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
f320: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f330: 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65 74 75 72 6e  .  }.*/.  return
f340: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
f350: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
f360: 33 5f 65 78 70 69 72 65 64 20 53 54 4d 54 20 0a  3_expired STMT .
f370: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  **.** Return TRU
f380: 45 20 69 66 20 61 20 72 65 63 6f 6d 70 69 6c 61  E if a recompila
f390: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
f3a0: 65 6d 65 6e 74 20 69 73 20 72 65 63 6f 6d 6d 65  ement is recomme
f3b0: 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nded..*/.static 
f3c0: 69 6e 74 20 74 65 73 74 5f 65 78 70 69 72 65 64  int test_expired
f3d0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
f3e0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
f3f0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
f400: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
f410: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
f420: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
f430: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
f440: 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ED.  sqlite3_stm
f450: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 66 28 20  t *pStmt;.  if( 
f460: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
f470: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f480: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
f490: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
f4a0: 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
f4b0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f4c0: 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
f4d0: 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20  " <STMT>", 0);. 
f4e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f4f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
f500: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
f510: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
f520: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
f530: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
f540: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
f550: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
f560: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  erp, Tcl_NewBool
f570: 65 61 6e 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  eanObj(sqlite3_e
f580: 78 70 69 72 65 64 28 70 53 74 6d 74 29 29 29 3b  xpired(pStmt)));
f590: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
f5a0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
f5b0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
f5c0: 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69  3_transfer_bindi
f5d0: 6e 67 73 20 46 52 4f 4d 53 54 4d 54 20 54 4f 53  ngs FROMSTMT TOS
f5e0: 54 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66  TMT.**.** Transf
f5f0: 65 72 20 61 6c 6c 20 62 69 6e 64 69 6e 67 73 20  er all bindings 
f600: 66 72 6f 6d 20 46 52 4f 4d 53 54 4d 54 20 6f 76  from FROMSTMT ov
f610: 65 72 20 74 6f 20 54 4f 53 54 4d 54 0a 2a 2f 0a  er to TOSTMT.*/.
f620: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
f630: 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 28 0a 20  transfer_bind(. 
f640: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
f650: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
f660: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
f670: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
f680: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
f690: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f6a0: 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
f6b0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
f6c0: 70 53 74 6d 74 31 2c 20 2a 70 53 74 6d 74 32 3b  pStmt1, *pStmt2;
f6d0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
f6e0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
f6f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f700: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
f710: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
f720: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
f730: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
f740: 5d 2c 20 30 29 2c 20 22 20 46 52 4f 4d 2d 53 54  ], 0), " FROM-ST
f750: 4d 54 20 54 4f 2d 53 54 4d 54 22 2c 20 30 29 3b  MT TO-STMT", 0);
f760: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
f770: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
f780: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
f790: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
f7a0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
f7b0: 26 70 53 74 6d 74 31 29 29 20 72 65 74 75 72 6e  &pStmt1)) return
f7c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
f7d0: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
f7e0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
f7f0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
f800: 20 26 70 53 74 6d 74 32 29 29 20 72 65 74 75 72   &pStmt2)) retur
f810: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
f820: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
f830: 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
f840: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
f850: 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e  te3_transfer_bin
f860: 64 69 6e 67 73 28 70 53 74 6d 74 31 2c 70 53 74  dings(pStmt1,pSt
f870: 6d 74 32 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20  mt2)));.#endif. 
f880: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
f890: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
f8a0: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
f8b0: 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
f8c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
f8d0: 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
f8e0: 68 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  he database by t
f8f0: 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65  he last SQL.** e
f900: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  xecution..*/.sta
f910: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 68 61  tic int test_cha
f920: 6e 67 65 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  nges(.  void * c
f930: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
f940: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
f950: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
f960: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
f970: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
f980: 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a  3 *db;.  if( obj
f990: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
f9a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f9b0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
f9c0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
f9d0: 22 2c 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ",.       Tcl_Ge
f9e0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
f9f0: 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
fa00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fa10: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
fa20: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
fa30: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
fa40: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
fa50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fa60: 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
fa70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
fa80: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
fa90: 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29 29  te3_changes(db))
faa0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
fab0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
fac0: 73 20 69 73 20 74 68 65 20 22 73 74 61 74 69 63  s is the "static
fad0: 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20 74 68 61  _bind_value" tha
fae0: 74 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  t variables are 
faf0: 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a  bound to when.**
fb00: 20 74 68 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e   the FLAG option
fb10: 20 6f 66 20 73 71 6c 69 74 65 33 5f 62 69 6e 64   of sqlite3_bind
fb20: 20 69 73 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a   is "static".*/.
fb30: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 71 6c  static char *sql
fb40: 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
fb50: 76 61 6c 75 65 20 3d 20 30 3b 0a 73 74 61 74 69  value = 0;.stati
fb60: 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 74 61  c int sqlite_sta
fb70: 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 20 3d  tic_bind_nbyte =
fb80: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65   0;../*.** Usage
fb90: 3a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20  :  sqlite3_bind 
fba0: 20 56 4d 20 20 49 44 58 20 20 56 41 4c 55 45 20   VM  IDX  VALUE 
fbb0: 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74   FLAGS.**.** Set
fbc0: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
fbd0: 68 65 20 49 44 58 2d 74 68 20 6f 63 63 75 72 61  he IDX-th occura
fbe0: 6e 63 65 20 6f 66 20 22 3f 22 20 69 6e 20 74 68  nce of "?" in th
fbf0: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a  e original SQL.*
fc00: 2a 20 73 74 72 69 6e 67 2e 20 20 56 41 4c 55 45  * string.  VALUE
fc10: 20 69 73 20 74 68 65 20 6e 65 77 20 76 61 6c 75   is the new valu
fc20: 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e  e.  If FLAGS=="n
fc30: 75 6c 6c 22 20 74 68 65 6e 20 56 41 4c 55 45 20  ull" then VALUE 
fc40: 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e  is.** ignored an
fc50: 64 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 73  d the value is s
fc60: 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20  et to NULL.  If 
fc70: 46 4c 41 47 53 3d 3d 22 73 74 61 74 69 63 22 20  FLAGS=="static" 
fc80: 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75  then.** the valu
fc90: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
fca0: 76 61 6c 75 65 20 6f 66 20 61 20 73 74 61 74 69  value of a stati
fcb0: 63 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 64  c variable named
fcc0: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 73 74 61 74  .** "sqlite_stat
fcd0: 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20  ic_bind_value". 
fce0: 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d   If FLAGS=="norm
fcf0: 61 6c 22 20 74 68 65 6e 20 61 20 63 6f 70 79 0a  al" then a copy.
fd00: 2a 2a 20 6f 66 20 74 68 65 20 56 41 4c 55 45 20  ** of the VALUE 
fd10: 69 73 20 6d 61 64 65 2e 20 20 49 66 20 46 4c 41  is made.  If FLA
fd20: 47 53 3d 3d 22 62 6c 6f 62 31 30 22 20 74 68 65  GS=="blob10" the
fd30: 6e 20 61 20 56 41 4c 55 45 20 69 73 20 69 67 6e  n a VALUE is ign
fd40: 6f 72 65 64 0a 2a 2a 20 61 6e 20 61 20 31 30 2d  ored.** an a 10-
fd50: 62 79 74 65 20 62 6c 6f 62 20 22 61 62 63 5c 30  byte blob "abc\0
fd60: 30 30 78 79 7a 5c 30 30 30 70 71 22 20 69 73 20  00xyz\000pq" is 
fd70: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61  inserted..*/.sta
fd80: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
fd90: 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  d(.  void *NotUs
fda0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
fdb0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
fdc0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
fdd0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
fde0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
fdf0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
fe00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fe10: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
fe20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
fe30: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
fe40: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
fe50: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
fe60: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
fe70: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
fe80: 6e 74 20 69 64 78 3b 0a 20 20 69 66 28 20 61 72  nt idx;.  if( ar
fe90: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
fea0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
feb0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
fec0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
fed0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
fee0: 20 20 20 20 20 22 20 56 4d 20 49 44 58 20 56 41       " VM IDX VA
fef0: 4c 55 45 20 28 6e 75 6c 6c 7c 73 74 61 74 69 63  LUE (null|static
ff00: 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c 20 30 29 3b  |normal)\"", 0);
ff10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ff20: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
ff30: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
ff40: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
ff50: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
ff60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
ff70: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
ff80: 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26  terp, argv[2], &
ff90: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
ffa0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73  L_ERROR;.  if( s
ffb0: 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e  trcmp(argv[4],"n
ffc0: 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ull")==0 ){.    
ffd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
ffe0: 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64  d_null(pStmt, id
fff0: 78 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  x);.  }else if( 
10000 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
10010 73 74 61 74 69 63 22 29 3d 3d 30 20 29 7b 0a 20  static")==0 ){. 
10020 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
10030 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
10040 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74 61   idx, sqlite_sta
10050 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20  tic_bind_value, 
10060 2d 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20  -1, 0);.  }else 
10070 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
10080 34 5d 2c 22 73 74 61 74 69 63 2d 6e 62 79 74 65  4],"static-nbyte
10090 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  s")==0 ){.    rc
100a0 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
100b0 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
100c0 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62   sqlite_static_b
100d0 69 6e 64 5f 76 61 6c 75 65 2c 0a 20 20 20 20 20  ind_value,.     
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10100 20 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f    sqlite_static_
10110 62 69 6e 64 5f 6e 62 79 74 65 2c 20 30 29 3b 0a  bind_nbyte, 0);.
10120 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
10130 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d  mp(argv[4],"norm
10140 61 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  al")==0 ){.    r
10150 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
10160 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78  _text(pStmt, idx
10170 2c 20 61 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53  , argv[3], -1, S
10180 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
10190 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
101a0 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 62 6c  rcmp(argv[4],"bl
101b0 6f 62 31 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ob10")==0 ){.   
101c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
101d0 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
101e0 64 78 2c 20 22 61 62 63 5c 30 30 30 78 79 7a 5c  dx, "abc\000xyz\
101f0 30 30 30 70 71 22 2c 20 31 30 2c 20 53 51 4c 49  000pq", 10, SQLI
10200 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65  TE_STATIC);.  }e
10210 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  lse{.    Tcl_App
10220 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
10230 2c 20 22 34 74 68 20 61 72 67 75 6d 65 6e 74 20  , "4th argument 
10240 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
10250 20 20 20 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72      "\"null\" or
10260 20 5c 22 73 74 61 74 69 63 5c 22 20 6f 72 20 5c   \"static\" or \
10270 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a  "normal\"", 0);.
10280 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10290 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
102a0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
102b0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
102c0 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
102d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
102e0 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  OR;.  if( rc ){.
102f0 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30      char zBuf[50
10300 5d 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ];.    sprintf(z
10310 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63  Buf, "(%d) ", rc
10320 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
10330 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10340 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 45 72 72  zBuf, sqlite3Err
10350 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  Str(rc), 0);.   
10360 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10370 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
10380 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  TCL_OK;.}..#ifnd
10390 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
103a0 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  TF16./*.** Usage
103b0 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61  : add_test_colla
103c0 74 65 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66  te <db ptr> <utf
103d0 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74  8> <utf16le> <ut
103e0 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69  f16be>.**.** Thi
103f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
10400 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  ed to test that 
10410 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74  SQLite selects t
10420 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6c 6c 61  he correct colla
10430 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65  tion.** sequence
10440 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d   callback when m
10450 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e 73  ultiple versions
10460 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20   (for different 
10470 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a  text encodings).
10480 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ** are available
10490 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20  ..**.** Calling 
104a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67  this routine reg
104b0 69 73 74 65 72 73 20 74 68 65 20 63 6f 6c 6c 61  isters the colla
104c0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 22 74  tion sequence "t
104d0 65 73 74 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20  est_collate".** 
104e0 77 69 74 68 20 64 61 74 61 62 61 73 65 20 68 61  with database ha
104f0 6e 64 6c 65 20 3c 64 62 3e 2e 20 54 68 65 20 73  ndle <db>. The s
10500 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d  econd argument m
10510 75 73 74 20 62 65 20 61 20 6c 69 73 74 20 6f 66  ust be a list of
10520 20 74 68 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61   three.** boolea
10530 6e 20 76 61 6c 75 65 73 2e 20 49 66 20 74 68 65  n values. If the
10540 20 66 69 72 73 74 20 69 73 20 74 72 75 65 2c 20   first is true, 
10550 74 68 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f  then a version o
10560 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69  f test_collate i
10570 73 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20  s.** registered 
10580 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20 74 68  for UTF-8, if th
10590 65 20 73 65 63 6f 6e 64 20 69 73 20 74 72 75 65  e second is true
105a0 2c 20 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72  , a version is r
105b0 65 67 69 73 74 65 72 65 64 20 66 6f 72 0a 2a 2a  egistered for.**
105c0 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74 68   UTF-16le, if th
105d0 65 20 74 68 69 72 64 20 69 73 20 74 72 75 65 2c  e third is true,
105e0 20 61 20 55 54 46 2d 31 36 62 65 20 76 65 72 73   a UTF-16be vers
105f0 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
10600 2e 0a 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65  ..** Previous ve
10610 72 73 69 6f 6e 73 20 6f 66 20 74 65 73 74 5f 63  rsions of test_c
10620 6f 6c 6c 61 74 65 20 61 72 65 20 64 65 6c 65 74  ollate are delet
10630 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ed..**.** The co
10640 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
10650 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73   test_collate is
10660 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
10670 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 66  calling the.** f
10680 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63 72  ollowing TCL scr
10690 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65  ipt:.**.**   "te
106a0 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e  st_collate <enc>
106b0 20 3c 6c 68 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a   <lhs> <rhs>".**
106c0 0a 2a 2a 20 54 68 65 20 3c 6c 68 73 3e 20 61 6e  .** The <lhs> an
106d0 64 20 3c 72 68 73 3e 20 61 72 65 20 74 68 65 20  d <rhs> are the 
106e0 74 77 6f 20 76 61 6c 75 65 73 20 62 65 69 6e 67  two values being
106f0 20 63 6f 6d 70 61 72 65 64 2c 20 65 6e 63 6f 64   compared, encod
10700 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20  ed in UTF-8..** 
10710 54 68 65 20 3c 65 6e 63 3e 20 70 61 72 61 6d 65  The <enc> parame
10720 74 65 72 20 69 73 20 74 68 65 20 65 6e 63 6f 64  ter is the encod
10730 69 6e 67 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61  ing of the colla
10740 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68  tion function th
10750 61 74 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 6c  at.** SQLite sel
10760 65 63 74 65 64 20 74 6f 20 63 61 6c 6c 2e 20 54  ected to call. T
10770 68 65 20 54 43 4c 20 74 65 73 74 20 73 63 72 69  he TCL test scri
10780 70 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  pt implements th
10790 65 0a 2a 2a 20 22 74 65 73 74 5f 63 6f 6c 6c 61  e.** "test_colla
107a0 74 65 22 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20  te" proc..**.** 
107b0 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 77  Note that this w
107c0 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20 77 69  ill only work wi
107d0 74 68 20 6f 6e 65 20 69 6e 74 65 70 72 65 74 65  th one inteprete
107e0 72 20 61 74 20 61 20 74 69 6d 65 2c 20 61 73 20  r at a time, as 
107f0 74 68 65 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f  the.** interp po
10800 69 6e 74 65 72 20 74 6f 20 75 73 65 20 77 68 65  inter to use whe
10810 6e 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65  n evaluating the
10820 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20 73   TCL script is s
10830 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73  tored in.** pTes
10840 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a  tCollateInterp..
10850 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 49 6e  */.static Tcl_In
10860 74 65 72 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61  terp* pTestColla
10870 74 65 49 6e 74 65 72 70 3b 0a 73 74 61 74 69 63  teInterp;.static
10880 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74   int test_collat
10890 65 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  e_func(.  void *
108a0 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c  pCtx, .  int nA,
108b0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c   const void *zA,
108c0 0a 20 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74  .  int nB, const
108d0 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54   void *zB.){.  T
108e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 20 3d 20 70  cl_Interp *i = p
108f0 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72  TestCollateInter
10900 70 3b 0a 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d  p;.  int encin =
10910 20 28 69 6e 74 29 70 43 74 78 3b 0a 20 20 69 6e   (int)pCtx;.  in
10920 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a  t res;.  int n;.
10930 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
10940 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f 4f 62   *pVal;.  Tcl_Ob
10950 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d 20 54  j *pX;..  pX = T
10960 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10970 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
10980 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
10990 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a 20 20  efCount(pX);..  
109a0 73 77 69 74 63 68 28 20 65 6e 63 69 6e 20 29 7b  switch( encin ){
109b0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
109c0 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 54 63 6c  _UTF8:.      Tcl
109d0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
109e0 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
109f0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
10a00 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20  -8",-1));.      
10a10 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
10a20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3a 0a  SQLITE_UTF16LE:.
10a30 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
10a40 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10a50 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ,pX,Tcl_NewStrin
10a60 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c  gObj("UTF-16LE",
10a70 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  -1));.      brea
10a80 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
10a90 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20 20 20  TE_UTF16BE:.    
10aa0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10ab0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c  endElement(i,pX,
10ac0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10ad0 28 22 55 54 46 2d 31 36 42 45 22 2c 2d 31 29 29  ("UTF-16BE",-1))
10ae0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10af0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
10b00 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d    assert(0);.  }
10b10 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ..  sqlite3Begin
10b20 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
10b30 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
10b40 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 69  ValueNew(0);.  i
10b50 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20 20 73  f( pVal ){.    s
10b60 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
10b70 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20  r(pVal, nA, zA, 
10b80 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54  encin, SQLITE_ST
10b90 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d 20 73  ATIC);.    n = s
10ba0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
10bb0 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 54 63  es(pVal);.    Tc
10bc0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10bd0 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20 20  lement(i,pX,.   
10be0 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
10bf0 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
10c00 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
10c10 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20 20 73  pVal),n));.    s
10c20 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
10c30 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42 2c 20  r(pVal, nB, zB, 
10c40 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54  encin, SQLITE_ST
10c50 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d 20 73  ATIC);.    n = s
10c60 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
10c70 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 54 63  es(pVal);.    Tc
10c80 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10c90 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20 20  lement(i,pX,.   
10ca0 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
10cb0 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
10cc0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
10cd0 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20 20 73  pVal),n));.    s
10ce0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
10cf0 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pVal);.  }.  sql
10d00 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
10d10 6c 6f 63 28 29 3b 0a 0a 20 20 54 63 6c 5f 45 76  loc();..  Tcl_Ev
10d20 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c 20 30  alObjEx(i, pX, 0
10d30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
10d40 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
10d50 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
10d60 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  , Tcl_GetObjResu
10d70 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a 20 20  lt(i), &res);.  
10d80 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74  return res;.}.st
10d90 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
10da0 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20  llate(.  void * 
10db0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10dc0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10dd0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10de0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10df0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
10e00 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61  e3 *db;.  int va
10e10 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l;.  sqlite3_val
10e20 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  ue *pVal;.  int 
10e30 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
10e40 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72  =5 ) goto bad_ar
10e50 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c 61  gs;.  pTestColla
10e60 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  teInterp = inter
10e70 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  p;.  if( getDbPo
10e80 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
10e90 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10ea0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
10eb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
10ec0 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
10ed0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
10ee0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
10ef0 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [2], &val) ) ret
10f00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10f10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
10f20 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
10f30 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  b, "test_collate
10f40 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
10f50 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64  .          (void
10f60 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c 20   *)SQLITE_UTF8, 
10f70 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  val?test_collate
10f80 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28 20  _func:0);.  if( 
10f90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10fa0 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  .    const void 
10fb0 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 69 66 28  *zUtf16;.    if(
10fc0 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
10fd0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
10fe0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
10ff0 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
11000 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 63  CL_ERROR;.    rc
11010 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
11020 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
11030 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
11040 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
11050 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  .            (vo
11060 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31  id *)SQLITE_UTF1
11070 36 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f  6LE, val?test_co
11080 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20  llate_func:0);. 
11090 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
110a0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
110b0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
110c0 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[4], &val) ) re
110d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
110e0 0a 23 69 66 20 30 0a 20 20 20 20 69 66 28 20 73  .#if 0.    if( s
110f0 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
11100 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  il>0 ){.      sq
11110 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
11120 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  l++;.    }.#endi
11130 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  f.    sqlite3_mu
11140 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
11150 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d  tex);.    pVal =
11160 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
11170 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
11180 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
11190 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f 6c  l, -1, "test_col
111a0 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  late", SQLITE_UT
111b0 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
111c0 43 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d  C);.    zUtf16 =
111d0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
111e0 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55  t(pVal, SQLITE_U
111f0 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20  TF16NATIVE);.   
11200 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11210 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ailed ){.      r
11220 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
11230 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11240 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
11250 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
11260 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 53  16(db, zUtf16, S
11270 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a  QLITE_UTF16BE, .
11280 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20            (void 
11290 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  *)SQLITE_UTF16BE
112a0 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61  , val?test_colla
112b0 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20  te_func:0);.    
112c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  }.    sqlite3Val
112d0 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20  ueFree(pVal);.  
112e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
112f0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
11300 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
11310 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
11320 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
11330 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11340 52 3b 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d  R;.  .  if( rc!=
11350 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11360 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11370 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
11380 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72  3TestErrorName(r
11390 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
113a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
113b0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
113c0 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  K;..bad_args:.  
113d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
113e0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
113f0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
11400 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c  e \"",.      Tcl
11410 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
11420 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
11430 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74   <DB> <utf8> <ut
11440 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e  f16le> <utf16be>
11450 22 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ", 0);.  return 
11460 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
11470 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 63 6f 6c  .** When the col
11480 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 63 61  lation needed ca
11490 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
114a0 64 2c 20 72 65 63 6f 72 64 20 74 68 65 20 6e 61  d, record the na
114b0 6d 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 72 65  me of .** the re
114c0 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6e  quested collatin
114d0 67 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e  g function here.
114e0 20 20 54 68 65 20 72 65 63 6f 72 64 65 64 20 6e    The recorded n
114f0 61 6d 65 20 69 73 20 6c 69 6e 6b 65 64 0a 2a 2a  ame is linked.**
11500 20 74 6f 20 61 20 54 43 4c 20 76 61 72 69 61 62   to a TCL variab
11510 6c 65 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d  le and used to m
11520 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
11530 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
11540 61 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20 69 73  ation.** name is
11550 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61   correct..*/.sta
11560 74 69 63 20 63 68 61 72 20 7a 4e 65 65 64 65 64  tic char zNeeded
11570 43 6f 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d 3b 0a  Collation[200];.
11580 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 7a 4e  static char *pzN
11590 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 20 3d  eededCollation =
115a0 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f   zNeededCollatio
115b0 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65  n;.../*.** Calle
115c0 64 20 77 68 65 6e 20 61 20 63 6f 6c 6c 61 74 69  d when a collati
115d0 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e  ng sequence is n
115e0 65 65 64 65 64 2e 20 20 52 65 67 69 73 74 65 72  eeded.  Register
115f0 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ed using.** sqli
11600 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
11610 65 64 65 64 31 36 28 29 2e 0a 2a 2f 0a 73 74 61  eded16()..*/.sta
11620 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 63 6f  tic void test_co
11630 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 28  llate_needed_cb(
11640 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a  .  void *pCtx, .
11650 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
11660 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20   int eTextRep,. 
11670 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4e 61   const void *pNa
11680 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 63 20  me.){.  int enc 
11690 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 69 6e 74  = ENC(db);.  int
116a0 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
116b0 20 66 6f 72 28 7a 20 3d 20 28 63 68 61 72 2a 29   for(z = (char*)
116c0 70 4e 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a 20 7c  pName, i=0; *z |
116d0 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a 20 20  | z[1]; z++){.  
116e0 20 20 69 66 28 20 2a 7a 20 29 20 7a 4e 65 65 64    if( *z ) zNeed
116f0 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b 2b 5d  edCollation[i++]
11700 20 3d 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a 4e 65   = *z;.  }.  zNe
11710 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 5d  ededCollation[i]
11720 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
11730 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
11740 28 0a 20 20 20 20 20 20 64 62 2c 20 22 74 65 73  (.      db, "tes
11750 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 45 4e 43 28  t_collate", ENC(
11760 64 62 29 2c 20 28 76 6f 69 64 20 2a 29 65 6e 63  db), (void *)enc
11770 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  , test_collate_f
11780 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  unc);.}../*.** U
11790 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
117a0 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20 44 42  ollate_needed DB
117b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
117c0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
117d0 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ed(.  void * cli
117e0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
117f0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
11800 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
11810 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
11820 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
11830 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
11840 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20    if( objc!=2 ) 
11850 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
11860 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
11870 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
11880 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
11890 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
118a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
118b0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  = sqlite3_collat
118c0 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c  ion_needed16(db,
118d0 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65   0, test_collate
118e0 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a  _needed_cb);.  z
118f0 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
11900 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  0] = 0;.  if( sq
11910 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
11920 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
11930 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11940 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
11950 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a  L_OK;..bad_args:
11960 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  .  Tcl_WrongNumA
11970 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
11980 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65  bjv, "DB");.  re
11990 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
119a0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
119b0 20 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74     add_alignment
119c0 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73  _test_collations
119d0 20 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74    DB.**.** Add t
119e0 77 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67  wo new collating
119f0 20 73 65 71 75 65 6e 63 65 73 20 74 6f 20 74 68   sequences to th
11a00 65 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2a  e database DB.**
11a10 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 61 6c  .**     utf16_al
11a20 69 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74 66  igned.**     utf
11a30 31 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a  16_unaligned.**.
11a40 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e  ** Both collatin
11a50 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 20  g sequences use 
11a60 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72  the same sort or
11a70 64 65 72 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a  der as BINARY..*
11a80 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65  * The only diffe
11a90 72 65 6e 63 65 20 69 73 20 74 68 61 74 20 74 68  rence is that th
11aa0 65 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 20  e utf16_aligned 
11ab0 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
11ac0 75 65 6e 63 65 20 69 73 20 64 65 63 6c 61 72 65  uence is declare
11ad0 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
11ae0 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
11af0 66 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f  flag..** Both co
11b00 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
11b10 73 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  s increment the 
11b20 75 6e 61 6c 69 67 6e 65 64 20 75 74 66 31 36 20  unaligned utf16 
11b30 63 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65  counter.** whene
11b40 76 65 72 20 74 68 65 79 20 73 65 65 20 61 20 73  ver they see a s
11b50 74 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e  tring that begin
11b60 73 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74 65  s on an odd byte
11b70 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74   boundary..*/.st
11b80 61 74 69 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e  atic int unalign
11b90 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
11ba0 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  r = 0;.static in
11bb0 74 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46  t alignmentCollF
11bc0 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
11bd0 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Used,.  int nKey
11be0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
11bf0 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
11c00 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
11c10 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
11c20 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
11c30 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
11c40 20 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b   nKey2;.  if( nK
11c50 65 79 31 3e 30 20 26 26 20 31 3d 3d 28 31 26 28  ey1>0 && 1==(1&(
11c60 69 6e 74 29 70 4b 65 79 31 29 20 29 20 75 6e 61  int)pKey1) ) una
11c70 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
11c80 75 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e  unter++;.  if( n
11c90 4b 65 79 32 3e 30 20 26 26 20 31 3d 3d 28 31 26  Key2>0 && 1==(1&
11ca0 28 69 6e 74 29 70 4b 65 79 32 29 20 29 20 75 6e  (int)pKey2) ) un
11cb0 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
11cc0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d  ounter++;.  rc =
11cd0 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70   memcmp(pKey1, p
11ce0 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20  Key2, n);.  if( 
11cf0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
11d00 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
11d10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11d20 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
11d30 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73  dd_alignment_tes
11d40 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20  t_collations(.  
11d50 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
11d60 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
11d70 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
11d80 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
11d90 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
11da0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
11db0 20 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a   if( objc>=2 ){.
11dc0 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69      if( getDbPoi
11dd0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
11de0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11df0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
11e00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11e10 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11e20 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
11e30 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22  utf16_unaligned"
11e40 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20  , SQLITE_UTF16, 
11e50 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67  .        0, alig
11e60 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a  nmentCollFunc);.
11e70 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11e80 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
11e90 20 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22   "utf16_aligned"
11ea0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  , SQLITE_UTF16_A
11eb0 4c 49 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20  LIGNED, .       
11ec0 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c   0, alignmentCol
11ed0 6c 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65  lFunc);.  }.  re
11ee0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11ef0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
11f00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11f10 5f 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a  _UTF16) */../*.*
11f20 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73  * Usage: add_tes
11f30 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70  t_function <db p
11f40 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31  tr> <utf8> <utf1
11f50 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a  6le> <utf16be>.*
11f60 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
11f70 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  on is used to te
11f80 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73  st that SQLite s
11f90 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65  elects the corre
11fa0 63 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74  ct user.** funct
11fb0 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65  ion callback whe
11fc0 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69  n multiple versi
11fd0 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65  ons (for differe
11fe0 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  nt text encoding
11ff0 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61  s).** are availa
12000 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ble..**.** Calli
12010 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
12020 72 65 67 69 73 74 65 72 73 20 75 70 20 74 6f 20  registers up to 
12030 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
12040 66 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  f the user funct
12050 69 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e  ion.** "test_fun
12060 63 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61  ction" with data
12070 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e  base handle <db>
12080 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
12090 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20   argument is.** 
120a0 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72  true, then a ver
120b0 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e  sion of test_fun
120c0 63 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65  ction is registe
120d0 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
120e0 66 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69  f the.** third i
120f0 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f  s true, a versio
12100 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
12110 66 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66  for UTF-16le, if
12120 20 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a   the fourth is.*
12130 2a 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36  * true, a UTF-16
12140 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  be version is av
12150 61 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f  ailable.  Previo
12160 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a  us versions of.*
12170 2a 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  * test_function 
12180 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a  are deleted..**.
12190 2a 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e 63  ** The user func
121a0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
121b0 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ted by calling t
121c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  he following TCL
121d0 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
121e0 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20   "test_function 
121f0 3c 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a  <enc> <arg>".**.
12200 2a 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69  ** Where <enc> i
12210 73 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20  s one of UTF-8, 
12220 55 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31  UTF-16LE or UTF1
12230 36 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69  6BE, and <arg> i
12240 73 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  s the.** single 
12250 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
12260 74 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  to the SQL funct
12270 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
12280 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68  eturned by.** th
12290 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20  e TCL script is 
122a0 75 73 65 64 20 61 73 20 74 68 65 20 72 65 74 75  used as the retu
122b0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  rn value of the 
122c0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74  SQL function. It
122d0 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f  .** is passed to
122e0 20 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54   SQLite using UT
122f0 46 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54 46  F-16BE for a UTF
12300 2d 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  -8 test_function
12310 28 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72  (), UTF-8.** for
12320 20 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74   a UTF-16LE test
12330 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64  _function(), and
12340 20 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e   UTF-16LE for an
12350 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12360 74 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20  that.** prefers 
12370 55 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66  UTF-16BE..*/.#if
12380 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12390 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f  _UTF16.static vo
123a0 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
123b0 5f 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33  _utf8(.  sqlite3
123c0 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
123d0 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
123e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
123f0 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
12400 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
12410 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
12420 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
12430 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
12440 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
12450 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
12460 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
12470 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
12480 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
12490 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
124a0 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
124b0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
124c0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
124d0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
124e0 62 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29  bj("UTF-8", -1))
124f0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
12500 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
12510 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20  erp, pX, .      
12520 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12530 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
12540 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
12550 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  0]), -1));.  Tcl
12560 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
12570 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  p, pX, 0);.  Tcl
12580 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
12590 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
125a0 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54  ult_text(pCtx, T
125b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
125c0 6c 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20  lt(interp), -1, 
125d0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
125e0 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
125f0 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
12600 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
12610 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
12620 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
12630 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
12640 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
12650 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
12660 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
12670 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
12680 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
12690 78 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20  xt16be(pVal),.  
126a0 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
126b0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
126c0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
126d0 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  al);.}.static vo
126e0 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
126f0 5f 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69  _utf16le(.  sqli
12700 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
12710 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
12720 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
12730 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f  **argv.){.  Tcl_
12740 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
12750 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20    Tcl_Obj *pX;. 
12760 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
12770 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d  pVal;.  interp =
12780 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73   (Tcl_Interp *)s
12790 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
127a0 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54  (pCtx);.  pX = T
127b0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
127c0 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
127d0 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
127e0 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
127f0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12800 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12810 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69   pX, Tcl_NewStri
12820 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22  ngObj("UTF-16LE"
12830 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
12840 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12850 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a  nt(interp, pX, .
12860 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
12870 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
12880 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
12890 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b  (argv[0]), -1));
128a0 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
128b0 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b  (interp, pX, 0);
128c0 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
128d0 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20  unt(pX);.  pVal 
128e0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
128f0 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
12900 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
12910 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69   -1, Tcl_GetStri
12920 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
12930 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  , .      SQLITE_
12940 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
12950 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
12960 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
12970 2c 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ,(char*)sqlite3_
12980 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
12990 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  ,-1,SQLITE_TRANS
129a0 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
129b0 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
129c0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
129d0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
129e0 31 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  16be(.  sqlite3_
129f0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
12a00 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
12a10 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
12a20 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
12a30 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
12a40 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
12a50 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
12a60 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
12a70 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
12a80 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
12a90 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
12aa0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
12ab0 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
12ac0 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
12ad0 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
12ae0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
12af0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
12b00 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12b10 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31  j("UTF-16BE", -1
12b20 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
12b30 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
12b40 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20  nterp, pX, .    
12b50 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
12b60 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
12b70 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
12b80 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54  v[0]), -1));.  T
12b90 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
12ba0 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  erp, pX, 0);.  T
12bb0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
12bc0 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  pX);.  pVal = sq
12bd0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
12be0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
12bf0 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
12c00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
12c10 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20  sult(interp), . 
12c20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
12c30 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
12c40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
12c50 6c 74 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20  lt_text16(pCtx, 
12c60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
12c70 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
12c80 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
12c90 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
12ca0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
12cb0 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16be(pCtx, sqlit
12cc0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
12cd0 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
12ce0 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
12cf0 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ENT);.  sqlite3_
12d00 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28  result_text16le(
12d10 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  pCtx, sqlite3_va
12d20 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61  lue_text16le(pVa
12d30 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51  l),.      -1, SQ
12d40 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
12d50 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
12d60 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e  ree(pVal);.}.#en
12d70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
12d80 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74  IT_UTF16 */.stat
12d90 69 63 20 69 6e 74 20 74 65 73 74 5f 66 75 6e 63  ic int test_func
12da0 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
12db0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
12dc0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
12dd0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
12de0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
12df0 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
12e00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
12e10 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  6.  sqlite3 *db;
12e20 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69  .  int val;..  i
12e30 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74  f( objc!=5 ) got
12e40 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66  o bad_args;.  if
12e50 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
12e60 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
12e70 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
12e80 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
12e90 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54  _ERROR;..  if( T
12ea0 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
12eb0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
12ec0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
12ed0 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
12ee0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
12ef0 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
12f00 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12f10 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
12f20 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
12f30 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 69  UTF8, .        i
12f40 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
12f50 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29  tion_utf8, 0, 0)
12f60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f  ;.  }.  if( TCL_
12f70 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
12f80 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
12f90 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29  , objv[3], &val)
12fa0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12fb0 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29  ROR;.  if( val )
12fc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
12fd0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
12fe0 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  , "test_function
12ff0 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
13000 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 69  16LE, .        i
13010 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
13020 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c  tion_utf16le, 0,
13030 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54   0);.  }.  if( T
13040 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
13050 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
13060 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76  erp, objv[4], &v
13070 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
13080 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
13090 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
130a0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
130b0 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
130c0 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
130d0 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20  UTF16BE, .      
130e0 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
130f0 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c  unction_utf16be,
13100 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72   0, 0);.  }..  r
13110 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61  eturn TCL_OK;.ba
13120 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70  d_args:.  Tcl_Ap
13130 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13140 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
13150 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
13160 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74  .      Tcl_GetSt
13170 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
13180 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20  [0], 0), " <DB> 
13190 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
131a0 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b   <utf16be>", 0);
131b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
131c0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
131d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
131e0 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OR;.}../*.** Usa
131f0 67 65 3a 20 20 20 20 20 20 20 20 20 74 65 73 74  ge:         test
13200 5f 65 72 72 73 74 72 20 3c 65 72 72 20 63 6f 64  _errstr <err cod
13210 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  e>.**.** Test th
13220 61 74 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c  at the english l
13230 61 6e 67 75 61 67 65 20 73 74 72 69 6e 67 20 65  anguage string e
13240 71 75 69 76 61 6c 65 6e 74 73 20 66 6f 72 20 73  quivalents for s
13250 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  qlite error code
13260 73 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20 54  s.** are sane. T
13270 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
13280 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65  an integer repre
13290 73 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69 74  senting an sqlit
132a0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  e error code..**
132b0 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   The result is a
132c0 20 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65   list of two ele
132d0 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 72 69 6e  ments, the strin
132e0 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
132f0 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72   of the.** error
13300 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 65 6e   code and the en
13310 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
13320 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  xplanation..*/.s
13330 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
13340 72 72 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 20  rrstr(.  void * 
13350 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
13360 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
13370 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
13380 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
13390 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20  bjv[].){.  char 
133a0 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69 3b  *zCode;.  int i;
133b0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
133c0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
133d0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
133e0 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72 20  , objv, "<error 
133f0 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20  code>");.  }..  
13400 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74 53  zCode = Tcl_GetS
13410 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
13420 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30 30    for(i=0; i<200
13430 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
13440 30 3d 3d 73 74 72 63 6d 70 28 74 31 45 72 72 6f  0==strcmp(t1Erro
13450 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29  rName(i), zCode)
13460 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
13470 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
13480 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
13490 6c 69 74 65 33 45 72 72 53 74 72 28 69 29 2c 20  lite3ErrStr(i), 
134a0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
134b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
134c0 61 67 65 3a 20 20 20 20 62 72 65 61 6b 70 6f 69  age:    breakpoi
134d0 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  nt.**.** This ro
134e0 75 74 69 6e 65 20 65 78 69 73 74 73 20 66 6f 72  utine exists for
134f0 20 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d 20 74   one purpose - t
13500 6f 20 70 72 6f 76 69 64 65 20 61 20 70 6c 61 63  o provide a plac
13510 65 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72  e to put a.** br
13520 65 61 6b 70 6f 69 6e 74 20 77 69 74 68 20 47 44  eakpoint with GD
13530 42 20 74 68 61 74 20 63 61 6e 20 62 65 20 74 72  B that can be tr
13540 69 67 67 65 72 65 64 20 75 73 69 6e 67 20 54 43  iggered using TC
13550 4c 20 63 6f 64 65 2e 20 20 54 68 65 20 75 73 65  L code.  The use
13560 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 69 73 20  .** for this is 
13570 77 68 65 6e 20 61 20 70 61 72 74 69 63 75 6c 61  when a particula
13580 72 20 74 65 73 74 20 66 61 69 6c 73 20 6f 6e 20  r test fails on 
13590 28 73 61 79 29 20 74 68 65 20 31 34 38 35 74 68  (say) the 1485th
135a0 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49   iteration..** I
135b0 6e 20 74 68 65 20 54 43 4c 20 74 65 73 74 20 73  n the TCL test s
135c0 63 72 69 70 74 2c 20 77 65 20 63 61 6e 20 61 64  cript, we can ad
135d0 64 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73  d code like this
135e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b  :.**.**     if {
135f0 24 69 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b 70  $i==1485} breakp
13600 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  oint.**.** Then 
13610 72 75 6e 20 74 65 73 74 66 69 78 74 75 72 65 20  run testfixture 
13620 69 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 20  in the debugger 
13630 61 6e 64 20 77 61 69 74 20 66 6f 72 20 74 68 65  and wait for the
13640 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a   breakpoint to.*
13650 2a 20 66 69 72 65 2e 20 20 54 68 65 6e 20 61 64  * fire.  Then ad
13660 64 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f  ditional breakpo
13670 69 6e 74 73 20 63 61 6e 20 62 65 20 73 65 74 20  ints can be set 
13680 74 6f 20 74 72 61 63 65 20 64 6f 77 6e 20 74 68  to trace down th
13690 65 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  e bug..*/.static
136a0 20 69 6e 74 20 74 65 73 74 5f 62 72 65 61 6b 70   int test_breakp
136b0 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  oint(.  void *No
136c0 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
136d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
136e0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
136f0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
13700 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
13710 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13730 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
13740 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
13750 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
13760 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
13770 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
13780 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
13790 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
137a0 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  thing */.}../*.*
137b0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
137c0 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
137d0 20 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a    STMT IDX N.**.
137e0 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
137f0 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
13800 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  b interface.  ST
13810 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
13820 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49   statement..** I
13830 44 58 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  DX is the index 
13840 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
13850 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
13860 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
13870 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
13880 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69  a N-byte zero-fi
13890 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65  lled BLOB to the
138a0 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
138b0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
138c0 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76  nd_zeroblob(.  v
138d0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
138e0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
138f0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
13900 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
13910 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
13920 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
13930 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
13940 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
13950 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
13960 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
13970 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
13980 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
13990 54 20 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72  T IDX N");.    r
139a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
139b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
139c0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
139d0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
139e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
139f0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
13a00 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
13a10 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
13a20 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
13a30 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
13a40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
13a50 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
13a60 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
13a70 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20  ], &n) ) return 
13a80 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
13a90 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
13aa0 7a 65 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  zeroblob(pStmt, 
13ab0 69 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73  idx, n);.  if( s
13ac0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
13ad0 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
13ae0 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
13af0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13b00 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
13b10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
13b20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13b30 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
13b40 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
13b50 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
13b60 62 69 6e 64 5f 69 6e 74 20 20 53 54 4d 54 20 4e  bind_int  STMT N
13b70 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73   VALUE.**.** Tes
13b80 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
13b90 6e 64 5f 69 6e 74 20 69 6e 74 65 72 66 61 63 65  nd_int interface
13ba0 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
13bb0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
13bc0 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
13bd0 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
13be0 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
13bf0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
13c00 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
13c10 64 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ds a 32-bit inte
13c20 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61  ger VALUE to tha
13c30 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  t wildcard..*/.s
13c40 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
13c50 69 6e 64 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20  ind_int(.  void 
13c60 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
13c70 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13c80 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
13c90 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
13ca0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
13cb0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
13cc0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
13cd0 6e 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  nt value;.  int 
13ce0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
13cf0 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
13d00 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13d10 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
13d20 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
13d30 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
13d40 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
13d50 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
13d60 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a  T N VALUE", 0);.
13d70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13d80 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
13d90 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
13da0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
13db0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
13dc0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
13dd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
13de0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
13df0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
13e00 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
13e10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13e20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
13e30 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
13e40 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
13e50 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13e60 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
13e70 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
13e80 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b  mt, idx, value);
13e90 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
13ea0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
13eb0 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
13ec0 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
13ed0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
13ee0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13ef0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
13f00 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
13f10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
13f20 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
13f30 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
13f40 74 36 34 20 20 53 54 4d 54 20 4e 20 56 41 4c 55  t64  STMT N VALU
13f50 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  E.**.** Test the
13f60 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
13f70 74 36 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20  t64 interface.  
13f80 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
13f90 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
13fa0 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
13fb0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
13fc0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
13fd0 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
13fe0 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
13ff0 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
14000 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77   VALUE to that w
14010 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
14020 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
14030 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a  _int64(.  void *
14040 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
14050 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
14060 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
14070 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
14080 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
14090 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
140a0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 36  .  int idx;.  i6
140b0 34 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  4 value;.  int r
140c0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
140d0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
140e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
140f0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
14100 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
14110 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
14120 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
14130 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
14140 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20   N VALUE", 0);. 
14150 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14160 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
14170 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
14180 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
14190 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
141a0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
141b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
141c0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
141d0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
141e0 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
141f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14200 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49  if( Tcl_GetWideI
14210 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
14220 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75  , objv[3], &valu
14230 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
14240 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
14250 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
14260 34 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  4(pStmt, idx, va
14270 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
14280 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
14290 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
142a0 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
142b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
142c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
142d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
142e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
142f0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
14300 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
14310 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
14320 6e 64 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54 20  nd_double  STMT 
14330 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65  N VALUE.**.** Te
14340 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
14350 69 6e 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72  ind_double inter
14360 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
14370 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
14380 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
14390 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
143a0 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
143b0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
143c0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
143d0 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20   binds a 64-bit 
143e0 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f  integer VALUE to
143f0 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a   that wildcard..
14400 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
14410 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a  st_bind_double(.
14420 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
14430 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
14440 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
14450 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
14460 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
14470 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
14480 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
14490 64 78 3b 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c  dx;.  double val
144a0 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ue;.  int rc;.  
144b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
144c0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61  ;.  int i;.  sta
144d0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
144e0 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
144f0 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
14500 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 70 65   Name of the spe
14510 63 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  cial floating po
14520 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  int value */.   
14530 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 55   unsigned int iU
14540 70 70 65 72 3b 20 20 20 2f 2a 20 55 70 70 65 72  pper;   /* Upper
14550 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 20 20   32 bits */.    
14560 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f  unsigned int iLo
14570 77 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer;   /* Lower 
14580 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61  32 bits */.  } a
14590 53 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a  SpecialFp[] = {.
145a0 20 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20      {  "NaN",   
145b0 20 20 20 30 78 37 66 66 66 66 66 66 66 2c 20 30     0x7fffffff, 0
145c0 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20  xffffffff },.   
145d0 20 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20 20 20   {  "SNaN",     
145e0 30 78 37 66 66 37 66 66 66 66 2c 20 30 78 66 66  0x7ff7ffff, 0xff
145f0 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20  ffffff },.    { 
14600 20 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78 66   "-NaN",     0xf
14610 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66  fffffff, 0xfffff
14620 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d  fff },.    {  "-
14630 53 4e 61 4e 22 2c 20 20 20 20 30 78 66 66 66 37  SNaN",    0xfff7
14640 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
14650 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66   },.    {  "+Inf
14660 22 2c 20 20 20 20 20 30 78 37 66 66 30 30 30 30  ",     0x7ff0000
14670 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c  0, 0x00000000 },
14680 0a 20 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20  .    {  "-Inf", 
14690 20 20 20 20 30 78 66 66 66 30 30 30 30 30 2c 20      0xfff00000, 
146a0 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  0x00000000 },.  
146b0 20 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20    {  "Epsilon", 
146c0 20 30 78 30 30 30 30 30 30 30 30 2c 20 30 78 30   0x00000000, 0x0
146d0 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b  0000001 },.    {
146e0 20 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78    "-Epsilon", 0x
146f0 38 30 30 30 30 30 30 30 2c 20 30 78 30 30 30 30  80000000, 0x0000
14700 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0001 },.    {  "
14710 4e 61 4e 30 22 2c 20 20 20 20 20 30 78 37 66 66  NaN0",     0x7ff
14720 38 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  80000, 0x0000000
14730 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61  0 },.    {  "-Na
14740 4e 30 22 2c 20 20 20 20 30 78 66 66 66 38 30 30  N0",    0xfff800
14750 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d  00, 0x00000000 }
14760 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62  ,.  };..  if( ob
14770 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
14780 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
14790 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
147a0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
147b0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
147c0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
147d0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
147e0 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30  STMT N VALUE", 0
147f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
14800 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
14810 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
14820 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
14830 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
14840 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
14850 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14860 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
14870 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
14880 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
14890 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
148a0 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65 70  ;..  /* Intercep
148b0 74 20 74 68 65 20 73 74 72 69 6e 67 20 22 4e 61  t the string "Na
148c0 4e 22 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  N" and generate 
148d0 61 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72 20  a NaN value for 
148e0 69 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68  it..  ** All oth
148f0 65 72 20 73 74 72 69 6e 67 73 20 61 72 65 20 70  er strings are p
14900 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
14910 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
14920 6f 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63  omObj()..  ** Tc
14930 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
14940 62 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e 64 65  bj() should unde
14950 72 73 74 61 6e 64 20 22 4e 61 4e 22 20 62 75 74  rstand "NaN" but
14960 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20   some versions. 
14970 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 75   ** contain a bu
14980 67 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d  g..  */.  zVal =
14990 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
149a0 62 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[3]);.  for(i
149b0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 70  =0; i<sizeof(aSp
149c0 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28  ecialFp)/sizeof(
149d0 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20  aSpecialFp[0]); 
149e0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
149f0 72 63 6d 70 28 61 53 70 65 63 69 61 6c 46 70 5b  rcmp(aSpecialFp[
14a00 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d  i].zName, zVal)=
14a10 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
14a20 74 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20  te3_uint64 x;.  
14a30 20 20 20 20 78 20 3d 20 61 53 70 65 63 69 61 6c      x = aSpecial
14a40 46 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20  Fp[i].iUpper;.  
14a50 20 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20      x <<= 32;.  
14a60 20 20 20 20 78 20 7c 3d 20 61 53 70 65 63 69 61      x |= aSpecia
14a70 6c 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20  lFp[i].iLower;. 
14a80 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
14a90 65 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b  eof(value)==8 );
14aa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
14ab0 69 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20  izeof(x)==8 );. 
14ac0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 61 6c       memcpy(&val
14ad0 75 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20  ue, &x, 8);.    
14ae0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14af0 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65   }.  if( i>=size
14b00 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73  of(aSpecialFp)/s
14b10 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70  izeof(aSpecialFp
14b20 5b 30 5d 29 20 26 26 0a 20 20 20 20 20 20 20 20  [0]) &&.        
14b30 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
14b40 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
14b50 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
14b60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
14b70 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
14b80 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
14b90 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64  double(pStmt, id
14ba0 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28  x, value);.  if(
14bb0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
14bc0 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
14bd0 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
14be0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
14bf0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
14c00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14c10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14c20 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
14c30 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
14c40 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
14c50 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d  3_bind_null  STM
14c60 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  T N.**.** Test t
14c70 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
14c80 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20  null interface. 
14c90 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
14ca0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
14cb0 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
14cc0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
14cd0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
14ce0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
14cf0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
14d00 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77   a NULL to the w
14d10 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
14d20 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
14d30 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20  _null(.  void * 
14d40 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
14d50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14d60 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
14d70 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
14d80 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
14d90 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
14da0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
14db0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
14dc0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
14dd0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
14de0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
14df0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
14e00 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
14e10 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
14e20 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
14e30 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72  MT N", 0);.    r
14e40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14e50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
14e60 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
14e70 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
14e80 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
14e90 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
14ea0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
14eb0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
14ec0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
14ed0 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
14ee0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
14ef0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
14f00 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
14f10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
14f20 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
14f30 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
14f40 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
14f50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
14f60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14f70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
14f80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
14f90 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
14fa0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
14fb0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
14fc0 74 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47  t  STMT N STRING
14fd0 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73   BYTES.**.** Tes
14fe0 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
14ff0 6e 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63  nd_text interfac
15000 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
15010 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
15020 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
15030 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
15040 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
15050 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
15060 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
15070 6e 64 73 20 61 20 55 54 46 2d 38 20 73 74 72 69  nds a UTF-8 stri
15080 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65  ng STRING to the
15090 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
150a0 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20  string is BYTES 
150b0 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a  bytes.** long..*
150c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
150d0 74 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76  t_bind_text(.  v
150e0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
150f0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15100 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15110 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15120 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15130 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
15140 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
15150 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
15160 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69  char *value;.  i
15170 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
15180 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
15190 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
151a0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
151b0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
151c0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
151d0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
151e0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
151f0 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54  STMT N VALUE BYT
15200 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ES", 0);.    ret
15210 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15220 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
15230 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
15240 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15250 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
15260 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15270 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
15280 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
15290 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
152a0 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
152b0 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20  _ERROR;.  value 
152c0 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74  = (char*)Tcl_Get
152d0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
152e0 28 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73  (objv[3], &bytes
152f0 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
15300 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
15310 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
15320 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
15330 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
15340 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
15350 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  t(pStmt, idx, va
15360 6c 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49  lue, bytes, SQLI
15370 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
15380 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
15390 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
153a0 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
153b0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
153c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
153d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
153e0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
153f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
15400 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d  ite3TestErrorNam
15410 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
15420 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15430 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
15440 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
15450 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
15460 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 3f 2d 73  _bind_text16 ?-s
15470 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 53 54  tatic? STMT N ST
15480 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a  RING BYTES.**.**
15490 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
154a0 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 69 6e  3_bind_text16 in
154b0 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
154c0 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
154d0 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
154e0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
154f0 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
15500 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
15510 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
15520 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d  .** binds a UTF-
15530 31 36 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47  16 string STRING
15540 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
15550 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73  .  The string is
15560 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20   BYTES bytes.** 
15570 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  long..*/.static 
15580 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65  int test_bind_te
15590 78 74 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  xt16(.  void * c
155a0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
155b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
155c0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
155d0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
155e0 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
155f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
15600 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  6.  sqlite3_stmt
15610 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
15620 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  dx;.  int bytes;
15630 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a  .  char *value;.
15640 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 76 6f 69    int rc;..  voi
15650 64 20 28 2a 78 44 65 6c 29 28 29 20 3d 20 28 6f  d (*xDel)() = (o
15660 62 6a 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54  bjc==6?SQLITE_ST
15670 41 54 49 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e  ATIC:SQLITE_TRAN
15680 53 49 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62  SIENT);.  Tcl_Ob
15690 6a 20 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62  j *oStmt    = ob
156a0 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63  jv[objc-4];.  Tc
156b0 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20  l_Obj *oN       
156c0 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a  = objv[objc-3];.
156d0 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69    Tcl_Obj *oStri
156e0 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  ng  = objv[objc-
156f0 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  2];.  Tcl_Obj *o
15700 42 79 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f  Bytes   = objv[o
15710 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f  bjc-1];..  if( o
15720 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
15730 36 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  6){.    Tcl_Appe
15740 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
15750 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
15760 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
15770 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
15780 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
15790 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
157a0 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20  N VALUE BYTES", 
157b0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
157c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
157d0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
157e0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
157f0 47 65 74 53 74 72 69 6e 67 28 6f 53 74 6d 74 29  GetString(oStmt)
15800 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
15810 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15820 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
15830 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e  omObj(interp, oN
15840 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
15850 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61   TCL_ERROR;.  va
15860 6c 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c  lue = (char*)Tcl
15870 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
15880 6d 4f 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29  mObj(oString, 0)
15890 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
158a0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
158b0 2c 20 6f 42 79 74 65 73 2c 20 26 62 79 74 65 73  , oBytes, &bytes
158c0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
158d0 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
158e0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
158f0 36 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76  6(pStmt, idx, (v
15900 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74  oid *)value, byt
15910 65 73 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66 28  es, xDel);.  if(
15920 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
15930 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
15940 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
15950 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15960 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
15970 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15980 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15990 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
159a0 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63  TestErrorName(rc
159b0 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
159c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
159d0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
159e0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
159f0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
15a00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
15a10 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
15a20 5f 62 6c 6f 62 20 3f 2d 73 74 61 74 69 63 3f 20  _blob ?-static? 
15a30 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45  STMT N DATA BYTE
15a40 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  S.**.** Test the
15a50 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
15a60 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  ob interface.  S
15a70 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
15a80 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
15a90 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
15aa0 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
15ab0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
15ac0 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
15ad0 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
15ae0 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c   BLOB to the wil
15af0 64 63 61 72 64 2e 20 20 54 68 65 20 42 4c 4f 42  dcard.  The BLOB
15b00 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73 20   is BYTES bytes 
15b10 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
15b20 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
15b30 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20  _blob(.  void * 
15b40 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
15b50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
15b60 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
15b70 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
15b80 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
15b90 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
15ba0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
15bb0 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a   bytes;.  char *
15bc0 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
15bd0 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 73 74 72  .  sqlite3_destr
15be0 75 63 74 6f 72 5f 74 79 70 65 20 78 44 65 73 74  uctor_type xDest
15bf0 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f  ructor = SQLITE_
15c00 54 52 41 4e 53 49 45 4e 54 3b 0a 0a 20 20 69 66  TRANSIENT;..  if
15c10 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
15c20 63 21 3d 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=6 ){.    Tcl_
15c30 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
15c40 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
15c50 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
15c60 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
15c70 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
15c80 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
15c90 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45 53  TMT N DATA BYTES
15ca0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
15cb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
15cc0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20  ..  if( objc==6 
15cd0 29 7b 0a 20 20 20 20 78 44 65 73 74 72 75 63 74  ){.    xDestruct
15ce0 6f 72 20 3d 20 53 51 4c 49 54 45 5f 53 54 41 54  or = SQLITE_STAT
15cf0 49 43 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a  IC;.    objv++;.
15d00 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
15d10 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
15d20 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
15d30 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
15d40 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15d50 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
15d60 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
15d70 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
15d80 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
15d90 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65  L_ERROR;.  value
15da0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
15db0 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28  (objv[3]);.  if(
15dc0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
15dd0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
15de0 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  4], &bytes) ) re
15df0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15e00 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
15e10 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
15e20 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74   idx, value, byt
15e30 65 73 2c 20 78 44 65 73 74 72 75 63 74 6f 72 29  es, xDestructor)
15e40 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
15e50 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
15e60 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
15e70 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
15e80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
15e90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15ea0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
15eb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
15ec0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
15ed0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
15ee0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
15ef0 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 20 20 53  rameter_count  S
15f00 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TMT.**.** Return
15f10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
15f20 69 6c 64 63 61 72 64 73 20 69 6e 20 74 68 65 20  ildcards in the 
15f30 67 69 76 65 6e 20 73 74 61 74 65 6d 65 6e 74 2e  given statement.
15f40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
15f50 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
15f60 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  er_count(.  void
15f70 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
15f80 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15f90 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
15fa0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
15fb0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
15fc0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
15fd0 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
15fe0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
15ff0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
16000 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
16010 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
16020 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
16030 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
16040 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
16050 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
16060 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
16070 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16080 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
16090 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
160a0 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
160b0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
160c0 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20  ount(pStmt)));. 
160d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
160e0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
160f0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
16100 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 20 20 53  arameter_name  S
16110 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65 74  TMT  N.**.** Ret
16120 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
16130 74 68 65 20 4e 74 68 20 77 69 6c 64 63 61 72 64  the Nth wildcard
16140 2e 20 20 54 68 65 20 66 69 72 73 74 20 77 69 6c  .  The first wil
16150 64 63 61 72 64 20 69 73 20 31 2e 0a 2a 2a 20 41  dcard is 1..** A
16160 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
16170 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 4e 20  s returned if N 
16180 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  is out of range 
16190 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61  or if the wildca
161a0 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65 6c 65 73  rd.** is nameles
161b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
161c0 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
161d0 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20 76 6f 69  eter_name(.  voi
161e0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
161f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
16200 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
16210 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
16220 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
16230 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
16240 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  mt;.  int i;..  
16250 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
16260 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
16270 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
16280 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22 29 3b 0a  bjv, "STMT N");.
16290 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
162a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
162b0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
162c0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
162d0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
162e0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
162f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
16300 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
16310 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
16320 32 5d 2c 20 26 69 29 20 29 20 72 65 74 75 72 6e  2], &i) ) return
16330 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
16340 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
16350 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c  nterp, .     Tcl
16360 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
16370 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
16380 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  eter_name(pStmt,
16390 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20 20 72 65  i),-1).  );.  re
163a0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
163b0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
163c0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
163d0 6d 65 74 65 72 5f 69 6e 64 65 78 20 20 53 54 4d  meter_index  STM
163e0 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65  T  NAME.**.** Re
163f0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
16400 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63  f the wildcard c
16410 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 52 65 74  alled NAME.  Ret
16420 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 69  urn 0 if there i
16430 73 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 77 69 6c  s.** no such wil
16440 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
16450 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70   int test_bind_p
16460 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 0a  arameter_index(.
16470 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
16480 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
16490 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
164a0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
164b0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
164c0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
164d0 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
164e0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
164f0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
16500 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
16510 20 22 53 54 4d 54 20 4e 41 4d 45 22 29 3b 0a 20   "STMT NAME");. 
16520 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16530 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
16540 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
16550 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
16560 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
16570 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
16580 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
16590 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
165a0 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e  erp, .     Tcl_N
165b0 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20  ewIntObj(.      
165c0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
165d0 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53  rameter_index(pS
165e0 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74 72 69 6e  tmt,Tcl_GetStrin
165f0 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20 20 20 20  g(objv[2])).    
16600 20 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e   ).  );.  return
16610 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
16620 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
16630 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
16640 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73 74 61  s STMT.**.*/.sta
16650 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6c 65  tic int test_cle
16660 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a 20 20 76  ar_bindings(.  v
16670 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16680 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16690 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
166a0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
166b0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
166c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
166d0 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
166e0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
166f0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
16700 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
16710 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
16720 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16730 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
16740 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
16750 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
16760 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
16770 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16780 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61  ;.  sqlite3_clea
16790 72 5f 62 69 6e 64 69 6e 67 73 28 30 29 3b 20 2f  r_bindings(0); /
167a0 2a 20 74 65 73 74 20 66 6f 72 20 68 61 6e 64 6c  * test for handl
167b0 69 6e 67 20 4e 55 4c 4c 20 3c 72 64 61 72 3a 2f  ing NULL <rdar:/
167c0 2f 70 72 6f 62 6c 65 6d 2f 36 36 34 36 33 33 31  /problem/6646331
167d0 3e 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 4f 62  > */.  Tcl_SetOb
167e0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
167f0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
16800 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
16810 69 6e 67 73 28 70 53 74 6d 74 29 29 29 3b 0a 20  ings(pStmt)));. 
16820 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
16830 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
16840 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20    sqlite3_sleep 
16850 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a  MILLISECONDS.*/.
16860 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
16870 73 6c 65 65 70 28 0a 20 20 76 6f 69 64 20 2a 20  sleep(.  void * 
16880 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
16890 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
168a0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
168b0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
168c0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d  bjv[].){.  int m
168d0 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  s;..  if( objc!=
168e0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
168f0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
16900 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c  , 1, objv, "MILL
16910 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20  ISECONDS");.    
16920 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16930 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
16940 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
16950 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
16960 6d 73 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ms) ){.    retur
16970 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16980 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
16990 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
169a0 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
169b0 33 5f 73 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20  3_sleep(ms)));. 
169c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
169d0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
169e0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
169f0 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a  _errcode DB.**.*
16a00 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72  * Return the str
16a10 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
16a20 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
16a30 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20  ecent sqlite3_* 
16a40 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  API.** error cod
16a50 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f  e. e.g. "SQLITE_
16a60 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69  ERROR"..*/.stati
16a70 63 20 69 6e 74 20 74 65 73 74 5f 65 78 5f 65 72  c int test_ex_er
16a80 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20  rcode(.  void * 
16a90 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
16aa0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16ab0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
16ac0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
16ad0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
16ae0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
16af0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
16b00 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
16b10 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16b20 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
16b30 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
16b40 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
16b50 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
16b60 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
16b70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16b80 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
16b90 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
16ba0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
16bb0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
16bc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16bd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
16be0 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
16bf0 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  db);.  Tcl_Appen
16c00 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16c10 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
16c20 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
16c30 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
16c40 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
16c50 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 44  qlite3_errcode D
16c60 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
16c70 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
16c80 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
16c90 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
16ca0 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72  te3_* API.** err
16cb0 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53  or code. e.g. "S
16cc0 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f  QLITE_ERROR"..*/
16cd0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
16ce0 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64  _errcode(.  void
16cf0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
16d00 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
16d10 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
16d20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
16d30 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
16d40 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
16d50 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
16d60 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
16d70 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16d80 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
16d90 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
16da0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
16db0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
16dc0 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
16dd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16de0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
16df0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
16e00 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
16e10 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
16e20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16e30 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
16e40 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
16e50 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16e60 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
16e70 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
16e80 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
16e90 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
16ea0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
16eb0 33 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a  3_errmsg DB.**.*
16ec0 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54  * Returns the UT
16ed0 46 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74 69  F-8 representati
16ee0 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20  on of the error 
16ef0 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 66  message string f
16f00 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  or the.** most r
16f10 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20  ecent sqlite3_* 
16f20 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  API call..*/.sta
16f30 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72  tic int test_err
16f40 6d 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  msg(.  void * cl
16f50 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
16f60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
16f70 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
16f80 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
16f90 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
16fa0 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
16fb0 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28  ar *zErr;..  if(
16fc0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
16fd0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
16fe0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
16ff0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
17000 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
17010 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
17020 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
17030 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
17040 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
17050 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
17060 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
17070 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
17080 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
17090 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20  _ERROR;..  zErr 
170a0 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
170b0 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  (db);.  Tcl_SetO
170c0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
170d0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
170e0 6a 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20  j(zErr, -1));.  
170f0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
17100 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
17110 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44   test_errmsg16 D
17120 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
17130 74 68 65 20 55 54 46 2d 31 36 20 72 65 70 72 65  the UTF-16 repre
17140 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
17150 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
17160 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a  tring for the.**
17170 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
17180 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e  ite3_* API call.
17190 20 54 68 69 73 20 69 73 20 61 20 62 79 74 65 20   This is a byte 
171a0 61 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20  array object at 
171b0 74 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65  the TCL .** leve
171c0 6c 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64  l, and it includ
171d0 65 73 20 74 68 65 20 30 78 30 30 20 30 78 30 30  es the 0x00 0x00
171e0 20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65   terminator byte
171f0 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
17200 74 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74  the.** UTF-16 st
17210 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
17220 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 31  int test_errmsg1
17230 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
17240 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
17250 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
17260 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17270 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17280 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
17290 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
172a0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
172b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72 72  const void *zErr
172c0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
172d0 7a 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 20 3d  z;.  int bytes =
172e0 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
172f0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
17300 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17310 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
17320 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
17330 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
17340 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
17350 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
17360 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17370 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
17380 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
17390 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
173a0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
173b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
173c0 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69  ;..  zErr = sqli
173d0 74 65 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29  te3_errmsg16(db)
173e0 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a  ;.  if( zErr ){.
173f0 20 20 20 20 7a 20 3d 20 7a 45 72 72 3b 0a 20 20      z = zErr;.  
17400 20 20 66 6f 72 28 62 79 74 65 73 3d 30 3b 20 7a    for(bytes=0; z
17410 5b 62 79 74 65 73 5d 20 7c 7c 20 7a 5b 62 79 74  [bytes] || z[byt
17420 65 73 2b 31 5d 3b 20 62 79 74 65 73 2b 3d 32 29  es+1]; bytes+=2)
17430 7b 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  {}.  }.  Tcl_Set
17440 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
17450 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
17460 61 79 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74 65  ayObj(zErr, byte
17470 73 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  s));.#endif /* S
17480 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
17490 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
174a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
174b0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
174c0 70 61 72 65 20 44 42 20 73 71 6c 20 62 79 74 65  pare DB sql byte
174d0 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a  s ?tailvar?.**.*
174e0 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
174f0 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
17500 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
17510 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
17520 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
17530 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
17540 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
17550 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
17560 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
17570 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
17580 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
17590 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
175a0 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
175b0 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
175c0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
175d0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
175e0 70 72 65 70 61 72 65 28 0a 20 20 76 6f 69 64 20  prepare(.  void 
175f0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
17600 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17610 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
17620 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
17630 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
17640 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
17650 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
17660 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e  int bytes;.  con
17670 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d  st char *zTail =
17680 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
17690 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
176a0 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
176b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
176c0 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
176d0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
176e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
176f0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
17700 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
17710 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
17720 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
17730 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
17740 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b   ?tailvar?", 0);
17750 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17760 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
17770 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
17780 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
17790 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
177a0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
177b0 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
177c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
177d0 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
177e0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
177f0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
17800 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
17810 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
17820 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
17830 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62  pare(db, zSql, b
17840 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62  ytes, &pStmt, ob
17850 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a  jc>=5 ? &zTail :
17860 20 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74   0);.  Tcl_Reset
17870 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
17880 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
17890 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
178a0 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
178b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
178c0 66 28 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63  f( zTail && objc
178d0 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 62  >=5 ){.    if( b
178e0 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ytes>=0 ){.     
178f0 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d   bytes = bytes -
17900 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20   (zTail-zSql);. 
17910 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
17920 6c 65 6e 28 7a 54 61 69 6c 29 3c 62 79 74 65 73  len(zTail)<bytes
17930 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20   ){.      bytes 
17940 3d 20 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b  = strlen(zTail);
17950 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f  .    }.    Tcl_O
17960 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
17970 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63  , objv[4], 0, Tc
17980 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
17990 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29  Tail, bytes), 0)
179a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
179b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
179c0 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d   assert( pStmt==
179d0 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  0 );.    sprintf
179e0 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20  (zBuf, "(%d) ", 
179f0 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  rc);.    Tcl_App
17a00 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
17a10 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f  , zBuf, sqlite3_
17a20 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
17a30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17a40 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
17a50 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
17a60 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
17a70 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
17a80 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
17a90 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17aa0 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
17ab0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
17ac0 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
17ad0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
17ae0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
17af0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
17b00 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65 73  _v2 DB sql bytes
17b10 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a   ?tailvar?.**.**
17b20 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c   Compile up to <
17b30 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20  bytes> bytes of 
17b40 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c  the supplied SQL
17b50 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73   string <sql> us
17b60 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
17b70 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65  handle <DB>. The
17b80 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c   parameter <tail
17b90 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65  val> is the name
17ba0 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20   of a global.** 
17bb0 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73  variable that is
17bc0 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73   set to the unus
17bd0 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73  ed portion of <s
17be0 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a  ql> (if any). A.
17bf0 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69  ** STMT handle i
17c00 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
17c10 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
17c20 72 65 70 61 72 65 5f 76 32 28 0a 20 20 76 6f 69  repare_v2(.  voi
17c30 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
17c40 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
17c50 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
17c60 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
17c70 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
17c80 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
17c90 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  nst char *zSql;.
17ca0 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
17cb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c  onst char *zTail
17cc0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
17cd0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
17ce0 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
17cf0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
17d00 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
17d10 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
17d20 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
17d30 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
17d40 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
17d50 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
17d60 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
17d70 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
17d80 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b  es tailvar", 0);
17d90 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17da0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
17db0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
17dc0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
17dd0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
17de0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
17df0 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
17e00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
17e10 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
17e20 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
17e30 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
17e40 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
17e50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
17e60 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
17e70 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
17e80 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
17e90 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69   objc>=5 ? &zTai
17ea0 6c 20 3a 20 30 29 3b 0a 20 20 61 73 73 65 72 74  l : 0);.  assert
17eb0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc==SQLITE_OK |
17ec0 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 54  | pStmt==0);.  T
17ed0 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
17ee0 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71  nterp);.  if( sq
17ef0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
17f00 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
17f10 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17f20 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c  ROR;.  if( zTail
17f30 20 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20   && objc>=5 ){. 
17f40 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20     if( bytes>=0 
17f50 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d  ){.      bytes =
17f60 20 62 79 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d   bytes - (zTail-
17f70 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
17f80 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
17f90 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
17fa0 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   0, Tcl_NewStrin
17fb0 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65  gObj(zTail, byte
17fc0 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  s), 0);.  }.  if
17fd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17fe0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
17ff0 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
18000 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25  printf(zBuf, "(%
18010 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
18020 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
18030 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
18040 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
18050 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18060 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18070 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
18080 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
18090 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
180a0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
180b0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
180c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
180d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
180e0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
180f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
18100 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
18110 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
18120 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 20 44  repare_tkt3134 D
18130 42 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  B.**.** Generate
18140 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
18150 65 6d 65 6e 74 20 66 6f 72 20 61 20 7a 65 72 6f  ement for a zero
18160 2d 62 79 74 65 20 73 74 72 69 6e 67 20 61 73 20  -byte string as 
18170 61 20 74 65 73 74 0a 2a 2a 20 66 6f 72 20 74 69  a test.** for ti
18180 63 6b 65 74 20 23 33 31 33 34 2e 20 20 54 68 65  cket #3134.  The
18190 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62   string should b
181a0 65 20 70 72 65 63 65 65 64 65 64 20 62 79 20 61  e preceeded by a
181b0 20 7a 65 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73   zero byte..*/.s
181c0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
181d0 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 28 0a  repare_tkt3134(.
181e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
181f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
18200 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18210 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
18220 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18230 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
18240 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
18250 63 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c  char zSql[] = "\
18260 30 30 30 53 45 4c 45 43 54 20 31 22 3b 0a 20 20  000SELECT 1";.  
18270 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
18280 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
18290 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20  zBuf[50];.  int 
182a0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
182b0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
182c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
182d0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
182e0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
182f0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
18300 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
18310 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
18320 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20  tailvar", 0);.  
18330 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18340 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
18350 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
18360 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
18370 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
18380 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18390 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
183a0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
183b0 2c 20 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20 26  , &zSql[1], 0, &
183c0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 61 73 73  pStmt, 0);.  ass
183d0 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
183e0 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a  K || pStmt==0);.
183f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
18400 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
18410 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
18420 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
18430 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18440 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
18450 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
18460 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28  sprintf(zBuf, "(
18470 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
18480 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18490 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
184a0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
184b0 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
184c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
184d0 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
184e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
184f0 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
18500 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
18510 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
18520 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
18530 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18540 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
18550 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18560 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
18570 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
18580 70 72 65 70 61 72 65 31 36 20 44 42 20 73 71 6c  prepare16 DB sql
18590 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a   bytes tailvar.*
185a0 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
185b0 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
185c0 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
185d0 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
185e0 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
185f0 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
18600 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
18610 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
18620 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
18630 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
18640 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
18650 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
18660 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
18670 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
18680 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
18690 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
186a0 73 74 5f 70 72 65 70 61 72 65 31 36 28 0a 20 20  st_prepare16(.  
186b0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
186c0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
186d0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
186e0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
186f0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18700 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18710 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
18720 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
18730 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63   void *zSql;.  c
18740 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c  onst void *zTail
18750 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   = 0;.  Tcl_Obj 
18760 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71  *pTail = 0;.  sq
18770 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
18780 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
18790 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72  uf[50]; .  int r
187a0 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20  c;.  int bytes; 
187b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
187c0 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70  * The integer sp
187d0 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33  ecified as arg 3
187e0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e   */.  int objlen
187f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18800 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61  /* The byte-arra
18810 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20  y length of arg 
18820 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  2 */..  if( objc
18830 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=5 && objc!=4 )
18840 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
18850 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
18860 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
18870 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
18880 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
18890 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
188a0 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69  B sql bytes ?tai
188b0 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20  lvar?", 0);.    
188c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
188d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
188e0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
188f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18900 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
18910 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18920 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
18930 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
18940 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a  bj(objv[2], &obj
18950 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  len);.  if( Tcl_
18960 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
18970 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
18980 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
18990 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
189a0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
189b0 72 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c 20 62  re16(db, zSql, b
189c0 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62  ytes, &pStmt, ob
189d0 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a  jc>=5 ? &zTail :
189e0 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   0);.  if( sqlit
189f0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
18a00 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
18a10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18a20 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
18a30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18a40 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f  OR;.  }..  if( o
18a50 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66  bjc>=5 ){.    if
18a60 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 20  ( zTail ){.     
18a70 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e   objlen = objlen
18a80 20 2d 20 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d   - ((u8 *)zTail-
18a90 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20  (u8 *)zSql);.   
18aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62   }else{.      ob
18ab0 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  jlen = 0;.    }.
18ac0 20 20 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f      pTail = Tcl_
18ad0 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
18ae0 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a  (u8 *)zTail, obj
18af0 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  len);.    Tcl_In
18b00 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c  crRefCount(pTail
18b10 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65  );.    Tcl_ObjSe
18b20 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62  tVar2(interp, ob
18b30 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c  jv[4], 0, pTail,
18b40 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63   0);.    Tcl_Dec
18b50 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29  rRefCount(pTail)
18b60 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
18b70 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
18b80 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
18b90 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
18ba0 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
18bb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18bc0 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e  .  }.  Tcl_Appen
18bd0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18be0 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66  zBuf, 0);.#endif
18bf0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
18c00 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
18c10 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
18c20 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
18c30 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 44  3_prepare16_v2 D
18c40 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69  B sql bytes ?tai
18c50 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  lvar?.**.** Comp
18c60 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73  ile up to <bytes
18c70 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73  > bytes of the s
18c80 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69  upplied SQL stri
18c90 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a  ng <sql> using.*
18ca0 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
18cb0 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61  e <DB>. The para
18cc0 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20  meter <tailval> 
18cd0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
18ce0 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61   global.** varia
18cf0 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20  ble that is set 
18d00 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f  to the unused po
18d10 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28  rtion of <sql> (
18d20 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54  if any). A.** ST
18d30 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74  MT handle is ret
18d40 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
18d50 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72   int test_prepar
18d60 65 31 36 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a  e16_v2(.  void *
18d70 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
18d80 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18d90 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18da0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18db0 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
18dc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
18dd0 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
18de0 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
18df0 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76  *zSql;.  const v
18e00 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  oid *zTail = 0;.
18e10 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c    Tcl_Obj *pTail
18e20 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
18e30 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
18e40 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
18e50 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ; .  int rc;.  i
18e60 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20  nt bytes;       
18e70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18e80 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65  integer specifie
18e90 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20  d as arg 3 */.  
18ea0 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20  int objlen;     
18eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18ec0 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67   byte-array leng
18ed0 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a  th of arg 2 */..
18ee0 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
18ef0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
18f00 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18f10 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
18f20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
18f30 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
18f40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18f50 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
18f60 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22  bytes ?tailvar?"
18f70 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18f80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18f90 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
18fa0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
18fb0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
18fc0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
18fd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
18fe0 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ql = Tcl_GetByte
18ff0 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
19000 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a  v[2], &objlen);.
19010 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
19020 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
19030 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
19040 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19050 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
19060 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76  ite3_prepare16_v
19070 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65  2(db, zSql, byte
19080 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e  s, &pStmt, objc>
19090 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29  =5 ? &zTail : 0)
190a0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
190b0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
190c0 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
190d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
190e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
190f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19100 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63  .  }..  if( objc
19110 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  >=5 ){.    if( z
19120 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62  Tail ){.      ob
19130 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20  jlen = objlen - 
19140 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38  ((u8 *)zTail-(u8
19150 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65   *)zSql);.    }e
19160 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65  lse{.      objle
19170 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  n = 0;.    }.   
19180 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77   pTail = Tcl_New
19190 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38  ByteArrayObj((u8
191a0 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e   *)zTail, objlen
191b0 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  );.    Tcl_IncrR
191c0 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a  efCount(pTail);.
191d0 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
191e0 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  r2(interp, objv[
191f0 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29  4], 0, pTail, 0)
19200 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
19210 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20  fCount(pTail);. 
19220 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
19230 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
19240 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
19250 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
19260 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
19270 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19280 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
19290 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
192a0 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  f, 0);.#endif /*
192b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
192c0 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
192d0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
192e0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f  Usage: sqlite3_o
192f0 70 65 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70  pen filename ?op
19300 74 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73  tions-list?.*/.s
19310 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f  tatic int test_o
19320 70 65 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  pen(.  void * cl
19330 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
19340 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19350 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19360 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
19370 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  v[].){.  const c
19380 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
19390 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
193a0 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
193b0 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  zBuf[100];..  if
193c0 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
193d0 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20  c!=2 && objc!=1 
193e0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
193f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19400 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
19410 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
19420 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
19430 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
19440 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73  filename options
19450 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20  -list", 0);.    
19460 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19470 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61  ;.  }..  zFilena
19480 6d 65 20 3d 20 6f 62 6a 63 3e 31 20 3f 20 54 63  me = objc>1 ? Tc
19490 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
194a0 5b 31 5d 29 20 3a 20 30 3b 0a 20 20 72 63 20 3d  [1]) : 0;.  rc =
194b0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46   sqlite3_open(zF
194c0 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20  ilename, &db);. 
194d0 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54   .  if( sqlite3T
194e0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
194f0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
19500 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
19510 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70  _ERROR;.  Tcl_Ap
19520 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19530 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
19540 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
19550 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
19560 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20 66 69 6c  lite3_open16 fil
19570 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f  ename options.*/
19580 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
19590 5f 6f 70 65 6e 31 36 28 0a 20 20 76 6f 69 64 20  _open16(.  void 
195a0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
195b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
195c0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
195d0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
195e0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
195f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
19600 54 46 31 36 0a 20 20 63 6f 6e 73 74 20 76 6f 69  TF16.  const voi
19610 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  d *zFilename;.  
19620 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
19630 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42  nt rc;.  char zB
19640 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
19650 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
19660 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19670 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
19680 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
19690 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
196a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
196b0 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65  [0]), " filename
196c0 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20   options-list", 
196d0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
196e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
196f0 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c   zFilename = Tcl
19700 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
19710 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
19720 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19730 5f 6f 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61 6d  _open16(zFilenam
19740 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66  e, &db);.  .  if
19750 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
19760 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
19770 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20  rp, zBuf, db) ) 
19780 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19790 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
197a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
197b0 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  f, 0);.#endif /*
197c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
197d0 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
197e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
197f0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
19800 6f 6d 70 6c 65 74 65 31 36 20 3c 55 54 46 2d 31  omplete16 <UTF-1
19810 36 20 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20  6 string>.**.** 
19820 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
19830 73 75 70 70 6c 69 65 64 20 61 72 67 75 6d 65 6e  supplied argumen
19840 74 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  t is a complete 
19850 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 6f  SQL statement, o
19860 72 20 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  r zero.** otherw
19870 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
19880 6e 74 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65  nt test_complete
19890 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
198a0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
198b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
198c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
198d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
198e0 5b 5d 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e  [].){.#if !defin
198f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
19900 4f 4d 50 4c 45 54 45 29 20 26 26 20 21 64 65 66  OMPLETE) && !def
19910 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
19920 5f 55 54 46 31 36 29 0a 20 20 63 68 61 72 20 2a  _UTF16).  char *
19930 7a 42 75 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  zBuf;..  if( obj
19940 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
19950 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
19960 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c  erp, 1, objv, "<
19970 75 74 66 2d 31 36 20 73 71 6c 3e 22 29 3b 0a 20  utf-16 sql>");. 
19980 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
19990 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66  ROR;.  }..  zBuf
199a0 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65   = (char*)Tcl_Ge
199b0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
199c0 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
199d0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
199e0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
199f0 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
19a00 63 6f 6d 70 6c 65 74 65 31 36 28 7a 42 75 66 29  complete16(zBuf)
19a10 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ));.#endif /* SQ
19a20 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45  LITE_OMIT_COMPLE
19a30 54 45 20 26 26 20 53 51 4c 49 54 45 5f 4f 4d 49  TE && SQLITE_OMI
19a40 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
19a50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
19a60 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
19a70 74 65 33 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a  te3_step STMT.**
19a80 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
19a90 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
19aa0 20 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74   next row..*/.st
19ab0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
19ac0 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ep(.  void * cli
19ad0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
19ae0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
19af0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
19b00 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
19b10 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
19b20 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
19b30 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
19b40 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
19b50 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19b60 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
19b70 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
19b80 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
19b90 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
19ba0 5d 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b  ]), " STMT", 0);
19bb0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19bc0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
19bd0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
19be0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
19bf0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
19c00 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
19c10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
19c20 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
19c30 28 70 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69  (pStmt);..  /* i
19c40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  f( rc!=SQLITE_DO
19c50 4e 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  NE && rc!=SQLITE
19c60 5f 52 4f 57 20 29 20 72 65 74 75 72 6e 20 54 43  _ROW ) return TC
19c70 4c 5f 45 52 52 4f 52 3b 20 2a 2f 0a 20 20 54 63  L_ERROR; */.  Tc
19c80 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
19c90 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
19ca0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
19cb0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
19cc0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
19cd0 74 65 73 74 5f 73 71 6c 28 0a 20 20 76 6f 69 64  test_sql(.  void
19ce0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
19cf0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19d00 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19d10 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19d20 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
19d30 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
19d40 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
19d50 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
19d60 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
19d70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
19d80 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
19d90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
19da0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
19db0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19dc0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19dd0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
19de0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19df0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
19e00 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
19e10 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
19e20 74 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  t), TCL_VOLATILE
19e30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
19e40 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
19e50 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
19e60 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a  mn_count STMT .*
19e70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19e80 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
19e90 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
19ea0 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  e sql statement 
19eb0 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  STMT..*/.static 
19ec0 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
19ed0 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  count(.  void * 
19ee0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
19ef0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19f00 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
19f10 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
19f20 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
19f30 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
19f40 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
19f50 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
19f60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
19f70 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
19f80 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
19f90 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
19fa0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
19fb0 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
19fc0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19fd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
19fe0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
19ff0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1a000 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1a010 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1a020 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1a030 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1a040 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1a050 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  IntObj(sqlite3_c
1a060 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
1a070 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  t)));.  return T
1a080 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1a090 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1a0a0 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54 4d 54 20  olumn_type STMT 
1a0b0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74  column.**.** Ret
1a0c0 75 72 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20  urn the type of 
1a0d0 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75  the data in colu
1a0e0 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74  mn 'column' of t
1a0f0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a  he current row..
1a100 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1a110 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a  st_column_type(.
1a120 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1a130 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1a140 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1a150 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1a160 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1a170 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1a180 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
1a190 6f 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a 0a 20  ol;.  int tp;.. 
1a1a0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1a1b0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a1c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1a1d0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1a1e0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1a1f0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1a200 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1a210 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1a220 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a230 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1a240 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1a250 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1a260 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1a270 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1a280 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1a290 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1a2a0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1a2b0 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1a2c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1a2d0 20 74 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   tp = sqlite3_co
1a2e0 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
1a2f0 20 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63 68 28   col);.  switch(
1a300 20 74 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   tp ){.    case 
1a310 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
1a320 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
1a330 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 4e  sult(interp, "IN
1a340 54 45 47 45 52 22 2c 20 54 43 4c 5f 53 54 41 54  TEGER", TCL_STAT
1a350 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
1a360 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1a370 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 54  TE_NULL:.      T
1a380 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1a390 65 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54 43 4c  erp, "NULL", TCL
1a3a0 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
1a3b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a3c0 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20   SQLITE_FLOAT:. 
1a3d0 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
1a3e0 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 4c 4f 41  lt(interp, "FLOA
1a3f0 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  T", TCL_STATIC);
1a400 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
1a410 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1a420 45 58 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  EXT:.      Tcl_S
1a430 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1a440 20 22 54 45 58 54 22 2c 20 54 43 4c 5f 53 54 41   "TEXT", TCL_STA
1a450 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
1a460 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1a470 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20  ITE_BLOB:.      
1a480 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1a490 74 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20 54 43  terp, "BLOB", TC
1a4a0 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
1a4b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
1a4c0 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
1a4d0 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  rt(0);.  }..  re
1a4e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1a4f0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1a500 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
1a510 34 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  4 STMT column.**
1a520 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1a530 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63  ata in column 'c
1a540 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75  olumn' of the cu
1a550 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61  rrent row cast a
1a560 73 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28 36 34  s an.** wide (64
1a570 2d 62 69 74 29 20 69 6e 74 65 67 65 72 2e 0a 2a  -bit) integer..*
1a580 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1a590 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a  t_column_int64(.
1a5a0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1a5b0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1a5c0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1a5d0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1a5e0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1a5f0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1a600 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
1a610 6f 6c 3b 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a  ol;.  i64 iVal;.
1a620 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1a630 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1a640 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1a650 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1a660 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1a670 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1a680 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1a690 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1a6a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a6b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1a6c0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1a6d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1a6e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1a6f0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1a700 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1a710 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1a720 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1a730 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
1a740 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a750 0a 20 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  iVal = sqlite
1a760 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
1a770 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63  Stmt, col);.  Tc
1a780 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1a790 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
1a7a0 64 65 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b  deIntObj(iVal));
1a7b0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1a7c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1a7d0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1a7e0 5f 62 6c 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d  _blob STMT colum
1a7f0 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
1a800 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  test_column_blob
1a810 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1a820 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1a830 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1a840 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1a850 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1a860 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1a870 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1a880 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e   col;..  int len
1a890 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1a8a0 70 42 6c 6f 62 3b 0a 0a 20 20 69 66 28 20 6f 62  pBlob;..  if( ob
1a8b0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1a8c0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a8d0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1a8e0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1a8f0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1a900 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1a910 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1a920 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1a930 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a940 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1a950 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1a960 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1a970 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1a980 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a990 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1a9a0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1a9b0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
1a9c0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
1a9d0 45 52 52 4f 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20  ERROR;..  len = 
1a9e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1a9f0 79 74 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29  ytes(pStmt, col)
1aa00 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69  ;.  pBlob = sqli
1aa10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
1aa20 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54  pStmt, col);.  T
1aa30 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1aa40 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
1aa50 79 74 65 41 72 72 61 79 4f 62 6a 28 70 42 6c 6f  yteArrayObj(pBlo
1aa60 62 2c 20 6c 65 6e 29 29 3b 0a 20 20 72 65 74 75  b, len));.  retu
1aa70 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1aa80 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1aa90 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
1aaa0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1aab0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
1aac0 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f  ta in column 'co
1aad0 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72  lumn' of the cur
1aae0 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73  rent row cast as
1aaf0 20 61 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74   a double..*/.st
1ab00 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1ab10 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 0a 20 20 76  lumn_double(.  v
1ab20 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1ab30 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1ab40 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1ab50 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1ab60 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1ab70 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1ab80 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1ab90 0a 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 3b 0a  .  double rVal;.
1aba0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1abb0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1abc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1abd0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1abe0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1abf0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1ac00 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1ac10 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1ac20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1ac30 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1ac40 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1ac50 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1ac60 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1ac70 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1ac80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1ac90 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1aca0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1acb0 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
1acc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1acd0 0a 20 20 72 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  rVal = sqlite
1ace0 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
1acf0 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54  pStmt, col);.  T
1ad00 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1ad10 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 44  interp, Tcl_NewD
1ad20 6f 75 62 6c 65 4f 62 6a 28 72 56 61 6c 29 29 3b  oubleObj(rVal));
1ad30 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1ad40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1ad50 3a 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63  : sqlite3_data_c
1ad60 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a  ount STMT .**.**
1ad70 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1ad80 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  er of columns re
1ad90 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71  turned by the sq
1ada0 6c 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54  l statement STMT
1adb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1adc0 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 28  test_data_count(
1add0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1ade0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1adf0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1ae00 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1ae10 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1ae20 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1ae30 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
1ae40 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1ae50 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1ae60 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1ae70 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1ae80 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1ae90 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1aea0 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1aeb0 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1aec0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1aed0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1aee0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1aef0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1af00 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1af10 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1af20 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65  ERROR;..  Tcl_Se
1af30 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1af40 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1af50 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f  (sqlite3_data_co
1af60 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20  unt(pStmt)));.  
1af70 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1af80 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1af90 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1afa0 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  xt STMT column.*
1afb0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1afc0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
1afd0 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ype STMT column.
1afe0 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
1aff0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
1b000 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a   STMT column.*/.
1b010 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1b020 73 74 6d 74 5f 75 74 66 38 28 0a 20 20 76 6f 69  stmt_utf8(.  voi
1b030 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  d * clientData, 
1b040 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1b050 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20  r to SQLite API 
1b060 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
1b070 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54 63 6c 5f 49  nvoke */.  Tcl_I
1b080 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1b090 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1b0a0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1b0b0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1b0c0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1b0d0 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20  nt col;.  const 
1b0e0 63 68 61 72 20 2a 28 2a 78 46 75 6e 63 29 28 73  char *(*xFunc)(s
1b0f0 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1b100 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t);.  const char
1b110 20 2a 7a 52 65 74 3b 0a 0a 20 20 78 46 75 6e 63   *zRet;..  xFunc
1b120 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
1b130 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  (*)(sqlite3_stmt
1b140 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61  *, int))clientDa
1b150 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ta;.  if( objc!=
1b160 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1b170 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b180 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1b190 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1b1a0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1b1b0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1b1c0 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1b1d0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1b1e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1b1f0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1b200 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1b210 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1b220 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1b230 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b240 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1b250 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1b260 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1b270 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b280 52 3b 0a 20 20 7a 52 65 74 20 3d 20 78 46 75 6e  R;.  zRet = xFun
1b290 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  c(pStmt, col);. 
1b2a0 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20   if( zRet ){.   
1b2b0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1b2c0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 7a  nterp, (char *)z
1b2d0 52 65 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Ret, 0);.  }.  r
1b2e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b2f0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1b300 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28  _global_recover(
1b310 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1b320 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1b330 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b340 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1b350 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1b360 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1b370 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41 4c 52 45 43  E_OMIT_GLOBALREC
1b380 4f 56 45 52 0a 23 69 66 6e 64 65 66 20 53 51 4c  OVER.#ifndef SQL
1b390 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
1b3a0 54 45 44 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  TED.  int rc;.  
1b3b0 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20  if( objc!=1 ){. 
1b3c0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1b3d0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1b3e0 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65  bjv, "");.    re
1b3f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b400 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1b410 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65  e3_global_recove
1b420 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  r();.  Tcl_SetRe
1b430 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1b440 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
1b450 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
1b460 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  );.#endif.#endif
1b470 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1b480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1b490 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1b4a0 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d  _text STMT colum
1b4b0 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
1b4c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
1b4d0 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75  cltype STMT colu
1b4e0 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1b4f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
1b500 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ame STMT column.
1b510 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1b520 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a 20  st_stmt_utf16(. 
1b530 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1b540 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ta,     /* Point
1b550 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49  er to SQLite API
1b560 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
1b570 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c  invoked */.  Tcl
1b580 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1b590 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1b5a0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1b5b0 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
1b5c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1b5d0 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  6.  sqlite3_stmt
1b5e0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
1b5f0 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ol;.  Tcl_Obj *p
1b600 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Ret;.  const voi
1b610 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f  d *zName16;.  co
1b620 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e  nst void *(*xFun
1b630 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  c)(sqlite3_stmt*
1b640 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63  , int);..  xFunc
1b650 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a   = (const void *
1b660 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  (*)(sqlite3_stmt
1b670 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61  *, int))clientDa
1b680 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ta;.  if( objc!=
1b690 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1b6a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b6b0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1b6c0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1b6d0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1b6e0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1b6f0 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1b700 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1b710 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1b720 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1b730 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1b740 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1b750 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1b760 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b770 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1b780 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1b790 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1b7a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b7b0 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20  R;..  zName16 = 
1b7c0 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c  xFunc(pStmt, col
1b7d0 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 31 36  );.  if( zName16
1b7e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
1b7f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1b800 20 3d 20 7a 4e 61 6d 65 31 36 3b 0a 20 20 20 20   = zName16;.    
1b810 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c  for(n=0; z[n] ||
1b820 20 7a 5b 6e 2b 31 5d 3b 20 6e 2b 3d 32 29 7b 7d   z[n+1]; n+=2){}
1b830 0a 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f  .    pRet = Tcl_
1b840 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
1b850 7a 4e 61 6d 65 31 36 2c 20 6e 2b 32 29 3b 0a 20  zName16, n+2);. 
1b860 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
1b870 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
1b880 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
1b890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1b8a0 31 36 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20  16 */..  return 
1b8b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1b8c0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1b8d0 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d 54 20  column_int STMT 
1b8e0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
1b8f0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1b900 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54 20 63 6f  mn_bytes STMT co
1b910 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
1b920 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1b930 5f 62 79 74 65 73 31 36 20 53 54 4d 54 20 63 6f  _bytes16 STMT co
1b940 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  lumn.**.*/.stati
1b950 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f  c int test_stmt_
1b960 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  int(.  void * cl
1b970 69 65 6e 74 44 61 74 61 2c 20 20 20 20 2f 2a 20  ientData,    /* 
1b980 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74  Pointer to SQLit
1b990 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74  e API function t
1b9a0 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a  o be invoked */.
1b9b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1b9c0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1b9d0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1b9e0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1b9f0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1ba00 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1ba10 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 73 71   int (*xFunc)(sq
1ba20 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
1ba30 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 69  );..  xFunc = (i
1ba40 6e 74 20 28 2a 29 28 73 71 6c 69 74 65 33 5f 73  nt (*)(sqlite3_s
1ba50 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e  tmt*, int))clien
1ba60 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a  tData;.  if( obj
1ba70 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1ba80 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ba90 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1baa0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1bab0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1bac0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1bad0 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1bae0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1baf0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1bb00 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1bb10 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1bb20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1bb30 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1bb40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1bb50 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1bb60 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1bb70 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
1bb80 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1bb90 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74  RROR;..  Tcl_Set
1bba0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1bbb0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1bbc0 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c  xFunc(pStmt, col
1bbd0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
1bbe0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1bbf0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 73 65  sage:  sqlite_se
1bc00 74 5f 6d 61 67 69 63 20 20 44 42 20 20 4d 41 47  t_magic  DB  MAG
1bc10 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20  IC-NUMBER.**.** 
1bc20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d 61 67 69  Set the db->magi
1bc30 63 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69  c value.  This i
1bc40 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 65  s used to test e
1bc50 72 72 6f 72 20 72 65 63 6f 76 65 72 79 20 6c 6f  rror recovery lo
1bc60 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  gic..*/.static i
1bc70 6e 74 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61  nt sqlite_set_ma
1bc80 67 69 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  gic(.  void * cl
1bc90 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1bca0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1bcb0 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1bcc0 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ar **argv.){.  s
1bcd0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
1bce0 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
1bcf0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1bd00 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1bd10 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1bd20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1bd30 0a 20 20 20 20 20 20 20 20 20 22 20 44 42 20 4d  .         " DB M
1bd40 41 47 49 43 22 2c 20 30 29 3b 0a 20 20 20 20 72  AGIC", 0);.    r
1bd50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bd60 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1bd70 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1bd80 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1bd90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1bda0 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 61  ;.  if( strcmp(a
1bdb0 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f  rgv[2], "SQLITE_
1bdc0 4d 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d 30 20  MAGIC_OPEN")==0 
1bdd0 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
1bde0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
1bdf0 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OPEN;.  }else if
1be00 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d  ( strcmp(argv[2]
1be10 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  , "SQLITE_MAGIC_
1be20 43 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b 0a 20  CLOSED")==0 ){. 
1be30 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
1be40 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53  QLITE_MAGIC_CLOS
1be50 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
1be60 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20  strcmp(argv[2], 
1be70 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55  "SQLITE_MAGIC_BU
1be80 53 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  SY")==0 ){.    d
1be90 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
1bea0 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
1beb0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1bec0 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54  (argv[2], "SQLIT
1bed0 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22 29 3d  E_MAGIC_ERROR")=
1bee0 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
1bef0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
1bf00 49 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  IC_ERROR;.  }els
1bf10 65 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74  e if( Tcl_GetInt
1bf20 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d  (interp, argv[2]
1bf30 2c 20 28 69 6e 74 2a 29 26 64 62 2d 3e 6d 61 67  , (int*)&db->mag
1bf40 69 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ic) ){.    retur
1bf50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1bf60 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1bf70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1bf80 3a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  :  sqlite3_inter
1bf90 72 75 70 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20  rupt  DB .**.** 
1bfa0 54 72 69 67 67 65 72 20 61 6e 20 69 6e 74 65 72  Trigger an inter
1bfb0 72 75 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74  rupt on DB.*/.st
1bfc0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 69 6e  atic int test_in
1bfd0 74 65 72 72 75 70 74 28 0a 20 20 76 6f 69 64 20  terrupt(.  void 
1bfe0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1bff0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1c000 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
1c010 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
1c020 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1c030 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
1c040 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1c050 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1c060 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1c070 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1c080 5b 30 5d 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  [0], " DB", 0);.
1c090 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c0a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1c0b0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1c0c0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1c0d0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1c0e0 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
1c0f0 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a  _interrupt(db);.
1c100 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c110 0a 7d 0a 0a 73 74 61 74 69 63 20 75 38 20 2a 73  .}..static u8 *s
1c120 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73  qlite3_stack_bas
1c130 65 6c 69 6e 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eline = 0;../*.*
1c140 2a 20 46 69 6c 6c 20 74 68 65 20 73 74 61 63 6b  * Fill the stack
1c150 20 77 69 74 68 20 61 20 6b 6e 6f 77 6e 20 62 69   with a known bi
1c160 74 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61  tpattern..*/.sta
1c170 74 69 63 20 76 6f 69 64 20 70 72 65 70 53 74 61  tic void prepSta
1c180 63 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  ck(void){.  int 
1c190 69 3b 0a 20 20 75 33 32 20 62 69 67 42 75 66 5b  i;.  u32 bigBuf[
1c1a0 36 35 35 33 36 5d 3b 0a 20 20 66 6f 72 28 69 3d  65536];.  for(i=
1c1b0 30 3b 20 69 3c 73 69 7a 65 6f 66 28 62 69 67 42  0; i<sizeof(bigB
1c1c0 75 66 29 3b 20 69 2b 2b 29 20 62 69 67 42 75 66  uf); i++) bigBuf
1c1d0 5b 69 5d 20 3d 20 30 78 64 65 61 64 62 65 65 66  [i] = 0xdeadbeef
1c1e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63  ;.  sqlite3_stac
1c1f0 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20 28 75 38  k_baseline = (u8
1c200 2a 29 26 62 69 67 42 75 66 5b 36 35 35 33 36 5d  *)&bigBuf[65536]
1c210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74  ;.}../*.** Get t
1c220 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 63 6b  he current stack
1c230 20 64 65 70 74 68 2e 20 20 55 73 65 64 20 66 6f   depth.  Used fo
1c240 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
1c250 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  ..*/.u64 sqlite3
1c260 53 74 61 63 6b 44 65 70 74 68 28 76 6f 69 64 29  StackDepth(void)
1c270 7b 0a 20 20 75 38 20 78 3b 0a 20 20 72 65 74 75  {.  u8 x;.  retu
1c280 72 6e 20 28 75 36 34 29 28 73 71 6c 69 74 65 33  rn (u64)(sqlite3
1c290 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20  _stack_baseline 
1c2a0 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  - &x);.}../*.** 
1c2b0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1c2c0 73 74 61 63 6b 5f 75 73 65 64 20 44 42 20 53 51  stack_used DB SQ
1c2d0 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d  L.**.** Try to m
1c2e0 65 61 73 75 72 65 20 74 68 65 20 61 6d 6f 75 6e  easure the amoun
1c2f0 74 20 6f 66 20 73 74 61 63 6b 20 73 70 61 63 65  t of stack space
1c300 20 75 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20   used by a call 
1c310 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 0a  to sqlite3_exec.
1c320 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1c330 73 74 5f 73 74 61 63 6b 5f 75 73 65 64 28 0a 20  st_stack_used(. 
1c340 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1c350 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1c360 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1c370 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
1c380 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
1c390 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   *db;.  int i;. 
1c3a0 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
1c3b0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1c3c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1c3d0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1c3e0 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1c3f0 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
1c400 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20  B SQL", 0);.    
1c410 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c420 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1c430 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1c440 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1c450 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c460 52 3b 0a 20 20 70 72 65 70 53 74 61 63 6b 28 29  R;.  prepStack()
1c470 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  ;.  (void)sqlite
1c480 33 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76 5b  3_exec(db, argv[
1c490 32 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  2], 0, 0, 0);.  
1c4a0 66 6f 72 28 69 3d 36 35 35 33 35 3b 20 69 3e 3d  for(i=65535; i>=
1c4b0 30 20 26 26 20 28 28 75 33 32 2a 29 73 71 6c 69  0 && ((u32*)sqli
1c4c0 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69  te3_stack_baseli
1c4d0 6e 65 29 5b 2d 69 5d 3d 3d 30 78 64 65 61 64 62  ne)[-i]==0xdeadb
1c4e0 65 65 66 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54 63  eef; i--){}.  Tc
1c4f0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1c500 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1c510 74 4f 62 6a 28 69 2a 34 29 29 3b 0a 20 20 72 65  tObj(i*4));.  re
1c520 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c530 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1c540 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74  ite_delete_funct
1c550 69 6f 6e 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d  ion DB function-
1c560 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  name.**.** Delet
1c570 65 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  e the user funct
1c580 69 6f 6e 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61  ion 'function-na
1c590 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73  me' from databas
1c5a0 65 20 68 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a  e handle DB. It.
1c5b0 2a 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  ** is assumed th
1c5c0 61 74 20 74 68 65 20 75 73 65 72 20 66 75 6e 63  at the user func
1c5d0 74 69 6f 6e 20 77 61 73 20 63 72 65 61 74 65 64  tion was created
1c5e0 20 61 73 20 55 54 46 38 2c 20 61 6e 79 20 6e 75   as UTF8, any nu
1c5f0 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d  mber of.** argum
1c600 65 6e 74 73 20 28 74 68 65 20 77 61 79 20 74 68  ents (the way th
1c610 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20  e TCL interface 
1c620 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61  does it)..*/.sta
1c630 74 69 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 66  tic int delete_f
1c640 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20  unction(.  void 
1c650 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1c660 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1c670 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
1c680 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
1c690 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1c6a0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1c6b0 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
1c6c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c6d0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1c6e0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1c6f0 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
1c700 20 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e          " DB fun
1c710 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b  ction-name", 0);
1c720 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1c730 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1c740 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1c750 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1c760 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1c770 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1c780 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1c790 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b  nction(db, argv[
1c7a0 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  2], -1, SQLITE_U
1c7b0 54 46 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  TF8, 0, 0, 0, 0)
1c7c0 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
1c7d0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1c7e0 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
1c7f0 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
1c800 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1c820 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63   sqlite_delete_c
1c830 6f 6c 6c 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c  ollation DB coll
1c840 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a  ation-name.**.**
1c850 20 44 65 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c   Delete the coll
1c860 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 27  ation sequence '
1c870 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20  collation-name' 
1c880 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61  from database ha
1c890 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20  ndle .** DB. It 
1c8a0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1c8b0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1c8c0 71 75 65 6e 63 65 20 77 61 73 20 63 72 65 61 74  quence was creat
1c8d0 65 64 20 61 73 20 55 54 46 38 20 28 74 68 65 20  ed as UTF8 (the 
1c8e0 0a 2a 2a 20 77 61 79 20 74 68 65 20 54 43 4c 20  .** way the TCL 
1c8f0 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 69  interface does i
1c900 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  t)..*/.static in
1c910 74 20 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69  t delete_collati
1c920 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  on(.  void * cli
1c930 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1c940 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1c950 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
1c960 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  r **argv.){.  in
1c970 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
1c980 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
1c990 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1c9a0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c9b0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1c9c0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1c9d0 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
1c9e0 20 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e     " DB function
1c9f0 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20  -name", 0);.    
1ca00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ca10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1ca20 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1ca30 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1ca40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ca50 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1ca60 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
1ca70 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  on(db, argv[2], 
1ca80 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
1ca90 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  0);.  Tcl_SetRes
1caa0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
1cab0 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
1cac0 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
1cad0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1cae0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1caf0 65 3a 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  e: sqlite3_get_a
1cb00 75 74 6f 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a  utocommit DB.**.
1cb10 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1cb20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 44  f the database D
1cb30 42 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  B is currently i
1cb40 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f  n auto-commit mo
1cb50 64 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  de..** Return fa
1cb60 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  lse if not..*/.s
1cb70 74 61 74 69 63 20 69 6e 74 20 67 65 74 5f 61 75  tatic int get_au
1cb80 74 6f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64  tocommit(.  void
1cb90 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1cba0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1cbb0 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1cbc0 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1cbd0 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  {.  char zBuf[30
1cbe0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ];.  sqlite3 *db
1cbf0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
1cc00 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1cc10 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1cc20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1cc30 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1cc40 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
1cc50 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1cc60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1cc70 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1cc80 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1cc90 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1cca0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ccb0 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
1ccc0 2c 20 22 25 64 22 2c 20 73 71 6c 69 74 65 33 5f  , "%d", sqlite3_
1ccd0 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64  get_autocommit(d
1cce0 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  b));.  Tcl_Appen
1ccf0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1cd00 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
1cd10 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1cd20 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1cd30 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 20  e3_busy_timeout 
1cd40 44 42 20 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20  DB MS.**.** Set 
1cd50 74 68 65 20 62 75 73 79 20 74 69 6d 65 6f 75 74  the busy timeout
1cd60 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
1cd70 65 61 73 69 6c 79 20 64 6f 6e 65 20 75 73 69 6e  easily done usin
1cd80 67 20 74 68 65 20 74 69 6d 65 6f 75 74 0a 2a 2a  g the timeout.**
1cd90 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 54   method of the T
1cda0 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 42  CL interface.  B
1cdb0 75 74 20 77 65 20 6e 65 65 64 20 61 20 77 61 79  ut we need a way
1cdc0 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73   to test the cas
1cdd0 65 0a 2a 2a 20 77 68 65 72 65 20 69 74 20 72 65  e.** where it re
1cde0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53  turns SQLITE_MIS
1cdf0 55 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  USE..*/.static i
1ce00 6e 74 20 74 65 73 74 5f 62 75 73 79 5f 74 69 6d  nt test_busy_tim
1ce10 65 6f 75 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  eout(.  void * c
1ce20 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1ce30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1ce40 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1ce50 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1ce60 69 6e 74 20 72 63 2c 20 6d 73 3b 0a 20 20 73 71  int rc, ms;.  sq
1ce70 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
1ce80 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
1ce90 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1cea0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1ceb0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1cec0 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1ced0 0a 20 20 20 20 20 20 20 20 22 20 44 42 22 2c 20  .        " DB", 
1cee0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1cef0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1cf00 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1cf10 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
1cf20 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1cf30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1cf40 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
1cf50 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6d 73  rp, argv[2], &ms
1cf60 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1cf70 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
1cf80 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
1cf90 74 28 64 62 2c 20 6d 73 29 3b 0a 20 20 54 63 6c  t(db, ms);.  Tcl
1cfa0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1cfb0 74 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73  terp, sqlite3Tes
1cfc0 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  tErrorName(rc), 
1cfd0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1cfe0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1cff0 61 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61 62  age:  tcl_variab
1d000 6c 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c 45  le_type VARIABLE
1d010 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  NAME.**.** Retur
1d020 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
1d030 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65  e internal repre
1d040 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68  sentation for th
1d050 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  e.** value of th
1d060 65 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c 65  e given variable
1d070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d080 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70  tcl_variable_typ
1d090 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
1d0a0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1d0b0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1d0c0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1d0d0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1d0e0 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ].){.  Tcl_Obj *
1d0f0 70 56 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63  pVar;.  if( objc
1d100 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
1d110 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1d120 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41  rp, 1, objv, "VA
1d130 52 49 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65  RIABLE");.    re
1d140 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d150 20 20 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c    }.  pVar = Tcl
1d160 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72  _GetVar2Ex(inter
1d170 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1d180 28 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43  (objv[1]), 0, TC
1d190 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29  L_LEAVE_ERR_MSG)
1d1a0 3b 0a 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20  ;.  if( pVar==0 
1d1b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d1c0 4f 52 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e  OR;.  if( pVar->
1d1d0 74 79 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54  typePtr ){.    T
1d1e0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1d1f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
1d200 74 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74  tringObj(pVar->t
1d210 79 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31  ypePtr->name, -1
1d220 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
1d230 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1d240 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
1d250 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
1d260 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d   ?N?.**.** Attem
1d270 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65  pt to release me
1d280 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68  mory currently h
1d290 65 6c 64 20 62 75 74 20 6e 6f 74 20 61 63 74 75  eld but not actu
1d2a0 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 2a  ally required..*
1d2b0 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 4e 20  * The integer N 
1d2c0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1d2d0 20 62 79 74 65 73 20 77 65 20 61 72 65 20 74 72   bytes we are tr
1d2e0 79 69 6e 67 20 74 6f 20 72 65 6c 65 61 73 65 2e  ying to release.
1d2f0 20 20 54 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e    The .** return
1d300 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 61 6d   value is the am
1d310 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61  ount of memory a
1d320 63 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 64  ctually released
1d330 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d340 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  test_release_mem
1d350 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ory(.  void * cl
1d360 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1d370 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1d380 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1d390 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1d3a0 76 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e  v[].){.#if defin
1d3b0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1d3c0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
1d3d0 4e 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  NT) && !defined(
1d3e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
1d3f0 49 4f 29 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69  IO).  int N;.  i
1d400 6e 74 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62  nt amt;.  if( ob
1d410 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=1 && objc!=2
1d420 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1d430 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1d440 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29   1, objv, "?N?")
1d450 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1d460 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1d470 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
1d480 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1d490 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1d4a0 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65  bjv[1], &N) ) re
1d4b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d4c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d    }else{.    N =
1d4d0 20 2d 31 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d   -1;.  }.  amt =
1d4e0 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
1d4f0 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63  _memory(N);.  Tc
1d500 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1d510 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1d520 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64  tObj(amt));.#end
1d530 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
1d540 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1d550 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6f 66  ge:  sqlite3_sof
1d560 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f  t_heap_limit ?N?
1d570 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 6f 72 20  .**.** Query or 
1d580 73 65 74 20 74 68 65 20 73 6f 66 74 20 68 65 61  set the soft hea
1d590 70 20 6c 69 6d 69 74 20 66 6f 72 20 74 68 65 20  p limit for the 
1d5a0 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20  current thread. 
1d5b0 20 54 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 69 73   The.** limit is
1d5c0 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66   only changed if
1d5d0 20 74 68 65 20 4e 20 69 73 20 70 72 65 73 65 6e   the N is presen
1d5e0 74 2e 20 20 54 68 65 20 70 72 65 76 69 6f 75 73  t.  The previous
1d5f0 20 6c 69 6d 69 74 0a 2a 2a 20 69 73 20 72 65 74   limit.** is ret
1d600 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1d610 20 69 6e 74 20 74 65 73 74 5f 73 6f 66 74 5f 68   int test_soft_h
1d620 65 61 70 5f 6c 69 6d 69 74 28 0a 20 20 76 6f 69  eap_limit(.  voi
1d630 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1d640 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1d650 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1d660 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1d670 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1d680 74 61 74 69 63 20 69 6e 74 20 73 6f 66 74 48 65  tatic int softHe
1d690 61 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69  apLimit = 0;.  i
1d6a0 6e 74 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62  nt amt;.  if( ob
1d6b0 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=1 && objc!=2
1d6c0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1d6d0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1d6e0 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29   1, objv, "?N?")
1d6f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1d700 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d  _ERROR;.  }.  am
1d710 74 20 3d 20 73 6f 66 74 48 65 61 70 4c 69 6d 69  t = softHeapLimi
1d720 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32  t;.  if( objc==2
1d730 20 29 7b 0a 20 20 20 20 69 6e 74 20 4e 3b 0a 20   ){.    int N;. 
1d740 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
1d750 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1d760 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20   objv[1], &N) ) 
1d770 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d780 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6f  ;.    sqlite3_so
1d790 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 4e 29  ft_heap_limit(N)
1d7a0 3b 0a 20 20 20 20 73 6f 66 74 48 65 61 70 4c 69  ;.    softHeapLi
1d7b0 6d 69 74 20 3d 20 4e 3b 0a 20 20 7d 0a 20 20 54  mit = N;.  }.  T
1d7c0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1d7d0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1d7e0 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72  ntObj(amt));.  r
1d7f0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1d800 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
1d810 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
1d820 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c  leanup.**.** Cal
1d830 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 68  l the sqlite3_th
1d840 72 65 61 64 5f 63 6c 65 61 6e 75 70 20 41 50 49  read_cleanup API
1d850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d860 74 65 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61  test_thread_clea
1d870 6e 75 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  nup(.  void * cl
1d880 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1d890 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1d8a0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1d8b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1d8c0 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
1d8d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
1d8e0 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f  CATED.  sqlite3_
1d8f0 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 29  thread_cleanup()
1d900 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
1d910 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d920 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
1d930 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  te3_pager_refcou
1d940 6e 74 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  nts  DB.**.** Re
1d950 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e  turn a list of n
1d960 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65  umbers which are
1d970 20 74 68 65 20 50 61 67 65 72 52 65 66 63 6f 75   the PagerRefcou
1d980 6e 74 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61  nt for all.** pa
1d990 67 65 72 73 20 6f 6e 20 65 61 63 68 20 64 61 74  gers on each dat
1d9a0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1d9b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d9c0 74 65 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f  test_pager_refco
1d9d0 75 6e 74 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  unts(.  void * c
1d9e0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1d9f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1da00 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1da10 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1da20 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1da30 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  3 *db;.  int i;.
1da40 20 20 69 6e 74 20 76 2c 20 2a 61 3b 0a 20 20 54    int v, *a;.  T
1da50 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
1da60 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1da70 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1da80 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1da90 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1daa0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
1dab0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1dac0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
1dad0 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30  0], 0), " DB", 0
1dae0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1daf0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1db00 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1db10 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1db20 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1db30 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1db40 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 52 65 73 75  L_ERROR;.  pResu
1db50 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  lt = Tcl_NewObj(
1db60 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1db70 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1db80 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
1db90 5d 2e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ].pBt==0 ){.    
1dba0 20 20 76 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65    v = -1;.    }e
1dbb0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1dbc0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1dbd0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
1dbe0 20 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   a = sqlite3Page
1dbf0 72 53 74 61 74 73 28 73 71 6c 69 74 65 33 42 74  rStats(sqlite3Bt
1dc00 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62  reePager(db->aDb
1dc10 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 20  [i].pBt));.     
1dc20 20 76 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20   v = a[0];.     
1dc30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1dc40 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1dc50 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c  .    }.    Tcl_L
1dc60 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1dc70 65 6e 74 28 30 2c 20 70 52 65 73 75 6c 74 2c 20  ent(0, pResult, 
1dc80 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29  Tcl_NewIntObj(v)
1dc90 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  );.  }.  Tcl_Set
1dca0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1dcb0 2c 20 70 52 65 73 75 6c 74 29 3b 0a 20 20 72 65  , pResult);.  re
1dcc0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1dcd0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
1dce0 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69   working_64bit_i
1dcf0 6e 74 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43  nt.**.** Some TC
1dd00 4c 20 62 75 69 6c 64 73 20 28 65 78 3a 20 63 79  L builds (ex: cy
1dd10 67 77 69 6e 29 20 64 6f 20 6e 6f 74 20 73 75 70  gwin) do not sup
1dd20 70 6f 72 74 20 36 34 2d 62 69 74 20 69 6e 74 65  port 64-bit inte
1dd30 67 65 72 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6c  gers.  This.** l
1dd40 65 61 64 73 20 74 6f 20 61 20 6e 75 6d 62 65 72  eads to a number
1dd50 20 6f 66 20 74 65 73 74 20 66 61 69 6c 75 72 65   of test failure
1dd60 73 2e 20 20 54 68 65 20 70 72 65 73 65 6e 74 20  s.  The present 
1dd70 63 6f 6d 6d 61 6e 64 20 63 68 65 63 6b 73 20 74  command checks t
1dd80 68 65 0a 2a 2a 20 54 43 4c 20 62 75 69 6c 64 20  he.** TCL build 
1dd90 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
1dda0 72 20 6e 6f 74 20 69 74 20 73 75 70 70 6f 72 74  r not it support
1ddb0 73 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  s 64-bit integer
1ddc0 73 2e 20 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e  s.  It.** return
1ddd0 73 20 54 52 55 45 20 69 66 20 69 74 20 64 6f 65  s TRUE if it doe
1dde0 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e  s and FALSE if n
1ddf0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ot..**.** This c
1de00 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
1de10 6f 20 77 61 72 6e 20 75 73 65 72 73 20 74 68 61  o warn users tha
1de20 74 20 74 68 65 69 72 20 54 43 4c 20 62 75 69 6c  t their TCL buil
1de30 64 20 69 73 20 64 65 66 65 63 74 69 76 65 0a 2a  d is defective.*
1de40 2a 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 65  * and that the e
1de50 72 72 6f 72 73 20 74 68 65 79 20 61 72 65 20 73  rrors they are s
1de60 65 65 69 6e 67 20 69 6e 20 74 68 65 20 74 65 73  eeing in the tes
1de70 74 20 73 63 72 69 70 74 73 20 6d 69 67 68 74 20  t scripts might 
1de80 62 65 0a 2a 2a 20 61 20 72 65 73 75 6c 74 20 6f  be.** a result o
1de90 66 20 74 68 65 69 72 20 64 65 66 65 63 74 69 76  f their defectiv
1dea0 65 20 54 43 4c 20 72 61 74 68 65 72 20 74 68 61  e TCL rather tha
1deb0 6e 20 70 72 6f 62 6c 65 6d 73 20 69 6e 20 53 51  n problems in SQ
1dec0 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Lite..*/.static 
1ded0 69 6e 74 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69  int working_64bi
1dee0 74 5f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44  t_int(.  ClientD
1def0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
1df00 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
1df10 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
1df20 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
1df30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1df40 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
1df50 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
1df60 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
1df70 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
1df80 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
1df90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1dfa0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
1dfb0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1dfc0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
1dfd0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
1dfe0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 65 73  .  Tcl_Obj *pTes
1dff0 74 4f 62 6a 3b 0a 20 20 69 6e 74 20 77 6f 72 6b  tObj;.  int work
1e000 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 70 54 65 73  ing = 0;..  pTes
1e010 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69  tObj = Tcl_NewWi
1e020 64 65 49 6e 74 4f 62 6a 28 31 30 30 30 30 30 30  deIntObj(1000000
1e030 2a 28 69 36 34 29 31 32 33 34 35 36 37 38 39 30  *(i64)1234567890
1e040 29 3b 0a 20 20 77 6f 72 6b 69 6e 67 20 3d 20 73  );.  working = s
1e050 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72  trcmp(Tcl_GetStr
1e060 69 6e 67 28 70 54 65 73 74 4f 62 6a 29 2c 20 22  ing(pTestObj), "
1e070 31 32 33 34 35 36 37 38 39 30 30 30 30 30 30 30  1234567890000000
1e080 22 29 3d 3d 30 3b 0a 20 20 54 63 6c 5f 44 65 63  ")==0;.  Tcl_Dec
1e090 72 52 65 66 43 6f 75 6e 74 28 70 54 65 73 74 4f  rRefCount(pTestO
1e0a0 62 6a 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  bj);.  Tcl_SetOb
1e0b0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1e0c0 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
1e0d0 6a 28 77 6f 72 6b 69 6e 67 29 29 3b 0a 20 20 72  j(working));.  r
1e0e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1e0f0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
1e100 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73    vfs_unlink_tes
1e110 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  t.**.** This TCL
1e120 20 63 6f 6d 6d 61 6e 64 20 75 6e 72 65 67 69 73   command unregis
1e130 74 65 72 73 20 74 68 65 20 70 72 69 6d 61 72 79  ters the primary
1e140 20 56 46 53 20 61 6e 64 20 74 68 65 6e 20 72 65   VFS and then re
1e150 67 69 73 74 65 72 73 0a 2a 2a 20 69 74 20 62 61  gisters.** it ba
1e160 63 6b 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20  ck again.  This 
1e170 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
1e180 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 72  the ability to r
1e190 65 67 69 73 74 65 72 20 61 0a 2a 2a 20 56 46 53  egister a.** VFS
1e1a0 20 77 68 65 6e 20 6e 6f 6e 65 20 61 72 65 20 70   when none are p
1e1b0 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74  reviously regist
1e1c0 65 72 65 64 2c 20 61 6e 64 20 74 68 65 20 61 62  ered, and the ab
1e1d0 69 6c 69 74 79 20 74 6f 20 0a 2a 2a 20 75 6e 72  ility to .** unr
1e1e0 65 67 69 73 74 65 72 20 74 68 65 20 6f 6e 6c 79  egister the only
1e1f0 20 61 76 61 69 6c 61 62 6c 65 20 56 46 53 2e 20   available VFS. 
1e200 20 54 69 63 6b 65 74 20 23 32 37 33 38 0a 2a 2f   Ticket #2738.*/
1e210 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f  .static int vfs_
1e220 75 6e 6c 69 6e 6b 5f 74 65 73 74 28 0a 20 20 43  unlink_test(.  C
1e230 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1e240 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
1e250 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
1e260 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
1e270 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1e280 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1e290 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1e2a0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1e2b0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1e2c0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
1e2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e2e0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1e2f0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
1e300 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
1e310 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
1e320 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1e330 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1e340 4d 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Main;.  sqlite3_
1e350 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a  vfs *apVfs[20];.
1e360 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e    sqlite3_vfs on
1e370 65 2c 20 74 77 6f 3b 0a 0a 20 20 73 71 6c 69 74  e, two;..  sqlit
1e380 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
1e390 72 28 30 29 3b 20 20 20 2f 2a 20 55 6e 72 65 67  r(0);   /* Unreg
1e3a0 69 73 74 65 72 20 6f 66 20 4e 55 4c 4c 20 69 73  ister of NULL is
1e3b0 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f   harmless */.  o
1e3c0 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e  ne.zName = "__on
1e3d0 65 22 3b 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65 20  e";.  two.zName 
1e3e0 3d 20 22 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a  = "__two";..  /*
1e3f0 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   Calling sqlite3
1e400 5f 76 66 73 5f 72 65 67 69 73 74 65 72 20 77 69  _vfs_register wi
1e410 74 68 20 32 6e 64 20 61 72 67 75 6d 65 6e 74 20  th 2nd argument 
1e420 6f 66 20 30 20 64 6f 65 73 20 6e 6f 74 0a 20 20  of 0 does not.  
1e430 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 64 65  ** change the de
1e440 66 61 75 6c 74 20 56 46 53 0a 20 20 2a 2f 0a 20  fault VFS.  */. 
1e450 20 70 4d 61 69 6e 20 3d 20 73 71 6c 69 74 65 33   pMain = sqlite3
1e460 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
1e470 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
1e480 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20  ster(&one, 0);. 
1e490 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d   assert( pMain==
1e4a0 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69  0 || pMain==sqli
1e4b0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
1e4c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  );.  sqlite3_vfs
1e4d0 5f 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20  _register(&two, 
1e4e0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d  0);.  assert( pM
1e4f0 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d  ain==0 || pMain=
1e500 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
1e510 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 57 65  d(0) );..  /* We
1e520 20 63 61 6e 20 66 69 6e 64 20 61 20 56 46 53 20   can find a VFS 
1e530 62 79 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  by its name */. 
1e540 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e550 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
1e560 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73  ")==&one );.  as
1e570 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
1e580 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d  s_find("__two")=
1e590 3d 26 74 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43  =&two );..  /* C
1e5a0 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 5f 76 66  alling sqlite_vf
1e5b0 73 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20  s_register with 
1e5c0 6e 6f 6e 2d 7a 65 72 6f 20 73 65 63 6f 6e 64 20  non-zero second 
1e5d0 70 61 72 61 6d 65 74 65 72 20 63 68 61 6e 67 65  parameter change
1e5e0 73 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75  s the.  ** defau
1e5f0 6c 74 20 56 46 53 2c 20 65 76 65 6e 20 69 66 20  lt VFS, even if 
1e600 74 68 65 20 31 73 74 20 70 61 72 61 6d 65 74 65  the 1st paramete
1e610 72 20 69 73 20 61 6e 20 65 78 69 73 74 69 67 20  r is an existig 
1e620 56 46 53 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  VFS that is.  **
1e630 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69   previously regi
1e640 73 74 65 72 65 64 20 61 73 20 74 68 65 20 6e 6f  stered as the no
1e650 6e 2d 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a  n-default..  */.
1e660 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
1e670 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b  gister(&one, 1);
1e680 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e690 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f  e3_vfs_find("__o
1e6a0 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20  ne")==&one );.  
1e6b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1e6c0 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22  vfs_find("__two"
1e6d0 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73  )==&two );.  ass
1e6e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
1e6f0 5f 66 69 6e 64 28 30 29 3d 3d 26 6f 6e 65 20 29  _find(0)==&one )
1e700 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
1e710 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20 31  register(&two, 1
1e720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1e730 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
1e740 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a  _one")==&one );.
1e750 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e760 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77  3_vfs_find("__tw
1e770 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61  o")==&two );.  a
1e780 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
1e790 66 73 5f 66 69 6e 64 28 30 29 3d 3d 26 74 77 6f  fs_find(0)==&two
1e7a0 20 29 3b 0a 20 20 69 66 28 20 70 4d 61 69 6e 20   );.  if( pMain 
1e7b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
1e7c0 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69  fs_register(pMai
1e7d0 6e 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  n, 1);.    asser
1e7e0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
1e7f0 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
1e800 6e 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ne );.    assert
1e810 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
1e820 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
1e830 6f 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  o );.    assert(
1e840 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1e850 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20  d(0)==pMain );. 
1e860 20 7d 0a 20 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e   }.  .  /* Unlin
1e870 6b 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  k the default VF
1e880 53 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c  S.  Repeat until
1e890 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
1e8a0 72 65 20 56 46 53 65 73 0a 20 20 2a 2a 20 72 65  re VFSes.  ** re
1e8b0 67 69 73 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 20  gistered..  */. 
1e8c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
1e8d0 6f 66 28 61 70 56 66 73 29 2f 73 69 7a 65 6f 66  of(apVfs)/sizeof
1e8e0 28 61 70 56 66 73 5b 30 5d 29 3b 20 69 2b 2b 29  (apVfs[0]); i++)
1e8f0 7b 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d  {.    apVfs[i] =
1e900 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1e910 64 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70  d(0);.    if( ap
1e920 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  Vfs[i] ){.      
1e930 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d  assert( apVfs[i]
1e940 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
1e950 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61  nd(apVfs[i]->zNa
1e960 6d 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  me) );.      sql
1e970 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
1e980 74 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20  ter(apVfs[i]);. 
1e990 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
1e9a0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1e9b0 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65  (apVfs[i]->zName
1e9c0 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ) );.    }.  }. 
1e9d0 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
1e9e0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
1e9f0 29 3b 0a 20 20 0a 20 20 2f 2a 20 52 65 67 69 73  );.  .  /* Regis
1ea00 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53  ter the main VFS
1ea10 20 61 73 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20   as non-default 
1ea20 28 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 64 65  (will be made de
1ea30 66 61 75 6c 74 2c 20 73 69 6e 63 65 0a 20 20 2a  fault, since.  *
1ea40 2a 20 69 74 27 6c 6c 20 62 65 20 74 68 65 20 6f  * it'll be the o
1ea50 6e 6c 79 20 6f 6e 65 20 69 6e 20 65 78 69 73 74  nly one in exist
1ea60 65 6e 63 65 29 2e 0a 20 20 2a 2f 0a 20 20 73 71  ence)..  */.  sq
1ea70 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
1ea80 65 72 28 70 4d 61 69 6e 2c 20 30 29 3b 0a 20 20  er(pMain, 0);.  
1ea90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1eaa0 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61  vfs_find(0)==pMa
1eab0 69 6e 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e  in );.  .  /* Un
1eac0 2d 72 65 67 69 73 74 65 72 20 74 68 65 20 6d 61  -register the ma
1ead0 69 6e 20 56 46 53 20 61 67 61 69 6e 20 74 6f 20  in VFS again to 
1eae0 72 65 73 74 6f 72 65 20 61 6e 20 65 6d 70 74 79  restore an empty
1eaf0 20 56 46 53 20 6c 69 73 74 20 2a 2f 0a 20 20 73   VFS list */.  s
1eb00 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67  qlite3_vfs_unreg
1eb10 69 73 74 65 72 28 70 4d 61 69 6e 29 3b 0a 20 20  ister(pMain);.  
1eb20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
1eb30 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
1eb40 3b 0a 0a 20 20 2f 2a 20 52 65 6c 69 6e 6b 20 61  ;..  /* Relink a
1eb50 6c 6c 20 56 46 53 65 73 20 69 6e 20 72 65 76 65  ll VFSes in reve
1eb60 72 73 65 20 6f 72 64 65 72 2e 20 2a 2f 20 20 0a  rse order. */  .
1eb70 20 20 66 6f 72 28 69 3d 73 69 7a 65 6f 66 28 61    for(i=sizeof(a
1eb80 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56  pVfs)/sizeof(apV
1eb90 66 73 5b 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20  fs[0])-1; i>=0; 
1eba0 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 70  i--){.    if( ap
1ebb0 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  Vfs[i] ){.      
1ebc0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
1ebd0 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 31  ster(apVfs[i], 1
1ebe0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ebf0 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74   apVfs[i]==sqlit
1ec00 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
1ec10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ec20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65  apVfs[i]==sqlite
1ec30 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73  3_vfs_find(apVfs
1ec40 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20  [i]->zName) );. 
1ec50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
1ec60 6e 72 65 67 69 73 74 65 72 20 6f 75 74 20 73 61  nregister out sa
1ec70 6d 70 6c 65 20 56 46 53 65 73 2e 20 2a 2f 0a 20  mple VFSes. */. 
1ec80 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
1ec90 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20  egister(&one);. 
1eca0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
1ecb0 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a 0a  egister(&two);..
1ecc0 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 69    /* Unregisteri
1ecd0 6e 67 20 61 20 56 46 53 20 74 68 61 74 20 69 73  ng a VFS that is
1ece0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
1ecf0 65 67 69 73 74 65 72 65 64 20 69 73 20 68 61 72  egistered is har
1ed00 6d 6c 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74  mless */.  sqlit
1ed10 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
1ed20 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74  r(&one);.  sqlit
1ed30 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
1ed40 72 28 26 74 77 6f 29 3b 0a 20 20 61 73 73 65 72  r(&two);.  asser
1ed50 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
1ed60 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20  ind("__one")==0 
1ed70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1ed80 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
1ed90 5f 74 77 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20 20  _two")==0 );..  
1eda0 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 62 65 20  /* We should be 
1edb0 6c 65 66 74 20 77 69 74 68 20 74 68 65 20 6f 72  left with the or
1edc0 69 67 69 6e 61 6c 20 64 65 66 61 75 6c 74 20 56  iginal default V
1edd0 46 53 20 62 61 63 6b 20 61 73 20 74 68 65 0a 20  FS back as the. 
1ede0 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a   ** original */.
1edf0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ee00 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70  3_vfs_find(0)==p
1ee10 4d 61 69 6e 20 29 3b 0a 0a 20 20 72 65 74 75 72  Main );..  retur
1ee20 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1ee30 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73  ** tclcmd:   vfs
1ee40 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 0a 2a  _initfail_test.*
1ee50 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
1ee60 6d 6d 61 6e 64 20 61 74 74 65 6d 70 74 73 20 74  mmand attempts t
1ee70 6f 20 76 66 73 5f 66 69 6e 64 20 61 6e 64 20 76  o vfs_find and v
1ee80 66 73 5f 72 65 67 69 73 74 65 72 20 77 68 65 6e  fs_register when
1ee90 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
1eea0 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 6e 74  initialize() int
1eeb0 65 72 66 61 63 65 20 69 73 20 66 61 69 6c 69 6e  erface is failin
1eec0 67 2e 20 20 41 6c 6c 20 63 61 6c 6c 73 20 73 68  g.  All calls sh
1eed0 6f 75 6c 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74  ould fail..*/.st
1eee0 61 74 69 63 20 69 6e 74 20 76 66 73 5f 69 6e 69  atic int vfs_ini
1eef0 74 66 61 69 6c 5f 74 65 73 74 28 0a 20 20 43 6c  tfail_test(.  Cl
1ef00 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1ef10 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
1ef20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
1ef30 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
1ef40 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1ef50 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1ef60 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1ef70 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1ef80 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1ef90 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
1efa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1efb0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1efc0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
1efd0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
1efe0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
1eff0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
1f000 76 66 73 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a  vfs one;.  one.z
1f010 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a  Name = "__one";.
1f020 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
1f030 66 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74  fs_find(0) ) ret
1f040 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f050 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
1f060 69 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a  ister(&one, 0);.
1f070 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66    if( sqlite3_vf
1f080 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75  s_find(0) ) retu
1f090 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f0a0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
1f0b0 73 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20  ster(&one, 1);. 
1f0c0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73   if( sqlite3_vfs
1f0d0 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72  _find(0) ) retur
1f0e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
1f0f0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1f100 0a 2f 2a 0a 2a 2a 20 53 61 76 65 64 20 56 46 53  ./*.** Saved VFS
1f110 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  es.*/.static sql
1f120 69 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73 5b  ite3_vfs *apVfs[
1f130 32 30 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  20];.static int 
1f140 6e 56 66 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  nVfs = 0;../*.**
1f150 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75   tclcmd:   vfs_u
1f160 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a  nregister_all.**
1f170 0a 2a 2a 20 55 6e 72 65 67 69 73 74 65 72 20 61  .** Unregister a
1f180 6c 6c 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61  ll VFSes..*/.sta
1f190 74 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 72 65  tic int vfs_unre
1f1a0 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c  gister_all(.  Cl
1f1b0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1f1c0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
1f1d0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
1f1e0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
1f1f0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1f200 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1f210 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1f220 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1f230 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1f240 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
1f250 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f260 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1f270 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
1f280 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
1f290 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
1f2a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
1f2b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
1f2c0 79 53 69 7a 65 28 61 70 56 66 73 29 3b 20 69 2b  ySize(apVfs); i+
1f2d0 2b 29 7b 0a 20 20 20 20 61 70 56 66 73 5b 69 5d  +){.    apVfs[i]
1f2e0 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
1f2f0 69 6e 64 28 30 29 3b 0a 20 20 20 20 69 66 28 20  ind(0);.    if( 
1f300 61 70 56 66 73 5b 69 5d 3d 3d 30 20 29 20 62 72  apVfs[i]==0 ) br
1f310 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eak;.    sqlite3
1f320 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
1f330 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apVfs[i]);.  }. 
1f340 20 6e 56 66 73 20 3d 20 69 3b 0a 20 20 72 65 74   nVfs = i;.  ret
1f350 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
1f360 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66  .** tclcmd:   vf
1f370 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_reregister_all
1f380 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 61  .**.** Restore a
1f390 6c 6c 20 56 46 53 65 73 20 74 68 61 74 20 77 65  ll VFSes that we
1f3a0 72 65 20 72 65 6d 6f 76 65 64 20 75 73 69 6e 67  re removed using
1f3b0 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f   vfs_unregister_
1f3c0 61 6c 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  all.*/.static in
1f3d0 74 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72  t vfs_reregister
1f3e0 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61  _all(.  ClientDa
1f3f0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
1f400 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
1f410 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
1f420 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
1f430 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f440 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
1f450 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
1f460 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
1f470 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
1f480 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
1f490 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1f4a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
1f4b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1f4c0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
1f4d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1f4e0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1f4f0 3d 30 3b 20 69 3c 6e 56 66 73 3b 20 69 2b 2b 29  =0; i<nVfs; i++)
1f500 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
1f510 73 5f 72 65 67 69 73 74 65 72 28 61 70 56 66 73  s_register(apVfs
1f520 5b 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a  [i], i==0);.  }.
1f530 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1f540 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  .}.../*.** tclcm
1f550 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
1f560 6c 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20  l_test DB.**.** 
1f570 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
1f580 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
1f590 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
1f5a0 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
1f5b0 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
1f5c0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
1f5d0 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e same..*/.stati
1f5e0 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
1f5f0 6f 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  ol_test(.  Clien
1f600 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
1f610 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
1f620 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
1f630 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
1f640 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f650 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1f660 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1f670 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1f680 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1f690 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
1f6a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f6b0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1f6c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1f6d0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
1f6e0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
1f6f0 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20  ){.  int iArg = 
1f700 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
1f710 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1f720 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1f730 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1f740 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1f750 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1f760 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
1f770 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
1f780 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
1f790 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
1f7a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1f7b0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1f7c0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1f7d0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1f7e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1f7f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1f800 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1f810 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
1f820 64 62 2c 20 30 2c 20 30 2c 20 26 69 41 72 67 29  db, 0, 0, &iArg)
1f830 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
1f840 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
1f850 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
1f860 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
1f870 22 6e 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20  "notadatabase", 
1f880 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
1f890 4b 53 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a  KSTATE, &iArg);.
1f8a0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1f8b0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
1f8c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
1f8d0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d  e_control(db, "m
1f8e0 61 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29  ain", -1, &iArg)
1f8f0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
1f900 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
1f910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
1f920 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
1f930 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69 41 72  "temp", -1, &iAr
1f940 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  g);.  assert( rc
1f950 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  ==SQLITE_ERROR )
1f960 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
1f970 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  OK;.}.../*.** tc
1f980 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
1f990 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74  trol_lasterrno_t
1f9a0 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69  est DB.**.** Thi
1f9b0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
1f9c0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
1f9d0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
1f9e0 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
1f9f0 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
1fa00 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53  eration of the S
1fa10 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
1fa20 20 76 65 72 62 2e 0a 2a 2f 0a 73 74 61 74 69 63   verb..*/.static
1fa30 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
1fa40 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74  l_lasterrno_test
1fa50 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
1fa60 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
1fa70 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
1fa80 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
1fa90 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
1faa0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
1fab0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
1fac0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
1fad0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
1fae0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fb00 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
1fb10 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
1fb20 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
1fb30 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
1fb40 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
1fb50 74 20 69 41 72 67 20 3d 20 30 3b 0a 20 20 73 71  t iArg = 0;.  sq
1fb60 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
1fb70 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
1fb80 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1fb90 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1fba0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1fbb0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1fbc0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
1fbd0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
1fbe0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
1fbf0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1fc00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1fc10 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1fc20 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1fc30 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1fc40 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
1fc50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1fc60 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1fc70 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
1fc80 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
1fc90 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 2c 20 26  TE_LAST_ERRNO, &
1fca0 69 41 72 67 29 3b 0a 20 20 69 66 28 20 72 63 20  iArg);.  if( rc 
1fcb0 29 7b 20 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  ){ .    Tcl_SetO
1fcc0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1fcd0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
1fce0 63 29 29 3b 20 0a 20 20 20 20 72 65 74 75 72 6e  c)); .    return
1fcf0 20 54 43 4c 5f 45 52 52 4f 52 3b 20 0a 20 20 7d   TCL_ERROR; .  }
1fd00 0a 20 20 69 66 28 20 69 41 72 67 21 3d 30 20 29  .  if( iArg!=0 )
1fd10 20 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e   {.    Tcl_Appen
1fd20 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1fd30 22 55 6e 65 78 70 65 63 74 65 64 20 6e 6f 6e 2d  "Unexpected non-
1fd40 7a 65 72 6f 20 65 72 72 6e 6f 3a 20 22 2c 0a 20  zero errno: ",. 
1fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd60 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1fd70 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 4e 65 77  gFromObj(Tcl_New
1fd80 49 6e 74 4f 62 6a 28 69 41 72 67 29 2c 20 30 29  IntObj(iArg), 0)
1fd90 2c 20 22 20 22 2c 20 30 29 3b 0a 20 20 20 20 72  , " ", 0);.    r
1fda0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1fdb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1fdc0 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  L_OK;  .}../*.**
1fdd0 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
1fde0 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78  control_lockprox
1fdf0 79 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20  y_test DB.**.** 
1fe00 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
1fe10 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
1fe20 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
1fe30 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
1fe40 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
1fe50 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
1fe60 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
1fe70 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a  KPROXYFILE and.*
1fe80 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  * SQLITE_SET_LOC
1fe90 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73  KPROXYFILE verbs
1fea0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1feb0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63  file_control_loc
1fec0 6b 70 72 6f 78 79 5f 74 65 73 74 28 0a 20 20 43  kproxy_test(.  C
1fed0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1fee0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
1fef0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
1ff00 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
1ff10 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1ff20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1ff30 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1ff40 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1ff50 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1ff60 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
1ff70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ff80 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1ff90 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
1ffa0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
1ffb0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
1ffc0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
1ffd0 20 2a 64 62 3b 0a 20 20 0a 20 20 69 66 28 20 6f   *db;.  .  if( o
1ffe0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1fff0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
20000 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
20010 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
20020 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
20030 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
20040 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
20050 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
20060 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
20070 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
20080 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
20090 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
200a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
200b0 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 72  ]), &db) ){.   r
200c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
200d0 0a 20 20 7d 0a 20 20 0a 23 69 66 20 21 64 65 66  .  }.  .#if !def
200e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
200f0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
20100 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64 28  ).#  if defined(
20110 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20  __APPLE__).#    
20120 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e  define SQLITE_EN
20130 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
20140 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20  LE 1.#  else.#  
20150 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
20160 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
20170 54 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66 0a  TYLE 0.#  endif.
20180 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
20190 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
201a0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
201b0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 7b  d(__APPLE__).  {
201c0 0a 20 20 20 20 63 68 61 72 20 2a 70 72 6f 78 79  .    char *proxy
201d0 50 61 74 68 20 3d 20 22 74 65 73 74 2e 70 72 6f  Path = "test.pro
201e0 78 79 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 74  xy";.    char *t
201f0 65 73 74 50 61 74 68 3b 0a 20 20 20 20 69 6e 74  estPath;.    int
20200 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
20210 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
20220 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
20230 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
20240 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68  YFILE, proxyPath
20250 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
20260 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
20270 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
20280 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
20290 29 29 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72  )); .      retur
202a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
202b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
202c0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
202d0 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
202e0 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
202f0 49 4c 45 2c 20 26 74 65 73 74 50 61 74 68 29 3b  ILE, &testPath);
20300 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
20310 28 70 72 6f 78 79 50 61 74 68 2c 74 65 73 74 50  (proxyPath,testP
20320 61 74 68 2c 31 31 29 20 29 7b 0a 20 20 20 20 20  ath,11) ){.     
20330 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
20340 74 28 69 6e 74 65 72 70 2c 20 22 4c 6f 63 6b 20  t(interp, "Lock 
20350 70 72 6f 78 79 20 66 69 6c 65 20 64 69 64 20 6e  proxy file did n
20360 6f 74 20 6d 61 74 63 68 20 74 68 65 20 22 0a 20  ot match the ". 
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
20390 72 65 76 69 6f 75 73 6c 79 20 61 73 73 69 67 6e  reviously assign
203a0 65 64 20 76 61 6c 75 65 22 2c 20 30 29 3b 0a 20  ed value", 0);. 
203b0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
203c0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
203d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
203e0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
203f0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
20400 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20  wIntObj(rc));.  
20410 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
20420 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
20430 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
20440 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
20450 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  LL, SQLITE_SET_L
20460 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72  OCKPROXYFILE, pr
20470 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66  oxyPath);.    if
20480 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
20490 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
204a0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
204b0 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20 20 20  tObj(rc));.     
204c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
204d0 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
204e0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
204f0 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  _OK;  .}.../*.**
20500 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74   tclcmd:   sqlit
20510 65 33 5f 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a  e3_vfs_list.**.*
20520 2a 20 20 20 52 65 74 75 72 6e 20 61 20 74 63 6c  *   Return a tcl
20530 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
20540 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
20550 6c 20 72 65 67 69 73 74 65 72 65 64 20 76 66 73  l registered vfs
20560 27 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  's..*/.static in
20570 74 20 76 66 73 5f 6c 69 73 74 28 0a 20 20 43 6c  t vfs_list(.  Cl
20580 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
20590 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
205a0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
205b0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
205c0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
205d0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
205e0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
205f0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
20600 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
20610 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
20620 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20630 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
20640 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
20650 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
20660 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
20670 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
20680 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 54 63 6c  vfs *pVfs;.  Tcl
20690 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c  _Obj *pRet = Tcl
206a0 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 69 66 28  _NewObj();.  if(
206b0 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
206c0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
206d0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
206e0 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72  , "");.    retur
206f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
20700 0a 20 20 66 6f 72 28 70 56 66 73 3d 73 71 6c 69  .  for(pVfs=sqli
20710 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
20720 20 70 56 66 73 3b 20 70 56 66 73 3d 70 56 66 73   pVfs; pVfs=pVfs
20730 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 54 63  ->pNext){.    Tc
20740 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
20750 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
20760 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
20770 6e 67 4f 62 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d  ngObj(pVfs->zNam
20780 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 54  e, -1));.  }.  T
20790 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
207a0 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
207b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
207c0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
207d0 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d  d:   sqlite3_lim
207e0 69 74 20 44 42 20 49 44 20 56 41 4c 55 45 0a 2a  it DB ID VALUE.*
207f0 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
20800 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
20810 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 69 6e 74  qlite3_limit int
20820 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65  erface and.** ve
20830 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f  rifies correct o
20840 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
20850 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  same..*/.static 
20860 69 6e 74 20 74 65 73 74 5f 6c 69 6d 69 74 28 0a  int test_limit(.
20870 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
20880 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
20890 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
208a0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
208b0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
208c0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
208d0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
208e0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
208f0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
20900 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
20910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20920 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
20930 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
20940 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
20950 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
20960 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
20970 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
20980 63 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  c;.  static cons
20990 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
209a0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
209b0 20 20 69 6e 74 20 69 64 3b 0a 20 20 7d 20 61 49    int id;.  } aI
209c0 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53  d[] = {.    { "S
209d0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
209e0 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  TH",            
209f0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c    SQLITE_LIMIT_L
20a00 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20  ENGTH           
20a10 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
20a20 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
20a30 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20  ENGTH",         
20a40 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51   SQLITE_LIMIT_SQ
20a50 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20  L_LENGTH        
20a60 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
20a70 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
20a80 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
20a90 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
20aa0 55 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  UMN             
20ab0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
20ac0 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
20ad0 50 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 53  PTH",          S
20ae0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
20af0 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20  _DEPTH          
20b00 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
20b10 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
20b20 5f 53 45 4c 45 43 54 22 2c 20 20 20 20 20 53 51  _SELECT",     SQ
20b30 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
20b40 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20  UND_SELECT      
20b50 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
20b60 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 22 2c  _LIMIT_VDBE_OP",
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
20b80 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
20b90 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  P              }
20ba0 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
20bb0 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
20bc0 52 47 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49  RG",        SQLI
20bd0 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
20be0 4e 5f 41 52 47 20 20 20 20 20 20 20 20 20 7d 2c  N_ARG         },
20bf0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
20c00 49 4d 49 54 5f 41 54 54 41 43 48 45 44 22 2c 20  IMIT_ATTACHED", 
20c10 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
20c20 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
20c30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
20c40 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
20c50 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
20c60 5f 4c 45 4e 47 54 48 22 2c 20 53 51 4c 49 54 45  _LENGTH", SQLITE
20c70 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
20c80 45 52 4e 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a 20  ERN_LENGTH  },. 
20c90 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
20ca0 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
20cb0 45 52 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  ER",     SQLITE_
20cc0 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
20cd0 55 4d 42 45 52 20 20 20 20 20 20 7d 2c 0a 20 20  UMBER      },.  
20ce0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
20cf0 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 22  T_TRIGGER_DEPTH"
20d00 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c  ,       SQLITE_L
20d10 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
20d20 54 48 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  TH        },.   
20d30 20 0a 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20   .    /* Out of 
20d40 72 61 6e 67 65 20 74 65 73 74 20 63 61 73 65 73  range test cases
20d50 20 2a 2f 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   */.    { "SQLIT
20d60 45 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c  E_LIMIT_TOOSMALL
20d70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d 31  ",            -1
20d80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20da0 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
20db0 5f 4c 49 4d 49 54 5f 54 4f 4f 42 49 47 22 2c 20  _LIMIT_TOOBIG", 
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
20dd0 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
20de0 52 5f 44 45 50 54 48 2b 31 20 20 20 20 20 20 7d  R_DEPTH+1      }
20df0 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
20e00 69 64 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20  id;.  int val;. 
20e10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
20e20 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
20e30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
20e40 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
20e50 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
20e60 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
20e70 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
20e80 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
20e90 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 49 44  [0], 0), " DB ID
20ea0 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
20eb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
20ec0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
20ed0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
20ee0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
20ef0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
20f00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
20f10 52 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f 47  R;.  zId = Tcl_G
20f20 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
20f30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
20f40 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65  sizeof(aId)/size
20f50 6f 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b 29  of(aId[0]); i++)
20f60 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
20f70 28 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61  (zId, aId[i].zNa
20f80 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
20f90 69 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b 0a  id = aId[i].id;.
20fa0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20fb0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d   }.  }.  if( i>=
20fc0 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65  sizeof(aId)/size
20fd0 6f 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20 20  of(aId[0]) ){.  
20fe0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
20ff0 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e  lt(interp, "unkn
21000 6f 77 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a 20  own limit type: 
21010 22 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a 29 30  ", zId, (char*)0
21020 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
21030 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
21040 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
21050 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
21060 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[3], &val) ) re
21070 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c    rc = sqlite3_l
21090 69 6d 69 74 28 64 62 2c 20 69 64 2c 20 76 61 6c  imit(db, id, val
210a0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
210b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
210c0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
210d0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
210e0 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
210f0 6c 63 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e 67  lcmd:  save_prng
21100 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76  _state.**.** Sav
21110 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
21120 68 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d  he pseudo-random
21130 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
21140 72 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73 61 6d  r..** At the sam
21150 65 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20 74  e time, verify t
21160 68 61 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74  hat sqlite3_test
21170 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 65  _control works e
21180 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c  ven when.** call
21190 65 64 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f  ed with an out-o
211a0 66 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e 0a  f-range opcode..
211b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
211c0 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20  ve_prng_state(. 
211d0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
211e0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
211f0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
21200 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
21210 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
21220 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
21230 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
21240 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
21250 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
21260 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
21270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21280 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
21290 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
212a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
212b0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
212c0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
212d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74  c = sqlite3_test
212e0 5f 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b 0a  _control(9999);.
212f0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20    assert( rc==0 
21300 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
21310 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 2d  3_test_control(-
21320 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  1);.  assert( rc
21330 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
21340 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
21350 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
21360 4e 47 5f 53 41 56 45 29 3b 0a 20 20 72 65 74 75  NG_SAVE);.  retu
21370 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  rn TCL_OK;.}./*.
21380 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 74  ** tclcmd:  rest
21390 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a  ore_prng_state.*
213a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
213b0 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 28  tore_prng_state(
213c0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
213d0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
213e0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
213f0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
21400 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
21410 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
21420 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
21430 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
21440 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
21450 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21470 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
21480 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
21490 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
214a0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
214b0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
214c0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
214d0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
214e0 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 29 3b  L_PRNG_RESTORE);
214f0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
21500 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  ;.}./*.** tclcmd
21510 3a 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74  :  reset_prng_st
21520 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ate.*/.static in
21530 74 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61  t reset_prng_sta
21540 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
21550 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
21560 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
21570 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
21580 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
21590 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
215a0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
215b0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
215c0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
215d0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
215e0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
215f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
21600 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
21610 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
21620 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
21630 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
21640 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
21650 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
21660 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 29  CTRL_PRNG_RESET)
21670 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
21680 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
21690 6d 64 3a 20 20 70 63 61 63 68 65 5f 73 74 61 74  md:  pcache_stat
216a0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
216b0 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74  test_pcache_stat
216c0 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  s(.  ClientData 
216d0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
216e0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
216f0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
21700 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
21710 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
21720 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
21730 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
21740 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
21750 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
21760 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
21770 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
21780 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
21790 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
217a0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
217b0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
217c0 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20 6e  nt nMin;.  int n
217d0 4d 61 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72 72  Max;.  int nCurr
217e0 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63 79  ent;.  int nRecy
217f0 63 6c 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f 62  clable;.  Tcl_Ob
21800 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c 69  j *pRet;..  sqli
21810 74 65 33 50 63 61 63 68 65 53 74 61 74 73 28 26  te3PcacheStats(&
21820 6e 43 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78 2c  nCurrent, &nMax,
21830 20 26 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63 6c   &nMin, &nRecycl
21840 61 62 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20 3d  able);..  pRet =
21850 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
21860 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
21870 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
21880 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
21890 74 72 69 6e 67 4f 62 6a 28 22 63 75 72 72 65 6e  tringObj("curren
218a0 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  t", -1));.  Tcl_
218b0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
218c0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
218d0 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
218e0 28 6e 43 75 72 72 65 6e 74 29 29 3b 0a 20 20 54  (nCurrent));.  T
218f0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
21900 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
21910 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
21920 69 6e 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d 31  ingObj("max", -1
21930 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
21940 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
21950 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
21960 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78 29  _NewIntObj(nMax)
21970 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
21980 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
21990 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
219a0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69  NewStringObj("mi
219b0 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  n", -1));.  Tcl_
219c0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
219d0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
219e0 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
219f0 28 6e 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f 4c  (nMin));.  Tcl_L
21a00 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
21a10 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
21a20 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
21a30 62 6a 28 22 72 65 63 79 63 6c 61 62 6c 65 22 2c  bj("recyclable",
21a40 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
21a50 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
21a60 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
21a70 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 52  Tcl_NewIntObj(nR
21a80 65 63 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20 20  ecyclable));..  
21a90 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
21aa0 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
21ab0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
21ac0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
21ad0 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
21ae0 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76  _NOTIFY.static v
21af0 6f 69 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f  oid test_unlock_
21b00 6e 6f 74 69 66 79 5f 63 62 28 76 6f 69 64 20 2a  notify_cb(void *
21b10 2a 61 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29  *aArg, int nArg)
21b20 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f  {.  int ii;.  fo
21b30 72 28 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67 3b  r(ii=0; ii<nArg;
21b40 20 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f   ii++){.    Tcl_
21b50 45 76 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74 65  EvalEx((Tcl_Inte
21b60 72 70 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20 22  rp *)aArg[ii], "
21b70 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20  unlock_notify", 
21b80 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  -1, TCL_EVAL_GLO
21b90 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  BAL);.  }.}.#end
21ba0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
21bb0 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
21bc0 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  Y */../*.** tclc
21bd0 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e 6c  md:  sqlite3_unl
21be0 6f 63 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a 2f  ock_notify db.*/
21bf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
21c00 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
21c10 49 46 59 0a 73 74 61 74 69 63 20 69 6e 74 20 74  IFY.static int t
21c20 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  est_unlock_notif
21c30 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  y(.  ClientData 
21c40 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
21c50 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
21c60 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
21c70 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
21c80 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
21c90 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
21ca0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
21cb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
21cc0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
21cd0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
21ce0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
21cf0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
21d00 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
21d10 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
21d20 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
21d30 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
21d40 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
21d50 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
21d60 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  B");.    return 
21d70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
21d80 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
21d90 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
21da0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
21db0 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
21dc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
21dd0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
21de0 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  te3_unlock_notif
21df0 79 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f 63  y(db, test_unloc
21e00 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76 6f  k_notify_cb, (vo
21e10 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20  id *)interp);.  
21e20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
21e30 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
21e40 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
21e50 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
21e60 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
21e70 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20  endif.../*.**   
21e80 20 20 74 63 6c 5f 6f 62 6a 70 72 6f 63 20 43 4f    tcl_objproc CO
21e90 4d 4d 41 4e 44 4e 41 4d 45 20 41 52 47 53 2e 2e  MMANDNAME ARGS..
21ea0 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 61 20 54 43  ..**.** Run a TC
21eb0 4c 20 63 6f 6d 6d 61 6e 64 20 75 73 69 6e 67 20  L command using 
21ec0 69 74 73 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65  its objProc inte
21ed0 72 66 61 63 65 2e 20 20 54 68 72 6f 77 20 61 6e  rface.  Throw an
21ee0 20 65 72 72 6f 72 20 69 66 0a 2a 2a 20 74 68 65   error if.** the
21ef0 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20   command has no 
21f00 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63  objProc interfac
21f10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
21f20 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63 28 0a 20   runAsObjProc(. 
21f30 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
21f40 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
21f50 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
21f60 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
21f70 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
21f80 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63  .  Tcl_CmdInfo c
21f90 6d 64 49 6e 66 6f 3b 0a 20 20 69 66 28 20 6f 62  mdInfo;.  if( ob
21fa0 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
21fb0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
21fc0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43  erp, 1, objv, "C
21fd0 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20  OMMAND ...");.  
21fe0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
21ff0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 54  OR;.  }.  if( !T
22000 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
22010 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  o(interp, Tcl_Ge
22020 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
22030 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
22040 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
22050 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
22060 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
22070 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54 63  ",.           Tc
22080 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
22090 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  [1]), (char*)0);
220a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
220b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
220c0 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63   cmdInfo.objProc
220d0 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  ==0 ){.    Tcl_A
220e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
220f0 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 68 61 73  rp, "command has
22100 20 6e 6f 20 6f 62 6a 50 72 6f 63 3a 20 22 2c 0a   no objProc: ",.
22110 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
22120 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
22130 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
22140 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
22150 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
22160 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63   cmdInfo.objProc
22170 28 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  (cmdInfo.objClie
22180 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20  ntData, interp, 
22190 6f 62 6a 63 2d 31 2c 20 6f 62 6a 76 2b 31 29 3b  objc-1, objv+1);
221a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  .}.../*.** Regis
221b0 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74  ter commands wit
221c0 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70  h the TCL interp
221d0 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71  reter..*/.int Sq
221e0 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54  litetest1_Init(T
221f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
22200 70 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  p){.  extern int
22210 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
22220 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
22230 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e  int sqlite3_foun
22240 64 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  d_count;.  exter
22250 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e  n int sqlite3_in
22260 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20  terrupt_count;. 
22270 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
22280 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  te3_open_file_co
22290 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
222a0 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63  t sqlite3_sort_c
222b0 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
222c0 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
222d0 6e 74 5f 74 69 6d 65 3b 0a 23 69 66 20 53 51 4c  nt_time;.#if SQL
222e0 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64  ITE_OS_UNIX && d
222f0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
22300 29 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ).  extern int s
22310 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
22320 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 74 65  m;.#endif.  exte
22330 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  rn int sqlite3_m
22340 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65  ax_blobsize;.  e
22350 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
22360 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68  3BtreeSharedCach
22370 65 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20  eReport(void*,. 
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223a0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 74           Tcl_Int
223b0 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a  erp*,int,Tcl_Obj
223c0 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74  *CONST*);.  stat
223d0 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
223e0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
223f0 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a     Tcl_CmdProc *
22400 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b  xProc;.  } aCmd[
22410 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64 62  ] = {.     { "db
22420 5f 65 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  _enter",        
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
22440 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65  cl_CmdProc*)db_e
22450 6e 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  nter            
22460 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62     },.     { "db
22470 5f 6c 65 61 76 65 22 2c 20 20 20 20 20 20 20 20  _leave",        
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
22490 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c  cl_CmdProc*)db_l
224a0 65 61 76 65 20 20 20 20 20 20 20 20 20 20 20 20  eave            
224b0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
224c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
224d0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  t",           (T
224e0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
224f0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20  te3_mprintf_int 
22500 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
22510 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
22520 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 28 54  t64",         (T
22530 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
22540 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36  te3_mprintf_int6
22550 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  4  },.     { "sq
22560 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
22570 6e 67 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  ng",          (T
22580 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
22590 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67  te3_mprintf_long
225a0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
225b0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
225c0 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  r",           (T
225d0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
225e0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20  te3_mprintf_str 
225f0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
22600 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73  lite3_snprintf_s
22610 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  tr",          (T
22620 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
22630 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72  te3_snprintf_str
22640 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
22650 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
22660 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28 54  ronly",       (T
22670 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
22680 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
22690 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  nly},.     { "sq
226a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f  lite3_mprintf_do
226b0 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28 54  uble",        (T
226c0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
226d0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
226e0 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  le },.     { "sq
226f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
22700 61 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28 54  aled",        (T
22710 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
22720 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
22730 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ed },.     { "sq
22740 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
22750 78 64 6f 75 62 6c 65 22 2c 20 20 20 28 54 63 6c  xdouble",   (Tcl
22760 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
22770 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75  3_mprintf_hexdou
22780 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ble},.     { "sq
22790 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f  lite3_mprintf_z_
227a0 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54  test",        (T
227b0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
227c0 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20  _mprintf_z      
227d0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
227e0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74  ite3_mprintf_n_t
227f0 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63  est",        (Tc
22800 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
22810 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20 20 20 20  mprintf_n       
22820 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
22830 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74  te3_snprintf_int
22840 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ",          (Tcl
22850 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73  _CmdProc*)test_s
22860 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 20  nprintf_int     
22870 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
22880 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
22890 6f 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f  owid",     (Tcl_
228a0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61  CmdProc*)test_la
228b0 73 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d  st_rowid       }
228c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
228d0 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20  3_exec_printf", 
228e0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
228f0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
22900 63 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c  c_printf      },
22910 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
22920 5f 65 78 65 63 5f 68 65 78 22 2c 20 20 20 20 20  _exec_hex",     
22930 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
22940 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
22950 5f 68 65 78 20 20 20 20 20 20 20 20 20 7d 2c 0a  _hex         },.
22960 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
22970 65 78 65 63 22 2c 20 20 20 20 20 20 20 20 20 20  exec",          
22980 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
22990 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 20  Proc*)test_exec 
229a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
229b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
229c0 78 65 63 5f 6e 72 22 2c 20 20 20 20 20 20 20 20  xec_nr",        
229d0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
229e0 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e  roc*)test_exec_n
229f0 72 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69  r          },.#i
22a00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22a10 54 5f 47 45 54 5f 54 41 42 4c 45 0a 20 20 20 20  T_GET_TABLE.    
22a20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f   { "sqlite3_get_
22a30 74 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20  table_printf",  
22a40 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
22a50 2a 29 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65  *)test_get_table
22a60 5f 70 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69  _printf },.#endi
22a70 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
22a80 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20  3_close",       
22a90 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
22aa0 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74  mdProc*)sqlite_t
22ab0 65 73 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c  est_close     },
22ac0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
22ad0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
22ae0 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ",       (Tcl_Cm
22af0 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61  dProc*)test_crea
22b00 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a  te_function  },.
22b10 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
22b20 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
22b30 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ",      (Tcl_Cmd
22b40 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74  Proc*)test_creat
22b50 65 5f 61 67 67 72 65 67 61 74 65 20 7d 2c 0a 20  e_aggregate },. 
22b60 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 72 65      { "sqlite_re
22b70 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63  gister_test_func
22b80 74 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50  tion", (Tcl_CmdP
22b90 72 6f 63 2a 29 74 65 73 74 5f 72 65 67 69 73 74  roc*)test_regist
22ba0 65 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20  er_func    },.  
22bb0 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f     { "sqlite_abo
22bc0 72 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rt",            
22bd0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
22be0 6f 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72 74  oc*)sqlite_abort
22bf0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
22c00 20 20 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e 64    { "sqlite_bind
22c10 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
22c20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
22c30 63 2a 29 74 65 73 74 5f 62 69 6e 64 20 20 20 20  c*)test_bind    
22c40 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
22c50 20 7b 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c   { "breakpoint",
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
22c80 2a 29 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e  *)test_breakpoin
22c90 74 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  t       },.     
22ca0 7b 20 22 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c  { "sqlite3_key",
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cc0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
22cd0 29 74 65 73 74 5f 6b 65 79 20 20 20 20 20 20 20  )test_key       
22ce0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
22cf0 20 22 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 22   "sqlite3_rekey"
22d00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22d10 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
22d20 74 65 73 74 5f 72 65 6b 65 79 20 20 20 20 20 20  test_rekey      
22d30 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
22d40 22 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69  "sqlite_set_magi
22d50 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
22d60 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
22d70 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20  qlite_set_magic 
22d80 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
22d90 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
22da0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
22db0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
22dc0 73 74 5f 69 6e 74 65 72 72 75 70 74 20 20 20 20  st_interrupt    
22dd0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
22de0 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e  qlite_delete_fun
22df0 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 28  ction",        (
22e00 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c  Tcl_CmdProc*)del
22e10 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20  ete_function    
22e20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
22e30 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c  lite_delete_coll
22e40 61 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54  ation",       (T
22e50 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65  cl_CmdProc*)dele
22e60 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20  te_collation    
22e70 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
22e80 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
22e90 6d 69 74 22 2c 20 20 20 20 20 20 20 20 28 54 63  mit",        (Tc
22ea0 6c 5f 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61  l_CmdProc*)get_a
22eb0 75 74 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20  utocommit       
22ec0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
22ed0 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c  te3_stack_used",
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
22ef0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73  _CmdProc*)test_s
22f00 74 61 63 6b 5f 75 73 65 64 20 20 20 20 20 20 20  tack_used       
22f10 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
22f20 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 22  e3_busy_timeout"
22f30 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
22f40 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 75  CmdProc*)test_bu
22f50 73 79 5f 74 69 6d 65 6f 75 74 20 20 20 20 20 7d  sy_timeout     }
22f60 2c 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74 66  ,.     { "printf
22f70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
22f80 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
22f90 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 70 72 69  mdProc*)test_pri
22fa0 6e 74 66 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ntf           },
22fb0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
22fc0 49 6f 54 72 61 63 65 22 2c 20 20 20 20 20 20 20  IoTrace",       
22fd0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
22fe0 72 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61  roc*)test_io_tra
22ff0 63 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  ce         },.  
23000 7d 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  };.  static stru
23010 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
23020 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f  zName;.     Tcl_
23030 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f  ObjCmdProc *xPro
23040 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c  c;.     void *cl
23050 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f  ientData;.  } aO
23060 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  bjCmd[] = {.    
23070 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e   { "sqlite3_conn
23080 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c  ection_pointer",
23090 20 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70      get_sqlite_p
230a0 6f 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20  ointer, 0 },.   
230b0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
230c0 64 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20  d_int",         
230d0 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69       test_bind_i
230e0 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20  nt,      0 },.  
230f0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
23100 6e 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20  nd_zeroblob",   
23110 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
23120 7a 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20  zeroblob, 0 },. 
23130 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
23140 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20  ind_int64",     
23150 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
23160 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a  _int64,    0 },.
23170 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
23180 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20  bind_double",   
23190 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
231a0 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c  d_double,   0 },
231b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
231c0 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20  _bind_null",    
231d0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
231e0 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d  nd_null     ,0 }
231f0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
23200 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20  3_bind_text",   
23210 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
23220 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20  ind_text     ,0 
23230 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
23240 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c  e3_bind_text16",
23250 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
23260 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30  bind_text16   ,0
23270 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
23280 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20  te3_bind_blob", 
23290 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
232a0 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c  _bind_blob     ,
232b0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
232c0 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
232d0 74 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73  ter_count",  tes
232e0 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
232f0 5f 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20  _count, 0},.    
23300 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
23310 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22  _parameter_name"
23320 2c 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  ,   test_bind_pa
23330 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30  rameter_name,  0
23340 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
23350 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
23360 72 5f 69 6e 64 65 78 22 2c 20 20 74 65 73 74 5f  r_index",  test_
23370 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
23380 6e 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  ndex, 0},.     {
23390 20 22 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f   "sqlite3_clear_
233a0 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 20  bindings",      
233b0 20 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e    test_clear_bin
233c0 64 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20  dings, 0},.     
233d0 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70  { "sqlite3_sleep
233e0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
233f0 20 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20     test_sleep,  
23400 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
23410 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63   { "sqlite3_errc
23420 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ode",           
23430 20 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65      test_errcode
23440 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
23450 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74    { "sqlite3_ext
23460 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 22 2c 20  ended_errcode", 
23470 20 20 20 20 20 74 65 73 74 5f 65 78 5f 65 72 72       test_ex_err
23480 63 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20  code    ,0 },.  
23490 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
234a0 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20 20  rmsg",          
234b0 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73        test_errms
234c0 67 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  g        ,0 },. 
234d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
234e0 72 72 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20  rrmsg16",       
234f0 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d         test_errm
23500 73 67 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a  sg16      ,0 },.
23510 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
23520 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20  open",          
23530 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65          test_ope
23540 6e 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  n          ,0 },
23550 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
23560 5f 6f 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20  _open16",       
23570 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70           test_op
23580 65 6e 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d  en16        ,0 }
23590 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
235a0 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20  3_complete16",  
235b0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
235c0 6f 6d 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20  omplete16    ,0 
235d0 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
235e0 74 65 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20  te3_prepare",   
235f0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
23600 5f 70 72 65 70 61 72 65 20 20 20 20 20 20 20 2c  _prepare       ,
23610 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
23620 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c  ite3_prepare16",
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
23640 74 5f 70 72 65 70 61 72 65 31 36 20 20 20 20 20  t_prepare16     
23650 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
23660 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
23670 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
23680 73 74 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20  st_prepare_v2   
23690 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
236a0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74  qlite3_prepare_t
236b0 6b 74 33 31 33 34 22 2c 20 20 20 20 20 20 20 74  kt3134",       t
236c0 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  est_prepare_tkt3
236d0 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  134, 0},.     { 
236e0 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
236f0 31 36 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  16_v2",         
23700 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f   test_prepare16_
23710 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  v2  ,0 },.     {
23720 20 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69   "sqlite3_finali
23730 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
23740 20 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20    test_finalize 
23750 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
23760 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  { "sqlite3_stmt_
23770 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20  status",        
23780 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61     test_stmt_sta
23790 74 75 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  tus   ,0 },.    
237a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65   { "sqlite3_rese
237b0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
237c0 20 20 20 20 74 65 73 74 5f 72 65 73 65 74 20 20      test_reset  
237d0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
237e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70    { "sqlite3_exp
237f0 69 72 65 64 22 2c 20 20 20 20 20 20 20 20 20 20  ired",          
23800 20 20 20 20 20 74 65 73 74 5f 65 78 70 69 72 65       test_expire
23810 64 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  d       ,0 },.  
23820 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72     { "sqlite3_tr
23830 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22  ansfer_bindings"
23840 2c 20 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73  ,     test_trans
23850 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20  fer_bind ,0 },. 
23860 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
23870 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
23880 20 20 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e         test_chan
23890 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  ges       ,0 },.
238a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
238b0 73 74 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  step",          
238c0 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 65          test_ste
238d0 70 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  p          ,0 },
238e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
238f0 5f 73 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20  _sql",          
23900 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71           test_sq
23910 6c 20 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d  l           ,0 }
23920 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
23930 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20  3_next_stmt",   
23940 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e            test_n
23950 65 78 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20  ext_stmt     ,0 
23960 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
23970 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
23980 72 79 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  ry",        test
23990 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c  _release_memory,
239a0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
239b0 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65  "sqlite3_soft_he
239c0 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20  ap_limit",      
239d0 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f   test_soft_heap_
239e0 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20  limit,    0},.  
239f0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68     { "sqlite3_th
23a00 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20  read_cleanup",  
23a10 20 20 20 20 20 20 74 65 73 74 5f 74 68 72 65 61        test_threa
23a20 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30  d_cleanup,     0
23a30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
23a40 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
23a50 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  ts",       test_
23a60 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c  pager_refcounts,
23a70 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20      0},..     { 
23a80 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78  "sqlite3_load_ex
23a90 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20  tension",       
23aa0 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e   test_load_exten
23ab0 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20  sion,     0},.  
23ac0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e     { "sqlite3_en
23ad0 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
23ae0 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c  ion", test_enabl
23af0 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30  e_load,        0
23b00 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
23b10 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
23b20 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f  lt_codes", test_
23b30 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
23b40 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20  codes, 0},.     
23b50 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  { "sqlite3_limit
23b60 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
23b70 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20     test_limit,  
23b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
23b90 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61 76 65  },..     { "save
23ba0 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20  _prng_state",   
23bb0 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65              save
23bc0 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 20  _prng_state,    
23bd0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73  0 },.     { "res
23be0 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 22  tore_prng_state"
23bf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73  ,            res
23c00 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c  tore_prng_state,
23c10 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65   0 },.     { "re
23c20 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c  set_prng_state",
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
23c40 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20  set_prng_state, 
23c50 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74    0 },.     { "t
23c60 63 6c 5f 6f 62 6a 70 72 6f 63 22 2c 20 20 20 20  cl_objproc",    
23c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
23c80 75 6e 41 73 4f 62 6a 50 72 6f 63 2c 20 20 20 20  unAsObjProc,    
23c90 20 20 20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a     0 },..     /*
23ca0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
23cb0 2a 28 29 20 41 50 49 20 2a 2f 0a 20 20 20 20 20  *() API */.     
23cc0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
23cd0 6e 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20  n_count",       
23ce0 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63     test_column_c
23cf0 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20  ount  ,0 },.    
23d00 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 61 74 61   { "sqlite3_data
23d10 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20  _count",        
23d20 20 20 20 20 74 65 73 74 5f 64 61 74 61 5f 63 6f      test_data_co
23d30 75 6e 74 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  unt    ,0 },.   
23d40 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
23d50 75 6d 6e 5f 74 79 70 65 22 2c 20 20 20 20 20 20  umn_type",      
23d60 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
23d70 5f 74 79 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20  _type   ,0 },.  
23d80 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
23d90 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20  lumn_blob",     
23da0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
23db0 6e 5f 62 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20  n_blob   ,0 },. 
23dc0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
23dd0 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20  olumn_double",  
23de0 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
23df0 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a  mn_double ,0 },.
23e00 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
23e10 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20  column_int64",  
23e20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
23e30 75 6d 6e 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c  umn_int64  ,0 },
23e40 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
23e50 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20  _column_text",  
23e60 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c   test_stmt_utf8,
23e70 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33    (void*)sqlite3
23e80 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c 0a  _column_text },.
23e90 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
23ea0 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20  column_name",   
23eb0 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20  test_stmt_utf8, 
23ec0 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
23ed0 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a 20  column_name },. 
23ee0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
23ef0 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 74  olumn_int",    t
23f00 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20  est_stmt_int,   
23f10 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
23f20 6f 6c 75 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20 20  olumn_int  },.  
23f30 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
23f40 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20 74 65  lumn_bytes",  te
23f50 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28  st_stmt_int,   (
23f60 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
23f70 6c 75 6d 6e 5f 62 79 74 65 73 7d 2c 0a 23 69 66  lumn_bytes},.#if
23f80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23f90 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 7b  _DECLTYPE.     {
23fa0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
23fb0 5f 64 65 63 6c 74 79 70 65 22 2c 74 65 73 74 5f  _decltype",test_
23fc0 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a  stmt_utf8,(void*
23fd0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
23fe0 64 65 63 6c 74 79 70 65 7d 2c 0a 23 65 6e 64 69  decltype},.#endi
23ff0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
24000 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
24010 54 41 44 41 54 41 0a 7b 20 22 73 71 6c 69 74 65  TADATA.{ "sqlite
24020 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
24030 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d  e_name",test_stm
24040 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
24050 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74  lite3_column_dat
24060 61 62 61 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22  abase_name},.{ "
24070 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
24080 61 62 6c 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f  able_name",test_
24090 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a  stmt_utf8,(void*
240a0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
240b0 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22  table_name},.{ "
240c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f  sqlite3_column_o
240d0 72 69 67 69 6e 5f 6e 61 6d 65 22 2c 74 65 73 74  rigin_name",test
240e0 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64  _stmt_utf8,(void
240f0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
24100 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23  _origin_name},.#
24110 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
24120 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
24130 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
24140 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22  _column_bytes16"
24150 2c 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c  , test_stmt_int,
24160 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
24170 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 7d  column_bytes16 }
24180 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
24190 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22  3_column_text16"
241a0 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ,  test_stmt_utf
241b0 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  16, (void*)sqlit
241c0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
241d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
241e0 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36  e3_column_name16
241f0 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  ",  test_stmt_ut
24200 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69  f16, (void*)sqli
24210 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31  te3_column_name1
24220 36 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f  6},.     { "add_
24230 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63  alignment_test_c
24240 6f 6c 6c 61 74 69 6f 6e 73 22 2c 20 61 64 64 5f  ollations", add_
24250 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63  alignment_test_c
24260 6f 6c 6c 61 74 69 6f 6e 73 2c 20 30 20 20 20 20  ollations, 0    
24270 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c    },.#ifndef SQL
24280 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
24290 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
242a0 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
242b0 65 31 36 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  e16",test_stmt_u
242c0 74 66 31 36 2c 28 76 6f 69 64 2a 29 73 71 6c 69  tf16,(void*)sqli
242d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
242e0 79 70 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23  ype16},.#endif.#
242f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
24300 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
24310 41 54 41 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f  ATA.{"sqlite3_co
24320 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
24330 6d 65 31 36 22 2c 0a 20 20 74 65 73 74 5f 73 74  me16",.  test_st
24340 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65  mt_utf16, sqlite
24350 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
24360 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c  e_name16},.{"sql
24370 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
24380 65 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f  e_name16", test_
24390 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
243a0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
243b0 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c  n_table_name16},
243c0 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .{"sqlite3_colum
243d0 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22  n_origin_name16"
243e0 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  , test_stmt_utf1
243f0 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  6, (void*)sqlite
24400 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
24410 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a  name16},.#endif.
24420 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
24430 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
24440 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73  llation_v2", tes
24450 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  t_create_collati
24460 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20  on_v2, 0 },.    
24470 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f 62   { "sqlite3_glob
24480 61 6c 5f 72 65 63 6f 76 65 72 22 2c 20 20 20 20  al_recover",    
24490 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63   test_global_rec
244a0 6f 76 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20 20  over, 0   },.   
244b0 20 20 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34 62    { "working_64b
244c0 69 74 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  it_int",        
244d0 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f    working_64bit_
244e0 69 6e 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20  int,   0   },.  
244f0 20 20 20 7b 20 22 76 66 73 5f 75 6e 6c 69 6e 6b     { "vfs_unlink
24500 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20  _test",         
24510 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65     vfs_unlink_te
24520 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20  st,     0   },. 
24530 20 20 20 20 7b 20 22 76 66 73 5f 69 6e 69 74 66      { "vfs_initf
24540 61 69 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20  ail_test",      
24550 20 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c      vfs_initfail
24560 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a  _test,   0   },.
24570 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 72 65       { "vfs_unre
24580 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20  gister_all",    
24590 20 20 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73       vfs_unregis
245a0 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c  ter_all,  0   },
245b0 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 72 65 72  .     { "vfs_rer
245c0 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20  egister_all",   
245d0 20 20 20 20 20 20 76 66 73 5f 72 65 72 65 67 69        vfs_reregi
245e0 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d  ster_all,  0   }
245f0 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
24600 6f 6e 74 72 6f 6c 5f 74 65 73 74 22 2c 20 20 20  ontrol_test",   
24610 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74         file_cont
24620 72 6f 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20  rol_test,   0   
24630 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
24640 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e  control_lasterrn
24650 6f 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f  o_test", file_co
24660 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f  ntrol_lasterrno_
24670 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20  test,  0   },.  
24680 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
24690 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73  ol_lockproxy_tes
246a0 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  t", file_control
246b0 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 2c  _lockproxy_test,
246c0 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
246d0 22 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73  "sqlite3_vfs_lis
246e0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 76 66  t",           vf
246f0 73 5f 6c 69 73 74 2c 20 20 20 20 20 30 20 20 20  s_list,     0   
24700 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63  },..     /* Func
24710 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20  tions from os.h 
24720 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
24730 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20  E_OMIT_UTF16.   
24740 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f    { "add_test_co
24750 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 74  llate",        t
24760 65 73 74 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20  est_collate, 0  
24770 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
24780 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f    { "add_test_co
24790 6c 6c 61 74 65 5f 6e 65 65 64 65 64 22 2c 20 74  llate_needed", t
247a0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
247b0 65 64 2c 20 30 20 20 20 20 20 7d 2c 0a 20 20 20  ed, 0     },.   
247c0 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 66 75    { "add_test_fu
247d0 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 74  nction",       t
247e0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20  est_function, 0 
247f0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e            },.#en
24800 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
24810 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 22  te3_test_errstr"
24820 2c 20 20 20 20 20 74 65 73 74 5f 65 72 72 73 74  ,     test_errst
24830 72 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  r, 0            
24840 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f   },.     { "tcl_
24850 76 61 72 69 61 62 6c 65 5f 74 79 70 65 22 2c 20  variable_type", 
24860 20 20 20 20 20 20 74 63 6c 5f 76 61 72 69 61 62        tcl_variab
24870 6c 65 5f 74 79 70 65 2c 20 30 20 20 20 20 20 20  le_type, 0      
24880 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   },.#ifndef SQLI
24890 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
248a0 41 43 48 45 0a 20 20 20 20 20 7b 20 22 73 71 6c  ACHE.     { "sql
248b0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72  ite3_enable_shar
248c0 65 64 5f 63 61 63 68 65 22 2c 20 74 65 73 74 5f  ed_cache", test_
248d0 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 2c 20 30  enable_shared, 0
248e0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
248f0 69 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68  ite3_shared_cach
24900 65 5f 72 65 70 6f 72 74 22 2c 20 73 71 6c 69 74  e_report", sqlit
24910 65 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63  e3BtreeSharedCac
24920 68 65 52 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65  heReport, 0},.#e
24930 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
24940 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  ite3_libversion_
24950 6e 75 6d 62 65 72 22 2c 20 74 65 73 74 5f 6c 69  number", test_li
24960 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c  bversion_number,
24970 20 30 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51   0  },.#ifdef SQ
24980 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
24990 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
249a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 61 62 6c   { "sqlite3_tabl
249b0 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
249c0 61 22 2c 20 74 65 73 74 5f 74 61 62 6c 65 5f 63  a", test_table_c
249d0 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20  olumn_metadata, 
249e0 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66  0  },.#endif.#if
249f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24a00 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b  _INCRBLOB.     {
24a10 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72   "sqlite3_blob_r
24a20 65 61 64 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62  ead",  test_blob
24a30 5f 72 65 61 64 2c 20 30 20 20 7d 2c 0a 20 20 20  _read, 0  },.   
24a40 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f    { "sqlite3_blo
24a50 62 5f 77 72 69 74 65 22 2c 20 74 65 73 74 5f 62  b_write", test_b
24a60 6c 6f 62 5f 77 72 69 74 65 2c 20 30 20 20 7d 2c  lob_write, 0  },
24a70 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
24a80 70 63 61 63 68 65 5f 73 74 61 74 73 22 2c 20 20  pcache_stats",  
24a90 20 20 20 20 20 74 65 73 74 5f 70 63 61 63 68 65       test_pcache
24aa0 5f 73 74 61 74 73 2c 20 30 20 20 7d 2c 0a 23 69  _stats, 0  },.#i
24ab0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
24ac0 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  LE_UNLOCK_NOTIFY
24ad0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
24ae0 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c  _unlock_notify",
24af0 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74   test_unlock_not
24b00 69 66 79 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69  ify, 0  },.#endi
24b10 66 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  f.  };.  static 
24b20 69 6e 74 20 62 69 74 6d 61 73 6b 5f 73 69 7a 65  int bitmask_size
24b30 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73   = sizeof(Bitmas
24b40 6b 29 2a 38 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  k)*8;.  int i;. 
24b50 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
24b60 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20  te3_sync_count, 
24b70 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
24b80 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
24b90 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65   int sqlite3_ope
24ba0 6e 74 65 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20 65  ntemp_count;.  e
24bb0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
24bc0 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20  3_like_count;.  
24bd0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
24be0 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74  e3_xferopt_count
24bf0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
24c00 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
24c10 64 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ddb_count;.  ext
24c20 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
24c30 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
24c40 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
24c50 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
24c60 77 72 69 74 65 6a 5f 63 6f 75 6e 74 3b 0a 23 69  writej_count;.#i
24c70 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  f defined(__linu
24c80 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28  x__) && defined(
24c90 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
24ca0 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
24cb0 45 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 74  E.  extern int t
24cc0 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
24cd0 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3b 0a 23  chOthersLocks;.#
24ce0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
24cf0 5f 4f 53 5f 57 49 4e 0a 20 20 65 78 74 65 72 6e  _OS_WIN.  extern
24d00 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f   int sqlite3_os_
24d10 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66  type;.#endif.#if
24d20 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
24d30 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
24d40 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b  lite3WhereTrace;
24d50 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
24d60 6c 69 74 65 33 4f 53 54 72 61 63 65 3b 0a 20 20  lite3OSTrace;.  
24d70 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
24d80 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
24d90 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
24da0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78  SQLITE_TEST.  ex
24db0 74 65 72 6e 20 63 68 61 72 20 73 71 6c 69 74 65  tern char sqlite
24dc0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 3b 0a  3_query_plan[];.
24dd0 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 71    static char *q
24de0 75 65 72 79 5f 70 6c 61 6e 20 3d 20 73 71 6c 69  uery_plan = sqli
24df0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 3b 0a  te3_query_plan;.
24e00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
24e10 41 42 4c 45 5f 46 54 53 33 0a 20 20 65 78 74 65  ABLE_FTS3.  exte
24e20 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  rn int sqlite3_f
24e30 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e  ts3_enable_paren
24e40 74 68 65 73 65 73 3b 0a 23 65 6e 64 69 66 0a 23  theses;.#endif.#
24e50 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30  endif..  for(i=0
24e60 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29  ; i<sizeof(aCmd)
24e70 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29  /sizeof(aCmd[0])
24e80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
24e90 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
24ea0 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e  terp, aCmd[i].zN
24eb0 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72  ame, aCmd[i].xPr
24ec0 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  oc, 0, 0);.  }. 
24ed0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
24ee0 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65  of(aObjCmd)/size
24ef0 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20  of(aObjCmd[0]); 
24f00 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72  i++){.    Tcl_Cr
24f10 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
24f20 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69  nterp, aObjCmd[i
24f30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ].zName, .      
24f40 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72    aObjCmd[i].xPr
24f50 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63  oc, aObjCmd[i].c
24f60 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20  lientData, 0);. 
24f70 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72   }.  Tcl_LinkVar
24f80 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
24f90 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20  _search_count", 
24fa0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
24fb0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
24fc0 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
24fd0 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
24fe0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
24ff0 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 22 2c 20  e_found_count", 
25000 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
25010 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75  qlite3_found_cou
25020 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
25030 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
25040 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
25050 5f 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20  _sort_count", . 
25060 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
25070 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c  ite3_sort_count,
25080 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
25090 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
250a0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 6d  terp, "sqlite3_m
250b0 61 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a 20  ax_blobsize", . 
250c0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
250d0 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
250e0 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
250f0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
25100 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
25110 6c 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  like_count", .  
25120 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
25130 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20  te3_like_count, 
25140 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
25150 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
25160 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74  erp, "sqlite_int
25170 65 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a  errupt_count", .
25180 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
25190 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f  lite3_interrupt_
251a0 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
251b0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
251c0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
251d0 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  ite_open_file_co
251e0 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
251f0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65  ar*)&sqlite3_ope
25200 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43  n_file_count, TC
25210 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
25220 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
25230 70 2c 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65  p, "sqlite_curre
25240 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20  nt_time", .     
25250 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
25260 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54  _current_time, T
25270 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69  CL_LINK_INT);.#i
25280 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  f SQLITE_OS_UNIX
25290 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
252a0 50 4c 45 5f 5f 29 0a 20 20 54 63 6c 5f 4c 69 6e  PLE__).  Tcl_Lin
252b0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
252c0 6c 69 74 65 5f 68 6f 73 74 69 64 5f 6e 75 6d 22  lite_hostid_num"
252d0 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
252e0 26 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f  &sqlite3_hostid_
252f0 6e 75 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  num, TCL_LINK_IN
25300 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c  T);.#endif.  Tcl
25310 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
25320 20 22 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70   "sqlite3_xferop
25330 74 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  t_count",.      
25340 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
25350 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20 54  xferopt_count, T
25360 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
25370 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
25380 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67  rp, "sqlite3_pag
25390 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 22  er_readdb_count"
253a0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
253b0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
253c0 61 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  addb_count, TCL_
253d0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
253e0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
253f0 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
25400 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c 0a  writedb_count",.
25410 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
25420 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
25430 65 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  edb_count, TCL_L
25440 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
25450 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
25460 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  "sqlite3_pager_w
25470 72 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20  ritej_count",.  
25480 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
25490 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
254a0 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
254b0 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53  _INT);.#ifndef S
254c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
254d0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
254e0 6e 74 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65  nterp, "unaligne
254f0 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
25500 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
25510 26 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e  &unaligned_strin
25520 67 5f 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c  g_counter, TCL_L
25530 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
25540 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c  .#if defined(__l
25550 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e  inux__) && defin
25560 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
25570 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
25580 53 41 46 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  SAFE.  Tcl_LinkV
25590 61 72 28 69 6e 74 65 72 70 2c 20 22 74 68 72 65  ar(interp, "thre
255a0 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
255b0 74 68 65 72 73 4c 6f 63 6b 73 22 2c 0a 20 20 20  thersLocks",.   
255c0 20 20 20 28 63 68 61 72 2a 29 26 74 68 72 65 61     (char*)&threa
255d0 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
255e0 68 65 72 73 4c 6f 63 6b 73 2c 20 54 43 4c 5f 4c  hersLocks, TCL_L
255f0 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
25600 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25610 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c  OMIT_UTF16.  Tcl
25620 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
25630 20 22 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65   "sqlite_last_ne
25640 65 64 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c  eded_collation",
25650 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70  .      (char*)&p
25660 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
25670 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
25680 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f  G|TCL_LINK_READ_
25690 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ONLY);.#endif.#i
256a0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
256b0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
256c0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73  terp, "sqlite_os
256d0 5f 74 79 70 65 22 2c 0a 20 20 20 20 20 20 28 63  _type",.      (c
256e0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73  har*)&sqlite3_os
256f0 5f 74 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  _type, TCL_LINK_
25700 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  INT);.#endif.#if
25710 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
25720 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
25730 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 71 75  terp, "sqlite_qu
25740 65 72 79 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20  ery_plan",.     
25750 20 28 63 68 61 72 2a 29 26 71 75 65 72 79 5f 70   (char*)&query_p
25760 6c 61 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54  lan, TCL_LINK_ST
25770 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45  RING|TCL_LINK_RE
25780 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  AD_ONLY);.#endif
25790 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
257a0 45 42 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  EBUG.  Tcl_LinkV
257b0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
257c0 74 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 22 2c  te_addop_trace",
257d0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
257e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
257f0 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
25800 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
25810 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
25820 74 65 5f 77 68 65 72 65 5f 74 72 61 63 65 22 2c  te_where_trace",
25830 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
25840 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
25850 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
25860 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
25870 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
25880 73 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20  s_trace",.      
25890 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 4f  (char*)&sqlite3O
258a0 53 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b  STrace, TCL_LINK
258b0 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69  _INT);.#endif.#i
258c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
258d0 54 5f 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f 4c  T_DISKIO.  Tcl_L
258e0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
258f0 73 71 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70 5f  sqlite_opentemp_
25900 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
25910 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70  har*)&sqlite3_op
25920 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54 43  entemp_count, TC
25930 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e  L_LINK_INT);.#en
25940 64 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  dif.  Tcl_LinkVa
25950 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
25960 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61  e_static_bind_va
25970 6c 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  lue",.      (cha
25980 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69  r*)&sqlite_stati
25990 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43  c_bind_value, TC
259a0 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a  L_LINK_STRING);.
259b0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
259c0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74  terp, "sqlite_st
259d0 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 22  atic_bind_nbyte"
259e0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
259f0 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
25a00 6e 64 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c 49  nd_nbyte, TCL_LI
25a10 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
25a20 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
25a30 73 71 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72 65  sqlite_temp_dire
25a40 63 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63  ctory",.      (c
25a50 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 74 65  har*)&sqlite3_te
25a60 6d 70 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43  mp_directory, TC
25a70 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a  L_LINK_STRING);.
25a80 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
25a90 74 65 72 70 2c 20 22 62 69 74 6d 61 73 6b 5f 73  terp, "bitmask_s
25aa0 69 7a 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ize",.      (cha
25ab0 72 2a 29 26 62 69 74 6d 61 73 6b 5f 73 69 7a 65  r*)&bitmask_size
25ac0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54  , TCL_LINK_INT|T
25ad0 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c  CL_LINK_READ_ONL
25ae0 59 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  Y);.  Tcl_LinkVa
25af0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
25b00 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20  e_sync_count",. 
25b10 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
25b20 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c  ite3_sync_count,
25b30 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
25b40 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
25b50 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 75  terp, "sqlite_fu
25b60 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20  llsync_count",. 
25b70 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
25b80 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
25b90 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
25ba0 54 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  T);.#if defined(
25bb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
25bc0 53 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  S3) && defined(S
25bd0 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 54 63  QLITE_TEST).  Tc
25be0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
25bf0 2c 20 22 73 71 6c 69 74 65 5f 66 74 73 33 5f 65  , "sqlite_fts3_e
25c00 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65  nable_parenthese
25c10 73 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  s",.      (char*
25c20 29 26 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65  )&sqlite3_fts3_e
25c30 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65  nable_parenthese
25c40 73 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  s, TCL_LINK_INT)
25c50 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
25c60 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a              n TCL_OK;.}.