/ Hex Artifact Content
Login

Artifact 2232a39540a6b72f3be8f84b34d1ca0714f92aee:


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 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
16790 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
167a0 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
167b0 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
167c0 73 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  s(pStmt)));.  re
167d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
167e0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
167f0 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d 49 4c  qlite3_sleep MIL
16800 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74 61  LISECONDS.*/.sta
16810 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6c 65  tic int test_sle
16820 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ep(.  void * cli
16830 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
16840 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
16850 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
16860 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
16870 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a  [].){.  int ms;.
16880 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
16890 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
168a0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
168b0 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
168c0 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 72 65 74  CONDS");.    ret
168d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
168e0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
168f0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
16900 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29  p, objv[1], &ms)
16910 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
16920 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
16930 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
16940 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
16950 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73  IntObj(sqlite3_s
16960 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20 20 72 65  leep(ms)));.  re
16970 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
16980 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
16990 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
169a0 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rcode DB.**.** R
169b0 65 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67  eturn the string
169c0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
169d0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
169e0 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
169f0 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .** error code. 
16a00 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52  e.g. "SQLITE_ERR
16a10 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  OR"..*/.static i
16a20 6e 74 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f  nt test_ex_errco
16a30 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  de(.  void * cli
16a40 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
16a50 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
16a60 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
16a70 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
16a80 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
16a90 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
16aa0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
16ab0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
16ac0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
16ad0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
16ae0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
16af0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
16b00 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
16b10 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
16b20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16b30 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
16b40 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
16b50 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
16b60 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
16b70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
16b80 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 74 65  c = sqlite3_exte
16b90 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 64 62 29  nded_errcode(db)
16ba0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
16bb0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
16bc0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
16bd0 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
16be0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
16bf0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
16c00 74 65 33 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a  te3_errcode DB.*
16c10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
16c20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
16c30 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
16c40 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
16c50 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20  _* API.** error 
16c60 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49  code. e.g. "SQLI
16c70 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74  TE_ERROR"..*/.st
16c80 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
16c90 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20  rcode(.  void * 
16ca0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
16cb0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16cc0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
16cd0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
16ce0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
16cf0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
16d00 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
16d10 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
16d20 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16d30 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
16d40 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
16d50 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
16d60 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
16d70 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
16d80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16d90 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
16da0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
16db0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
16dc0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
16dd0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16de0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
16df0 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63  rrcode(db);.  Tc
16e00 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16e10 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
16e20 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
16e30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
16e40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
16e50 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 65  age:   sqlite3_e
16e60 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rrmsg DB.**.** R
16e70 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 38  eturns the UTF-8
16e80 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
16e90 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  of the error mes
16ea0 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20  sage string for 
16eb0 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
16ec0 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
16ed0 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
16ee0 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67   int test_errmsg
16ef0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
16f00 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
16f10 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
16f20 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
16f30 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
16f40 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
16f50 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
16f60 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20 6f 62  *zErr;..  if( ob
16f70 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
16f80 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16f90 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
16fa0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
16fb0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
16fc0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
16fd0 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
16fe0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16ff0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
17000 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
17010 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
17020 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
17030 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17040 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73  ROR;..  zErr = s
17050 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
17060 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
17070 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
17080 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
17090 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74  Err, -1));.  ret
170a0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
170b0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65  *.** Usage:   te
170c0 73 74 5f 65 72 72 6d 73 67 31 36 20 44 42 0a 2a  st_errmsg16 DB.*
170d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
170e0 20 55 54 46 2d 31 36 20 72 65 70 72 65 73 65 6e   UTF-16 represen
170f0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72  tation of the er
17100 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
17110 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f  ng for the.** mo
17120 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
17130 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20 54 68  3_* API call. Th
17140 69 73 20 69 73 20 61 20 62 79 74 65 20 61 72 72  is is a byte arr
17150 61 79 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65  ay object at the
17160 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c 20   TCL .** level, 
17170 61 6e 64 20 69 74 20 69 6e 63 6c 75 64 65 73 20  and it includes 
17180 74 68 65 20 30 78 30 30 20 30 78 30 30 20 74 65  the 0x00 0x00 te
17190 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20 61  rminator bytes a
171a0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
171b0 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74 72 69 6e  .** UTF-16 strin
171c0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
171d0 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 28 0a   test_errmsg16(.
171e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
171f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17200 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17210 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17220 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17230 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
17240 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
17250 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
17260 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20  st void *zErr;. 
17270 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
17280 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 30 3b    int bytes = 0;
17290 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
172a0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
172b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
172c0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
172d0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
172e0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
172f0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
17300 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
17310 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17320 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
17330 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
17340 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
17350 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
17360 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
17370 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
17380 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a 20  _errmsg16(db);. 
17390 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
173a0 20 7a 20 3d 20 7a 45 72 72 3b 0a 20 20 20 20 66   z = zErr;.    f
173b0 6f 72 28 62 79 74 65 73 3d 30 3b 20 7a 5b 62 79  or(bytes=0; z[by
173c0 74 65 73 5d 20 7c 7c 20 7a 5b 62 79 74 65 73 2b  tes] || z[bytes+
173d0 31 5d 3b 20 62 79 74 65 73 2b 3d 32 29 7b 7d 0a  1]; bytes+=2){}.
173e0 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
173f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
17400 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
17410 62 6a 28 7a 45 72 72 2c 20 62 79 74 65 73 29 29  bj(zErr, bytes))
17420 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
17430 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
17440 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
17450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
17460 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
17470 65 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  e DB sql bytes ?
17480 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43  tailvar?.**.** C
17490 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
174a0 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
174b0 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
174c0 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
174d0 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
174e0 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
174f0 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
17500 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
17510 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
17520 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
17530 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
17540 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
17550 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
17560 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
17570 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
17580 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
17590 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  pare(.  void * c
175a0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
175b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
175c0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
175d0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
175e0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
175f0 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
17600 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
17610 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20   bytes;.  const 
17620 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  char *zTail = 0;
17630 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
17640 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
17650 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69  ar zBuf[50];.  i
17660 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
17670 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=5 && objc!=4
17680 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
17690 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
176a0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
176b0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
176c0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
176d0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
176e0 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
176f0 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20  ailvar?", 0);.  
17700 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17710 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
17720 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
17730 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
17740 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
17750 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17760 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = Tcl
17770 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
17780 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  2]);.  if( Tcl_G
17790 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
177a0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62  erp, objv[3], &b
177b0 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
177c0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
177d0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
177e0 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65  e(db, zSql, byte
177f0 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e  s, &pStmt, objc>
17800 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29  =5 ? &zTail : 0)
17810 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
17820 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69  ult(interp);.  i
17830 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
17840 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
17850 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
17860 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
17870 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35  zTail && objc>=5
17880 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65   ){.    if( byte
17890 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79  s>=0 ){.      by
178a0 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 7a  tes = bytes - (z
178b0 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20  Tail-zSql);.    
178c0 7d 0a 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e  }.    if( strlen
178d0 28 7a 54 61 69 6c 29 3c 62 79 74 65 73 20 29 7b  (zTail)<bytes ){
178e0 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 73  .      bytes = s
178f0 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a 20 20  trlen(zTail);.  
17900 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53    }.    Tcl_ObjS
17910 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
17920 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e  bjv[4], 0, Tcl_N
17930 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69  ewStringObj(zTai
17940 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20  l, bytes), 0);. 
17950 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
17960 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
17970 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29  sert( pStmt==0 )
17980 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  ;.    sprintf(zB
17990 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
179a0 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
179b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
179c0 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Buf, sqlite3_err
179d0 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
179e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
179f0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  R;.  }..  if( pS
17a00 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
17a10 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
17a20 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
17a30 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
17a40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17a50 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
17a60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
17a70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
17a80 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
17a90 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
17aa0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
17ab0 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
17ac0 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f  ailvar?.**.** Co
17ad0 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74  mpile up to <byt
17ae0 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65  es> bytes of the
17af0 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74   supplied SQL st
17b00 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67  ring <sql> using
17b10 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
17b20 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61  dle <DB>. The pa
17b30 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c  rameter <tailval
17b40 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  > is the name of
17b50 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72   a global.** var
17b60 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65  iable that is se
17b70 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20  t to the unused 
17b80 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e  portion of <sql>
17b90 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20   (if any). A.** 
17ba0 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72  STMT handle is r
17bb0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
17bc0 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70  ic int test_prep
17bd0 61 72 65 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a  are_v2(.  void *
17be0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
17bf0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17c00 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
17c10 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
17c20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
17c30 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
17c40 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
17c50 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73  nt bytes;.  cons
17c60 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20  t char *zTail = 
17c70 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
17c80 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
17c90 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
17ca0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
17cb0 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
17cc0 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
17cd0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17ce0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
17cf0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
17d00 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
17d10 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
17d20 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
17d30 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20  tailvar", 0);.  
17d40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17d50 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
17d60 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
17d70 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
17d80 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
17d90 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17da0 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = Tcl
17db0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
17dc0 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  2]);.  if( Tcl_G
17dd0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
17de0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62  erp, objv[3], &b
17df0 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
17e00 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
17e10 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
17e20 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62  e_v2(db, zSql, b
17e30 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62  ytes, &pStmt, ob
17e40 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a  jc>=5 ? &zTail :
17e50 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63   0);.  assert(rc
17e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
17e70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f  Stmt==0);.  Tcl_
17e80 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
17e90 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rp);.  if( sqlit
17ea0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
17eb0 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
17ec0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17ed0 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26 26  ;.  if( zTail &&
17ee0 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20   objc>=5 ){.    
17ef0 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a  if( bytes>=0 ){.
17f00 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79        bytes = by
17f10 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53 71  tes - (zTail-zSq
17f20 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  l);.    }.    Tc
17f30 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
17f40 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c  erp, objv[4], 0,
17f50 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
17f60 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c  j(zTail, bytes),
17f70 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
17f80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17f90 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d      assert( pStm
17fa0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69  t==0 );.    spri
17fb0 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20  ntf(zBuf, "(%d) 
17fc0 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f  ", rc);.    Tcl_
17fd0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
17fe0 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74  erp, zBuf, sqlit
17ff0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
18000 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
18010 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
18020 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
18030 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
18040 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
18050 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
18060 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
18070 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
18080 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
18090 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
180a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
180b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
180c0 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
180d0 61 72 65 5f 74 6b 74 33 31 33 34 20 44 42 0a 2a  are_tkt3134 DB.*
180e0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
180f0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
18100 6e 74 20 66 6f 72 20 61 20 7a 65 72 6f 2d 62 79  nt for a zero-by
18110 74 65 20 73 74 72 69 6e 67 20 61 73 20 61 20 74  te string as a t
18120 65 73 74 0a 2a 2a 20 66 6f 72 20 74 69 63 6b 65  est.** for ticke
18130 74 20 23 33 31 33 34 2e 20 20 54 68 65 20 73 74  t #3134.  The st
18140 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 70  ring should be p
18150 72 65 63 65 65 64 65 64 20 62 79 20 61 20 7a 65  receeded by a ze
18160 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  ro byte..*/.stat
18170 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70  ic int test_prep
18180 61 72 65 5f 74 6b 74 33 31 33 34 28 0a 20 20 76  are_tkt3134(.  v
18190 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
181a0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
181b0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
181c0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
181d0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
181e0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
181f0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
18200 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c 30 30 30  r zSql[] = "\000
18210 53 45 4c 45 43 54 20 31 22 3b 0a 20 20 73 71 6c  SELECT 1";.  sql
18220 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
18230 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
18240 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  f[50];.  int rc;
18250 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
18260 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
18270 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18280 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
18290 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
182a0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
182b0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
182c0 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69  DB sql bytes tai
182d0 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72  lvar", 0);.    r
182e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
182f0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
18300 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
18310 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18320 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
18330 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18340 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
18350 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 26  prepare_v2(db, &
18360 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20 26 70 53 74  zSql[1], 0, &pSt
18370 6d 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  mt, 0);.  assert
18380 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc==SQLITE_OK |
18390 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69  | pStmt==0);.  i
183a0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
183b0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
183c0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
183d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
183e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
183f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
18400 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70 72  mt==0 );.    spr
18410 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29  intf(zBuf, "(%d)
18420 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c   ", rc);.    Tcl
18430 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18440 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69  terp, zBuf, sqli
18450 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
18460 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
18470 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
18480 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
18490 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
184a0 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
184b0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
184c0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
184d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c  L_ERROR;.    Tcl
184e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
184f0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
18500 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
18510 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18520 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
18530 70 61 72 65 31 36 20 44 42 20 73 71 6c 20 62 79  pare16 DB sql by
18540 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a  tes tailvar.**.*
18550 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
18560 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
18570 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
18580 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
18590 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
185a0 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
185b0 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
185c0 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
185d0 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
185e0 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
185f0 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
18600 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
18610 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
18620 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
18630 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
18640 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
18650 70 72 65 70 61 72 65 31 36 28 0a 20 20 76 6f 69  prepare16(.  voi
18660 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
18670 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18680 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18690 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
186a0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
186b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
186c0 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
186d0 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   *db;.  const vo
186e0 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73  id *zSql;.  cons
186f0 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20  t void *zTail = 
18700 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54  0;.  Tcl_Obj *pT
18710 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
18720 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
18730 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
18740 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a  50]; .  int rc;.
18750 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20    int bytes;    
18760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18770 68 65 20 69 6e 74 65 67 65 72 20 73 70 65 63 69  he integer speci
18780 66 69 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f  fied as arg 3 */
18790 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20  .  int objlen;  
187a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
187b0 54 68 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c  The byte-array l
187c0 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a  ength of arg 2 *
187d0 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  /..  if( objc!=5
187e0 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
187f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
18800 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
18810 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
18820 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
18830 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
18840 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73  objv[0]), " DB s
18850 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61  ql bytes ?tailva
18860 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  r?", 0);.    ret
18870 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18880 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
18890 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
188a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
188b0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
188c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
188d0 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42   zSql = Tcl_GetB
188e0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
188f0 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e  objv[2], &objlen
18900 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
18910 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
18920 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74  p, objv[3], &byt
18930 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
18940 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
18950 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
18960 36 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65  6(db, zSql, byte
18970 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e  s, &pStmt, objc>
18980 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29  =5 ? &zTail : 0)
18990 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
189a0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
189b0 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
189c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
189d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
189e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
189f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63  .  }..  if( objc
18a00 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  >=5 ){.    if( z
18a10 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62  Tail ){.      ob
18a20 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20  jlen = objlen - 
18a30 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38  ((u8 *)zTail-(u8
18a40 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65   *)zSql);.    }e
18a50 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65  lse{.      objle
18a60 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  n = 0;.    }.   
18a70 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77   pTail = Tcl_New
18a80 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38  ByteArrayObj((u8
18a90 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e   *)zTail, objlen
18aa0 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  );.    Tcl_IncrR
18ab0 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a  efCount(pTail);.
18ac0 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
18ad0 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  r2(interp, objv[
18ae0 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29  4], 0, pTail, 0)
18af0 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
18b00 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20  fCount(pTail);. 
18b10 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
18b20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
18b30 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
18b40 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
18b50 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
18b60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18b70 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
18b80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
18b90 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  f, 0);.#endif /*
18ba0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
18bb0 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
18bc0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
18bd0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
18be0 72 65 70 61 72 65 31 36 5f 76 32 20 44 42 20 73  repare16_v2 DB s
18bf0 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61  ql bytes ?tailva
18c00 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  r?.**.** Compile
18c10 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62   up to <bytes> b
18c20 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70  ytes of the supp
18c30 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20  lied SQL string 
18c40 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64  <sql> using.** d
18c50 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
18c60 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74  DB>. The paramet
18c70 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20  er <tailval> is 
18c80 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c  the name of a gl
18c90 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  obal.** variable
18ca0 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20   that is set to 
18cb0 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69  the unused porti
18cc0 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20  on of <sql> (if 
18cd0 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20  any). A.** STMT 
18ce0 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e  handle is return
18cf0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
18d00 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36  t test_prepare16
18d10 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  _v2(.  void * cl
18d20 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
18d30 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
18d40 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
18d50 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
18d60 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
18d70 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
18d80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18d90 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53    const void *zS
18da0 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ql;.  const void
18db0 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54   *zTail = 0;.  T
18dc0 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20  cl_Obj *pTail = 
18dd0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
18de0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
18df0 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a  char zBuf[50]; .
18e00 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
18e10 62 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20  bytes;          
18e20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
18e30 65 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61  eger specified a
18e40 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74  s arg 3 */.  int
18e50 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20   objlen;        
18e60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79         /* The by
18e70 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20  te-array length 
18e80 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69  of arg 2 */..  i
18e90 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
18ea0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
18eb0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18ec0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
18ed0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
18ee0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
18ef0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
18f00 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
18f10 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30  es ?tailvar?", 0
18f20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
18f30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
18f40 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
18f50 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
18f60 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
18f70 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
18f80 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20  L_ERROR;.  zSql 
18f90 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
18fa0 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
18fb0 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69  ], &objlen);.  i
18fc0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
18fd0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
18fe0 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
18ff0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19000 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
19010 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 64  3_prepare16_v2(d
19020 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
19030 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20  &pStmt, objc>=5 
19040 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20  ? &zTail : 0);. 
19050 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
19060 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
19070 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
19080 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
19090 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
190a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
190b0 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35  }..  if( objc>=5
190c0 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69   ){.    if( zTai
190d0 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65  l ){.      objle
190e0 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 28 75  n = objlen - ((u
190f0 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29  8 *)zTail-(u8 *)
19100 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zSql);.    }else
19110 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  {.      objlen =
19120 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54   0;.    }.    pT
19130 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  ail = Tcl_NewByt
19140 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29  eArrayObj((u8 *)
19150 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a  zTail, objlen);.
19160 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
19170 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20  ount(pTail);.   
19180 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
19190 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
191a0 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20   0, pTail, 0);. 
191b0 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
191c0 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a  unt(pTail);.  }.
191d0 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
191e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
191f0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
19200 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
19210 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
19220 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
19230 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19240 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
19250 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  0);.#endif /* SQ
19260 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
19270 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
19280 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
19290 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ge: sqlite3_open
192a0 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f   filename ?optio
192b0 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74  ns-list?.*/.stat
192c0 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e  ic int test_open
192d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
192e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
192f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
19300 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
19310 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
19320 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
19330 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73   *zFilename;.  s
19340 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
19350 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75  t rc;.  char zBu
19360 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  f[100];..  if( o
19370 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
19380 32 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a  2 && objc!=1 ){.
19390 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
193a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
193b0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
193c0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
193d0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
193e0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c  (objv[0]), " fil
193f0 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69  ename options-li
19400 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  st", 0);.    ret
19410 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19420 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20   }..  zFilename 
19430 3d 20 6f 62 6a 63 3e 31 20 3f 20 54 63 6c 5f 47  = objc>1 ? Tcl_G
19440 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
19450 29 20 3a 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  ) : 0;.  rc = sq
19460 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65  lite3_open(zFile
19470 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20  name, &db);.  . 
19480 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
19490 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
194a0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29  nterp, zBuf, db)
194b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
194c0 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  ROR;.  Tcl_Appen
194d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
194e0 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
194f0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
19500 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
19510 65 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61  e3_open16 filena
19520 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74  me options.*/.st
19530 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70  atic int test_op
19540 65 6e 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  en16(.  void * c
19550 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
19560 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
19570 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
19580 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
19590 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
195a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
195b0 36 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  6.  const void *
195c0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c  zFilename;.  sql
195d0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
195e0 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  rc;.  char zBuf[
195f0 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  100];..  if( obj
19600 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
19610 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
19620 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
19630 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
19640 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
19650 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
19660 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70  ), " filename op
19670 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b  tions-list", 0);
19680 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19690 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46  ERROR;.  }..  zF
196a0 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  ilename = Tcl_Ge
196b0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
196c0 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
196d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
196e0 65 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  en16(zFilename, 
196f0 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73  &db);.  .  if( s
19700 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
19710 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
19720 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74   zBuf, db) ) ret
19730 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19740 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19750 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
19760 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  0);.#endif /* SQ
19770 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
19780 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
19790 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
197a0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70  ge: sqlite3_comp
197b0 6c 65 74 65 31 36 20 3c 55 54 46 2d 31 36 20 73  lete16 <UTF-16 s
197c0 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74  tring>.**.** Ret
197d0 75 72 6e 20 31 20 69 66 20 74 68 65 20 73 75 70  urn 1 if the sup
197e0 70 6c 69 65 64 20 61 72 67 75 6d 65 6e 74 20 69  plied argument i
197f0 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c  s a complete SQL
19800 20 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a   statement, or z
19810 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
19820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19830 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 28  test_complete16(
19840 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
19850 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
19860 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
19870 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
19880 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
19890 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ){.#if !defined(
198a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
198b0 4c 45 54 45 29 20 26 26 20 21 64 65 66 69 6e 65  LETE) && !define
198c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  d(SQLITE_OMIT_UT
198d0 46 31 36 29 0a 20 20 63 68 61 72 20 2a 7a 42 75  F16).  char *zBu
198e0 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  f;..  if( objc!=
198f0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
19900 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
19910 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66  , 1, objv, "<utf
19920 2d 31 36 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20  -16 sql>");.    
19930 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19940 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20  ;.  }..  zBuf = 
19950 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79  (char*)Tcl_GetBy
19960 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
19970 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63  bjv[1], 0);.  Tc
19980 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
19990 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
199a0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6d  tObj(sqlite3_com
199b0 70 6c 65 74 65 31 36 28 7a 42 75 66 29 29 29 3b  plete16(zBuf)));
199c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
199d0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20  E_OMIT_COMPLETE 
199e0 26 26 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  && SQLITE_OMIT_U
199f0 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
19a00 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
19a10 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
19a20 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  _step STMT.**.**
19a30 20 41 64 76 61 6e 63 65 20 74 68 65 20 73 74 61   Advance the sta
19a40 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65  tement to the ne
19a50 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  xt row..*/.stati
19a60 63 20 69 6e 74 20 74 65 73 74 5f 73 74 65 70 28  c int test_step(
19a70 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
19a80 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
19a90 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
19aa0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
19ab0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
19ac0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
19ad0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
19ae0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
19af0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
19b00 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19b10 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
19b20 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
19b30 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
19b40 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
19b50 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20   " STMT", 0);.  
19b60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19b70 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
19b80 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
19b90 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
19ba0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
19bb0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
19bc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
19bd0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
19be0 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20  tmt);..  /* if( 
19bf0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
19c00 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  && rc!=SQLITE_RO
19c10 57 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  W ) return TCL_E
19c20 52 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53  RROR; */.  Tcl_S
19c30 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
19c40 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
19c50 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
19c60 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
19c70 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ..static int tes
19c80 74 5f 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20  t_sql(.  void * 
19c90 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
19ca0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19cb0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
19cc0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
19cd0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
19ce0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
19cf0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
19d00 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
19d10 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
19d20 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
19d30 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19d40 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
19d50 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
19d60 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
19d70 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
19d80 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
19d90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
19da0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
19db0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
19dc0 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 2c  ite3_sql(pStmt),
19dd0 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
19de0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
19df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
19e00 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
19e10 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a  count STMT .**.*
19e20 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
19e30 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72  ber of columns r
19e40 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73  eturned by the s
19e50 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d  ql statement STM
19e60 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
19e70 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75   test_column_cou
19e80 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
19e90 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
19ea0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
19eb0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
19ec0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
19ed0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
19ee0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
19ef0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
19f00 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
19f10 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
19f20 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
19f30 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
19f40 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
19f50 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
19f60 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
19f70 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19f80 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
19f90 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
19fa0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
19fb0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
19fc0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
19fd0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c  CL_ERROR;..  Tcl
19fe0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
19ff0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1a000 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  Obj(sqlite3_colu
1a010 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29  mn_count(pStmt))
1a020 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1a030 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1a040 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1a050 6d 6e 5f 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  mn_type STMT col
1a060 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  umn.**.** Return
1a070 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
1a080 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20   data in column 
1a090 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20  'column' of the 
1a0a0 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a  current row..*/.
1a0b0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1a0c0 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76  column_type(.  v
1a0d0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1a0e0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1a0f0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1a100 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1a110 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1a120 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1a130 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1a140 0a 20 20 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66  .  int tp;..  if
1a150 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1a160 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a170 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1a180 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1a190 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1a1a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1a1b0 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1a1c0 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1a1d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a1e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1a1f0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1a200 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1a210 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1a220 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1a230 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1a240 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1a250 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1a260 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1a270 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70  TCL_ERROR;..  tp
1a280 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1a290 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 63 6f  n_type(pStmt, co
1a2a0 6c 29 3b 0a 20 20 73 77 69 74 63 68 28 20 74 70  l);.  switch( tp
1a2b0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
1a2c0 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20  ITE_INTEGER: .  
1a2d0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1a2e0 74 28 69 6e 74 65 72 70 2c 20 22 49 4e 54 45 47  t(interp, "INTEG
1a2f0 45 52 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ER", TCL_STATIC)
1a300 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
1a310 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a320 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f  NULL:.      Tcl_
1a330 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1a340 2c 20 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54  , "NULL", TCL_ST
1a350 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
1a360 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
1a370 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  LITE_FLOAT:.    
1a380 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1a390 69 6e 74 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c  interp, "FLOAT",
1a3a0 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20   TCL_STATIC); . 
1a3b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a3c0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
1a3d0 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  :.      Tcl_SetR
1a3e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
1a3f0 45 58 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  EXT", TCL_STATIC
1a400 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
1a410 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1a420 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c  _BLOB:.      Tcl
1a430 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1a440 70 2c 20 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53  p, "BLOB", TCL_S
1a450 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
1a460 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
1a470 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
1a480 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0);.  }..  retur
1a490 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1a4a0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1a4b0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53  3_column_int64 S
1a4c0 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1a4d0 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
1a4e0 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75   in column 'colu
1a4f0 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65  mn' of the curre
1a500 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73 20 61  nt row cast as a
1a510 6e 0a 2a 2a 20 77 69 64 65 20 28 36 34 2d 62 69  n.** wide (64-bi
1a520 74 29 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73  t) integer..*/.s
1a530 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1a540 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76  olumn_int64(.  v
1a550 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1a560 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1a570 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1a580 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1a590 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1a5a0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1a5b0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1a5c0 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20  .  i64 iVal;..  
1a5d0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1a5e0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a5f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1a600 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1a610 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1a620 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1a630 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1a640 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1a650 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a660 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1a670 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1a680 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1a690 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1a6a0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1a6b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1a6c0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1a6d0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1a6e0 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
1a6f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1a700 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  iVal = sqlite3_c
1a710 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
1a720 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
1a730 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1a740 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
1a750 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20  ntObj(iVal));.  
1a760 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1a770 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1a780 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
1a790 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  ob STMT column.*
1a7a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1a7b0 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20  t_column_blob(. 
1a7c0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1a7d0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1a7e0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1a7f0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1a800 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1a810 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1a820 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
1a830 6c 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  l;..  int len;. 
1a840 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c   const void *pBl
1a850 6f 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ob;..  if( objc!
1a860 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1a870 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1a880 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1a890 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1a8a0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1a8b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1a8c0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1a8d0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a8e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1a8f0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1a900 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1a910 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1a920 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1a930 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a940 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1a950 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1a960 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1a970 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a980 4f 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c  OR;..  len = sql
1a990 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
1a9a0 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  s(pStmt, col);. 
1a9b0 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   pBlob = sqlite3
1a9c0 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
1a9d0 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f  mt, col);.  Tcl_
1a9e0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1a9f0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  erp, Tcl_NewByte
1aa00 41 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20  ArrayObj(pBlob, 
1aa10 6c 65 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  len));.  return 
1aa20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1aa30 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1aa40 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54  column_double ST
1aa50 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1aa60 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20  Return the data 
1aa70 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
1aa80 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
1aa90 74 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 20  t row cast as a 
1aaa0 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  double..*/.stati
1aab0 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d  c int test_colum
1aac0 6e 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64  n_double(.  void
1aad0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1aae0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1aaf0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1ab00 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1ab10 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1ab20 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1ab30 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
1ab40 64 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20  double rVal;..  
1ab50 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1ab60 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1ab70 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1ab80 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1ab90 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1aba0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1abb0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1abc0 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1abd0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1abe0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1abf0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1ac00 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1ac10 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1ac20 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1ac30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1ac40 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1ac50 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1ac60 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
1ac70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1ac80 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  rVal = sqlite3_c
1ac90 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74  olumn_double(pSt
1aca0 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f  mt, col);.  Tcl_
1acb0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1acc0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62  erp, Tcl_NewDoub
1acd0 6c 65 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20  leObj(rVal));.  
1ace0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1acf0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1ad00 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e  qlite3_data_coun
1ad10 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65  t STMT .**.** Re
1ad20 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1ad30 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  of columns retur
1ad40 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 20 73  ned by the sql s
1ad50 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a  tatement STMT..*
1ad60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1ad70 74 5f 64 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20  t_data_count(.  
1ad80 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1ad90 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1ada0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1adb0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1adc0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1add0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1ade0 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
1adf0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1ae00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1ae10 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1ae20 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1ae30 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1ae40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1ae50 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1ae60 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1ae70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ae80 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1ae90 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1aea0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1aeb0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1aec0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1aed0 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  OR;..  Tcl_SetOb
1aee0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1aef0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
1af00 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74  lite3_data_count
1af10 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74  (pStmt)));.  ret
1af20 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1af30 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1af40 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20  te3_column_text 
1af50 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1af60 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1af70 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
1af80 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1af90 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1afa0 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54  3_column_name ST
1afb0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61  MT column.*/.sta
1afc0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
1afd0 74 5f 75 74 66 38 28 0a 20 20 76 6f 69 64 20 2a  t_utf8(.  void *
1afe0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20   clientData,    
1aff0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1b000 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e  o SQLite API fun
1b010 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
1b020 6b 65 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ke */.  Tcl_Inte
1b030 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b040 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1b050 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1b060 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1b070 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1b080 63 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  col;.  const cha
1b090 72 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  r *(*xFunc)(sqli
1b0a0 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b  te3_stmt*, int);
1b0b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b0c0 52 65 74 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20  Ret;..  xFunc = 
1b0d0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 29  (const char *(*)
1b0e0 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
1b0f0 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b  int))clientData;
1b100 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1b110 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1b120 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1b130 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1b140 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1b150 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1b160 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1b170 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1b180 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b190 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1b1a0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1b1b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1b1c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1b1d0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1b1e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1b1f0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1b200 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1b210 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
1b220 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b230 20 20 7a 52 65 74 20 3d 20 78 46 75 6e 63 28 70    zRet = xFunc(p
1b240 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66  Stmt, col);.  if
1b250 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 54 63  ( zRet ){.    Tc
1b260 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1b270 72 70 2c 20 28 63 68 61 72 20 2a 29 7a 52 65 74  rp, (char *)zRet
1b280 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1b290 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74  rn TCL_OK;.}..st
1b2a0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67 6c  atic int test_gl
1b2b0 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 0a 20 20  obal_recover(.  
1b2c0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1b2d0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1b2e0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1b2f0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1b300 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1b310 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b320 4d 49 54 5f 47 4c 4f 42 41 4c 52 45 43 4f 56 45  MIT_GLOBALRECOVE
1b330 52 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  R.#ifndef SQLITE
1b340 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
1b350 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
1b360 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
1b370 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1b380 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1b390 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72  , "");.    retur
1b3a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b3b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1b3c0 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 29  global_recover()
1b3d0 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
1b3e0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1b3f0 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
1b400 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
1b410 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20 20  #endif.#endif.  
1b420 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1b430 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1b440 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1b450 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  xt STMT column.*
1b460 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1b470 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
1b480 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ype STMT column.
1b490 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
1b4a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
1b4b0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a   STMT column.*/.
1b4c0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1b4d0 73 74 6d 74 5f 75 74 66 31 36 28 0a 20 20 76 6f  stmt_utf16(.  vo
1b4e0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1b4f0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1b500 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75  to SQLite API fu
1b510 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
1b520 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  oked */.  Tcl_In
1b530 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1b540 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1b550 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1b560 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1b570 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1b580 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1b590 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1b5a0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
1b5b0 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1b5c0 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74  zName16;.  const
1b5d0 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28   void *(*xFunc)(
1b5e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1b5f0 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20  nt);..  xFunc = 
1b600 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29  (const void *(*)
1b610 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
1b620 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b  int))clientData;
1b630 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1b640 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1b650 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1b660 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1b670 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1b680 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1b690 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1b6a0 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1b6b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b6c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1b6d0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1b6e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1b6f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1b700 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1b710 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1b720 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1b730 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1b740 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
1b750 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b760 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75  .  zName16 = xFu
1b770 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  nc(pStmt, col);.
1b780 20 20 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b    if( zName16 ){
1b790 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
1b7a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1b7b0 7a 4e 61 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72  zName16;.    for
1b7c0 28 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b  (n=0; z[n] || z[
1b7d0 6e 2b 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20  n+1]; n+=2){}.  
1b7e0 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
1b7f0 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61  ByteArrayObj(zNa
1b800 6d 65 31 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20  me16, n+2);.    
1b810 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1b820 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
1b830 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1b840 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1b850 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  */..  return TCL
1b860 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1b870 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1b880 75 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c  umn_int STMT col
1b890 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1b8a0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1b8b0 62 79 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d  bytes STMT colum
1b8c0 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
1b8d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1b8e0 74 65 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d  tes16 STMT colum
1b8f0 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n.**.*/.static i
1b900 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74  nt test_stmt_int
1b910 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1b920 74 44 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69  tData,    /* Poi
1b930 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41  nter to SQLite A
1b940 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  PI function to b
1b950 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54  e invoked */.  T
1b960 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1b970 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1b980 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1b990 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1b9a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1b9b0 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e  .  int col;.  in
1b9c0 74 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  t (*xFunc)(sqlit
1b9d0 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a  e3_stmt*, int);.
1b9e0 0a 20 20 78 46 75 6e 63 20 3d 20 28 69 6e 74 20  .  xFunc = (int 
1b9f0 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  (*)(sqlite3_stmt
1ba00 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61  *, int))clientDa
1ba10 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ta;.  if( objc!=
1ba20 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1ba30 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1ba40 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1ba50 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1ba60 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1ba70 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1ba80 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1ba90 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1baa0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1bab0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1bac0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1bad0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1bae0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1baf0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1bb00 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1bb10 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1bb20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1bb30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1bb40 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  R;..  Tcl_SetObj
1bb50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1bb60 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75  cl_NewIntObj(xFu
1bb70 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29  nc(pStmt, col)))
1bb80 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1bb90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1bba0 65 3a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d  e:  sqlite_set_m
1bbb0 61 67 69 63 20 20 44 42 20 20 4d 41 47 49 43 2d  agic  DB  MAGIC-
1bbc0 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74  NUMBER.**.** Set
1bbd0 20 74 68 65 20 64 62 2d 3e 6d 61 67 69 63 20 76   the db->magic v
1bbe0 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 75  alue.  This is u
1bbf0 73 65 64 20 74 6f 20 74 65 73 74 20 65 72 72 6f  sed to test erro
1bc00 72 20 72 65 63 6f 76 65 72 79 20 6c 6f 67 69 63  r recovery logic
1bc10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bc20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
1bc30 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1bc40 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1bc50 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1bc60 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1bc70 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
1bc80 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1bc90 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1bca0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1bcb0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1bcc0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1bcd0 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
1bce0 20 20 20 20 20 20 20 22 20 44 42 20 4d 41 47 49         " DB MAGI
1bcf0 43 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  C", 0);.    retu
1bd00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1bd10 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1bd20 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1bd30 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1bd40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1bd50 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
1bd60 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
1bd70 49 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a  IC_OPEN")==0 ){.
1bd80 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
1bd90 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
1bda0 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  N;.  }else if( s
1bdb0 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
1bdc0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
1bdd0 53 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  SED")==0 ){.    
1bde0 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
1bdf0 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
1be00 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
1be10 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
1be20 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 22  LITE_MAGIC_BUSY"
1be30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
1be40 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1be50 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  AGIC_BUSY;.  }el
1be60 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
1be70 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
1be80 41 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20  AGIC_ERROR")==0 
1be90 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
1bea0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
1beb0 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69  ERROR;.  }else i
1bec0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
1bed0 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 28  terp, argv[2], (
1bee0 69 6e 74 2a 29 26 64 62 2d 3e 6d 61 67 69 63 29  int*)&db->magic)
1bef0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1bf00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1bf10 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1bf20 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1bf30 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
1bf40 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69  t  DB .**.** Tri
1bf50 67 67 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70  gger an interrup
1bf60 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69  t on DB.*/.stati
1bf70 63 20 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72  c int test_inter
1bf80 72 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  rupt(.  void * c
1bf90 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1bfa0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1bfb0 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1bfc0 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1bfd0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1bfe0 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
1bff0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1c000 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1c010 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1c020 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1c030 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
1c040 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c050 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1c060 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1c070 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1c080 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c090 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  OR;.  sqlite3_in
1c0a0 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72  terrupt(db);.  r
1c0b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1c0c0 0a 73 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69  .static u8 *sqli
1c0d0 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69  te3_stack_baseli
1c0e0 6e 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46  ne = 0;../*.** F
1c0f0 69 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69  ill the stack wi
1c100 74 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61  th a known bitpa
1c110 74 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ttern..*/.static
1c120 20 76 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28   void prepStack(
1c130 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  void){.  int i;.
1c140 20 20 75 33 32 20 62 69 67 42 75 66 5b 36 35 35    u32 bigBuf[655
1c150 33 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  36];.  for(i=0; 
1c160 69 3c 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29  i<sizeof(bigBuf)
1c170 3b 20 69 2b 2b 29 20 62 69 67 42 75 66 5b 69 5d  ; i++) bigBuf[i]
1c180 20 3d 20 30 78 64 65 61 64 62 65 65 66 3b 0a 20   = 0xdeadbeef;. 
1c190 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62   sqlite3_stack_b
1c1a0 61 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a 29 26  aseline = (u8*)&
1c1b0 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 7d  bigBuf[65536];.}
1c1c0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20  ../*.** Get the 
1c1d0 63 75 72 72 65 6e 74 20 73 74 61 63 6b 20 64 65  current stack de
1c1e0 70 74 68 2e 20 20 55 73 65 64 20 66 6f 72 20 64  pth.  Used for d
1c1f0 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
1c200 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 53 74 61  /.u64 sqlite3Sta
1c210 63 6b 44 65 70 74 68 28 76 6f 69 64 29 7b 0a 20  ckDepth(void){. 
1c220 20 75 38 20 78 3b 0a 20 20 72 65 74 75 72 6e 20   u8 x;.  return 
1c230 28 75 36 34 29 28 73 71 6c 69 74 65 33 5f 73 74  (u64)(sqlite3_st
1c240 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d 20 26  ack_baseline - &
1c250 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  x);.}../*.** Usa
1c260 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 61  ge:  sqlite3_sta
1c270 63 6b 5f 75 73 65 64 20 44 42 20 53 51 4c 0a 2a  ck_used DB SQL.*
1c280 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65 61 73  *.** Try to meas
1c290 75 72 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ure the amount o
1c2a0 66 20 73 74 61 63 6b 20 73 70 61 63 65 20 75 73  f stack space us
1c2b0 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
1c2c0 73 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a 2f 0a  sqlite3_exec.*/.
1c2d0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1c2e0 73 74 61 63 6b 5f 75 73 65 64 28 0a 20 20 76 6f  stack_used(.  vo
1c2f0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1c300 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1c310 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
1c320 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
1c330 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1c340 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  b;.  int i;.  if
1c350 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
1c360 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1c370 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1c380 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1c390 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1c3a0 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 53   .        " DB S
1c3b0 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  QL", 0);.    ret
1c3c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c3d0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1c3e0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1c3f0 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1c400 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1c410 20 20 70 72 65 70 53 74 61 63 6b 28 29 3b 0a 20    prepStack();. 
1c420 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
1c430 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  xec(db, argv[2],
1c440 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72   0, 0, 0);.  for
1c450 28 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30 20 26  (i=65535; i>=0 &
1c460 26 20 28 28 75 33 32 2a 29 73 71 6c 69 74 65 33  & ((u32*)sqlite3
1c470 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 29  _stack_baseline)
1c480 5b 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65 65 66  [-i]==0xdeadbeef
1c490 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53  ; i--){}.  Tcl_S
1c4a0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1c4b0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1c4c0 6a 28 69 2a 34 29 29 3b 0a 20 20 72 65 74 75 72  j(i*4));.  retur
1c4d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1c4e0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1c4f0 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e  _delete_function
1c500 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d   DB function-nam
1c510 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  e.**.** Delete t
1c520 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
1c530 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27   'function-name'
1c540 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68   from database h
1c550 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20  andle DB. It.** 
1c560 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1c570 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  the user functio
1c580 6e 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73  n was created as
1c590 20 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65   UTF8, any numbe
1c5a0 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  r of.** argument
1c5b0 73 20 28 74 68 65 20 77 61 79 20 74 68 65 20 54  s (the way the T
1c5c0 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65  CL interface doe
1c5d0 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  s it)..*/.static
1c5e0 20 69 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e 63   int delete_func
1c5f0 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
1c600 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1c610 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c620 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1c630 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1c640 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1c650 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1c660 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1c670 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c680 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1c690 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1c6a0 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1c6b0 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69       " DB functi
1c6c0 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20  on-name", 0);.  
1c6d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1c6e0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1c6f0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1c700 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
1c710 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c720 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
1c730 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1c740 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
1c750 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
1c760 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
1c770 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1c780 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
1c790 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
1c7a0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
1c7b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1c7c0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1c7d0 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c  lite_delete_coll
1c7e0 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69  ation DB collati
1c7f0 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65  on-name.**.** De
1c800 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  lete the collati
1c810 6f 6e 20 73 65 71 75 65 6e 63 65 20 27 63 6f 6c  on sequence 'col
1c820 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f  lation-name' fro
1c830 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  m database handl
1c840 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73 20  e .** DB. It is 
1c850 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1c860 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1c870 6e 63 65 20 77 61 73 20 63 72 65 61 74 65 64 20  nce was created 
1c880 61 73 20 55 54 46 38 20 28 74 68 65 20 0a 2a 2a  as UTF8 (the .**
1c890 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74   way the TCL int
1c8a0 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e  erface does it).
1c8b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
1c8c0 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  elete_collation(
1c8d0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c8e0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1c8f0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1c900 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1c910 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
1c920 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
1c930 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
1c940 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1c950 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1c960 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1c970 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1c980 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
1c990 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61  " DB function-na
1c9a0 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  me", 0);.    ret
1c9b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c9c0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1c9d0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1c9e0 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1c9f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ca00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
1ca10 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
1ca20 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c  db, argv[2], SQL
1ca30 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b  ITE_UTF8, 0, 0);
1ca40 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1ca50 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1ca60 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1ca70 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
1ca80 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1ca90 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1caa0 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
1cab0 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20  commit DB.**.** 
1cac0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1cad0 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20 69  he database DB i
1cae0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61  s currently in a
1caf0 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e  uto-commit mode.
1cb00 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65  .** Return false
1cb10 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
1cb20 69 63 20 69 6e 74 20 67 65 74 5f 61 75 74 6f 63  ic int get_autoc
1cb30 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20  ommit(.  void * 
1cb40 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1cb50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1cb60 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1cb70 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1cb80 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
1cb90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1cba0 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
1cbb0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1cbc0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1cbd0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1cbe0 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1cbf0 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
1cc00 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
1cc10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1cc20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1cc30 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1cc40 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1cc50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1cc60 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
1cc70 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74  %d", sqlite3_get
1cc80 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29  _autocommit(db))
1cc90 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1cca0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1ccb0 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
1ccc0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1ccd0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1cce0 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20  busy_timeout DB 
1ccf0 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65  MS.**.** Set the
1cd00 20 62 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20   busy timeout.  
1cd10 54 68 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73  This is more eas
1cd20 69 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74  ily done using t
1cd30 68 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65  he timeout.** me
1cd40 74 68 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20  thod of the TCL 
1cd50 69 6e 74 65 72 66 61 63 65 2e 20 20 42 75 74 20  interface.  But 
1cd60 77 65 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f  we need a way to
1cd70 20 74 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a   test the case.*
1cd80 2a 20 77 68 65 72 65 20 69 74 20 72 65 74 75 72  * where it retur
1cd90 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ns SQLITE_MISUSE
1cda0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cdb0 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75  test_busy_timeou
1cdc0 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
1cdd0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1cde0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1cdf0 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1ce00 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
1ce10 20 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74   rc, ms;.  sqlit
1ce20 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1ce30 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1ce40 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1ce50 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1ce60 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1ce70 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1ce80 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b        " DB", 0);
1ce90 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1cea0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1ceb0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1cec0 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1ced0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1cee0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1cef0 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
1cf00 20 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29   argv[2], &ms) )
1cf10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cf20 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1cf30 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64  3_busy_timeout(d
1cf40 62 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70  b, ms);.  Tcl_Ap
1cf50 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1cf60 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  p, sqlite3TestEr
1cf70 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
1cf80 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1cf90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1cfa0 3a 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f  :  tcl_variable_
1cfb0 74 79 70 65 20 56 41 52 49 41 42 4c 45 4e 41 4d  type VARIABLENAM
1cfc0 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  E.**.** Return t
1cfd0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
1cfe0 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e  nternal represen
1cff0 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a  tation for the.*
1d000 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 67  * value of the g
1d010 69 76 65 6e 20 76 61 72 69 61 62 6c 65 2e 0a 2a  iven variable..*
1d020 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c  /.static int tcl
1d030 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 28 0a  _variable_type(.
1d040 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1d050 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1d060 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1d070 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1d080 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1d090 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61  {.  Tcl_Obj *pVa
1d0a0 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  r;.  if( objc!=2
1d0b0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1d0c0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1d0d0 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49 41   1, objv, "VARIA
1d0e0 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  BLE");.    retur
1d0f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1d100 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  .  pVar = Tcl_Ge
1d110 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20  tVar2Ex(interp, 
1d120 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1d130 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f 4c  jv[1]), 0, TCL_L
1d140 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a 20  EAVE_ERR_MSG);. 
1d150 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29 20 72   if( pVar==0 ) r
1d160 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d170 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74 79 70  .  if( pVar->typ
1d180 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ePtr ){.    Tcl_
1d190 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1d1a0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
1d1b0 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70 65  ngObj(pVar->type
1d1c0 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29 3b  Ptr->name, -1));
1d1d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1d1e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1d1f0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72  sage:  sqlite3_r
1d200 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f 4e  elease_memory ?N
1d210 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ?.**.** Attempt 
1d220 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72  to release memor
1d230 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  y currently held
1d240 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c   but not actuall
1d250 79 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 54  y required..** T
1d260 68 65 20 69 6e 74 65 67 65 72 20 4e 20 69 73 20  he integer N is 
1d270 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1d280 74 65 73 20 77 65 20 61 72 65 20 74 72 79 69 6e  tes we are tryin
1d290 67 20 74 6f 20 72 65 6c 65 61 73 65 2e 20 20 54  g to release.  T
1d2a0 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  he .** return va
1d2b0 6c 75 65 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  lue is the amoun
1d2c0 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74 75  t of memory actu
1d2d0 61 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a  ally released..*
1d2e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1d2f0 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  t_release_memory
1d300 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1d310 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1d320 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1d330 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1d340 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1d350 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .){.#if defined(
1d360 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
1d370 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29  MORY_MANAGEMENT)
1d380 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1d390 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
1d3a0 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20  .  int N;.  int 
1d3b0 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  amt;.  if( objc!
1d3c0 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b  =1 && objc!=2 ){
1d3d0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1d3e0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1d3f0 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20   objv, "?N?");. 
1d400 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d410 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
1d420 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66  bjc==2 ){.    if
1d430 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1d440 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1d450 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72  [1], &N) ) retur
1d460 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1d470 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d 31  else{.    N = -1
1d480 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71  ;.  }.  amt = sq
1d490 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
1d4a0 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f 53  mory(N);.  Tcl_S
1d4b0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1d4c0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1d4d0 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66 0a  j(amt));.#endif.
1d4e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1d4f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1d500 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68    sqlite3_soft_h
1d510 65 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a  eap_limit ?N?.**
1d520 0a 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74  .** Query or set
1d530 20 74 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c   the soft heap l
1d540 69 6d 69 74 20 66 6f 72 20 74 68 65 20 63 75 72  imit for the cur
1d550 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 54 68  rent thread.  Th
1d560 65 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e  e.** limit is on
1d570 6c 79 20 63 68 61 6e 67 65 64 20 69 66 20 74 68  ly changed if th
1d580 65 20 4e 20 69 73 20 70 72 65 73 65 6e 74 2e 20  e N is present. 
1d590 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   The previous li
1d5a0 6d 69 74 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  mit.** is return
1d5b0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1d5c0 74 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70  t test_soft_heap
1d5d0 5f 6c 69 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a  _limit(.  void *
1d5e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1d5f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1d600 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1d610 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1d620 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74  objv[].){.  stat
1d630 69 63 20 69 6e 74 20 73 6f 66 74 48 65 61 70 4c  ic int softHeapL
1d640 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
1d650 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  amt;.  if( objc!
1d660 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b  =1 && objc!=2 ){
1d670 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1d680 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1d690 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20   objv, "?N?");. 
1d6a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d6b0 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d  ROR;.  }.  amt =
1d6c0 20 73 6f 66 74 48 65 61 70 4c 69 6d 69 74 3b 0a   softHeapLimit;.
1d6d0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
1d6e0 0a 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20  .    int N;.    
1d6f0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1d700 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1d710 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74  jv[1], &N) ) ret
1d720 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d730 20 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f     sqlite3_soft_
1d740 68 65 61 70 5f 6c 69 6d 69 74 28 4e 29 3b 0a 20  heap_limit(N);. 
1d750 20 20 20 73 6f 66 74 48 65 61 70 4c 69 6d 69 74     softHeapLimit
1d760 20 3d 20 4e 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f   = N;.  }.  Tcl_
1d770 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1d780 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1d790 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65 74 75  bj(amt));.  retu
1d7a0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1d7b0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
1d7c0 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
1d7d0 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  nup.**.** Call t
1d7e0 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  he sqlite3_threa
1d7f0 64 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a  d_cleanup API..*
1d800 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1d810 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  t_thread_cleanup
1d820 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1d830 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1d840 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1d850 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1d860 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1d870 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1d880 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
1d890 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72  ED.  sqlite3_thr
1d8a0 65 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23  ead_cleanup();.#
1d8b0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
1d8c0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1d8d0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
1d8e0 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
1d8f0 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72    DB.**.** Retur
1d900 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62  n a list of numb
1d910 65 72 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ers which are th
1d920 65 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20  e PagerRefcount 
1d930 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72  for all.** pager
1d940 73 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61  s on each databa
1d950 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
1d960 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1d970 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  t_pager_refcount
1d980 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
1d990 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1d9a0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1d9b0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1d9c0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1d9d0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
1d9e0 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
1d9f0 6e 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f  nt v, *a;.  Tcl_
1da00 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20  Obj *pResult;.. 
1da10 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1da20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1da30 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1da40 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1da50 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
1da60 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1da70 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
1da80 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a   0), " DB", 0);.
1da90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1daa0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1dab0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1dac0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1dad0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1dae0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1daf0 52 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20  RROR;.  pResult 
1db00 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
1db10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
1db20 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1db30 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
1db40 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  Bt==0 ){.      v
1db50 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
1db60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1db70 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1db80 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20  mutex);.      a 
1db90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
1dba0 61 74 73 28 73 71 6c 69 74 65 33 42 74 72 65 65  ats(sqlite3Btree
1dbb0 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d  Pager(db->aDb[i]
1dbc0 2e 70 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20  .pBt));.      v 
1dbd0 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71  = a[0];.      sq
1dbe0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1dbf0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1dc00 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74    }.    Tcl_List
1dc10 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1dc20 28 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c  (0, pResult, Tcl
1dc30 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a  _NewIntObj(v));.
1dc40 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
1dc50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
1dc60 52 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72  Result);.  retur
1dc70 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
1dc80 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f  .** tclcmd:   wo
1dc90 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a  rking_64bit_int.
1dca0 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62  **.** Some TCL b
1dcb0 75 69 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69  uilds (ex: cygwi
1dcc0 6e 29 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  n) do not suppor
1dcd0 74 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  t 64-bit integer
1dce0 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64  s.  This.** lead
1dcf0 73 20 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66  s to a number of
1dd00 20 74 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20   test failures. 
1dd10 20 54 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d   The present com
1dd20 6d 61 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a  mand checks the.
1dd30 2a 2a 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20  ** TCL build to 
1dd40 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
1dd50 6f 74 20 69 74 20 73 75 70 70 6f 72 74 73 20 36  ot it supports 6
1dd60 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20  4-bit integers. 
1dd70 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54   It.** returns T
1dd80 52 55 45 20 69 66 20 69 74 20 64 6f 65 73 20 61  RUE if it does a
1dd90 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e  nd FALSE if not.
1dda0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  .**.** This comm
1ddb0 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 77  and is used to w
1ddc0 61 72 6e 20 75 73 65 72 73 20 74 68 61 74 20 74  arn users that t
1ddd0 68 65 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69  heir TCL build i
1dde0 73 20 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61  s defective.** a
1ddf0 6e 64 20 74 68 61 74 20 74 68 65 20 65 72 72 6f  nd that the erro
1de00 72 73 20 74 68 65 79 20 61 72 65 20 73 65 65 69  rs they are seei
1de10 6e 67 20 69 6e 20 74 68 65 20 74 65 73 74 20 73  ng in the test s
1de20 63 72 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a  cripts might be.
1de30 2a 2a 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  ** a result of t
1de40 68 65 69 72 20 64 65 66 65 63 74 69 76 65 20 54  heir defective T
1de50 43 4c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70  CL rather than p
1de60 72 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74  roblems in SQLit
1de70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1de80 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69   working_64bit_i
1de90 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  nt(.  ClientData
1dea0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
1deb0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
1dec0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
1ded0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
1dee0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1def0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1df00 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1df10 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1df20 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
1df30 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1df40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
1df50 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
1df60 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1df70 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
1df80 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
1df90 54 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62  Tcl_Obj *pTestOb
1dfa0 6a 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67  j;.  int working
1dfb0 20 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62   = 0;..  pTestOb
1dfc0 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  j = Tcl_NewWideI
1dfd0 6e 74 4f 62 6a 28 31 30 30 30 30 30 30 2a 28 69  ntObj(1000000*(i
1dfe0 36 34 29 31 32 33 34 35 36 37 38 39 30 29 3b 0a  64)1234567890);.
1dff0 20 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63    working = strc
1e000 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  mp(Tcl_GetString
1e010 28 70 54 65 73 74 4f 62 6a 29 2c 20 22 31 32 33  (pTestObj), "123
1e020 34 35 36 37 38 39 30 30 30 30 30 30 30 22 29 3d  4567890000000")=
1e030 3d 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  =0;.  Tcl_DecrRe
1e040 66 43 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a 29  fCount(pTestObj)
1e050 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1e060 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1e070 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77  _NewBooleanObj(w
1e080 6f 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74 75  orking));.  retu
1e090 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
1e0a0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76  *.** tclcmd:   v
1e0b0 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a  fs_unlink_test.*
1e0c0 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
1e0d0 6d 6d 61 6e 64 20 75 6e 72 65 67 69 73 74 65 72  mmand unregister
1e0e0 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 56 46  s the primary VF
1e0f0 53 20 61 6e 64 20 74 68 65 6e 20 72 65 67 69 73  S and then regis
1e100 74 65 72 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20  ters.** it back 
1e110 61 67 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20  again.  This is 
1e120 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
1e130 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65 67 69   ability to regi
1e140 73 74 65 72 20 61 0a 2a 2a 20 56 46 53 20 77 68  ster a.** VFS wh
1e150 65 6e 20 6e 6f 6e 65 20 61 72 65 20 70 72 65 76  en none are prev
1e160 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
1e170 64 2c 20 61 6e 64 20 74 68 65 20 61 62 69 6c 69  d, and the abili
1e180 74 79 20 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69  ty to .** unregi
1e190 73 74 65 72 20 74 68 65 20 6f 6e 6c 79 20 61 76  ster the only av
1e1a0 61 69 6c 61 62 6c 65 20 56 46 53 2e 20 20 54 69  ailable VFS.  Ti
1e1b0 63 6b 65 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74  cket #2738.*/.st
1e1c0 61 74 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c  atic int vfs_unl
1e1d0 69 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  ink_test(.  Clie
1e1e0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
1e1f0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
1e200 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
1e210 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
1e220 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1e230 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1e240 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1e250 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1e260 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1e270 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
1e280 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e290 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1e2a0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1e2b0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
1e2c0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
1e2d0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  .){.  int i;.  s
1e2e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4d 61 69  qlite3_vfs *pMai
1e2f0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n;.  sqlite3_vfs
1e300 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73   *apVfs[20];.  s
1e310 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20  qlite3_vfs one, 
1e320 74 77 6f 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  two;..  sqlite3_
1e330 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 30  vfs_unregister(0
1e340 29 3b 20 20 20 2f 2a 20 55 6e 72 65 67 69 73 74  );   /* Unregist
1e350 65 72 20 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61  er of NULL is ha
1e360 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e  rmless */.  one.
1e370 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b  zName = "__one";
1e380 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22  .  two.zName = "
1e390 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61  __two";..  /* Ca
1e3a0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66  lling sqlite3_vf
1e3b0 73 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20  s_register with 
1e3c0 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20  2nd argument of 
1e3d0 30 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  0 does not.  ** 
1e3e0 63 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  change the defau
1e3f0 6c 74 20 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d  lt VFS.  */.  pM
1e400 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  ain = sqlite3_vf
1e410 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c  s_find(0);.  sql
1e420 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1e430 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73  r(&one, 0);.  as
1e440 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c  sert( pMain==0 |
1e450 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33  | pMain==sqlite3
1e460 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
1e470 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
1e480 67 69 73 74 65 72 28 26 74 77 6f 2c 20 30 29 3b  gister(&two, 0);
1e490 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e  .  assert( pMain
1e4a0 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71  ==0 || pMain==sq
1e4b0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1e4c0 29 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61  ) );..  /* We ca
1e4d0 6e 20 66 69 6e 64 20 61 20 56 46 53 20 62 79 20  n find a VFS by 
1e4e0 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73  its name */.  as
1e4f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
1e500 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d  s_find("__one")=
1e510 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72  =&one );.  asser
1e520 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
1e530 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74  ind("__two")==&t
1e540 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c  wo );..  /* Call
1e550 69 6e 67 20 73 71 6c 69 74 65 5f 76 66 73 5f 72  ing sqlite_vfs_r
1e560 65 67 69 73 74 65 72 20 77 69 74 68 20 6e 6f 6e  egister with non
1e570 2d 7a 65 72 6f 20 73 65 63 6f 6e 64 20 70 61 72  -zero second par
1e580 61 6d 65 74 65 72 20 63 68 61 6e 67 65 73 20 74  ameter changes t
1e590 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
1e5a0 56 46 53 2c 20 65 76 65 6e 20 69 66 20 74 68 65  VFS, even if the
1e5b0 20 31 73 74 20 70 61 72 61 6d 65 74 65 72 20 69   1st parameter i
1e5c0 73 20 61 6e 20 65 78 69 73 74 69 67 20 56 46 53  s an existig VFS
1e5d0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 70 72   that is.  ** pr
1e5e0 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
1e5f0 72 65 64 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64  red as the non-d
1e600 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73  efault..  */.  s
1e610 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1e620 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20  ter(&one, 1);.  
1e630 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1e640 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
1e650 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73  )==&one );.  ass
1e660 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
1e670 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
1e680 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  &two );.  assert
1e690 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
1e6a0 6e 64 28 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  nd(0)==&one );. 
1e6b0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
1e6c0 69 73 74 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a  ister(&two, 1);.
1e6d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e6e0 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
1e6f0 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61  e")==&one );.  a
1e700 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
1e710 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
1e720 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65  ==&two );.  asse
1e730 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
1e740 66 69 6e 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b  find(0)==&two );
1e750 0a 20 20 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a  .  if( pMain ){.
1e760 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
1e770 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20  register(pMain, 
1e780 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
1e790 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1e7a0 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20  ("__one")==&one 
1e7b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1e7c0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1e7d0 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29  "__two")==&two )
1e7e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
1e7f0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1e800 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a  )==pMain );.  }.
1e810 20 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74    .  /* Unlink t
1e820 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 20  he default VFS. 
1e830 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
1e840 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
1e850 56 46 53 65 73 0a 20 20 2a 2a 20 72 65 67 69 73  VFSes.  ** regis
1e860 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tered..  */.  fo
1e870 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
1e880 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70  apVfs)/sizeof(ap
1e890 56 66 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Vfs[0]); i++){. 
1e8a0 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71     apVfs[i] = sq
1e8b0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1e8c0 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  );.    if( apVfs
1e8d0 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 61 73 73  [i] ){.      ass
1e8e0 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73  ert( apVfs[i]==s
1e8f0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1e900 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29  apVfs[i]->zName)
1e910 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1e920 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
1e930 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20  (apVfs[i]);.    
1e940 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
1e950 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70  ite3_vfs_find(ap
1e960 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29  Vfs[i]->zName) )
1e970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
1e980 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
1e990 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
1e9a0 20 20 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72    .  /* Register
1e9b0 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 73   the main VFS as
1e9c0 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 28 77 69   non-default (wi
1e9d0 6c 6c 20 62 65 20 6d 61 64 65 20 64 65 66 61 75  ll be made defau
1e9e0 6c 74 2c 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69  lt, since.  ** i
1e9f0 74 27 6c 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79  t'll be the only
1ea00 20 6f 6e 65 20 69 6e 20 65 78 69 73 74 65 6e 63   one in existenc
1ea10 65 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  e)..  */.  sqlit
1ea20 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
1ea30 70 4d 61 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73  pMain, 0);.  ass
1ea40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
1ea50 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20  _find(0)==pMain 
1ea60 29 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65  );.  .  /* Un-re
1ea70 67 69 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20  gister the main 
1ea80 56 46 53 20 61 67 61 69 6e 20 74 6f 20 72 65 73  VFS again to res
1ea90 74 6f 72 65 20 61 6e 20 65 6d 70 74 79 20 56 46  tore an empty VF
1eaa0 53 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69  S list */.  sqli
1eab0 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
1eac0 65 72 28 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73  er(pMain);.  ass
1ead0 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f  ert( 0==sqlite3_
1eae0 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a  vfs_find(0) );..
1eaf0 20 20 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20    /* Relink all 
1eb00 56 46 53 65 73 20 69 6e 20 72 65 76 65 72 73 65  VFSes in reverse
1eb10 20 6f 72 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66   order. */  .  f
1eb20 6f 72 28 69 3d 73 69 7a 65 6f 66 28 61 70 56 66  or(i=sizeof(apVf
1eb30 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b  s)/sizeof(apVfs[
1eb40 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  0])-1; i>=0; i--
1eb50 29 7b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  ){.    if( apVfs
1eb60 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [i] ){.      sql
1eb70 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1eb80 72 28 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a  r(apVfs[i], 1);.
1eb90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70        assert( ap
1eba0 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f  Vfs[i]==sqlite3_
1ebb0 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20  vfs_find(0) );. 
1ebc0 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56       assert( apV
1ebd0 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76  fs[i]==sqlite3_v
1ebe0 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d  fs_find(apVfs[i]
1ebf0 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20  ->zName) );.    
1ec00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65  }.  }..  /* Unre
1ec10 67 69 73 74 65 72 20 6f 75 74 20 73 61 6d 70 6c  gister out sampl
1ec20 65 20 56 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71  e VFSes. */.  sq
1ec30 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
1ec40 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71  ster(&one);.  sq
1ec50 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
1ec60 73 74 65 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f  ster(&two);..  /
1ec70 2a 20 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20  * Unregistering 
1ec80 61 20 56 46 53 20 74 68 61 74 20 69 73 20 6e 6f  a VFS that is no
1ec90 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69  t currently regi
1eca0 73 74 65 72 65 64 20 69 73 20 68 61 72 6d 6c 65  stered is harmle
1ecb0 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ss */.  sqlite3_
1ecc0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
1ecd0 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  one);.  sqlite3_
1ece0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
1ecf0 74 77 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  two);.  assert( 
1ed00 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1ed10 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a  ("__one")==0 );.
1ed20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ed30 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77  3_vfs_find("__tw
1ed40 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  o")==0 );..  /* 
1ed50 57 65 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 66  We should be lef
1ed60 74 20 77 69 74 68 20 74 68 65 20 6f 72 69 67 69  t with the origi
1ed70 6e 61 6c 20 64 65 66 61 75 6c 74 20 56 46 53 20  nal default VFS 
1ed80 62 61 63 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a  back as the.  **
1ed90 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61   original */.  a
1eda0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
1edb0 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
1edc0 6e 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  n );..  return T
1edd0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1ede0 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e  tclcmd:   vfs_in
1edf0 69 74 66 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a  itfail_test.**.*
1ee00 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
1ee10 6e 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 76  nd attempts to v
1ee20 66 73 5f 66 69 6e 64 20 61 6e 64 20 76 66 73 5f  fs_find and vfs_
1ee30 72 65 67 69 73 74 65 72 20 77 68 65 6e 20 74 68  register when th
1ee40 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69  e.** sqlite3_ini
1ee50 74 69 61 6c 69 7a 65 28 29 20 69 6e 74 65 72 66  tialize() interf
1ee60 61 63 65 20 69 73 20 66 61 69 6c 69 6e 67 2e 20  ace is failing. 
1ee70 20 41 6c 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c   All calls shoul
1ee80 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69  d fail..*/.stati
1ee90 63 20 69 6e 74 20 76 66 73 5f 69 6e 69 74 66 61  c int vfs_initfa
1eea0 69 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  il_test(.  Clien
1eeb0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
1eec0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
1eed0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
1eee0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
1eef0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1ef00 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1ef10 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1ef20 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1ef30 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1ef40 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
1ef50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ef60 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1ef70 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1ef80 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
1ef90 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
1efa0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1efb0 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d   one;.  one.zNam
1efc0 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20  e = "__one";..  
1efd0 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  if( sqlite3_vfs_
1efe0 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e  find(0) ) return
1eff0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
1f000 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
1f010 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69  er(&one, 0);.  i
1f020 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  f( sqlite3_vfs_f
1f030 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20  ind(0) ) return 
1f040 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
1f050 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1f060 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66  r(&one, 1);.  if
1f070 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
1f080 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54  nd(0) ) return T
1f090 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
1f0a0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1f0b0 0a 2a 2a 20 53 61 76 65 64 20 56 46 53 65 73 0a  .** Saved VFSes.
1f0c0 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
1f0d0 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d  3_vfs *apVfs[20]
1f0e0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 56 66  ;.static int nVf
1f0f0 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63  s = 0;../*.** tc
1f100 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e 72 65  lcmd:   vfs_unre
1f110 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a  gister_all.**.**
1f120 20 55 6e 72 65 67 69 73 74 65 72 20 61 6c 6c 20   Unregister all 
1f130 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  VFSes..*/.static
1f140 20 69 6e 74 20 76 66 73 5f 75 6e 72 65 67 69 73   int vfs_unregis
1f150 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e  ter_all(.  Clien
1f160 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
1f170 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
1f180 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
1f190 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
1f1a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f1b0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1f1c0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1f1d0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1f1e0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1f1f0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
1f200 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f210 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1f220 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1f230 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
1f240 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
1f250 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1f260 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
1f270 7a 65 28 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b  ze(apVfs); i++){
1f280 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20  .    apVfs[i] = 
1f290 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1f2a0 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56  (0);.    if( apV
1f2b0 66 73 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b  fs[i]==0 ) break
1f2c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  ;.    sqlite3_vf
1f2d0 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56  s_unregister(apV
1f2e0 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56  fs[i]);.  }.  nV
1f2f0 66 73 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e  fs = i;.  return
1f300 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
1f310 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72   tclcmd:   vfs_r
1f320 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a  eregister_all.**
1f330 0a 2a 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c 20  .** Restore all 
1f340 56 46 53 65 73 20 74 68 61 74 20 77 65 72 65 20  VFSes that were 
1f350 72 65 6d 6f 76 65 64 20 75 73 69 6e 67 20 76 66  removed using vf
1f360 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
1f370 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1f380 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c  fs_reregister_al
1f390 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  l(.  ClientData 
1f3a0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
1f3b0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
1f3c0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
1f3d0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
1f3e0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
1f3f0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
1f400 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
1f410 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
1f420 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
1f430 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1f440 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1f450 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
1f460 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1f470 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
1f480 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
1f490 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1f4a0 20 69 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20   i<nVfs; i++){. 
1f4b0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
1f4c0 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d  egister(apVfs[i]
1f4d0 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72  , i==0);.  }.  r
1f4e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1f4f0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
1f500 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74    file_control_t
1f510 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69  est DB.**.** Thi
1f520 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
1f530 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
1f540 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
1f550 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
1f560 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
1f570 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  eration of the s
1f580 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
1f590 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
1f5a0 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
1f5b0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
1f5c0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
1f5d0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
1f5e0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
1f5f0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f600 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
1f610 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
1f620 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
1f630 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
1f640 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
1f650 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1f660 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
1f670 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1f680 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
1f690 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1f6a0 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a    int iArg = 0;.
1f6b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1f6c0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1f6d0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1f6e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1f6f0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1f700 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1f710 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
1f720 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
1f730 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
1f740 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1f750 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f760 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1f770 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1f780 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1f790 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
1f7a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f7b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1f7c0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
1f7d0 20 30 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20   0, 0, &iArg);. 
1f7e0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1f7f0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72  ITE_ERROR );.  r
1f800 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
1f810 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e 6f  _control(db, "no
1f820 74 61 64 61 74 61 62 61 73 65 22 2c 20 53 51 4c  tadatabase", SQL
1f830 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
1f840 41 54 45 2c 20 26 69 41 72 67 29 3b 0a 20 20 61  ATE, &iArg);.  a
1f850 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1f860 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63 20  E_ERROR );.  rc 
1f870 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
1f880 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e  ontrol(db, "main
1f890 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20  ", -1, &iArg);. 
1f8a0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1f8b0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72  ITE_ERROR );.  r
1f8c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
1f8d0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 74 65  _control(db, "te
1f8e0 6d 70 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b  mp", -1, &iArg);
1f8f0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
1f900 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a  QLITE_ERROR );..
1f910 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1f920 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  .}.../*.** tclcm
1f930 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
1f940 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74  l_lasterrno_test
1f950 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54   DB.**.** This T
1f960 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
1f970 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
1f980 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
1f990 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
1f9a0 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
1f9b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49  tion of the SQLI
1f9c0 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 20 76 65  TE_LAST_ERRNO ve
1f9d0 72 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rb..*/.static in
1f9e0 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c  t file_control_l
1f9f0 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 28 0a 20  asterrno_test(. 
1fa00 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
1fa10 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
1fa20 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
1fa30 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
1fa40 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
1fa50 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1fa60 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1fa70 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1fa80 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1fa90 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
1faa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1fab0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1fac0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
1fad0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
1fae0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
1faf0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
1fb00 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Arg = 0;.  sqlit
1fb10 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
1fb20 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1fb30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1fb40 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1fb50 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1fb60 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
1fb70 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1fb80 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
1fb90 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20  [0], 0), " DB", 
1fba0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1fbb0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1fbc0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1fbd0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1fbe0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1fbf0 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
1fc00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fc10 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1fc20 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
1fc30 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  b, NULL, SQLITE_
1fc40 4c 41 53 54 5f 45 52 52 4e 4f 2c 20 26 69 41 72  LAST_ERRNO, &iAr
1fc50 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 20  g);.  if( rc ){ 
1fc60 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
1fc70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1fc80 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
1fc90 3b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ; .    return TC
1fca0 4c 5f 45 52 52 4f 52 3b 20 0a 20 20 7d 0a 20 20  L_ERROR; .  }.  
1fcb0 69 66 28 20 69 41 72 67 21 3d 30 20 29 20 7b 0a  if( iArg!=0 ) {.
1fcc0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1fcd0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55 6e  sult(interp, "Un
1fce0 65 78 70 65 63 74 65 64 20 6e 6f 6e 2d 7a 65 72  expected non-zer
1fcf0 6f 20 65 72 72 6e 6f 3a 20 22 2c 0a 20 20 20 20  o errno: ",.    
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd10 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
1fd20 6f 6d 4f 62 6a 28 54 63 6c 5f 4e 65 77 49 6e 74  omObj(Tcl_NewInt
1fd30 4f 62 6a 28 69 41 72 67 29 2c 20 30 29 2c 20 22  Obj(iArg), 0), "
1fd40 20 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75   ", 0);.    retu
1fd50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1fd60 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1fd70 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
1fd80 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
1fd90 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74  trol_lockproxy_t
1fda0 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69  est DB.**.** Thi
1fdb0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
1fdc0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
1fdd0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
1fde0 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
1fdf0 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
1fe00 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53  eration of the S
1fe10 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
1fe20 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53  OXYFILE and.** S
1fe30 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
1fe40 4f 58 59 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a  OXYFILE verbs..*
1fe50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
1fe60 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72  e_control_lockpr
1fe70 6f 78 79 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  oxy_test(.  Clie
1fe80 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
1fe90 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
1fea0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
1feb0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
1fec0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1fed0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1fee0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1fef0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1ff00 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1ff10 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
1ff20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1ff30 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1ff40 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1ff50 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
1ff60 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
1ff70 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1ff80 62 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  b;.  .  if( objc
1ff90 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1ffa0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1ffb0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1ffc0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1ffd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ffe0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1fff0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
20000 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20  [0], 0), " DB", 
20010 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
20020 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
20030 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
20040 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
20050 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
20060 20 26 64 62 29 20 29 7b 0a 20 20 20 72 65 74 75   &db) ){.   retu
20070 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20080 7d 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  }.  .#if !define
20090 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
200a0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23  LOCKING_STYLE).#
200b0 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41    if defined(__A
200c0 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66  PPLE__).#    def
200d0 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
200e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
200f0 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
20100 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41  efine SQLITE_ENA
20110 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
20120 45 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  E 0.#  endif.#en
20130 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
20140 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
20150 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
20160 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 7b 0a 20 20  _APPLE__).  {.  
20170 20 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61 74    char *proxyPat
20180 68 20 3d 20 22 74 65 73 74 2e 70 72 6f 78 79 22  h = "test.proxy"
20190 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 73 74  ;.    char *test
201a0 50 61 74 68 3b 0a 20 20 20 20 69 6e 74 20 72 63  Path;.    int rc
201b0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
201c0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
201d0 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  db, NULL, SQLITE
201e0 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
201f0 4c 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a  LE, proxyPath);.
20200 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
20210 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
20220 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
20230 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
20240 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54   .      return T
20250 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
20260 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20270 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
20280 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 47  , NULL, SQLITE_G
20290 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
202a0 2c 20 26 74 65 73 74 50 61 74 68 29 3b 0a 20 20  , &testPath);.  
202b0 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 70 72    if( strncmp(pr
202c0 6f 78 79 50 61 74 68 2c 74 65 73 74 50 61 74 68  oxyPath,testPath
202d0 2c 31 31 29 20 29 7b 0a 20 20 20 20 20 20 54 63  ,11) ){.      Tc
202e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
202f0 6e 74 65 72 70 2c 20 22 4c 6f 63 6b 20 70 72 6f  nterp, "Lock pro
20300 78 79 20 66 69 6c 65 20 64 69 64 20 6e 6f 74 20  xy file did not 
20310 6d 61 74 63 68 20 74 68 65 20 22 0a 20 20 20 20  match the ".    
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 20 20 20 20 20 20 20 20 20 20 20 22 70 72 65 76             "prev
20340 69 6f 75 73 6c 79 20 61 73 73 69 67 6e 65 64 20  iously assigned 
20350 76 61 6c 75 65 22 2c 20 30 29 3b 0a 20 20 20 20  value", 0);.    
20360 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
20370 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
20380 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
20390 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
203a0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
203b0 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20 20 20  tObj(rc));.     
203c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
203d0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
203e0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
203f0 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
20400 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
20410 50 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79  PROXYFILE, proxy
20420 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72  Path);.    if( r
20430 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  c ){.      Tcl_S
20440 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
20450 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
20460 6a 28 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65  j(rc));.      re
20470 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20480 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
20490 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
204a0 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  ;  .}.../*.** tc
204b0 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f  lcmd:   sqlite3_
204c0 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20  vfs_list.**.**  
204d0 20 52 65 74 75 72 6e 20 61 20 74 63 6c 20 6c 69   Return a tcl li
204e0 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
204f0 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 72  e names of all r
20500 65 67 69 73 74 65 72 65 64 20 76 66 73 27 73 2e  egistered vfs's.
20510 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
20520 66 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69 65 6e  fs_list(.  Clien
20530 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
20540 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
20550 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
20560 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
20570 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
20580 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
20590 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
205a0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
205b0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
205c0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
205d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
205e0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
205f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
20600 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
20610 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
20620 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
20630 20 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f 4f 62   *pVfs;.  Tcl_Ob
20640 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  j *pRet = Tcl_Ne
20650 77 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20 6f 62  wObj();.  if( ob
20660 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
20670 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
20680 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
20690 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
206a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
206b0 66 6f 72 28 70 56 66 73 3d 73 71 6c 69 74 65 33  for(pVfs=sqlite3
206c0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 20 70 56  _vfs_find(0); pV
206d0 66 73 3b 20 70 56 66 73 3d 70 56 66 73 2d 3e 70  fs; pVfs=pVfs->p
206e0 4e 65 78 74 29 7b 0a 20 20 20 20 54 63 6c 5f 4c  Next){.    Tcl_L
206f0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
20700 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
20710 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
20720 62 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20  bj(pVfs->zName, 
20730 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  -1));.  }.  Tcl_
20740 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
20750 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 72 65  erp, pRet);.  re
20760 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
20770 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
20780 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20    sqlite3_limit 
20790 44 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a  DB ID VALUE.**.*
207a0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
207b0 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
207c0 74 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65 72 66  te3_limit interf
207d0 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
207e0 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
207f0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d  ation of the sam
20800 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
20810 20 74 65 73 74 5f 6c 69 6d 69 74 28 0a 20 20 43   test_limit(.  C
20820 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
20830 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
20840 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
20850 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
20860 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
20870 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
20880 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
20890 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
208a0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
208b0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
208c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
208d0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
208e0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
208f0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
20900 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
20910 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
20920 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
20930 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
20940 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
20950 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69  r *zName;.     i
20960 6e 74 20 69 64 3b 0a 20 20 7d 20 61 49 64 5b 5d  nt id;.  } aId[]
20970 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49   = {.    { "SQLI
20980 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 22  TE_LIMIT_LENGTH"
20990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ,              S
209a0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
209b0 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
209c0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
209d0 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
209e0 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  TH",          SQ
209f0 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
20a00 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20  ENGTH           
20a10 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
20a20 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 22 2c 20  _LIMIT_COLUMN", 
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
20a40 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
20a60 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
20a70 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
20a80 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ",          SQLI
20a90 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
20aa0 50 54 48 20 20 20 20 20 20 20 20 20 20 20 7d 2c  PTH           },
20ab0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
20ac0 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
20ad0 4c 45 43 54 22 2c 20 20 20 20 20 53 51 4c 49 54  LECT",     SQLIT
20ae0 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
20af0 5f 53 45 4c 45 43 54 20 20 20 20 20 20 7d 2c 0a  _SELECT      },.
20b00 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
20b10 4d 49 54 5f 56 44 42 45 5f 4f 50 22 2c 20 20 20  MIT_VDBE_OP",   
20b20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
20b30 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20  _LIMIT_VDBE_OP  
20b40 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
20b50 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
20b60 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 22  IT_FUNCTION_ARG"
20b70 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
20b80 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
20b90 52 47 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  RG         },.  
20ba0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
20bb0 54 5f 41 54 54 41 43 48 45 44 22 2c 20 20 20 20  T_ATTACHED",    
20bc0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
20bd0 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20 20  IMIT_ATTACHED   
20be0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
20bf0 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
20c00 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
20c10 4e 47 54 48 22 2c 20 53 51 4c 49 54 45 5f 4c 49  NGTH", SQLITE_LI
20c20 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
20c30 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a 20 20 20 20  _LENGTH  },.    
20c40 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
20c50 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 22  VARIABLE_NUMBER"
20c60 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d  ,     SQLITE_LIM
20c70 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
20c80 45 52 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  ER      },.    {
20c90 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54   "SQLITE_LIMIT_T
20ca0 52 49 47 47 45 52 5f 44 45 50 54 48 22 2c 20 20  RIGGER_DEPTH",  
20cb0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
20cc0 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  T_TRIGGER_DEPTH 
20cd0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 0a 20         },.    . 
20ce0 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20 72 61 6e     /* Out of ran
20cf0 67 65 20 74 65 73 74 20 63 61 73 65 73 20 2a 2f  ge test cases */
20d00 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
20d10 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22 2c 20  IMIT_TOOSMALL", 
20d20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 20             -1,  
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
20d50 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
20d60 4d 49 54 5f 54 4f 4f 42 49 47 22 2c 20 20 20 20  MIT_TOOBIG",    
20d70 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
20d80 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
20d90 45 50 54 48 2b 31 20 20 20 20 20 20 7d 2c 0a 20  EPTH+1      },. 
20da0 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64 3b   };.  int i, id;
20db0 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 63 6f  .  int val;.  co
20dc0 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 0a  nst char *zId;..
20dd0 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
20de0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
20df0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
20e00 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
20e10 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
20e20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
20e30 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
20e40 2c 20 30 29 2c 20 22 20 44 42 20 49 44 20 56 41  , 0), " DB ID VA
20e50 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LUE", 0);.    re
20e60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20e70 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
20e80 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
20e90 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
20ea0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
20eb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20ec0 20 20 7a 49 64 20 3d 20 54 63 6c 5f 47 65 74 53    zId = Tcl_GetS
20ed0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
20ee0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
20ef0 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28  eof(aId)/sizeof(
20f00 61 49 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  aId[0]); i++){. 
20f10 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 49     if( strcmp(zI
20f20 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d 65 29  d, aId[i].zName)
20f30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 64 20  ==0 ){.      id 
20f40 3d 20 61 49 64 5b 69 5d 2e 69 64 3b 0a 20 20 20  = aId[i].id;.   
20f50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20f60 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a    }.  if( i>=siz
20f70 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28  eof(aId)/sizeof(
20f80 61 49 64 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54  aId[0]) ){.    T
20f90 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
20fa0 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e  interp, "unknown
20fb0 20 6c 69 6d 69 74 20 74 79 70 65 3a 20 22 2c 20   limit type: ", 
20fc0 7a 49 64 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  zId, (char*)0);.
20fd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
20fe0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
20ff0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
21000 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
21010 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
21020 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
21030 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  c = sqlite3_limi
21040 74 28 64 62 2c 20 69 64 2c 20 76 61 6c 29 3b 0a  t(db, id, val);.
21050 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
21060 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
21070 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20  ewIntObj(rc));. 
21080 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
21090 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
210a0 64 3a 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74  d:  save_prng_st
210b0 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65 20 74  ate.**.** Save t
210c0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
210d0 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75  pseudo-random nu
210e0 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  mber generator..
210f0 2a 2a 20 41 74 20 74 68 65 20 73 61 6d 65 20 74  ** At the same t
21100 69 6d 65 2c 20 76 65 72 69 66 79 20 74 68 61 74  ime, verify that
21110 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
21120 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 65 76 65 6e  ntrol works even
21130 20 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64 20   when.** called 
21140 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 72  with an out-of-r
21150 61 6e 67 65 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  ange opcode..*/.
21160 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 5f  static int save_
21170 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c  prng_state(.  Cl
21180 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
21190 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
211a0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
211b0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
211c0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
211d0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
211e0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
211f0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
21200 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
21210 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
21220 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21230 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
21240 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
21250 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
21260 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
21270 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
21280 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
21290 6e 74 72 6f 6c 28 39 39 39 39 29 3b 0a 20 20 61  ntrol(9999);.  a
212a0 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a  ssert( rc==0 );.
212b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
212c0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 2d 31 29 3b  est_control(-1);
212d0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
212e0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65   );.  sqlite3_te
212f0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
21300 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
21310 53 41 56 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  SAVE);.  return 
21320 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  TCL_OK;.}./*.** 
21330 74 63 6c 63 6d 64 3a 20 20 72 65 73 74 6f 72 65  tclcmd:  restore
21340 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73  _prng_state.*/.s
21350 74 61 74 69 63 20 69 6e 74 20 72 65 73 74 6f 72  tatic int restor
21360 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20  e_prng_state(.  
21370 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
21380 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
21390 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
213a0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
213b0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
213c0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
213d0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
213e0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
213f0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
21400 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
21410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21420 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
21430 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
21440 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
21450 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
21460 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
21470 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
21480 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
21490 52 4e 47 5f 52 45 53 54 4f 52 45 29 3b 0a 20 20  RNG_RESTORE);.  
214a0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
214b0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
214c0 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65  reset_prng_state
214d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
214e0 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 28  eset_prng_state(
214f0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
21500 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
21510 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
21520 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
21530 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
21540 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
21550 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
21560 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
21570 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
21580 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
215a0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
215b0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
215c0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
215d0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
215e0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
215f0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
21600 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
21610 4c 5f 50 52 4e 47 5f 52 45 53 45 54 29 3b 0a 20  L_PRNG_RESET);. 
21620 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
21630 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
21640 20 20 70 63 61 63 68 65 5f 73 74 61 74 73 0a 2a    pcache_stats.*
21650 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
21660 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73 28 0a  t_pcache_stats(.
21670 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
21680 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
21690 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
216a0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
216b0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
216c0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
216d0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
216e0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
216f0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
21700 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
21710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21720 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
21730 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
21740 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
21750 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
21760 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
21770 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20 6e 4d 61 78  nMin;.  int nMax
21780 3b 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74  ;.  int nCurrent
21790 3b 0a 20 20 69 6e 74 20 6e 52 65 63 79 63 6c 61  ;.  int nRecycla
217a0 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ble;.  Tcl_Obj *
217b0 70 52 65 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  pRet;..  sqlite3
217c0 50 63 61 63 68 65 53 74 61 74 73 28 26 6e 43 75  PcacheStats(&nCu
217d0 72 72 65 6e 74 2c 20 26 6e 4d 61 78 2c 20 26 6e  rrent, &nMax, &n
217e0 4d 69 6e 2c 20 26 6e 52 65 63 79 63 6c 61 62 6c  Min, &nRecyclabl
217f0 65 29 3b 0a 0a 20 20 70 52 65 74 20 3d 20 54 63  e);..  pRet = Tc
21800 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63  l_NewObj();.  Tc
21810 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
21820 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
21830 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
21840 6e 67 4f 62 6a 28 22 63 75 72 72 65 6e 74 22 2c  ngObj("current",
21850 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
21860 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
21870 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
21880 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43  Tcl_NewIntObj(nC
21890 75 72 72 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f  urrent));.  Tcl_
218a0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
218b0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
218c0 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
218d0 4f 62 6a 28 22 6d 61 78 22 2c 20 2d 31 29 29 3b  Obj("max", -1));
218e0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
218f0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
21900 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
21910 77 49 6e 74 4f 62 6a 28 6e 4d 61 78 29 29 3b 0a  wIntObj(nMax));.
21920 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
21930 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
21940 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
21950 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 22 2c  StringObj("min",
21960 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
21970 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
21980 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
21990 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d  Tcl_NewIntObj(nM
219a0 69 6e 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  in));.  Tcl_List
219b0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
219c0 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
219d0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
219e0 22 72 65 63 79 63 6c 61 62 6c 65 22 2c 20 2d 31  "recyclable", -1
219f0 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
21a00 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
21a10 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
21a20 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 52 65 63 79  _NewIntObj(nRecy
21a30 63 6c 61 62 6c 65 29 29 3b 0a 0a 20 20 54 63 6c  clable));..  Tcl
21a40 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
21a50 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20  terp, pRet);..  
21a60 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
21a70 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
21a80 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
21a90 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64  TIFY.static void
21aa0 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74   test_unlock_not
21ab0 69 66 79 5f 63 62 28 76 6f 69 64 20 2a 2a 61 41  ify_cb(void **aA
21ac0 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b 0a 20  rg, int nArg){. 
21ad0 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28 69   int ii;.  for(i
21ae0 69 3d 30 3b 20 69 69 3c 6e 41 72 67 3b 20 69 69  i=0; ii<nArg; ii
21af0 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 45 76 61  ++){.    Tcl_Eva
21b00 6c 45 78 28 28 54 63 6c 5f 49 6e 74 65 72 70 20  lEx((Tcl_Interp 
21b10 2a 29 61 41 72 67 5b 69 69 5d 2c 20 22 75 6e 6c  *)aArg[ii], "unl
21b20 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 2d 31 2c  ock_notify", -1,
21b30 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
21b40 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
21b50 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
21b60 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 20 2a  _UNLOCK_NOTIFY *
21b70 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  /../*.** tclcmd:
21b80 20 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b    sqlite3_unlock
21b90 5f 6e 6f 74 69 66 79 20 64 62 0a 2a 2f 0a 23 69  _notify db.*/.#i
21ba0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
21bb0 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  LE_UNLOCK_NOTIFY
21bc0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
21bd0 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 0a  _unlock_notify(.
21be0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
21bf0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73  entData, /* Unus
21c00 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
21c10 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
21c20 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
21c30 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
21c40 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
21c50 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
21c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21c70 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
21c80 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
21c90 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
21ca0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
21cb0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
21cc0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
21cd0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
21ce0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
21cf0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
21d00 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29  , 1, objv, "DB")
21d10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
21d20 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
21d30 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
21d40 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
21d50 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
21d60 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
21d70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
21d80 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
21d90 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 64  _unlock_notify(d
21da0 62 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e  b, test_unlock_n
21db0 6f 74 69 66 79 5f 63 62 2c 20 28 76 6f 69 64 20  otify_cb, (void 
21dc0 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20 54 63 6c  *)interp);.  Tcl
21dd0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
21de0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
21df0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
21e00 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
21e10 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
21e20 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 74  if.../*.**     t
21e30 63 6c 5f 6f 62 6a 70 72 6f 63 20 43 4f 4d 4d 41  cl_objproc COMMA
21e40 4e 44 4e 41 4d 45 20 41 52 47 53 2e 2e 2e 0a 2a  NDNAME ARGS....*
21e50 2a 0a 2a 2a 20 52 75 6e 20 61 20 54 43 4c 20 63  *.** Run a TCL c
21e60 6f 6d 6d 61 6e 64 20 75 73 69 6e 67 20 69 74 73  ommand using its
21e70 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66 61   objProc interfa
21e80 63 65 2e 20 20 54 68 72 6f 77 20 61 6e 20 65 72  ce.  Throw an er
21e90 72 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ror if.** the co
21ea0 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a  mmand has no obj
21eb0 50 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e 0a  Proc interface..
21ec0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75  */.static int ru
21ed0 6e 41 73 4f 62 6a 50 72 6f 63 28 0a 20 20 76 6f  nAsObjProc(.  vo
21ee0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
21ef0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
21f00 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
21f10 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
21f20 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
21f30 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
21f40 6e 66 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3c  nfo;.  if( objc<
21f50 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
21f60 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
21f70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 4f 4d 4d  , 1, objv, "COMM
21f80 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  AND ...");.    r
21f90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
21fa0 0a 20 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f  .  }.  if( !Tcl_
21fb0 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
21fc0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
21fd0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
21fe0 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
21ff0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
22000 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
22010 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a  d not found: ",.
22020 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
22030 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
22040 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
22050 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
22060 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6d  OR;.  }.  if( cm
22070 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 3d 3d 30  dInfo.objProc==0
22080 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
22090 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
220a0 20 22 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f   "command has no
220b0 20 6f 62 6a 50 72 6f 63 3a 20 22 2c 0a 20 20 20   objProc: ",.   
220c0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
220d0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
220e0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
220f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22100 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6d  .  }.  return cm
22110 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 28 63 6d  dInfo.objProc(cm
22120 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
22130 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a  ata, interp, obj
22140 63 2d 31 2c 20 6f 62 6a 76 2b 31 29 3b 0a 7d 0a  c-1, objv+1);.}.
22150 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
22160 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74   commands with t
22170 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
22180 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74  er..*/.int Sqlit
22190 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f  etest1_Init(Tcl_
221a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
221b0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
221c0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
221d0 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
221e0 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63   sqlite3_found_c
221f0 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
22200 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  nt sqlite3_inter
22210 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  rupt_count;.  ex
22220 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
22230 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
22240 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
22250 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e  qlite3_sort_coun
22260 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
22270 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
22280 74 69 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45  time;.#if SQLITE
22290 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69  _OS_UNIX && defi
222a0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
222b0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
222c0 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b 0a  te3_hostid_num;.
222d0 23 65 6e 64 69 66 0a 20 20 65 78 74 65 72 6e 20  #endif.  extern 
222e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 61 78 5f  int sqlite3_max_
222f0 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65 78 74 65  blobsize;.  exte
22300 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74  rn int sqlite3Bt
22310 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52 65  reeSharedCacheRe
22320 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20 20 20 20  port(void*,.    
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22350 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70        Tcl_Interp
22360 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f  *,int,Tcl_Obj*CO
22370 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74 69 63 20  NST*);.  static 
22380 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
22390 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
223a0 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72  Tcl_CmdProc *xPr
223b0 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d  oc;.  } aCmd[] =
223c0 20 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f 65 6e   {.     { "db_en
223d0 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ter",           
223e0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
223f0 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65  CmdProc*)db_ente
22400 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
22410 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f 6c 65  },.     { "db_le
22420 61 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ave",           
22430 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
22440 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76  CmdProc*)db_leav
22450 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
22460 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
22470 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c  e3_mprintf_int",
22480 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
22490 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
224a0 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20  _mprintf_int    
224b0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
224c0 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34  e3_mprintf_int64
224d0 22 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ",         (Tcl_
224e0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
224f0 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20  _mprintf_int64  
22500 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
22510 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 22  e3_mprintf_long"
22520 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
22530 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
22540 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 20 20  _mprintf_long   
22550 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
22560 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c  e3_mprintf_str",
22570 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
22580 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
22590 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20  _mprintf_str    
225a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
225b0 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 22  e3_snprintf_str"
225c0 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
225d0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
225e0 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 20 20  _snprintf_str   
225f0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
22600 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
22610 6c 79 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  ly",       (Tcl_
22620 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
22630 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79  _mprintf_stronly
22640 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
22650 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
22660 65 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  e",        (Tcl_
22670 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
22680 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20  _mprintf_double 
22690 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
226a0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
226b0 64 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  d",        (Tcl_
226c0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
226d0 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20  _mprintf_scaled 
226e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
226f0 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f  e3_mprintf_hexdo
22700 75 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d  uble",   (Tcl_Cm
22710 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
22720 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
22730 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
22740 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
22750 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
22760 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70  CmdProc*)test_mp
22770 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d  rintf_z        }
22780 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
22790 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74  3_mprintf_n_test
227a0 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
227b0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72  mdProc*)test_mpr
227c0 69 6e 74 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c  intf_n        },
227d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
227e0 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20  _snprintf_int", 
227f0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
22800 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72  dProc*)test_snpr
22810 69 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a  intf_int     },.
22820 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
22830 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
22840 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  d",     (Tcl_Cmd
22850 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f  Proc*)test_last_
22860 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20  rowid       },. 
22870 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
22880 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20  xec_printf",    
22890 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
228a0 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70  roc*)test_exec_p
228b0 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20  rintf      },.  
228c0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
228d0 65 63 5f 68 65 78 22 2c 20 20 20 20 20 20 20 20  ec_hex",        
228e0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
228f0 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 68 65  oc*)test_exec_he
22900 78 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  x         },.   
22910 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
22920 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
22930 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
22940 63 2a 29 74 65 73 74 5f 65 78 65 63 20 20 20 20  c*)test_exec    
22950 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
22960 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63   { "sqlite3_exec
22970 5f 6e 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  _nr",           
22980 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
22990 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e 72 20 20  *)test_exec_nr  
229a0 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64          },.#ifnd
229b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47  ef SQLITE_OMIT_G
229c0 45 54 5f 54 41 42 4c 45 0a 20 20 20 20 20 7b 20  ET_TABLE.     { 
229d0 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62  "sqlite3_get_tab
229e0 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20  le_printf",     
229f0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
22a00 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  est_get_table_pr
22a10 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  intf },.#endif. 
22a20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
22a30 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20  lose",          
22a40 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
22a50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74  roc*)sqlite_test
22a60 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20  _close     },.  
22a70 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72     { "sqlite3_cr
22a80 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  eate_function", 
22a90 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
22aa0 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f  oc*)test_create_
22ab0 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20  function  },.   
22ac0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
22ad0 61 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20  ate_aggregate", 
22ae0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
22af0 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61  c*)test_create_a
22b00 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20  ggregate },.    
22b10 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73   { "sqlite_regis
22b20 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  ter_test_functio
22b30 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  n", (Tcl_CmdProc
22b40 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  *)test_register_
22b50 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20  func    },.     
22b60 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22  { "sqlite_abort"
22b70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22b80 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
22b90 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20  )sqlite_abort   
22ba0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
22bb0 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20   "sqlite_bind", 
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bd0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
22be0 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20  test_bind       
22bf0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
22c00 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20  "breakpoint",   
22c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
22c30 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20  est_breakpoint  
22c40 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
22c50 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20 20  sqlite3_key",   
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
22c80 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20  st_key          
22c90 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
22ca0 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20 20  qlite3_rekey",  
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
22cc0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
22cd0 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20 20  t_rekey         
22ce0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
22cf0 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c  lite_set_magic",
22d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
22d10 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
22d20 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20 20  te_set_magic    
22d30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
22d40 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22 2c  ite3_interrupt",
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
22d60 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
22d70 69 6e 74 65 72 72 75 70 74 20 20 20 20 20 20 20  interrupt       
22d80 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
22d90 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69  te_delete_functi
22da0 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  on",        (Tcl
22db0 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65  _CmdProc*)delete
22dc0 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20 20  _function       
22dd0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
22de0 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69  e_delete_collati
22df0 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  on",       (Tcl_
22e00 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f  CmdProc*)delete_
22e10 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d  collation      }
22e20 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
22e30 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
22e40 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
22e50 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f  mdProc*)get_auto
22e60 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d 2c  commit        },
22e70 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
22e80 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20 20 20  _stack_used",   
22e90 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
22ea0 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74 61 63  dProc*)test_stac
22eb0 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d 2c 0a  k_used       },.
22ec0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
22ed0 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20  busy_timeout",  
22ee0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
22ef0 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79 5f  Proc*)test_busy_
22f00 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20  timeout     },. 
22f10 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c 20      { "printf", 
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
22f40 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74 66  roc*)test_printf
22f50 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
22f60 20 20 20 7b 20 22 73 71 6c 69 74 65 33 49 6f 54     { "sqlite3IoT
22f70 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20  race",          
22f80 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
22f90 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 20  *)test_io_trace 
22fa0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a          },.  };.
22fb0 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
22fc0 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  {.     char *zNa
22fd0 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a  me;.     Tcl_Obj
22fe0 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a  CmdProc *xProc;.
22ff0 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e       void *clien
23000 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43  tData;.  } aObjC
23010 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  md[] = {.     { 
23020 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74  "sqlite3_connect
23030 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20 20 20  ion_pointer",   
23040 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e   get_sqlite_poin
23050 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ter, 0 },.     {
23060 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69   "sqlite3_bind_i
23070 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
23080 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c    test_bind_int,
23090 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20        0 },.     
230a0 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
230b0 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20  zeroblob",      
230c0 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72     test_bind_zer
230d0 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20  oblob, 0 },.    
230e0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
230f0 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
23100 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
23110 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20  t64,    0 },.   
23120 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
23130 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  d_double",      
23140 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64       test_bind_d
23150 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20  ouble,   0 },.  
23160 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
23170 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20  nd_null",       
23180 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
23190 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20  null     ,0 },. 
231a0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
231b0 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20  ind_text",      
231c0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
231d0 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a  _text     ,0 },.
231e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
231f0 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20  bind_text16",   
23200 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
23210 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c  d_text16   ,0 },
23220 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
23230 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20  _bind_blob",    
23240 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
23250 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d  nd_blob     ,0 }
23260 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
23270 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
23280 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62  _count",  test_b
23290 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
232a0 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  unt, 0},.     { 
232b0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  "sqlite3_bind_pa
232c0 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20  rameter_name",  
232d0 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
232e0 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a  eter_name,  0},.
232f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
23300 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
23310 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62 69 6e  ndex",  test_bin
23320 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
23330 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  x, 0},.     { "s
23340 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e  qlite3_clear_bin
23350 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20 20 74  dings",        t
23360 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  est_clear_bindin
23370 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  gs, 0},.     { "
23380 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c 20  sqlite3_sleep", 
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233a0 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20 20 20  test_sleep,     
233b0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
233c0 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  "sqlite3_errcode
233d0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
233e0 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20   test_errcode   
233f0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
23400 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64   "sqlite3_extend
23410 65 64 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20  ed_errcode",    
23420 20 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64    test_ex_errcod
23430 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  e    ,0 },.     
23440 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  { "sqlite3_errms
23450 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  g",             
23460 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20     test_errmsg  
23470 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
23480 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d   { "sqlite3_errm
23490 73 67 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  sg16",          
234a0 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31      test_errmsg1
234b0 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  6      ,0 },.   
234c0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
234d0 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n",             
234e0 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20       test_open  
234f0 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
23500 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
23510 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  en16",          
23520 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31        test_open1
23530 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  6        ,0 },. 
23540 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
23550 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20 20  omplete16",     
23560 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d 70         test_comp
23570 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a  lete16    ,0 },.
23580 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
23590 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20 20 20  _prepare",      
235a0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
235b0 65 70 61 72 65 20 20 20 20 20 20 20 2c 30 20 7d  epare       ,0 }
235c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
235d0 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20 20  3_prepare16",   
235e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
235f0 72 65 70 61 72 65 31 36 20 20 20 20 20 2c 30 20  repare16     ,0 
23600 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
23610 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20  e3_prepare_v2", 
23620 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
23630 70 72 65 70 61 72 65 5f 76 32 20 20 20 20 2c 30  prepare_v2    ,0
23640 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
23650 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  te3_prepare_tkt3
23660 31 33 34 22 2c 20 20 20 20 20 20 20 74 65 73 74  134",       test
23670 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34  _prepare_tkt3134
23680 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  , 0},.     { "sq
23690 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f  lite3_prepare16_
236a0 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  v2",          te
236b0 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20  st_prepare16_v2 
236c0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
236d0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22  qlite3_finalize"
236e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ,              t
236f0 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20  est_finalize    
23700 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
23710 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
23720 74 75 73 22 2c 20 20 20 20 20 20 20 20 20 20 20  tus",           
23730 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75 73  test_stmt_status
23740 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
23750 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74 22 2c  "sqlite3_reset",
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23770 20 74 65 73 74 5f 72 65 73 65 74 20 20 20 20 20   test_reset     
23780 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
23790 20 22 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65   "sqlite3_expire
237a0 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  d",             
237b0 20 20 74 65 73 74 5f 65 78 70 69 72 65 64 20 20    test_expired  
237c0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
237d0 7b 20 22 73 71 6c 69 74 65 33 5f 74 72 61 6e 73  { "sqlite3_trans
237e0 66 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20  fer_bindings",  
237f0 20 20 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72     test_transfer
23800 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20 20  _bind ,0 },.    
23810 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e   { "sqlite3_chan
23820 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20  ges",           
23830 20 20 20 20 74 65 73 74 5f 63 68 61 6e 67 65 73      test_changes
23840 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
23850 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 65    { "sqlite3_ste
23860 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
23870 20 20 20 20 20 74 65 73 74 5f 73 74 65 70 20 20       test_step  
23880 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
23890 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 71     { "sqlite3_sq
238a0 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
238b0 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 20 20        test_sql  
238c0 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
238d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6e      { "sqlite3_n
238e0 65 78 74 5f 73 74 6d 74 22 2c 20 20 20 20 20 20  ext_stmt",      
238f0 20 20 20 20 20 20 20 74 65 73 74 5f 6e 65 78 74         test_next
23900 5f 73 74 6d 74 20 20 20 20 20 2c 30 20 7d 2c 0a  _stmt     ,0 },.
23910 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
23920 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22  _release_memory"
23930 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 72 65  ,        test_re
23940 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 20  lease_memory,   
23950 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
23960 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
23970 6c 69 6d 69 74 22 2c 20 20 20 20 20 20 20 74 65  limit",       te
23980 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  st_soft_heap_lim
23990 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  it,    0},.     
239a0 7b 20 22 73 71 6c 69 74 65 33 5f 74 68 72 65 61  { "sqlite3_threa
239b0 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20 20 20 20  d_cleanup",     
239c0 20 20 20 74 65 73 74 5f 74 68 72 65 61 64 5f 63     test_thread_c
239d0 6c 65 61 6e 75 70 2c 20 20 20 20 20 30 7d 2c 0a  leanup,     0},.
239e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
239f0 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 22  pager_refcounts"
23a00 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70 61 67  ,       test_pag
23a10 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c 20 20 20  er_refcounts,   
23a20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71   0},..     { "sq
23a30 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
23a40 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 74 65  sion",        te
23a50 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  st_load_extensio
23a60 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  n,     0},.     
23a70 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  { "sqlite3_enabl
23a80 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
23a90 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c  ", test_enable_l
23aa0 6f 61 64 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  oad,        0},.
23ab0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
23ac0 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
23ad0 63 6f 64 65 73 22 2c 20 74 65 73 74 5f 65 78 74  codes", test_ext
23ae0 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
23af0 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  es, 0},.     { "
23b00 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 22 2c 20  sqlite3_limit", 
23b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20 20 20 20  test_limit,     
23b30 20 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c 0a              0},.
23b40 0a 20 20 20 20 20 7b 20 22 73 61 76 65 5f 70 72  .     { "save_pr
23b50 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20  ng_state",      
23b60 20 20 20 20 20 20 20 20 20 73 61 76 65 5f 70 72           save_pr
23b70 6e 67 5f 73 74 61 74 65 2c 20 20 20 20 30 20 7d  ng_state,    0 }
23b80 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 74 6f 72  ,.     { "restor
23b90 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20  e_prng_state",  
23ba0 20 20 20 20 20 20 20 20 20 20 72 65 73 74 6f 72            restor
23bb0 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 30 20  e_prng_state, 0 
23bc0 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 65 74  },.     { "reset
23bd0 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20  _prng_state",   
23be0 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 74             reset
23bf0 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 30  _prng_state,   0
23c00 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f   },.     { "tcl_
23c10 6f 62 6a 70 72 6f 63 22 2c 20 20 20 20 20 20 20  objproc",       
23c20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e 41              runA
23c30 73 4f 62 6a 50 72 6f 63 2c 20 20 20 20 20 20 20  sObjProc,       
23c40 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71  0 },..     /* sq
23c50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29  lite3_column_*()
23c60 20 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22   API */.     { "
23c70 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
23c80 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
23c90 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  test_column_coun
23ca0 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  t  ,0 },.     { 
23cb0 22 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f  "sqlite3_data_co
23cc0 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  unt",           
23cd0 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74   test_data_count
23ce0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
23cf0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
23d00 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20  _type",         
23d10 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79    test_column_ty
23d20 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  pe   ,0 },.     
23d30 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
23d40 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  n_blob",        
23d50 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62     test_column_b
23d60 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  lob   ,0 },.    
23d70 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
23d80 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20  mn_double",     
23d90 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
23da0 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20  double ,0 },.   
23db0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
23dc0 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20  umn_int64",     
23dd0 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
23de0 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20  _int64  ,0 },.  
23df0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
23e00 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 74 65  lumn_text",   te
23e10 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28  st_stmt_utf8,  (
23e20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
23e30 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c 0a 20 20 20  lumn_text },.   
23e40 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
23e50 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73  umn_name",   tes
23e60 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76  t_stmt_utf8,  (v
23e70 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
23e80 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a 20 20 20 20  umn_name },.    
23e90 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
23ea0 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 74 65 73 74  mn_int",    test
23eb0 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f  _stmt_int,   (vo
23ec0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
23ed0 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20 20 20 20 20  mn_int  },.     
23ee0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
23ef0 6e 5f 62 79 74 65 73 22 2c 20 20 74 65 73 74 5f  n_bytes",  test_
23f00 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69  stmt_int,   (voi
23f10 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
23f20 6e 5f 62 79 74 65 73 7d 2c 0a 23 69 66 6e 64 65  n_bytes},.#ifnde
23f30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
23f40 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73  CLTYPE.     { "s
23f50 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
23f60 63 6c 74 79 70 65 22 2c 74 65 73 74 5f 73 74 6d  cltype",test_stm
23f70 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
23f80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
23f90 6c 74 79 70 65 7d 2c 0a 23 65 6e 64 69 66 0a 23  ltype},.#endif.#
23fa0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
23fb0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
23fc0 41 54 41 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63  ATA.{ "sqlite3_c
23fd0 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
23fe0 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  ame",test_stmt_u
23ff0 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  tf8,(void*)sqlit
24000 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
24010 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c  se_name},.{ "sql
24020 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
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 74 61 62  lite3_column_tab
24060 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c  le_name},.{ "sql
24070 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
24080 69 6e 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74  in_name",test_st
24090 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73  mt_utf8,(void*)s
240a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
240b0 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64  igin_name},.#end
240c0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
240d0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
240e0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
240f0 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 74  lumn_bytes16", t
24100 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 28 76  est_stmt_int, (v
24110 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
24120 75 6d 6e 5f 62 79 74 65 73 31 36 20 7d 2c 0a 20  umn_bytes16 },. 
24130 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
24140 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20  olumn_text16",  
24150 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
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 74 65 78 74 31 36 7d 2c 0a  column_text16},.
24180 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
24190 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20  column_name16", 
241a0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
241b0 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
241c0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c  _column_name16},
241d0 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 61 6c 69  .     { "add_ali
241e0 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
241f0 61 74 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69  ations", add_ali
24200 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
24210 61 74 69 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d  ations, 0      }
24220 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
24230 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
24240 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
24250 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36  olumn_decltype16
24260 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  ",test_stmt_utf1
24270 36 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  6,(void*)sqlite3
24280 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
24290 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64  16},.#endif.#ifd
242a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
242b0 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
242c0 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .{"sqlite3_colum
242d0 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31  n_database_name1
242e0 36 22 2c 0a 20 20 74 65 73 74 5f 73 74 6d 74 5f  6",.  test_stmt_
242f0 75 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63  utf16, sqlite3_c
24300 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
24310 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65  ame16},.{"sqlite
24320 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e  3_column_table_n
24330 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d  ame16", test_stm
24340 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29  t_utf16, (void*)
24350 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
24360 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22  able_name16},.{"
24370 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f  sqlite3_column_o
24380 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c 20 74  rigin_name16", t
24390 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
243a0 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
243b0 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
243c0 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6e  e16},.#endif.#en
243d0 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
243e0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
243f0 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63  tion_v2", test_c
24400 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
24410 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  v2, 0 },.     { 
24420 22 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f  "sqlite3_global_
24430 72 65 63 6f 76 65 72 22 2c 20 20 20 20 20 74 65  recover",     te
24440 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65  st_global_recove
24450 72 2c 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  r, 0   },.     {
24460 20 22 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f   "working_64bit_
24470 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 77  int",          w
24480 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74  orking_64bit_int
24490 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  ,   0   },.     
244a0 7b 20 22 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65  { "vfs_unlink_te
244b0 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  st",            
244c0 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 2c  vfs_unlink_test,
244d0 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20       0   },.    
244e0 20 7b 20 22 76 66 73 5f 69 6e 69 74 66 61 69 6c   { "vfs_initfail
244f0 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20  _test",         
24500 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65   vfs_initfail_te
24510 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  st,   0   },.   
24520 20 20 7b 20 22 76 66 73 5f 75 6e 72 65 67 69 73    { "vfs_unregis
24530 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20  ter_all",       
24540 20 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72    vfs_unregister
24550 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20  _all,  0   },.  
24560 20 20 20 7b 20 22 76 66 73 5f 72 65 72 65 67 69     { "vfs_reregi
24570 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20  ster_all",      
24580 20 20 20 76 66 73 5f 72 65 72 65 67 69 73 74 65     vfs_reregiste
24590 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20  r_all,  0   },. 
245a0 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
245b0 72 6f 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20  rol_test",      
245c0 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c      file_control
245d0 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a  _test,   0   },.
245e0 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
245f0 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74  trol_lasterrno_t
24600 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72  est", file_contr
24610 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73  ol_lasterrno_tes
24620 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  t,  0   },.     
24630 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
24640 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 22 2c  lockproxy_test",
24650 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f   file_control_lo
24660 63 6b 70 72 6f 78 79 5f 74 65 73 74 2c 20 20 30  ckproxy_test,  0
24670 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
24680 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 22 2c  lite3_vfs_list",
24690 20 20 20 20 20 20 20 20 20 20 20 76 66 73 5f 6c             vfs_l
246a0 69 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a  ist,     0   },.
246b0 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f  .     /* Functio
246c0 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a  ns from os.h */.
246d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
246e0 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b  MIT_UTF16.     {
246f0 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61   "add_test_colla
24700 74 65 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  te",        test
24710 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20  _collate, 0     
24720 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
24730 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61   "add_test_colla
24740 74 65 5f 6e 65 65 64 65 64 22 2c 20 74 65 73 74  te_needed", test
24750 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c  _collate_needed,
24760 20 30 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b   0     },.     {
24770 20 22 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74   "add_test_funct
24780 69 6f 6e 22 2c 20 20 20 20 20 20 20 74 65 73 74  ion",       test
24790 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20  _function, 0    
247a0 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66         },.#endif
247b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
247c0 5f 74 65 73 74 5f 65 72 72 73 74 72 22 2c 20 20  _test_errstr",  
247d0 20 20 20 74 65 73 74 5f 65 72 72 73 74 72 2c 20     test_errstr, 
247e0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  0             },
247f0 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 76 61 72  .     { "tcl_var
24800 69 61 62 6c 65 5f 74 79 70 65 22 2c 20 20 20 20  iable_type",    
24810 20 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f     tcl_variable_
24820 74 79 70 65 2c 20 30 20 20 20 20 20 20 20 7d 2c  type, 0       },
24830 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24840 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
24850 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
24860 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
24870 63 61 63 68 65 22 2c 20 74 65 73 74 5f 65 6e 61  cache", test_ena
24880 62 6c 65 5f 73 68 61 72 65 64 2c 20 30 20 20 7d  ble_shared, 0  }
24890 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
248a0 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72  3_shared_cache_r
248b0 65 70 6f 72 74 22 2c 20 73 71 6c 69 74 65 33 42  eport", sqlite3B
248c0 74 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52  treeSharedCacheR
248d0 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e 64 69  eport, 0},.#endi
248e0 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
248f0 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  3_libversion_num
24900 62 65 72 22 2c 20 74 65 73 74 5f 6c 69 62 76 65  ber", test_libve
24910 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30 20  rsion_number, 0 
24920 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54   },.#ifdef SQLIT
24930 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
24940 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 7b 20  METADATA.     { 
24950 22 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63  "sqlite3_table_c
24960 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 22 2c  olumn_metadata",
24970 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75   test_table_colu
24980 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30 20 20  mn_metadata, 0  
24990 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  },.#endif.#ifnde
249a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
249b0 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73  CRBLOB.     { "s
249c0 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
249d0 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65  ",  test_blob_re
249e0 61 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  ad, 0  },.     {
249f0 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77   "sqlite3_blob_w
24a00 72 69 74 65 22 2c 20 74 65 73 74 5f 62 6c 6f 62  rite", test_blob
24a10 5f 77 72 69 74 65 2c 20 30 20 20 7d 2c 0a 23 65  _write, 0  },.#e
24a20 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 70 63 61  ndif.     { "pca
24a30 63 68 65 5f 73 74 61 74 73 22 2c 20 20 20 20 20  che_stats",     
24a40 20 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74    test_pcache_st
24a50 61 74 73 2c 20 30 20 20 7d 2c 0a 23 69 66 64 65  ats, 0  },.#ifde
24a60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
24a70 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20  UNLOCK_NOTIFY.  
24a80 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 6e     { "sqlite3_un
24a90 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 74 65  lock_notify", te
24aa0 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  st_unlock_notify
24ab0 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  , 0  },.#endif. 
24ac0 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   };.  static int
24ad0 20 62 69 74 6d 61 73 6b 5f 73 69 7a 65 20 3d 20   bitmask_size = 
24ae0 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
24af0 38 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 65 78  8;.  int i;.  ex
24b00 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
24b10 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 73 71 6c  _sync_count, sql
24b20 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
24b30 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
24b40 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
24b50 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  mp_count;.  exte
24b60 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  rn int sqlite3_l
24b70 69 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ike_count;.  ext
24b80 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
24b90 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a 20  xferopt_count;. 
24ba0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
24bb0 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
24bc0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
24bd0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
24be0 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_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 77 72 69  qlite3_pager_wri
24c10 74 65 6a 5f 63 6f 75 6e 74 3b 0a 23 69 66 20 64  tej_count;.#if d
24c20 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
24c30 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
24c40 49 54 45 5f 54 45 53 54 29 20 26 26 20 53 51 4c  ITE_TEST) && SQL
24c50 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
24c60 20 65 78 74 65 72 6e 20 69 6e 74 20 74 68 72 65   extern int thre
24c70 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
24c80 74 68 65 72 73 4c 6f 63 6b 73 3b 0a 23 65 6e 64  thersLocks;.#end
24c90 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  if.#if SQLITE_OS
24ca0 5f 57 49 4e 0a 20 20 65 78 74 65 72 6e 20 69 6e  _WIN.  extern in
24cb0 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
24cc0 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  e;.#endif.#ifdef
24cd0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
24ce0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
24cf0 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20  e3WhereTrace;.  
24d00 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
24d10 65 33 4f 53 54 72 61 63 65 3b 0a 20 20 65 78 74  e3OSTrace;.  ext
24d20 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 56  ern int sqlite3V
24d30 64 62 65 41 64 64 6f 70 54 72 61 63 65 3b 0a 23  dbeAddopTrace;.#
24d40 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
24d50 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72  ITE_TEST.  exter
24d60 6e 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71  n char sqlite3_q
24d70 75 65 72 79 5f 70 6c 61 6e 5b 5d 3b 0a 20 20 73  uery_plan[];.  s
24d80 74 61 74 69 63 20 63 68 61 72 20 2a 71 75 65 72  tatic char *quer
24d90 79 5f 70 6c 61 6e 20 3d 20 73 71 6c 69 74 65 33  y_plan = sqlite3
24da0 5f 71 75 65 72 79 5f 70 6c 61 6e 3b 0a 23 69 66  _query_plan;.#if
24db0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
24dc0 45 5f 46 54 53 33 0a 20 20 65 78 74 65 72 6e 20  E_FTS3.  extern 
24dd0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 74 73 33  int sqlite3_fts3
24de0 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65  _enable_parenthe
24df0 73 65 73 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  ses;.#endif.#end
24e00 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  if..  for(i=0; i
24e10 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69  <sizeof(aCmd)/si
24e20 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69  zeof(aCmd[0]); i
24e30 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  ++){.    Tcl_Cre
24e40 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
24e50 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65  p, aCmd[i].zName
24e60 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c  , aCmd[i].xProc,
24e70 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f   0, 0);.  }.  fo
24e80 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
24e90 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28  aObjCmd)/sizeof(
24ea0 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b  aObjCmd[0]); i++
24eb0 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ){.    Tcl_Creat
24ec0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
24ed0 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a  rp, aObjCmd[i].z
24ee0 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 61  Name, .        a
24ef0 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c  ObjCmd[i].xProc,
24f00 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65   aObjCmd[i].clie
24f10 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a  ntData, 0);.  }.
24f20 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
24f30 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 65  terp, "sqlite_se
24f40 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  arch_count", .  
24f50 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
24f60 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
24f70 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
24f80 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
24f90 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66  nterp, "sqlite_f
24fa0 6f 75 6e 64 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  ound_count", .  
24fb0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
24fc0 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 2c  te3_found_count,
24fd0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
24fe0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
24ff0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 6f  terp, "sqlite_so
25000 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  rt_count", .    
25010 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
25020 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20 54 43  3_sort_count, TC
25030 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
25040 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
25050 70 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61 78 5f  p, "sqlite3_max_
25060 62 6c 6f 62 73 69 7a 65 22 2c 20 0a 20 20 20 20  blobsize", .    
25070 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
25080 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 2c 20  3_max_blobsize, 
25090 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
250a0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
250b0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 69 6b  erp, "sqlite_lik
250c0 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20  e_count", .     
250d0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
250e0 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20 54 43 4c  _like_count, TCL
250f0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
25100 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
25110 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65 72 72  , "sqlite_interr
25120 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  upt_count", .   
25130 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
25140 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  e3_interrupt_cou
25150 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
25160 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
25170 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
25180 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
25190 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
251a0 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66  )&sqlite3_open_f
251b0 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ile_count, TCL_L
251c0 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
251d0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
251e0 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f  "sqlite_current_
251f0 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 28 63  time", .      (c
25200 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 63 75  har*)&sqlite3_cu
25210 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c 5f  rrent_time, TCL_
25220 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20 53  LINK_INT);.#if S
25230 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26  QLITE_OS_UNIX &&
25240 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
25250 5f 5f 29 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  __).  Tcl_LinkVa
25260 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
25270 65 5f 68 6f 73 74 69 64 5f 6e 75 6d 22 2c 20 0a  e_hostid_num", .
25280 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
25290 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
252a0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
252b0 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c 69  .#endif.  Tcl_Li
252c0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
252d0 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63  qlite3_xferopt_c
252e0 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
252f0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 78 66 65  ar*)&sqlite3_xfe
25300 72 6f 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  ropt_count, TCL_
25310 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
25320 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
25330 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
25340 72 65 61 64 64 62 5f 63 6f 75 6e 74 22 2c 0a 20  readdb_count",. 
25350 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
25360 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
25370 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  b_count, TCL_LIN
25380 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
25390 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
253a0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
253b0 74 65 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  tedb_count",.   
253c0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
253d0 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
253e0 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
253f0 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
25400 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
25410 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
25420 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  ej_count",.     
25430 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
25440 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
25450 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
25460 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  T);.#ifndef SQLI
25470 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
25480 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
25490 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65 64 5f 73  rp, "unaligned_s
254a0 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 22 2c 0a  tring_counter",.
254b0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 75 6e        (char*)&un
254c0 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
254d0 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c 49 4e 4b  ounter, TCL_LINK
254e0 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69  _INT);.#endif.#i
254f0 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  f defined(__linu
25500 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28  x__) && defined(
25510 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
25520 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
25530 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  E.  Tcl_LinkVar(
25540 69 6e 74 65 72 70 2c 20 22 74 68 72 65 61 64 73  interp, "threads
25550 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
25560 72 73 4c 6f 63 6b 73 22 2c 0a 20 20 20 20 20 20  rsLocks",.      
25570 28 63 68 61 72 2a 29 26 74 68 72 65 61 64 73 4f  (char*)&threadsO
25580 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
25590 73 4c 6f 63 6b 73 2c 20 54 43 4c 5f 4c 49 4e 4b  sLocks, TCL_LINK
255a0 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69  _INT);.#endif.#i
255b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
255c0 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69  T_UTF16.  Tcl_Li
255d0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
255e0 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65 65 64 65  qlite_last_neede
255f0 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20 20  d_collation",.  
25600 20 20 20 20 28 63 68 61 72 2a 29 26 70 7a 4e 65      (char*)&pzNe
25610 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 2c 20 54  ededCollation, T
25620 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54  CL_LINK_STRING|T
25630 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c  CL_LINK_READ_ONL
25640 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  Y);.#endif.#if S
25650 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 54  QLITE_OS_WIN.  T
25660 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
25670 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 79  p, "sqlite_os_ty
25680 70 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  pe",.      (char
25690 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  *)&sqlite3_os_ty
256a0 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  pe, TCL_LINK_INT
256b0 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
256c0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 54   SQLITE_TEST.  T
256d0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
256e0 70 2c 20 22 73 71 6c 69 74 65 5f 71 75 65 72 79  p, "sqlite_query
256f0 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20 28 63  _plan",.      (c
25700 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c 61 6e  har*)&query_plan
25710 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
25720 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f  G|TCL_LINK_READ_
25730 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ONLY);.#endif.#i
25740 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
25750 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  G.  Tcl_LinkVar(
25760 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
25770 61 64 64 6f 70 5f 74 72 61 63 65 22 2c 0a 20 20  addop_trace",.  
25780 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
25790 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63  te3VdbeAddopTrac
257a0 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
257b0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
257c0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
257d0 77 68 65 72 65 5f 74 72 61 63 65 22 2c 0a 20 20  where_trace",.  
257e0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
257f0 74 65 33 57 68 65 72 65 54 72 61 63 65 2c 20 54  te3WhereTrace, T
25800 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
25810 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
25820 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74  rp, "sqlite_os_t
25830 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68  race",.      (ch
25840 61 72 2a 29 26 73 71 6c 69 74 65 33 4f 53 54 72  ar*)&sqlite3OSTr
25850 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
25860 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  T);.#endif.#ifnd
25870 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
25880 49 53 4b 49 4f 0a 20 20 54 63 6c 5f 4c 69 6e 6b  ISKIO.  Tcl_Link
25890 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
258a0 69 74 65 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  ite_opentemp_cou
258b0 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
258c0 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  *)&sqlite3_opent
258d0 65 6d 70 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  emp_count, TCL_L
258e0 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
258f0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
25900 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
25910 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
25920 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
25930 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  &sqlite_static_b
25940 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c 5f 4c  ind_value, TCL_L
25950 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54  INK_STRING);.  T
25960 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
25970 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69  p, "sqlite_stati
25980 63 5f 62 69 6e 64 5f 6e 62 79 74 65 22 2c 0a 20  c_bind_nbyte",. 
25990 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
259a0 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
259b0 6e 62 79 74 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  nbyte, TCL_LINK_
259c0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
259d0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
259e0 69 74 65 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  ite_temp_directo
259f0 72 79 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ry",.      (char
25a00 2a 29 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  *)&sqlite3_temp_
25a10 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c  directory, TCL_L
25a20 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54  INK_STRING);.  T
25a30 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
25a40 70 2c 20 22 62 69 74 6d 61 73 6b 5f 73 69 7a 65  p, "bitmask_size
25a50 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
25a60 26 62 69 74 6d 61 73 6b 5f 73 69 7a 65 2c 20 54  &bitmask_size, T
25a70 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f  CL_LINK_INT|TCL_
25a80 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b  LINK_READ_ONLY);
25a90 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
25aa0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
25ab0 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  ync_count",.    
25ac0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
25ad0 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43  3_sync_count, TC
25ae0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
25af0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
25b00 70 2c 20 22 73 71 6c 69 74 65 5f 66 75 6c 6c 73  p, "sqlite_fulls
25b10 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  ync_count",.    
25b20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
25b30 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
25b40 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
25b50 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
25b60 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29  ITE_ENABLE_FTS3)
25b70 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
25b80 54 45 5f 54 45 53 54 29 0a 20 20 54 63 6c 5f 4c  TE_TEST).  Tcl_L
25b90 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
25ba0 73 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e 61 62  sqlite_fts3_enab
25bb0 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 22 2c  le_parentheses",
25bc0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
25bd0 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62  qlite3_fts3_enab
25be0 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 2c 20  le_parentheses, 
25bf0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
25c00 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
25c10 43 4c 5f 4f 4b 3b 0a 7d 0a                       CL_OK;.}.