/ Hex Artifact Content
Login

Artifact f2969f28574433743f7439da62f0cfd9063fc26b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a  te library..**.*
0220: 2a 20 24 49 64 3a 20 74 65 73 74 31 2e 63 2c 76  * $Id: test1.c,v
0230: 20 31 2e 32 36 31 20 32 30 30 37 2f 30 38 2f 31   1.261 2007/08/1
0240: 36 20 31 30 3a 30 39 3a 30 33 20 64 61 6e 69 65  6 10:09:03 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 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65   "os.h".#include
02a0: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
02b0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
02c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
02d0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72   copy of the fir
02e0: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 53  st part of the S
02f0: 71 6c 69 74 65 44 62 20 73 74 72 75 63 74 75 72  qliteDb structur
0300: 65 20 69 6e 20 0a 2a 2a 20 74 63 6c 73 71 6c 69  e in .** tclsqli
0310: 74 65 2e 63 2e 20 20 57 65 20 6e 65 65 64 20 69  te.c.  We need i
0320: 74 20 68 65 72 65 20 73 6f 20 74 68 61 74 20 74  t here so that t
0330: 68 65 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f  he get_sqlite_po
0340: 69 6e 74 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a  inter routine.**
0350: 20 63 61 6e 20 65 78 74 72 61 63 74 20 74 68 65   can extract the
0360: 20 73 71 6c 69 74 65 33 2a 20 70 6f 69 6e 74 65   sqlite3* pointe
0370: 72 20 66 72 6f 6d 20 61 6e 20 65 78 69 73 74 69  r from an existi
0380: 6e 67 20 54 63 6c 20 53 51 4c 69 74 65 0a 2a 2a  ng Tcl SQLite.**
0390: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
03a0: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20  struct SqliteDb 
03b0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
03c0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .};../*.** Conve
03d0: 72 74 20 74 65 78 74 20 67 65 6e 65 72 61 74 65  rt text generate
03e0: 64 20 62 79 20 74 68 65 20 22 25 70 22 20 63 6f  d by the "%p" co
03f0: 6e 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20  nversion format 
0400: 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20 61 20 70  back into.** a p
0410: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
0420: 63 20 69 6e 74 20 74 65 73 74 48 65 78 54 6f 49  c int testHexToI
0430: 6e 74 28 69 6e 74 20 68 29 7b 0a 20 20 69 66 28  nt(int h){.  if(
0440: 20 68 3e 3d 27 30 27 20 26 26 20 68 3c 3d 27 39   h>='0' && h<='9
0450: 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ' ){.    return 
0460: 68 20 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65  h - '0';.  }else
0470: 20 69 66 28 20 68 3e 3d 27 61 27 20 26 26 20 68   if( h>='a' && h
0480: 3c 3d 27 66 27 20 29 7b 0a 20 20 20 20 72 65 74  <='f' ){.    ret
0490: 75 72 6e 20 68 20 2d 20 27 61 27 20 2b 20 31 30  urn h - 'a' + 10
04a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
04b0: 73 73 65 72 74 28 20 68 3e 3d 27 41 27 20 26 26  ssert( h>='A' &&
04c0: 20 68 3c 3d 27 46 27 20 29 3b 0a 20 20 20 20 72   h<='F' );.    r
04d0: 65 74 75 72 6e 20 68 20 2d 20 27 41 27 20 2b 20  eturn h - 'A' + 
04e0: 31 30 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 2a  10;.  }.}.void *
04f0: 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72  sqlite3TextToPtr
0500: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0510: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 75 36  .  void *p;.  u6
0520: 34 20 76 3b 0a 20 20 75 33 32 20 76 32 3b 0a 20  4 v;.  u32 v2;. 
0530: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 30 27 20 26   if( z[0]=='0' &
0540: 26 20 7a 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20  & z[1]=='x' ){. 
0550: 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20     z += 2;.  }. 
0560: 20 76 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   v = 0;.  while(
0570: 20 2a 7a 20 29 7b 0a 20 20 20 20 76 20 3d 20 28   *z ){.    v = (
0580: 76 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  v<<4) + testHexT
0590: 6f 49 6e 74 28 2a 7a 29 3b 0a 20 20 20 20 7a 2b  oInt(*z);.    z+
05a0: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a  +;.  }.  if( siz
05b0: 65 6f 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28 76  eof(p)==sizeof(v
05c0: 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) ){.    memcpy(
05d0: 26 70 2c 20 26 76 2c 20 73 69 7a 65 6f 66 28 70  &p, &v, sizeof(p
05e0: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
05f0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
0600: 70 29 3d 3d 73 69 7a 65 6f 66 28 76 32 29 20 29  p)==sizeof(v2) )
0610: 3b 0a 20 20 20 20 76 32 20 3d 20 28 75 33 32 29  ;.    v2 = (u32)
0620: 76 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  v;.    memcpy(&p
0630: 2c 20 26 76 32 2c 20 73 69 7a 65 6f 66 28 70 29  , &v2, sizeof(p)
0640: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
0650: 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 54  p;.}.../*.** A T
0660: 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 68 61 74 20  CL command that 
0670: 72 65 74 75 72 6e 73 20 74 68 65 20 61 64 64 72  returns the addr
0680: 65 73 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ess of the sqlit
0690: 65 2a 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 66 6f  e* pointer.** fo
06a0: 72 20 61 6e 20 73 71 6c 69 74 65 20 63 6f 6e 6e  r an sqlite conn
06b0: 65 63 74 69 6f 6e 20 69 6e 73 74 61 6e 63 65 2e  ection instance.
06c0: 20 20 42 61 64 20 74 68 69 6e 67 73 20 68 61 70    Bad things hap
06d0: 70 65 6e 20 69 66 20 74 68 65 0a 2a 2a 20 69 6e  pen if the.** in
06e0: 70 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 73 71  put is not an sq
06f0: 6c 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  lite connection.
0700: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
0710: 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74 65  et_sqlite_pointe
0720: 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  r(.  void * clie
0730: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
0740: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
0750: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
0760: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
0770: 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 71  ].){.  struct Sq
0780: 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63 6c  liteDb *p;.  Tcl
0790: 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f  _CmdInfo cmdInfo
07a0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
07b0: 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0];.  if( objc!=
07c0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
07d0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
07e0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 49  , 1, objv, "SQLI
07f0: 54 45 2d 43 4f 4e 4e 45 43 54 49 4f 4e 22 29 3b  TE-CONNECTION");
0800: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
0810: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
0820: 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
0830: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c  Info(interp, Tcl
0840: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
0850: 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  1]), &cmdInfo) )
0860: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
0870: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
0880: 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e  command not foun
0890: 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
08a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
08b0: 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29  bjv[1]), (char*)
08c0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
08d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
08e0: 70 20 3d 20 28 73 74 72 75 63 74 20 53 71 6c 69  p = (struct Sqli
08f0: 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62  teDb*)cmdInfo.ob
0900: 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 73  jClientData;.  s
0910: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 70  printf(zBuf, "%p
0920: 22 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 69 66 28  ", p->db);.  if(
0930: 20 73 74 72 6e 63 6d 70 28 7a 42 75 66 2c 22 30   strncmp(zBuf,"0
0940: 78 22 2c 32 29 20 29 7b 0a 20 20 20 20 73 70 72  x",2) ){.    spr
0950: 69 6e 74 66 28 7a 42 75 66 2c 20 22 30 78 25 70  intf(zBuf, "0x%p
0960: 22 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20  ", p->db);.  }. 
0970: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0980: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
0990: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
09a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
09b0: 63 6f 64 65 20 61 20 70 6f 69 6e 74 65 72 20 74  code a pointer t
09c0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 20 6f 62 6a  o an sqlite3 obj
09d0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
09e0: 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  nt getDbPointer(
09f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0a00: 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  rp, const char *
0a10: 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  zA, sqlite3 **pp
0a20: 44 62 29 7b 0a 20 20 73 74 72 75 63 74 20 53 71  Db){.  struct Sq
0a30: 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63 6c  liteDb *p;.  Tcl
0a40: 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f  _CmdInfo cmdInfo
0a50: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43  ;.  if( Tcl_GetC
0a60: 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72  ommandInfo(inter
0a70: 70 2c 20 7a 41 2c 20 26 63 6d 64 49 6e 66 6f 29  p, zA, &cmdInfo)
0a80: 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 73 74 72   ){.    p = (str
0a90: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
0aa0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
0ab0: 61 74 61 3b 0a 20 20 20 20 2a 70 70 44 62 20 3d  ata;.    *ppDb =
0ac0: 20 70 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 7b   p->db;.  }else{
0ad0: 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 28 73 71  .    *ppDb = (sq
0ae0: 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 54 65  lite3*)sqlite3Te
0af0: 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20 7d  xtToPtr(zA);.  }
0b00: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
0b10: 3b 0a 7d 0a 0a 0a 63 6f 6e 73 74 20 63 68 61 72  ;.}...const char
0b20: 20 2a 73 71 6c 69 74 65 33 54 65 73 74 45 72 72   *sqlite3TestErr
0b30: 6f 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a  orName(int rc){.
0b40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
0b50: 61 6d 65 20 3d 20 30 3b 0a 20 20 73 77 69 74 63  ame = 0;.  switc
0b60: 68 28 20 72 63 20 26 20 30 78 66 66 20 29 7b 0a  h( rc & 0xff ){.
0b70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0b80: 4f 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  OK:         zNam
0b90: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b  e = "SQLITE_OK";
0ba0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
0bb0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0bc0: 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 7a 4e 61  _ERROR:      zNa
0bd0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52  me = "SQLITE_ERR
0be0: 4f 52 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  OR";       break
0bf0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0c00: 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 7a 4e  E_PERM:       zN
0c10: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45  ame = "SQLITE_PE
0c20: 52 4d 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  RM";        brea
0c30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0c40: 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 7a  TE_ABORT:      z
0c50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
0c60: 42 4f 52 54 22 3b 20 20 20 20 20 20 20 62 72 65  BORT";       bre
0c70: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0c80: 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20  ITE_BUSY:       
0c90: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0ca0: 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 62 72  BUSY";        br
0cb0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0cc0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20  LITE_LOCKED:    
0cd0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0ce0: 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 62  _LOCKED";      b
0cf0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0d00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20  QLITE_NOMEM:    
0d10: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0d20: 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  E_NOMEM";       
0d30: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0d40: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a  SQLITE_READONLY:
0d50: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0d60: 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20  TE_READONLY";   
0d70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0d80: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
0d90: 54 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  T:  zName = "SQL
0da0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20  ITE_INTERRUPT"; 
0db0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0dc0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20  e SQLITE_IOERR: 
0dd0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
0de0: 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20  LITE_IOERR";    
0df0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0e00: 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  se SQLITE_CORRUP
0e10: 54 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  T:    zName = "S
0e20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20  QLITE_CORRUPT"; 
0e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0e40: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a  ase SQLITE_FULL:
0e50: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0e60: 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20  SQLITE_FULL";   
0e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0e80: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
0e90: 4f 50 45 4e 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  OPEN:   zName = 
0ea0: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
0eb0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
0ec0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f   case SQLITE_PRO
0ed0: 54 4f 43 4f 4c 3a 20 20 20 7a 4e 61 6d 65 20 3d  TOCOL:   zName =
0ee0: 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   "SQLITE_PROTOCO
0ef0: 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  L";    break;.  
0f00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d    case SQLITE_EM
0f10: 50 54 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  PTY:      zName 
0f20: 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22  = "SQLITE_EMPTY"
0f30: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
0f40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
0f50: 43 48 45 4d 41 3a 20 20 20 20 20 7a 4e 61 6d 65  CHEMA:     zName
0f60: 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d   = "SQLITE_SCHEM
0f70: 41 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  A";      break;.
0f80: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0f90: 43 4f 4e 53 54 52 41 49 4e 54 3a 20 7a 4e 61 6d  CONSTRAINT: zNam
0fa0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
0fb0: 54 52 41 49 4e 54 22 3b 20 20 62 72 65 61 6b 3b  TRAINT";  break;
0fc0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0fd0: 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 7a 4e 61  _MISMATCH:   zNa
0fe0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53  me = "SQLITE_MIS
0ff0: 4d 41 54 43 48 22 3b 20 20 20 20 62 72 65 61 6b  MATCH";    break
1000: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1010: 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 7a 4e  E_MISUSE:     zN
1020: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
1030: 53 55 53 45 22 3b 20 20 20 20 20 20 62 72 65 61  SUSE";      brea
1040: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1050: 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 7a  TE_NOLFS:      z
1060: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
1070: 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 62 72 65  OLFS";       bre
1080: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1090: 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20  ITE_AUTH:       
10a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
10b0: 41 55 54 48 22 3b 20 20 20 20 20 20 20 20 62 72  AUTH";        br
10c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
10d0: 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20  LITE_FORMAT:    
10e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
10f0: 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 62  _FORMAT";      b
1100: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1110: 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20  QLITE_RANGE:    
1120: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
1130: 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20  E_RANGE";       
1140: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1150: 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20  SQLITE_ROW:     
1160: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1170: 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20  TE_ROW";        
1180: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1190: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20   SQLITE_DONE:   
11a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
11b0: 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20  ITE_DONE";      
11c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11d0: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a  e SQLITE_NOTADB:
11e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
11f0: 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20  LITE_NOTADB";   
1200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
1210: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
1220: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
1230: 51 4c 49 54 45 5f 55 6e 6b 6e 6f 77 6e 22 3b 20  QLITE_Unknown"; 
1240: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
1250: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
1260: 0a 23 64 65 66 69 6e 65 20 74 31 45 72 72 6f 72  .#define t1Error
1270: 4e 61 6d 65 20 73 71 6c 69 74 65 33 54 65 73 74  Name sqlite3Test
1280: 45 72 72 6f 72 4e 61 6d 65 0a 0a 2f 2a 0a 2a 2a  ErrorName../*.**
1290: 20 43 6f 6e 76 65 72 74 20 61 6e 20 73 71 6c 69   Convert an sqli
12a0: 74 65 33 5f 73 74 6d 74 2a 20 69 6e 74 6f 20 61  te3_stmt* into a
12b0: 6e 20 73 71 6c 69 74 65 33 2a 2e 20 20 54 68 69  n sqlite3*.  Thi
12c0: 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  s depends on the
12d0: 0a 2a 2a 20 66 61 63 74 20 74 68 61 74 20 74 68  .** fact that th
12e0: 65 20 73 71 6c 69 74 65 33 2a 20 69 73 20 74 68  e sqlite3* is th
12f0: 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 6e  e first field in
1300: 20 74 68 65 20 56 64 62 65 20 73 74 72 75 63 74   the Vdbe struct
1310: 75 72 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ure..*/.#define 
1320: 53 74 6d 74 54 6f 44 62 28 58 29 20 20 20 73 71  StmtToDb(X)   sq
1330: 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28  lite3_db_handle(
1340: 58 29 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  X)../*.** Check 
1350: 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 74  a return value t
1360: 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 61  o make sure it a
1370: 67 72 65 65 73 20 77 69 74 68 20 74 68 65 20 72  grees with the r
1380: 65 73 75 6c 74 73 0a 2a 2a 20 66 72 6f 6d 20 73  esults.** from s
1390: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 2e 0a  qlite3_errcode..
13a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65  */.int sqlite3Te
13b0: 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f 49 6e  stErrCode(Tcl_In
13c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 73 71  terp *interp, sq
13d0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 72  lite3 *db, int r
13e0: 63 29 7b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  c){.  if( rc!=SQ
13f0: 4c 49 54 45 5f 4d 49 53 55 53 45 20 26 26 20 72  LITE_MISUSE && r
1400: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1410: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
1420: 64 62 29 21 3d 72 63 20 29 7b 0a 20 20 20 20 63  db)!=rc ){.    c
1430: 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
1440: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
1450: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
1460: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
1470: 66 2c 20 22 65 72 72 6f 72 20 63 6f 64 65 20 25  f, "error code %
1480: 73 20 28 25 64 29 20 64 6f 65 73 20 6e 6f 74 20  s (%d) does not 
1490: 6d 61 74 63 68 20 73 71 6c 69 74 65 33 5f 65 72  match sqlite3_er
14a0: 72 63 6f 64 65 20 25 73 20 28 25 64 29 22 2c 0a  rcode %s (%d)",.
14b0: 20 20 20 20 20 20 20 74 31 45 72 72 6f 72 4e 61         t1ErrorNa
14c0: 6d 65 28 72 63 29 2c 20 72 63 2c 20 74 31 45 72  me(rc), rc, t1Er
14d0: 72 6f 72 4e 61 6d 65 28 72 32 29 2c 20 72 32 29  rorName(r2), r2)
14e0: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  ;.    Tcl_ResetR
14f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
1500: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1510: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1520: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1530: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
1540: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63   0;.}../*.** Dec
1550: 6f 64 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ode a pointer to
1560: 20 61 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   an sqlite3_stmt
1570: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
1580: 69 63 20 69 6e 74 20 67 65 74 53 74 6d 74 50 6f  ic int getStmtPo
1590: 69 6e 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74  inter(.  Tcl_Int
15a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20  erp *interp, .  
15b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
15c0: 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ,  .  sqlite3_st
15d0: 6d 74 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20  mt **ppStmt.){. 
15e0: 20 2a 70 70 53 74 6d 74 20 3d 20 28 73 71 6c 69   *ppStmt = (sqli
15f0: 74 65 33 5f 73 74 6d 74 2a 29 73 71 6c 69 74 65  te3_stmt*)sqlite
1600: 33 54 65 78 74 54 6f 50 74 72 28 7a 41 72 67 29  3TextToPtr(zArg)
1610: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1620: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
1630: 64 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  de a pointer to 
1640: 61 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  an sqlite3_stmt 
1650: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
1660: 63 20 69 6e 74 20 67 65 74 46 69 6c 65 50 6f 69  c int getFilePoi
1670: 6e 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74 65  nter(.  Tcl_Inte
1680: 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63  rp *interp, .  c
1690: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c  onst char *zArg,
16a0: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    .  sqlite3_fil
16b0: 65 20 2a 2a 70 70 46 69 6c 65 0a 29 7b 0a 20 20  e **ppFile.){.  
16c0: 2a 70 70 46 69 6c 65 20 3d 20 28 73 71 6c 69 74  *ppFile = (sqlit
16d0: 65 33 5f 66 69 6c 65 2a 29 73 71 6c 69 74 65 33  e3_file*)sqlite3
16e0: 54 65 78 74 54 6f 50 74 72 28 7a 41 72 67 29 3b  TextToPtr(zArg);
16f0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1710: 61 74 65 20 61 20 74 65 78 74 20 72 65 70 72 65  ate a text repre
1720: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 70  sentation of a p
1730: 6f 69 6e 74 65 72 20 74 68 61 74 20 63 61 6e 20  ointer that can 
1740: 62 65 20 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a  be understood.**
1750: 20 62 79 20 74 68 65 20 67 65 74 44 62 50 6f 69   by the getDbPoi
1760: 6e 74 65 72 20 61 6e 64 20 67 65 74 56 6d 50 6f  nter and getVmPo
1770: 69 6e 74 65 72 20 72 6f 75 74 69 6e 65 73 20 61  inter routines a
1780: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bove..**.** The 
1790: 70 72 6f 62 6c 65 6d 20 69 73 2c 20 6f 6e 20 73  problem is, on s
17a0: 6f 6d 65 20 6d 61 63 68 69 6e 65 73 20 28 53 6f  ome machines (So
17b0: 6c 61 72 69 73 29 20 69 66 20 79 6f 75 20 64 6f  laris) if you do
17c0: 20 61 20 70 72 69 6e 74 66 20 77 69 74 68 0a 2a   a printf with.*
17d0: 2a 20 22 25 70 22 20 79 6f 75 20 63 61 6e 6e 6f  * "%p" you canno
17e0: 74 20 74 75 72 6e 20 61 72 6f 75 6e 64 20 61 6e  t turn around an
17f0: 64 20 64 6f 20 61 20 73 63 61 6e 66 20 77 69 74  d do a scanf wit
1800: 68 20 74 68 65 20 73 61 6d 65 20 22 25 70 22 20  h the same "%p" 
1810: 61 6e 64 0a 2a 2a 20 67 65 74 20 79 6f 75 72 20  and.** get your 
1820: 70 6f 69 6e 74 65 72 20 62 61 63 6b 2e 20 20 59  pointer back.  Y
1830: 6f 75 20 68 61 76 65 20 74 6f 20 70 72 65 70 65  ou have to prepe
1840: 6e 64 20 61 20 22 30 78 22 20 62 65 66 6f 72 65  nd a "0x" before
1850: 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 77 6f 72 6b   it will.** work
1860: 2e 20 20 4f 72 20 61 74 20 6c 65 61 73 74 20 74  .  Or at least t
1870: 68 61 74 20 69 73 20 77 68 61 74 20 69 73 20 72  hat is what is r
1880: 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 28 64  eported to me (d
1890: 72 68 29 2e 20 20 42 75 74 20 74 68 69 73 0a 2a  rh).  But this.*
18a0: 2a 20 62 65 68 61 76 69 6f 72 20 76 61 72 69 65  * behavior varie
18b0: 73 20 66 72 6f 6d 20 6d 61 63 68 69 6e 65 20 74  s from machine t
18c0: 6f 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20  o machine.  The 
18d0: 73 6f 6c 75 74 69 6f 6e 20 75 73 65 64 20 68 65  solution used he
18e0: 72 20 69 73 0a 2a 2a 20 74 6f 20 74 65 73 74 20  r is.** to test 
18f0: 74 68 65 20 73 74 72 69 6e 67 20 72 69 67 68 74  the string right
1900: 20 61 66 74 65 72 20 69 74 20 69 73 20 67 65 6e   after it is gen
1910: 65 72 61 74 65 64 20 74 6f 20 73 65 65 20 69 66  erated to see if
1920: 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 75 6e   it can be.** un
1930: 64 65 72 73 74 6f 6f 64 20 62 79 20 73 63 61 6e  derstood by scan
1940: 66 2c 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 74  f, and if not, t
1950: 72 79 20 70 72 65 70 65 6e 64 69 6e 67 20 61 6e  ry prepending an
1960: 20 22 30 78 22 20 74 6f 20 73 65 65 20 69 66 0a   "0x" to see if.
1970: 2a 2a 20 74 68 61 74 20 68 65 6c 70 73 2e 20 20  ** that helps.  
1980: 49 66 20 6e 6f 74 68 69 6e 67 20 77 6f 72 6b 73  If nothing works
1990: 2c 20 61 20 66 61 74 61 6c 20 65 72 72 6f 72 20  , a fatal error 
19a0: 69 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f  is generated..*/
19b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74  .int sqlite3Test
19c0: 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54  MakePointerStr(T
19d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19e0: 70 2c 20 63 68 61 72 20 2a 7a 50 74 72 2c 20 76  p, char *zPtr, v
19f0: 6f 69 64 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  oid *p){.  sqlit
1a00: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
1a10: 20 7a 50 74 72 2c 20 22 25 70 22 2c 20 70 29 3b   zPtr, "%p", p);
1a20: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
1a40: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
1a50: 66 6f 72 20 73 71 6c 69 74 65 33 5f 65 78 65 63  for sqlite3_exec
1a60: 5f 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 73 74  _printf()..*/.st
1a70: 61 74 69 63 20 69 6e 74 20 65 78 65 63 5f 70 72  atic int exec_pr
1a80: 69 6e 74 66 5f 63 62 28 76 6f 69 64 20 2a 70 41  intf_cb(void *pA
1a90: 72 67 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68  rg, int argc, ch
1aa0: 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20  ar **argv, char 
1ab0: 2a 2a 6e 61 6d 65 29 7b 0a 20 20 54 63 6c 5f 44  **name){.  Tcl_D
1ac0: 53 74 72 69 6e 67 20 2a 73 74 72 20 3d 20 28 54  String *str = (T
1ad0: 63 6c 5f 44 53 74 72 69 6e 67 2a 29 70 41 72 67  cl_DString*)pArg
1ae0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
1af0: 28 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e  ( Tcl_DStringLen
1b00: 67 74 68 28 73 74 72 29 3d 3d 30 20 29 7b 0a 20  gth(str)==0 ){. 
1b10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72     for(i=0; i<ar
1b20: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gc; i++){.      
1b30: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
1b40: 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c 20 6e 61  dElement(str, na
1b50: 6d 65 5b 69 5d 20 3f 20 6e 61 6d 65 5b 69 5d 20  me[i] ? name[i] 
1b60: 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d  : "NULL");.    }
1b70: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1b80: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
1b90: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
1ba0: 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c 20  endElement(str, 
1bb0: 61 72 67 76 5b 69 5d 20 3f 20 61 72 67 76 5b 69  argv[i] ? argv[i
1bc0: 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 7d  ] : "NULL");.  }
1bd0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1be0: 2f 2a 0a 2a 2a 20 54 68 65 20 49 2f 4f 20 74 72  /*.** The I/O tr
1bf0: 61 63 69 6e 67 20 63 61 6c 6c 62 61 63 6b 2e 0a  acing callback..
1c00: 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  */.static FILE *
1c10: 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 30  iotrace_file = 0
1c20: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6f  ;.static void io
1c30: 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 28  _trace_callback(
1c40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
1c50: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
1c60: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
1c70: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
1c80: 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 69 6f 74  ;.  vfprintf(iot
1c90: 72 61 63 65 5f 66 69 6c 65 2c 20 7a 46 6f 72 6d  race_file, zForm
1ca0: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
1cb0: 64 28 61 70 29 3b 0a 20 20 66 66 6c 75 73 68 28  d(ap);.  fflush(
1cc0: 69 6f 74 72 61 63 65 5f 66 69 6c 65 29 3b 0a 7d  iotrace_file);.}
1cd0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1ce0: 69 6f 5f 74 72 61 63 65 20 46 49 4c 45 4e 41 4d  io_trace FILENAM
1cf0: 45 0a 2a 2a 0a 2a 2a 20 54 75 72 6e 20 49 2f 4f  E.**.** Turn I/O
1d00: 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f   tracing on or o
1d10: 66 66 2e 20 20 49 66 20 46 49 4c 45 4e 41 4d 45  ff.  If FILENAME
1d20: 20 69 73 20 6e 6f 74 20 61 6e 20 65 6d 70 74 79   is not an empty
1d30: 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 49 2f 4f 20   string,.** I/O 
1d40: 74 72 61 63 69 6e 67 20 62 65 67 69 6e 73 20 67  tracing begins g
1d50: 6f 69 6e 67 20 69 6e 74 6f 20 46 49 4c 45 4e 41  oing into FILENA
1d60: 4d 45 2e 20 49 66 20 46 49 4c 45 4e 41 4d 45 20  ME. If FILENAME 
1d70: 69 73 20 61 6e 20 65 6d 70 74 79 0a 2a 2a 20 73  is an empty.** s
1d80: 74 72 69 6e 67 2c 20 49 2f 4f 20 74 72 61 63 69  tring, I/O traci
1d90: 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  ng is turned off
1da0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1db0: 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 28 0a 20  test_io_trace(. 
1dc0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
1dd0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1de0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1df0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1e00: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1e10: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1e20: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
1e30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e40: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1e50: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
1e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
1e70: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
1e80: 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 61 72  t */.){.  if( ar
1e90: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
1ea0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1eb0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1ec0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1ed0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
1ee0: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
1ef0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
1f00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1f10: 20 20 7d 0a 20 20 69 66 28 20 69 6f 74 72 61 63    }.  if( iotrac
1f20: 65 5f 66 69 6c 65 20 29 7b 0a 20 20 20 20 69 66  e_file ){.    if
1f30: 28 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 21 3d  ( iotrace_file!=
1f40: 73 74 64 6f 75 74 20 26 26 20 69 6f 74 72 61 63  stdout && iotrac
1f50: 65 5f 66 69 6c 65 21 3d 73 74 64 65 72 72 20 29  e_file!=stderr )
1f60: 7b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69  {.      fclose(i
1f70: 6f 74 72 61 63 65 5f 66 69 6c 65 29 3b 0a 20 20  otrace_file);.  
1f80: 20 20 7d 0a 20 20 20 20 69 6f 74 72 61 63 65 5f    }.    iotrace_
1f90: 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  file = 0;.    sq
1fa0: 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 20 3d  lite3_io_trace =
1fb0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72   0;.  }.  if( ar
1fc0: 67 76 5b 31 5d 5b 30 5d 20 29 7b 0a 20 20 20 20  gv[1][0] ){.    
1fd0: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
1fe0: 31 5d 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20  1],"stdout")==0 
1ff0: 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65  ){.      iotrace
2000: 5f 66 69 6c 65 20 3d 20 73 74 64 6f 75 74 3b 0a  _file = stdout;.
2010: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
2020: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74  rcmp(argv[1],"st
2030: 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  derr")==0 ){.   
2040: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
2050: 3d 20 73 74 64 65 72 72 3b 0a 20 20 20 20 7d 65  = stderr;.    }e
2060: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  lse{.      iotra
2070: 63 65 5f 66 69 6c 65 20 3d 20 66 6f 70 65 6e 28  ce_file = fopen(
2080: 61 72 67 76 5b 31 5d 2c 20 22 77 22 29 3b 0a 20  argv[1], "w");. 
2090: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
20a0: 5f 69 6f 5f 74 72 61 63 65 20 3d 20 69 6f 5f 74  _io_trace = io_t
20b0: 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 3b 0a 20  race_callback;. 
20c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
20d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
20e0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
20f0: 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42  _exec_printf  DB
2100: 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47    FORMAT  STRING
2110: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
2120: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70  e sqlite3_exec_p
2130: 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63  rintf() interfac
2140: 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e  e using the open
2150: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e   database.** DB.
2160: 20 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65    The SQL is the
2170: 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20   string FORMAT. 
2180: 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   The format stri
2190: 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  ng should contai
21a0: 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25  n.** one %s or %
21b0: 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68  q.  STRING is th
21c0: 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64  e value inserted
21d0: 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a   into %s or %q..
21e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
21f0: 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a  st_exec_printf(.
2200: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
2210: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2220: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2230: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2240: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2250: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2260: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
2270: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2280: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2290: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
22a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
22b0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
22c0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
22d0: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
22e0: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
22f0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
2300: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
2310: 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  Sql;.  char zBuf
2320: 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63  [30];.  if( argc
2330: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
2340: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2350: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2360: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2370: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
2380: 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53     " DB FORMAT S
2390: 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20  TRING", 0);.    
23a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
23c0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
23d0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
23e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23f0: 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  R;.  Tcl_DString
2400: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53  Init(&str);.  zS
2410: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
2420: 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 20 61 72  intf(argv[2], ar
2430: 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[3]);.  rc = s
2440: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2450: 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74  zSql, exec_print
2460: 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72  f_cb, &str, &zEr
2470: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
2480: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69  ee(zSql);.  spri
2490: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
24a0: 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rc);.  Tcl_Appen
24b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
24c0: 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
24d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
24e0: 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rp, rc==SQLITE_O
24f0: 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  K ? Tcl_DStringV
2500: 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72  alue(&str) : zEr
2510: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
2520: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69  gFree(&str);.  i
2530: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
2540: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
2550: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
2560: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
2570: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
2580: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
2590: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
25a0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
25b0: 69 74 65 33 5f 65 78 65 63 20 20 44 42 20 20 53  ite3_exec  DB  S
25c0: 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  QL.**.** Invoke 
25d0: 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63  the sqlite3_exec
25e0: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
25f0: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
2600: 73 65 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20  se DB.*/.static 
2610: 69 6e 74 20 74 65 73 74 5f 65 78 65 63 28 0a 20  int test_exec(. 
2620: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
2630: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2640: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2650: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2660: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2670: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2680: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
2690: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
26a0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
26b0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
26c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
26d0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
26e0: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
26f0: 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74  3 *db;.  Tcl_DSt
2700: 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20  ring str;.  int 
2710: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
2720: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53   = 0;.  char *zS
2730: 71 6c 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ql;.  int i, j;.
2740: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
2750: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
2760: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2770: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2780: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
2790: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
27a0: 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20  v[0], .       " 
27b0: 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20  DB SQL", 0);.   
27c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27d0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
27e0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
27f0: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
2800: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2810: 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  OR;.  Tcl_DStrin
2820: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a  gInit(&str);.  z
2830: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
2840: 72 69 6e 74 66 28 22 25 73 22 2c 20 61 72 67 76  rintf("%s", argv
2850: 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  [2]);.  for(i=j=
2860: 30 3b 20 7a 53 71 6c 5b 69 5d 3b 29 7b 0a 20 20  0; zSql[i];){.  
2870: 20 20 69 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d 27    if( zSql[i]=='
2880: 25 27 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  %' ){.      zSql
2890: 5b 6a 2b 2b 5d 20 3d 20 28 74 65 73 74 48 65 78  [j++] = (testHex
28a0: 54 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 31 5d 29  ToInt(zSql[i+1])
28b0: 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54 6f  <<4) + testHexTo
28c0: 49 6e 74 28 7a 53 71 6c 5b 69 2b 32 5d 29 3b 0a  Int(zSql[i+2]);.
28d0: 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20 20        i += 3;.  
28e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
28f0: 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 7a 53 71 6c 5b  Sql[j++] = zSql[
2900: 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  i++];.    }.  }.
2910: 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
2920: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2930: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65  ec(db, zSql, exe
2940: 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74  c_printf_cb, &st
2950: 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c  r, &zErr);.  sql
2960: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2970: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
2980: 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63   "%d", rc);.  Tc
2990: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
29a0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
29b0: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
29c0: 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53  nt(interp, rc==S
29d0: 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44  QLITE_OK ? Tcl_D
29e0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
29f0: 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c  ) : zErr);.  Tcl
2a00: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
2a10: 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29  r);.  if( zErr )
2a20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
2a30: 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rr);.  if( sqlit
2a40: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
2a50: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
2a60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2a70: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2a80: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
2a90: 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  e:  sqlite3_exec
2aa0: 5f 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a  _nr  DB  SQL.**.
2ab0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
2ac0: 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72  lite3_exec inter
2ad0: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
2ae0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 2e  pen database DB.
2af0: 20 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c 6c    Discard.** all
2b00: 20 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61 74   results.*/.stat
2b10: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63  ic int test_exec
2b20: 5f 6e 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  _nr(.  void *Not
2b30: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2b40: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2b50: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2b60: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2b70: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2b80: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ba0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2bb0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
2bc0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
2bd0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
2be0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
2bf0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
2c00: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
2c10: 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  Err = 0;.  if( a
2c20: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
2c30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2c40: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
2c50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
2c60: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
2c70: 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c        " DB SQL",
2c80: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2c90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ca0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2cb0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2cc0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2cd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
2ce0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2cf0: 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20  db, argv[2], 0, 
2d00: 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28  0, &zErr);.  if(
2d10: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
2d20: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
2d30: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
2d40: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
2d50: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2d60: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
2d70: 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74  3_mprintf_z_test
2d80: 20 20 53 45 50 41 52 41 54 4f 52 20 20 41 52 47    SEPARATOR  ARG
2d90: 30 20 20 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a  0  ARG1 ....**.*
2da0: 2a 20 54 65 73 74 20 74 68 65 20 25 7a 20 66 6f  * Test the %z fo
2db0: 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 4d 50  rmat of sqliteMP
2dc0: 72 69 6e 74 66 28 29 2e 20 20 55 73 65 20 6d 75  rintf().  Use mu
2dd0: 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74 66 28 29  ltiple mprintf()
2de0: 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f   calls to .** co
2df0: 6e 63 61 74 65 6e 61 74 65 20 61 72 67 30 20 74  ncatenate arg0 t
2e00: 68 72 6f 75 67 68 20 61 72 67 6e 20 75 73 69 6e  hrough argn usin
2e10: 67 20 73 65 70 61 72 61 74 6f 72 20 61 73 20 74  g separator as t
2e20: 68 65 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2a  he separator..**
2e30: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
2e40: 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lt..*/.static in
2e50: 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 7a  t test_mprintf_z
2e60: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
2e70: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
2e80: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2e90: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2ea0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2eb0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2ec0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
2ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ee0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2ef0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f10: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
2f20: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ment */.){.  cha
2f30: 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a  r *zResult = 0;.
2f40: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28    int i;..  for(
2f50: 69 3d 32 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=2; i<argc; i++
2f60: 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d  ){.    zResult =
2f70: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
2f80: 30 2c 20 22 25 7a 25 73 25 73 22 2c 20 7a 52 65  0, "%z%s%s", zRe
2f90: 73 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61  sult, argv[1], a
2fa0: 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54  rgv[i]);.  }.  T
2fb0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2fc0: 69 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c  interp, zResult,
2fd0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
2fe0: 72 65 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20  ree(zResult);.  
2ff0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3000: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
3010: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
3020: 6e 5f 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a  n_test  STRING.*
3030: 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e  *.** Test the %n
3040: 20 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74   format of sqlit
3050: 65 4d 50 72 69 6e 74 66 28 29 2e 20 20 52 65 74  eMPrintf().  Ret
3060: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
3070: 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73  f the.** input s
3080: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
3090: 20 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74   int test_mprint
30a0: 66 5f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  f_n(.  void *Not
30b0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
30c0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
30d0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
30e0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
30f0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
3100: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
3110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3120: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
3130: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
3140: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
3150: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
3160: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
3170: 63 68 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e  char *zStr;.  in
3180: 74 20 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20  t n = 0;.  zStr 
3190: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
31a0: 28 30 2c 20 22 25 73 25 6e 22 2c 20 61 72 67 76  (0, "%s%n", argv
31b0: 5b 31 5d 2c 20 26 6e 29 3b 0a 20 20 73 71 6c 69  [1], &n);.  sqli
31c0: 74 65 33 5f 66 72 65 65 28 7a 53 74 72 29 3b 0a  te3_free(zStr);.
31d0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
31e0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
31f0: 65 77 49 6e 74 4f 62 6a 28 6e 29 29 3b 0a 20 20  ewIntObj(n));.  
3200: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3210: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
3220: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
3230: 5f 69 6e 74 20 20 53 49 5a 45 20 46 4f 52 4d 41  _int  SIZE FORMA
3240: 54 20 20 49 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73  T  INT.**.** Tes
3250: 74 20 74 68 65 20 6f 66 20 73 71 6c 69 74 65 33  t the of sqlite3
3260: 5f 73 6e 70 72 69 6e 74 66 28 29 20 72 6f 75 74  _snprintf() rout
3270: 69 6e 65 2e 20 20 53 49 5a 45 20 69 73 20 74 68  ine.  SIZE is th
3280: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
3290: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
32a0: 6e 20 62 79 74 65 73 2e 20 20 54 68 65 20 6d 61  n bytes.  The ma
32b0: 78 69 6d 75 6d 20 73 69 7a 65 20 69 73 20 31 30  ximum size is 10
32c0: 30 2e 20 20 46 4f 52 4d 41 54 20 69 73 20 74 68  0.  FORMAT is th
32d0: 65 0a 2a 2a 20 66 6f 72 6d 61 74 20 73 74 72 69  e.** format stri
32e0: 6e 67 2e 20 20 49 4e 54 20 69 73 20 61 20 73 69  ng.  INT is a si
32f0: 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67  ngle integer arg
3300: 75 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 4d  ument.  The FORM
3310: 41 54 0a 2a 2a 20 73 74 72 69 6e 67 20 6d 75 73  AT.** string mus
3320: 74 20 72 65 71 75 69 72 65 20 6e 6f 20 6d 6f 72  t require no mor
3330: 65 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 20  e than this one 
3340: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
3350: 2e 20 20 49 66 0a 2a 2a 20 59 6f 75 20 70 61 73  .  If.** You pas
3360: 73 20 69 6e 20 61 20 66 6f 72 6d 61 74 20 73 74  s in a format st
3370: 72 69 6e 67 20 74 68 61 74 20 72 65 71 75 69 72  ring that requir
3380: 65 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  es more than one
3390: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61   argument,.** ba
33a0: 64 20 74 68 69 6e 67 73 20 77 69 6c 6c 20 68 61  d things will ha
33b0: 70 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ppen..*/.static 
33c0: 69 6e 74 20 74 65 73 74 5f 73 6e 70 72 69 6e 74  int test_snprint
33d0: 66 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e  f_int(.  void *N
33e0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
33f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
3400: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
3410: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
3420: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
3430: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3450: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
3460: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
3470: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
3480: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3490: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
34a0: 20 20 63 68 61 72 20 7a 53 74 72 5b 31 30 30 5d    char zStr[100]
34b0: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 61 74 6f 69  ;.  int n = atoi
34c0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 63 6f 6e  (argv[1]);.  con
34d0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
34e0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 69 6e   = argv[2];.  in
34f0: 74 20 61 31 20 3d 20 61 74 6f 69 28 61 72 67 76  t a1 = atoi(argv
3500: 5b 33 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 73 69  [3]);.  if( n>si
3510: 7a 65 6f 66 28 7a 53 74 72 29 20 29 20 6e 20 3d  zeof(zStr) ) n =
3520: 20 73 69 7a 65 6f 66 28 7a 53 74 72 29 3b 0a 20   sizeof(zStr);. 
3530: 20 73 74 72 63 70 79 28 7a 53 74 72 2c 20 22 61   strcpy(zStr, "a
3540: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
3550: 72 73 74 75 76 77 78 79 7a 22 29 3b 0a 20 20 73  rstuvwxyz");.  s
3560: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3570: 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d 61 74  n, zStr, zFormat
3580: 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41 70 70  , a1);.  Tcl_App
3590: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
35a0: 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20 72 65  , zStr, 0);.  re
35b0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
35c0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
35d0: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
35e0: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
35f0: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
3600: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
3610: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
3620: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
3630: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
3640: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
3650: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
3660: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
3670: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
3680: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
3690: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
36a0: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
36b0: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
36c0: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
36d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
36e0: 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e  t_get_table_prin
36f0: 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  tf(.  void *NotU
3700: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
3710: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
3720: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
3730: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
3740: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3750: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3770: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3780: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
3790: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
37a0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
37b0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
37c0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63  qlite3 *db;.  Tc
37d0: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
37e0: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
37f0: 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74  *zErr = 0;.  int
3800: 20 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63   nRow, nCol;.  c
3810: 68 61 72 20 2a 2a 61 52 65 73 75 6c 74 3b 0a 20  har **aResult;. 
3820: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a   int i;.  char z
3830: 42 75 66 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20  Buf[30];.  char 
3840: 2a 7a 53 71 6c 3b 0a 20 20 69 66 28 20 61 72 67  *zSql;.  if( arg
3850: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
3860: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
3870: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
3880: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
3890: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
38a0: 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20      " DB FORMAT 
38b0: 53 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20  STRING", 0);.   
38c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
38d0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
38e0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
38f0: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
3900: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
3910: 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  OR;.  Tcl_DStrin
3920: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a  gInit(&str);.  z
3930: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
3940: 72 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 61 72  rintf(argv[2],ar
3950: 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[3]);.  rc = s
3960: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
3970: 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73  (db, zSql, &aRes
3980: 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f  ult, &nRow, &nCo
3990: 6c 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c  l, &zErr);.  sql
39a0: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
39b0: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
39c0: 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63   "%d", rc);.  Tc
39d0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
39e0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
39f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3a00: 4f 4b 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  OK ){.    sprint
3a10: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 52  f(zBuf, "%d", nR
3a20: 6f 77 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ow);.    Tcl_App
3a30: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3a40: 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 73 70  p, zBuf);.    sp
3a50: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
3a60: 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 54 63 6c  , nCol);.    Tcl
3a70: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
3a80: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
3a90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 52    for(i=0; i<(nR
3aa0: 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 20 69 2b 2b 29  ow+1)*nCol; i++)
3ab0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
3ac0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3ad0: 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20 61  , aResult[i] ? a
3ae0: 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55 4c  Result[i] : "NUL
3af0: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  L");.    }.  }el
3b00: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  se{.    Tcl_Appe
3b10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3b20: 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73  , zErr);.  }.  s
3b30: 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c  qlite3_free_tabl
3b40: 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69 66  e(aResult);.  if
3b50: 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33  ( zErr ) sqlite3
3b60: 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69  _free(zErr);.  i
3b70: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
3b80: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
3b90: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
3ba0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
3bb0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
3bc0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
3bd0: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
3be0: 5f 72 6f 77 69 64 20 44 42 0a 2a 2a 0a 2a 2a 20  _rowid DB.**.** 
3bf0: 52 65 74 75 72 6e 73 20 74 68 65 20 69 6e 74 65  Returns the inte
3c00: 67 65 72 20 52 4f 57 49 44 20 6f 66 20 74 68 65  ger ROWID of the
3c10: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73   most recent ins
3c20: 65 72 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ert..*/.static i
3c30: 6e 74 20 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77  nt test_last_row
3c40: 69 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  id(.  void *NotU
3c50: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
3c60: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
3c70: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
3c80: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
3c90: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3ca0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3cc0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3cd0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
3ce0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
3cf0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
3d00: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
3d10: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68  qlite3 *db;.  ch
3d20: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20  ar zBuf[30];..  
3d30: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
3d40: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
3d50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
3d60: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
3d70: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
3d80: 5d 2c 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a  ], " DB\"", 0);.
3d90: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3da0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
3db0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
3dc0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
3dd0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
3de0: 45 52 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66  ERROR;.  sprintf
3df0: 28 7a 42 75 66 2c 20 22 25 6c 6c 64 22 2c 20 73  (zBuf, "%lld", s
3e00: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
3e10: 72 74 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a 20  rt_rowid(db));. 
3e20: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
3e30: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
3e40: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
3e50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3e60: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
3e70: 5f 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a  _key DB KEY.**.*
3e80: 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20  * Set the codec 
3e90: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
3ea0: 6e 74 20 74 65 73 74 5f 6b 65 79 28 0a 20 20 76  nt test_key(.  v
3eb0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
3ec0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3ed0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
3ee0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
3ef0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
3f00: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
3f10: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
3f20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3f30: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
3f40: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
3f50: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
3f60: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
3f70: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
3f80: 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
3f90: 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e  r *zKey;.  int n
3fa0: 4b 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21  Key;.  if( argc!
3fb0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
3fc0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3fd0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
3fe0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
3ff0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
4000: 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20   " FILENAME\"", 
4010: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
4020: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
4030: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
4040: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
4050: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
4060: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65  TCL_ERROR;.  zKe
4070: 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e  y = argv[2];.  n
4080: 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65  Key = strlen(zKe
4090: 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  y);.#ifdef SQLIT
40a0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71  E_HAS_CODEC.  sq
40b0: 6c 69 74 65 33 5f 6b 65 79 28 64 62 2c 20 7a 4b  lite3_key(db, zK
40c0: 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69  ey, nKey);.#endi
40d0: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
40e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
40f0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65  e:  sqlite3_reke
4100: 79 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 43  y DB KEY.**.** C
4110: 68 61 6e 67 65 20 74 68 65 20 63 6f 64 65 63 20  hange the codec 
4120: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
4130: 6e 74 20 74 65 73 74 5f 72 65 6b 65 79 28 0a 20  nt test_rekey(. 
4140: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4150: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4160: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4170: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4180: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4190: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
41a0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
41b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
41c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
41d0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
41e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
41f0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4200: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
4210: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
4220: 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74  har *zKey;.  int
4230: 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61 72 67   nKey;.  if( arg
4240: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
4250: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4260: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
4270: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
4280: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
4290: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
42a0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
42b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
42c0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
42d0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
42e0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
42f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
4300: 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20  Key = argv[2];. 
4310: 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a   nKey = strlen(z
4320: 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Key);.#ifdef SQL
4330: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
4340: 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 64 62  sqlite3_rekey(db
4350: 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23  , zKey, nKey);.#
4360: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
4370: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
4380: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
4390: 63 6c 6f 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43  close DB.**.** C
43a0: 6c 6f 73 65 73 20 74 68 65 20 64 61 74 61 62 61  loses the databa
43b0: 73 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c  se opened by sql
43c0: 69 74 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74  ite3_open..*/.st
43d0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
43e0: 74 65 73 74 5f 63 6c 6f 73 65 28 0a 20 20 76 6f  test_close(.  vo
43f0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
4400: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4410: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
4420: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
4430: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
4440: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
4450: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
4460: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4470: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
4480: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
4490: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
44a0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
44b0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
44c0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
44d0: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
44e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
44f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
4500: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
4510: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
4520: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45  ],.       " FILE
4530: 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  NAME\"", 0);.   
4540: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4550: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
4560: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
4570: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
4580: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
4590: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
45a0: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
45b0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
45c0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
45d0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
45e0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
45f0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
4600: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
4610: 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f  tion of the x_co
4620: 61 6c 65 73 63 65 28 29 20 66 75 6e 63 74 69 6f  alesce() functio
4630: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  n..** Return the
4640: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
4650: 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
4660: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4670: 64 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28  d t1_ifnullFunc(
4680: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
4690: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
46a0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
46b0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
46c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
46d0: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
46e0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  ++){.    if( SQL
46f0: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
4700: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
4710: 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 69  v[i]) ){.      i
4720: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  nt n = sqlite3_v
4730: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
4740: 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i]);.      sqlit
4750: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
4760: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73  ontext, (char*)s
4770: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
4780: 74 28 61 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20  t(argv[i]),.    
4790: 20 20 20 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f        n, SQLITE_
47a0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
47b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
47c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73   }.}../*.** Thes
47d0: 65 20 61 72 65 20 74 65 73 74 20 66 75 6e 63 74  e are test funct
47e0: 69 6f 6e 73 2e 20 20 20 20 68 65 78 38 28 29 20  ions.    hex8() 
47f0: 69 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61  interprets its a
4800: 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54  rgument as.** UT
4810: 46 38 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  F8 and returns a
4820: 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20   hex encoding.  
4830: 68 65 78 31 36 6c 65 28 29 20 69 6e 74 65 72 70  hex16le() interp
4840: 72 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e  rets its argumen
4850: 74 0a 2a 2a 20 61 73 20 55 54 46 31 36 6c 65 20  t.** as UTF16le 
4860: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65  and returns a he
4870: 78 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  x encoding..*/.s
4880: 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 38 46  tatic void hex8F
4890: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
48a0: 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63  ext *p, int argc
48b0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
48c0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
48d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
48e0: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
48f0: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
4900: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
4910: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
4920: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
4930: 7a 65 6f 66 28 7a 42 75 66 29 2f 32 20 2d 20 32  zeof(zBuf)/2 - 2
4940: 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   && z[i]; i++){.
4950: 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75      sprintf(&zBu
4960: 66 5b 69 2a 32 5d 2c 20 22 25 30 32 78 22 2c 20  f[i*2], "%02x", 
4970: 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a  z[i]&0xff);.  }.
4980: 20 20 7a 42 75 66 5b 69 2a 32 5d 20 3d 20 30 3b    zBuf[i*2] = 0;
4990: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
49a0: 74 5f 74 65 78 74 28 70 2c 20 28 63 68 61 72 2a  t_text(p, (char*
49b0: 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54  )zBuf, -1, SQLIT
49c0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
49d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
49e0: 4d 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63  MIT_UTF16.static
49f0: 20 76 6f 69 64 20 68 65 78 31 36 46 75 6e 63 28   void hex16Func(
4a00: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
4a10: 2a 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  *p, int argc, sq
4a20: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
4a30: 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  gv){.  const uns
4a40: 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20  igned short int 
4a50: 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *z;.  int i;.  c
4a60: 68 61 72 20 7a 42 75 66 5b 34 30 30 5d 3b 0a 20  har zBuf[400];. 
4a70: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
4a80: 75 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30  ue_text16(argv[0
4a90: 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
4aa0: 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 34 20  <sizeof(zBuf)/4 
4ab0: 2d 20 34 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b  - 4 && z[i]; i++
4ac0: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26  ){.    sprintf(&
4ad0: 7a 42 75 66 5b 69 2a 34 5d 2c 20 22 25 30 34 78  zBuf[i*4], "%04x
4ae0: 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20  ", z[i]&0xff);. 
4af0: 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d   }.  zBuf[i*4] =
4b00: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
4b10: 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68  sult_text(p, (ch
4b20: 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51  ar*)zBuf, -1, SQ
4b30: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
4b40: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
4b50: 20 41 20 73 74 72 75 63 74 75 72 65 20 69 6e 74   A structure int
4b60: 6f 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d  o which to accum
4b70: 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73  ulate text..*/.s
4b80: 74 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69  truct dstr {.  i
4b90: 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53  nt nAlloc;  /* S
4ba0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a  pace allocated *
4bb0: 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20  /.  int nUsed;  
4bc0: 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a   /* Space used *
4bd0: 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
4be0: 20 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f   /* The space */
4bf0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .};../*.** Appen
4c00: 64 20 74 65 78 74 20 74 6f 20 61 20 64 73 74 72  d text to a dstr
4c10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4c20: 64 73 74 72 41 70 70 65 6e 64 28 73 74 72 75 63  dstrAppend(struc
4c30: 74 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74  t dstr *p, const
4c40: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69   char *z, int di
4c50: 76 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  vider){.  int n 
4c60: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69  = strlen(z);.  i
4c70: 66 28 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20  f( p->nUsed + n 
4c80: 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20  + 2 > p->nAlloc 
4c90: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  ){.    char *zNe
4ca0: 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63  w;.    p->nAlloc
4cb0: 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b   = p->nAlloc*2 +
4cc0: 20 6e 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e   n + 200;.    zN
4cd0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
4ce0: 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41  lloc(p->z, p->nA
4cf0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a  lloc);.    if( z
4d00: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
4d10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
4d20: 7a 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  z);.      memset
4d30: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
4d40: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
4d50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a  ;.    }.    p->z
4d60: 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69   = zNew;.  }.  i
4d70: 66 28 20 64 69 76 69 64 65 72 20 26 26 20 70 2d  f( divider && p-
4d80: 3e 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20  >nUsed>0 ){.    
4d90: 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  p->z[p->nUsed++]
4da0: 20 3d 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a   = divider;.  }.
4db0: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70    memcpy(&p->z[p
4dc0: 2d 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31  ->nUsed], z, n+1
4dd0: 29 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d  );.  p->nUsed +=
4de0: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   n;.}../*.** Inv
4df0: 6f 6b 65 64 20 66 6f 72 20 65 61 63 68 20 63 61  oked for each ca
4e00: 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69  llback from sqli
4e10: 74 65 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73  te3ExecFunc.*/.s
4e20: 74 61 74 69 63 20 69 6e 74 20 65 78 65 63 46 75  tatic int execFu
4e30: 6e 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  ncCallback(void 
4e40: 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63  *pData, int argc
4e50: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63  , char **argv, c
4e60: 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a  har **NotUsed){.
4e70: 20 20 73 74 72 75 63 74 20 64 73 74 72 20 2a 70    struct dstr *p
4e80: 20 3d 20 28 73 74 72 75 63 74 20 64 73 74 72 2a   = (struct dstr*
4e90: 29 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b  )pData;.  int i;
4ea0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
4eb0: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  gc; i++){.    if
4ec0: 28 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a  ( argv[i]==0 ){.
4ed0: 20 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64        dstrAppend
4ee0: 28 70 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29  (p, "NULL", ' ')
4ef0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4f00: 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c     dstrAppend(p,
4f10: 20 61 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a   argv[i], ' ');.
4f20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4f30: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
4f40: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
4f50: 20 74 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78   the x_sqlite_ex
4f60: 65 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ec() function.  
4f70: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61  This function ta
4f80: 6b 65 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  kes.** a single 
4f90: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74  argument and att
4fa0: 65 6d 70 74 73 20 74 6f 20 65 78 65 63 75 74 65  empts to execute
4fb0: 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61   that argument a
4fc0: 73 20 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54  s SQL code..** T
4fd0: 68 69 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61  his is illegal a
4fe0: 6e 64 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68  nd should set th
4ff0: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  e SQLITE_MISUSE 
5000: 66 6c 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61  flag on the data
5010: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34  base..**.** 2004
5020: 2d 4a 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76  -Jan-07:  We hav
5030: 65 20 63 68 61 6e 67 65 64 20 74 68 69 73 20 74  e changed this t
5040: 6f 20 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20  o make it legal 
5050: 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  to call sqlite3_
5060: 65 78 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77  exec().** from w
5070: 69 74 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e  ithin a function
5080: 20 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20   call.  .** .** 
5090: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d  This routine sim
50a0: 75 6c 61 74 65 73 20 74 68 65 20 65 66 66 65 63  ulates the effec
50b0: 74 20 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20  t of having two 
50c0: 74 68 72 65 61 64 73 20 61 74 74 65 6d 70 74 20  threads attempt 
50d0: 74 6f 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61  to.** use the sa
50e0: 6d 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  me database at t
50f0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f  he same time..*/
5100: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
5110: 69 74 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20  ite3ExecFunc(.  
5120: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5130: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
5140: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
5150: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
5160: 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72  ){.  struct dstr
5170: 20 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c   x;.  memset(&x,
5180: 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a   0, sizeof(x));.
5190: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
51a0: 65 78 65 63 28 28 73 71 6c 69 74 65 33 2a 29 73  exec((sqlite3*)s
51b0: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
51c0: 28 63 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20  (context),.     
51d0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
51e0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
51f0: 30 5d 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46  0]),.      execF
5200: 75 6e 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c  uncCallback, &x,
5210: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72   0);.  sqlite3_r
5220: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
5230: 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64  xt, x.z, x.nUsed
5240: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
5250: 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  NT);.  sqlite3_f
5260: 72 65 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  ree(x.z);.}../*.
5270: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
5280: 6e 20 6f 66 20 74 6b 74 32 32 31 33 66 75 6e 63  n of tkt2213func
5290: 28 29 2c 20 61 20 73 63 61 6c 61 72 20 66 75 6e  (), a scalar fun
52a0: 63 74 69 6f 6e 20 74 68 61 74 20 74 61 6b 65 73  ction that takes
52b0: 20 65 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20   exactly.** one 
52c0: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 68 61 73  argument. It has
52d0: 20 74 77 6f 20 69 6e 74 65 72 65 73 74 69 6e 67   two interesting
52e0: 20 66 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a   features:.**.**
52f0: 20 2a 20 49 74 20 63 61 6c 6c 73 20 73 71 6c 69   * It calls sqli
5300: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29  te3_value_text()
5310: 20 33 20 74 69 6d 65 73 20 6f 6e 20 74 68 65 20   3 times on the 
5320: 61 72 67 75 6d 65 6e 74 20 73 71 6c 69 74 65 33  argument sqlite3
5330: 5f 76 61 6c 75 65 2a 2e 0a 2a 2a 20 20 20 49 66  _value*..**   If
5340: 20 74 68 65 20 74 68 72 65 65 20 70 6f 69 6e 74   the three point
5350: 65 72 73 20 72 65 74 75 72 6e 65 64 20 61 72 65  ers returned are
5360: 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 6e   not the same an
5370: 20 53 51 4c 20 65 72 72 6f 72 20 69 73 20 72 61   SQL error is ra
5380: 69 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74  ised..**.** * Ot
5390: 68 65 72 77 69 73 65 20 69 74 20 72 65 74 75 72  herwise it retur
53a0: 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ns a copy of the
53b0: 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
53c0: 74 69 6f 6e 20 6f 66 20 69 74 27 73 20 0a 2a 2a  tion of it's .**
53d0: 20 20 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73     argument in s
53e0: 75 63 68 20 61 20 77 61 79 20 61 73 20 74 68 65  uch a way as the
53f0: 20 56 44 42 45 20 72 65 70 72 65 73 65 6e 74 61   VDBE representa
5400: 74 69 6f 6e 20 69 73 20 61 20 4d 65 6d 2a 20 63  tion is a Mem* c
5410: 65 6c 6c 20 0a 2a 2a 20 20 20 77 69 74 68 20 74  ell .**   with t
5420: 68 65 20 4d 45 4d 5f 54 65 72 6d 20 66 6c 61 67  he MEM_Term flag
5430: 20 63 6c 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54   clear. .**.** T
5440: 69 63 6b 65 74 20 23 32 32 31 33 20 63 61 6e 20  icket #2213 can 
5450: 74 68 65 72 65 66 6f 72 65 20 62 65 20 74 65 73  therefore be tes
5460: 74 65 64 20 62 79 20 65 76 61 6c 75 61 74 69 6e  ted by evaluatin
5470: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  g the following.
5480: 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  ** SQL expressio
5490: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32 32  n:.**.**   tkt22
54a0: 31 33 66 75 6e 63 28 74 6b 74 32 32 31 33 66 75  13func(tkt2213fu
54b0: 6e 63 28 27 61 20 73 74 72 69 6e 67 27 29 29 3b  nc('a string'));
54c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
54d0: 74 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e 28  tkt2213Function(
54e0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
54f0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20  xt *context, .  
5500: 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71  int argc,  .  sq
5510: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
5520: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 54 65 78  gv.){.  int nTex
5530: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
5540: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 31  ar const *zText1
5550: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
5560: 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 32 3b  r const *zText2;
5570: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5580: 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 33 3b 0a   const *zText3;.
5590: 0a 20 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74  .  nText = sqlit
55a0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
55b0: 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74  rgv[0]);.  zText
55c0: 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  1 = sqlite3_valu
55d0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
55e0: 0a 20 20 7a 54 65 78 74 32 20 3d 20 73 71 6c 69  .  zText2 = sqli
55f0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5600: 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74  rgv[0]);.  zText
5610: 33 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  3 = sqlite3_valu
5620: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5630: 0a 0a 20 20 69 66 28 20 7a 54 65 78 74 31 21 3d  ..  if( zText1!=
5640: 7a 54 65 78 74 32 20 7c 7c 20 7a 54 65 78 74 32  zText2 || zText2
5650: 21 3d 7a 54 65 78 74 33 20 29 7b 0a 20 20 20 20  !=zText3 ){.    
5660: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5670: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 74  rror(context, "t
5680: 6b 74 32 32 31 33 20 69 73 20 6e 6f 74 20 66 69  kt2213 is not fi
5690: 78 65 64 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c  xed", -1);.  }el
56a0: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  se{.    char *zC
56b0: 6f 70 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71  opy = (char *)sq
56c0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 65  lite3_malloc(nTe
56d0: 78 74 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  xt);.    memcpy(
56e0: 7a 43 6f 70 79 2c 20 7a 54 65 78 74 31 2c 20 6e  zCopy, zText1, n
56f0: 54 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Text);.    sqlit
5700: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5710: 6f 6e 74 65 78 74 2c 20 7a 43 6f 70 79 2c 20 6e  ontext, zCopy, n
5720: 54 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 66 72  Text, sqlite3_fr
5730: 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ee);.  }.}../*.*
5740: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
5750: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  SQL function tak
5760: 65 73 20 34 20 61 72 67 75 6d 65 6e 74 73 2e 20  es 4 arguments. 
5770: 20 54 68 65 20 32 6e 64 20 61 6e 64 0a 2a 2a 20   The 2nd and.** 
5780: 34 74 68 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  4th argument mus
5790: 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 73  t be one of thes
57a0: 65 20 73 74 72 69 6e 67 73 3a 20 20 27 74 65 78  e strings:  'tex
57b0: 74 27 2c 20 27 74 65 78 74 31 36 27 2c 0a 2a 2a  t', 'text16',.**
57c0: 20 6f 72 20 27 62 6c 6f 62 27 20 63 6f 72 72 65   or 'blob' corre
57d0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 20  sponding to API 
57e0: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20  functions.**.** 
57f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
5800: 75 65 5f 74 65 78 74 28 29 0a 2a 2a 20 20 20 20  ue_text().**    
5810: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
5820: 74 65 78 74 31 36 28 29 0a 2a 2a 20 20 20 20 20  text16().**     
5830: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5840: 6c 6f 62 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lob().**.** The 
5850: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
5860: 73 20 61 20 73 74 72 69 6e 67 2c 20 65 69 74 68  s a string, eith
5870: 65 72 20 27 62 79 74 65 73 27 20 6f 72 20 27 62  er 'bytes' or 'b
5880: 79 74 65 73 31 36 27 20 6f 72 20 27 6e 6f 6f 70  ytes16' or 'noop
5890: 27 2c 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  ',.** correspond
58a0: 69 6e 67 20 74 6f 20 41 50 49 73 3a 0a 2a 2a 0a  ing to APIs:.**.
58b0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  **      sqlite3_
58c0: 76 61 6c 75 65 5f 62 79 74 65 73 28 29 0a 2a 2a  value_bytes().**
58d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
58e0: 6c 75 65 5f 62 79 74 65 73 31 36 28 29 0a 2a 2a  lue_bytes16().**
58f0: 20 20 20 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a 2a        noop.**.**
5900: 20 54 68 65 20 41 50 49 73 20 64 65 73 69 67 6e   The APIs design
5910: 61 74 65 64 20 62 79 20 74 68 65 20 32 6e 64 20  ated by the 2nd 
5920: 74 68 72 6f 75 67 68 20 34 74 68 20 61 72 67 75  through 4th argu
5930: 6d 65 6e 74 73 20 61 72 65 20 61 70 70 6c 69 65  ments are applie
5940: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  d.** to the firs
5950: 74 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 6f 72  t argument in or
5960: 64 65 72 2e 20 20 49 66 20 74 68 65 20 70 6f 69  der.  If the poi
5970: 6e 74 65 72 73 20 72 65 74 75 72 6e 65 64 20 62  nters returned b
5980: 79 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  y the.** second 
5990: 61 6e 64 20 66 6f 75 72 74 68 20 61 72 65 20 64  and fourth are d
59a0: 69 66 66 65 72 65 6e 74 2c 20 74 68 69 73 20 72  ifferent, this r
59b0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
59c0: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
59d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
59e0: 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 54  turns 0..**.** T
59f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
5a00: 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 6f 20  used to test to 
5a10: 73 65 65 20 77 68 65 6e 20 72 65 74 75 72 6e 65  see when returne
5a20: 64 20 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d 0a  d pointers from.
5a30: 2a 2a 20 74 68 65 20 5f 74 65 78 74 28 29 2c 20  ** the _text(), 
5a40: 5f 74 65 78 74 31 36 28 29 20 61 6e 64 20 5f 62  _text16() and _b
5a50: 6c 6f 62 28 29 20 41 50 49 73 20 62 65 63 6f 6d  lob() APIs becom
5a60: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
5a70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
5a80: 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e 28 0a 20  rChngFunction(. 
5a90: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
5aa0: 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e   *context, .  in
5ab0: 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69  t argc,  .  sqli
5ac0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5ad0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  .){.  const void
5ae0: 20 2a 70 31 2c 20 2a 70 32 3b 0a 20 20 63 6f 6e   *p1, *p2;.  con
5af0: 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20  st char *zCmd;. 
5b00: 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 20 72   if( argc!=4 ) r
5b10: 65 74 75 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d 20  eturn;.  zCmd = 
5b20: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
5b30: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5b40: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20  argv[1]);.  if( 
5b50: 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e  zCmd==0 ) return
5b60: 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ;.  if( strcmp(z
5b70: 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29  Cmd,"text")==0 )
5b80: 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73  {.    p1 = (cons
5b90: 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  t void*)sqlite3_
5ba0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5bb0: 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0]);.#ifndef SQL
5bc0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
5bd0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
5be0: 70 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22  p(zCmd, "text16"
5bf0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d  )==0 ){.    p1 =
5c00: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
5c10: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5c20: 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e  16(argv[0]);.#en
5c30: 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  dif.  }else if( 
5c40: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c  strcmp(zCmd, "bl
5c50: 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ob")==0 ){.    p
5c60: 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  1 = (const void*
5c70: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
5c80: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  lob(argv[0]);.  
5c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
5ca0: 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20  n;.  }.  zCmd = 
5cb0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
5cc0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5cd0: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  argv[2]);.  if( 
5ce0: 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e  zCmd==0 ) return
5cf0: 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ;.  if( strcmp(z
5d00: 43 6d 64 2c 22 62 79 74 65 73 22 29 3d 3d 30 20  Cmd,"bytes")==0 
5d10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
5d20: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
5d30: 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0]);.#ifndef SQL
5d40: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
5d50: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
5d60: 70 28 7a 43 6d 64 2c 20 22 62 79 74 65 73 31 36  p(zCmd, "bytes16
5d70: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ")==0 ){.    sql
5d80: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
5d90: 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e  16(argv[0]);.#en
5da0: 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  dif.  }else if( 
5db0: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f  strcmp(zCmd, "no
5dc0: 6f 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  op")==0 ){.    /
5dd0: 2a 20 64 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * do nothing */.
5de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
5df0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20  urn;.  }.  zCmd 
5e00: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
5e10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5e20: 74 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66  t(argv[3]);.  if
5e30: 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75  ( zCmd==0 ) retu
5e40: 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  rn;.  if( strcmp
5e50: 28 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30  (zCmd,"text")==0
5e60: 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f   ){.    p2 = (co
5e70: 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65  nst void*)sqlite
5e80: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
5e90: 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  v[0]);.#ifndef S
5ea0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
5eb0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
5ec0: 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78 74 31  cmp(zCmd, "text1
5ed0: 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32  6")==0 ){.    p2
5ee0: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
5ef0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
5f00: 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23  xt16(argv[0]);.#
5f10: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66  endif.  }else if
5f20: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22  ( strcmp(zCmd, "
5f30: 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20  blob")==0 ){.   
5f40: 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69   p2 = (const voi
5f50: 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  d*)sqlite3_value
5f60: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
5f70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
5f80: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
5f90: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
5fa0: 6e 74 65 78 74 2c 20 70 31 21 3d 70 32 29 3b 0a  ntext, p1!=p2);.
5fb0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
5fc0: 20 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 72    sqlite_test_cr
5fd0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42  eate_function DB
5fe0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
5ff0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
6000: 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74  unction API on t
6010: 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
6020: 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  e in order.** to
6030: 20 63 72 65 61 74 65 20 61 20 66 75 6e 63 74 69   create a functi
6040: 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f 61 6c  on named "x_coal
6050: 65 73 63 65 22 2e 20 20 54 68 69 73 20 66 75 6e  esce".  This fun
6060: 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73  ction does the s
6070: 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20  ame thing.** as 
6080: 74 68 65 20 22 63 6f 61 6c 65 73 63 65 22 20 66  the "coalesce" f
6090: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66  unction.  This f
60a0: 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 72 65 67  unction also reg
60b0: 69 73 74 65 72 73 20 61 6e 20 53 51 4c 20 66 75  isters an SQL fu
60c0: 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64 20  nction.** named 
60d0: 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 20  "x_sqlite_exec" 
60e0: 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c  that invokes sql
60f0: 69 74 65 33 5f 65 78 65 63 28 29 2e 20 20 49 6e  ite3_exec().  In
6100: 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 65  voking sqlite3_e
6110: 78 65 63 28 29 0a 2a 2a 20 69 6e 20 74 68 69 73  xec().** in this
6120: 20 77 61 79 20 69 73 20 69 6c 6c 65 67 61 6c 20   way is illegal 
6130: 72 65 63 75 72 73 69 6f 6e 20 61 6e 64 20 73 68  recursion and sh
6140: 6f 75 6c 64 20 72 61 69 73 65 20 61 6e 20 53 51  ould raise an SQ
6150: 4c 49 54 45 5f 4d 49 53 55 53 45 20 65 72 72 6f  LITE_MISUSE erro
6160: 72 2e 0a 2a 2a 20 54 68 65 20 65 66 66 65 63 74  r..** The effect
6170: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
6180: 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65  rying to use the
6190: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
61a0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a  onnection from.*
61b0: 2a 20 74 77 6f 20 74 68 72 65 61 64 73 20 61 74  * two threads at
61c0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
61d0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
61e0: 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f  al motivation fo
61f0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
6200: 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  as to be able to
6210: 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c   call the.** sql
6220: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6230: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 68  tion function wh
6240: 69 6c 65 20 61 20 71 75 65 72 79 20 69 73 20 69  ile a query is i
6250: 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72  n progress in or
6260: 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74  der.** to test t
6270: 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  he SQLITE_MISUSE
6280: 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63   detection logic
6290: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
62a0: 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63  test_create_func
62b0: 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  tion(.  void *No
62c0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
62d0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
62e0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
62f0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
6300: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
6310: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6330: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
6340: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
6350: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
6360: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
6370: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
6380: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
6390: 65 33 20 2a 64 62 3b 0a 20 20 65 78 74 65 72 6e  e3 *db;.  extern
63a0: 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73 74   void Md5_Regist
63b0: 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 20  er(sqlite3*);.. 
63c0: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
63d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
63e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
63f0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
6400: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
6410: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 44 42 5c  0],.       " DB\
6420: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
6430: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6440: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
6450: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
6460: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
6470: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6480: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
6490: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
64a0: 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2c 20  , "x_coalesce", 
64b0: 2d 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20  -1, SQLITE_ANY, 
64c0: 30 2c 20 0a 20 20 20 20 20 20 20 20 74 31 5f 69  0, .        t1_i
64d0: 66 6e 75 6c 6c 46 75 6e 63 2c 20 30 2c 20 30 29  fnullFunc, 0, 0)
64e0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
64f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
6500: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
6510: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68  _function(db, "h
6520: 65 78 38 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ex8", 1, SQLITE_
6530: 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  ANY, 0, .       
6540: 20 20 20 68 65 78 38 46 75 6e 63 2c 20 30 2c 20     hex8Func, 0, 
6550: 30 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  0);.  }.#ifndef 
6560: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
6570: 36 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  6.  if( rc==SQLI
6580: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
6590: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
65a0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68  _function(db, "h
65b0: 65 78 31 36 22 2c 20 31 2c 20 53 51 4c 49 54 45  ex16", 1, SQLITE
65c0: 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20  _ANY, 0, .      
65d0: 20 20 20 20 68 65 78 31 36 46 75 6e 63 2c 20 30      hex16Func, 0
65e0: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
65f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6600: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
6610: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
6620: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 6b  function(db, "tk
6630: 74 32 32 31 33 66 75 6e 63 22 2c 20 31 2c 20 53  t2213func", 1, S
6640: 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20  QLITE_ANY, 0, . 
6650: 20 20 20 20 20 20 20 20 20 74 6b 74 32 32 31 33           tkt2213
6660: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
6670: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
6680: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6690: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
66a0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
66b0: 20 22 70 6f 69 6e 74 65 72 5f 63 68 61 6e 67 65   "pointer_change
66c0: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 4e 59  ", 4, SQLITE_ANY
66d0: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
66e0: 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e 2c  ptrChngFunction,
66f0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 23 69 66   0, 0);.  }..#if
6700: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6710: 5f 55 54 46 31 36 0a 20 20 2f 2a 20 55 73 65 20  _UTF16.  /* Use 
6720: 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61  the sqlite3_crea
6730: 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 29 20  te_function16() 
6740: 41 50 49 20 68 65 72 65 2e 20 4d 61 69 6e 6c 79  API here. Mainly
6750: 20 66 6f 72 20 66 75 6e 2c 20 62 75 74 20 61 6c   for fun, but al
6760: 73 6f 20 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  so .  ** because
6770: 20 69 74 20 69 73 20 6e 6f 74 20 74 65 73 74 65   it is not teste
6780: 64 20 61 6e 79 77 68 65 72 65 20 65 6c 73 65 2e  d anywhere else.
6790: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
67a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
67b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
67c0: 61 6c 3b 0a 23 69 66 20 30 0a 20 20 20 20 69 66  al;.#if 0.    if
67d0: 28 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f  ( sqlite3_iMallo
67e0: 63 46 61 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20  cFail>0 ){.     
67f0: 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
6800: 46 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65  Fail++;.    }.#e
6810: 6e 64 69 66 20 0a 20 20 20 20 70 56 61 6c 20 3d  ndif .    pVal =
6820: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
6830: 28 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (0);.    sqlite3
6840: 56 61 6c 75 65 53 65 74 53 74 72 28 30 2c 70 56  ValueSetStr(0,pV
6850: 61 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c 69 74  al, -1, "x_sqlit
6860: 65 5f 65 78 65 63 22 2c 20 53 51 4c 49 54 45 5f  e_exec", SQLITE_
6870: 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
6880: 54 49 43 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  TIC);.    rc = s
6890: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
68a0: 6e 63 74 69 6f 6e 31 36 28 64 62 2c 20 0a 20 20  nction16(db, .  
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
68c0: 74 65 33 56 61 6c 75 65 54 65 78 74 28 30 2c 20  te3ValueText(0, 
68d0: 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
68e0: 31 36 4e 41 54 49 56 45 29 2c 0a 20 20 20 20 20  16NATIVE),.     
68f0: 20 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49           1, SQLI
6900: 54 45 5f 55 54 46 31 36 2c 20 64 62 2c 20 73 71  TE_UTF16, db, sq
6910: 6c 69 74 65 33 45 78 65 63 46 75 6e 63 2c 20 30  lite3ExecFunc, 0
6920: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6930: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
6940: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
6950: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
6960: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
6970: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
6980: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
6990: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
69a0: 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
69b0: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
69c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
69d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  .}../*.** Routin
69e0: 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  es to implement 
69f0: 74 68 65 20 78 5f 63 6f 75 6e 74 28 29 20 61 67  the x_count() ag
6a00: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
6a10: 2e 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f 75 6e 74 28  ..**.** x_count(
6a20: 29 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d  ) counts the num
6a30: 62 65 72 20 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c 20  ber of non-null 
6a40: 61 72 67 75 6d 65 6e 74 73 2e 20 20 42 75 74 20  arguments.  But 
6a50: 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 73 6f 6d  there are.** som
6a60: 65 20 74 77 69 73 74 73 20 66 6f 72 20 74 65 73  e twists for tes
6a70: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ting purposes..*
6a80: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 72 67 75  *.** If the argu
6a90: 6d 65 6e 74 20 74 6f 20 78 5f 63 6f 75 6e 74 28  ment to x_count(
6aa0: 29 20 69 73 20 34 30 20 74 68 65 6e 20 61 20 55  ) is 40 then a U
6ab0: 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65  TF-8 error is re
6ac0: 70 6f 72 74 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  ported.** on the
6ad0: 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20   step function. 
6ae0: 20 49 66 20 78 5f 63 6f 75 6e 74 28 34 31 29 20   If x_count(41) 
6af0: 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 61 20  is seen, then a 
6b00: 55 54 46 2d 31 36 20 65 72 72 6f 72 0a 2a 2a 20  UTF-16 error.** 
6b10: 69 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74  is reported on t
6b20: 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e  he step function
6b30: 2e 20 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20  .  If the total 
6b40: 63 6f 75 6e 74 20 69 73 20 34 32 2c 20 74 68 65  count is 42, the
6b50: 6e 0a 2a 2a 20 61 20 55 54 46 2d 38 20 65 72 72  n.** a UTF-8 err
6b60: 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f  or is reported o
6b70: 6e 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 20 66  n the finalize f
6b80: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  unction..*/.type
6b90: 64 65 66 20 73 74 72 75 63 74 20 74 31 43 6f 75  def struct t1Cou
6ba0: 6e 74 43 74 78 20 74 31 43 6f 75 6e 74 43 74 78  ntCtx t1CountCtx
6bb0: 3b 0a 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74  ;.struct t1Count
6bc0: 43 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d  Ctx {.  int n;.}
6bd0: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31  ;.static void t1
6be0: 43 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c  CountStep(.  sql
6bf0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
6c00: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
6c10: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
6c20: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 74  ue **argv.){.  t
6c30: 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20  1CountCtx *p;.  
6c40: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
6c50: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
6c60: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
6c70: 29 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d  ));.  if( (argc=
6c80: 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c  =0 || SQLITE_NUL
6c90: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
6ca0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29  _type(argv[0]) )
6cb0: 20 26 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e   && p ){.    p->
6cc0: 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  n++;.  }.  if( a
6cd0: 72 67 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  rgc>0 ){.    int
6ce0: 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   v = sqlite3_val
6cf0: 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b  ue_int(argv[0]);
6d00: 0a 20 20 20 20 69 66 28 20 76 3d 3d 34 30 20 29  .    if( v==40 )
6d10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6d20: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
6d30: 74 65 78 74 2c 20 22 76 61 6c 75 65 20 6f 66 20  text, "value of 
6d40: 34 30 20 68 61 6e 64 65 64 20 74 6f 20 78 5f 63  40 handed to x_c
6d50: 6f 75 6e 74 22 2c 20 2d 31 29 3b 0a 23 69 66 6e  ount", -1);.#ifn
6d60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6d70: 55 54 46 31 36 0a 20 20 20 20 7d 65 6c 73 65 20  UTF16.    }else 
6d80: 69 66 28 20 76 3d 3d 34 31 20 29 7b 0a 20 20 20  if( v==41 ){.   
6d90: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 55     const char zU
6da0: 74 66 31 36 45 72 72 4d 73 67 5b 5d 20 3d 20 7b  tf16ErrMsg[] = {
6db0: 20 30 2c 20 30 78 36 31 2c 20 30 2c 20 30 78 36   0, 0x61, 0, 0x6
6dc0: 32 2c 20 30 2c 20 30 78 36 33 2c 20 30 2c 20 30  2, 0, 0x63, 0, 0
6dd0: 2c 20 30 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0};.      sqli
6de0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
6df0: 31 36 28 63 6f 6e 74 65 78 74 2c 20 26 7a 55 74  16(context, &zUt
6e00: 66 31 36 45 72 72 4d 73 67 5b 31 2d 53 51 4c 49  f16ErrMsg[1-SQLI
6e10: 54 45 5f 42 49 47 45 4e 44 49 41 4e 5d 2c 20 2d  TE_BIGENDIAN], -
6e20: 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  1);.#endif.    }
6e30: 0a 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63  .  }.}   .static
6e40: 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 46 69 6e   void t1CountFin
6e50: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
6e60: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
6e70: 0a 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70  .  t1CountCtx *p
6e80: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
6e90: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
6ea0: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
6eb0: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20  f(*p));.  if( p 
6ec0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  ){.    if( p->n=
6ed0: 3d 34 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =42 ){.      sql
6ee0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
6ef0: 72 28 63 6f 6e 74 65 78 74 2c 20 22 78 5f 63 6f  r(context, "x_co
6f00: 75 6e 74 20 74 6f 74 61 6c 73 20 74 6f 20 34 32  unt totals to 42
6f10: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73  ", -1);.    }els
6f20: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
6f30: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
6f40: 65 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20  ext, p ? p->n : 
6f50: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  0);.    }.  }.}.
6f60: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
6f70: 71 6c 69 74 65 5f 74 65 73 74 5f 63 72 65 61 74  qlite_test_creat
6f80: 65 5f 61 67 67 72 65 67 61 74 65 20 44 42 0a 2a  e_aggregate DB.*
6f90: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
6fa0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6fb0: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
6fc0: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
6fd0: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
6fe0: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
6ff0: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22   named "x_count"
7000: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
7010: 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 74   does the same t
7020: 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20 22  hing.** as the "
7030: 6d 64 35 73 75 6d 22 20 66 75 6e 63 74 69 6f 6e  md5sum" function
7040: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
7050: 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20  inal motivation 
7060: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
7070: 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20   was to be able 
7080: 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73  to call the.** s
7090: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67  qlite3_create_ag
70a0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
70b0: 20 77 68 69 6c 65 20 61 20 71 75 65 72 79 20 69   while a query i
70c0: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e  s in progress in
70d0: 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73   order.** to tes
70e0: 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53  t the SQLITE_MIS
70f0: 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f  USE detection lo
7100: 67 69 63 2e 20 20 53 65 65 20 6d 69 73 75 73 65  gic.  See misuse
7110: 2e 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  .test..**.** Thi
7120: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 6c 61  s routine was la
7130: 74 65 72 20 65 78 74 65 6e 64 65 64 20 74 6f 20  ter extended to 
7140: 74 65 73 74 20 74 68 65 20 75 73 65 20 6f 66 20  test the use of 
7150: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7160: 72 72 6f 72 28 29 0a 2a 2a 20 77 69 74 68 69 6e  rror().** within
7170: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
7180: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
7190: 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f  int test_create_
71a0: 61 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f 69  aggregate(.  voi
71b0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
71c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
71d0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
71e0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
71f0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
7200: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
7210: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
7220: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
7230: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
7240: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
7250: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
7260: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
7270: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
7280: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
7290: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
72a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
72b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
72c0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
72d0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
72e0: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
72f0: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
7300: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7310: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
7320: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
7330: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
7340: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7350: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
7360: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7370: 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c  n(db, "x_count",
7380: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
7390: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 74 31 43   0, 0,.      t1C
73a0: 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74  ountStep,t1Count
73b0: 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28  Finalize);.  if(
73c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
73d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
73e0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
73f0: 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 31 2c 20  , "x_count", 1, 
7400: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
7410: 30 2c 0a 20 20 20 20 20 20 20 20 74 31 43 6f 75  0,.        t1Cou
7420: 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69  ntStep,t1CountFi
7430: 6e 61 6c 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69  nalize);.  }.  i
7440: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
7450: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
7460: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
7470: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
7480: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
7490: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 70 72 69  *.** Usage:  pri
74a0: 6e 74 66 20 54 45 58 54 0a 2a 2a 0a 2a 2a 20 53  ntf TEXT.**.** S
74b0: 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 70 72  end output to pr
74c0: 69 6e 74 66 2e 20 20 55 73 65 20 74 68 69 73 20  intf.  Use this 
74d0: 72 61 74 68 65 72 20 74 68 61 6e 20 70 75 74 73  rather than puts
74e0: 20 74 6f 20 6d 65 72 67 65 20 74 68 65 20 6f 75   to merge the ou
74f0: 74 70 75 74 0a 2a 2a 20 69 6e 20 74 68 65 20 63  tput.** in the c
7500: 6f 72 72 65 63 74 20 73 65 71 75 65 6e 63 65 20  orrect sequence 
7510: 77 69 74 68 20 64 65 62 75 67 67 69 6e 67 20 70  with debugging p
7520: 72 69 6e 74 66 73 20 69 6e 73 65 72 74 65 64 20  rintfs inserted 
7530: 69 6e 74 6f 20 43 20 63 6f 64 65 2e 0a 2a 2a 20  into C code..** 
7540: 50 75 74 73 20 75 73 65 73 20 61 20 73 65 70 61  Puts uses a sepa
7550: 72 61 74 65 20 62 75 66 66 65 72 20 61 6e 64 20  rate buffer and 
7560: 64 65 62 75 67 67 69 6e 67 20 73 74 61 74 65 6d  debugging statem
7570: 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 6f 75 74  ents will be out
7580: 20 6f 66 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20   of.** sequence 
7590: 69 66 20 69 74 20 69 73 20 75 73 65 64 2e 0a 2a  if it is used..*
75a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
75b0: 74 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64  t_printf(.  void
75c0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
75d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
75e0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
75f0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
7600: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
7610: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
7620: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
7630: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
7640: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
7650: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
7660: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
7670: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
7680: 29 7b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ){.  if( argc!=2
7690: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
76a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
76b0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
76c0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
76d0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
76e0: 20 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a 20 20   TEXT\"", 0);.  
76f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7700: 4f 52 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66  OR;.  }.  printf
7710: 28 22 25 73 5c 6e 22 2c 20 61 72 67 76 5b 31 5d  ("%s\n", argv[1]
7720: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
7730: 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55  OK;.}..../*.** U
7740: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
7750: 70 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41  printf_int FORMA
7760: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
7770: 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  R INTEGER.**.** 
7780: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
7790: 68 20 74 68 72 65 65 20 69 6e 74 65 67 65 72 20  h three integer 
77a0: 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  arguments.*/.sta
77b0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
77c0: 6d 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76  mprintf_int(.  v
77d0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
77e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
77f0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
7800: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
7810: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
7820: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
7830: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
7840: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7850: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
7860: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
7870: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
7880: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
7890: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d  */.){.  int a[3]
78a0: 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  , i;.  char *z;.
78b0: 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b    if( argc!=5 ){
78c0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
78d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
78e0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
78f0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
7900: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
7910: 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54  RMAT INT INT INT
7920: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
7930: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7940: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
7950: 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  5; i++){.    if(
7960: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
7970: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b  rp, argv[i], &a[
7980: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
7990: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
79a0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
79b0: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
79c0: 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a  ], a[1], a[2]);.
79d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
79e0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
79f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
7a00: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
7a10: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  L_OK;.}../*.** I
7a20: 66 20 7a 4e 75 6d 20 72 65 70 72 65 73 65 6e 74  f zNum represent
7a30: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  s an integer tha
7a40: 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 36 34  t will fit in 64
7a50: 2d 62 69 74 73 2c 20 74 68 65 6e 20 73 65 74 0a  -bits, then set.
7a60: 2a 2a 20 2a 70 56 61 6c 75 65 20 74 6f 20 74 68  ** *pValue to th
7a70: 61 74 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72  at integer and r
7a80: 65 74 75 72 6e 20 74 72 75 65 2e 20 20 4f 74 68  eturn true.  Oth
7a90: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 66 61  erwise return fa
7aa0: 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lse..*/.static i
7ab0: 6e 74 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  nt sqlite3GetInt
7ac0: 36 34 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  64(const char *z
7ad0: 4e 75 6d 2c 20 69 36 34 20 2a 70 56 61 6c 75 65  Num, i64 *pValue
7ae0: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
7af0: 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 4e 75  FitsIn64Bits(zNu
7b00: 6d 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m) ){.    sqlite
7b10: 33 41 74 6f 69 36 34 28 7a 4e 75 6d 2c 20 70 56  3Atoi64(zNum, pV
7b20: 61 6c 75 65 29 3b 0a 20 20 20 20 72 65 74 75 72  alue);.    retur
7b30: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
7b40: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  n 0;.}../*.** Us
7b50: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
7b60: 72 69 6e 74 66 5f 69 6e 74 36 34 20 46 4f 52 4d  rintf_int64 FORM
7b70: 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  AT INTEGER INTEG
7b80: 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a  ER INTEGER.**.**
7b90: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
7ba0: 74 68 20 74 68 72 65 65 20 36 34 2d 62 69 74 20  th three 64-bit 
7bb0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
7bc0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
7bd0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
7be0: 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 4e  int64(.  void *N
7bf0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
7c00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
7c10: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
7c20: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
7c30: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
7c40: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c60: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
7c70: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
7c80: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
7c90: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
7ca0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
7cb0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
7cc0: 65 5f 69 6e 74 36 34 20 61 5b 33 5d 3b 0a 20 20  e_int64 a[3];.  
7cd0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
7ce0: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
7cf0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7d00: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
7d10: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
7d20: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
7d30: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e       " FORMAT IN
7d40: 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29  T INT INT\"", 0)
7d50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
7d60: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
7d70: 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29  r(i=2; i<5; i++)
7d80: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
7d90: 65 33 47 65 74 49 6e 74 36 34 28 61 72 67 76 5b  e3GetInt64(argv[
7da0: 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 7b 0a  i], &a[i-2]) ){.
7db0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
7dc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7dd0: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
7de0: 61 20 76 61 6c 69 64 20 36 34 2d 62 69 74 20 69  a valid 64-bit i
7df0: 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20  nteger", 0);.   
7e00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7e10: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
7e20: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
7e30: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b  intf(argv[1], a[
7e40: 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b  0], a[1], a[2]);
7e50: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
7e60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30  ult(interp, z, 0
7e70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
7e80: 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  e(z);.  return T
7e90: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
7ea0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
7eb0: 6d 70 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d  mprintf_str FORM
7ec0: 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  AT INTEGER INTEG
7ed0: 45 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20  ER STRING.**.** 
7ee0: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
7ef0: 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72  h two integer ar
7f00: 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20  guments and one 
7f10: 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a  string argument.
7f20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
7f30: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
7f40: 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  r(.  void *NotUs
7f50: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
7f60: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
7f70: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
7f80: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
7f90: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
7fa0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
7fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7fc0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
7fd0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
7fe0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
7ff0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8000: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8010: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61  t a[3], i;.  cha
8020: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
8030: 3c 34 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a  <4 || argc>5 ){.
8040: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8050: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
8060: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
8070: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
8080: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
8090: 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52  MAT INT INT ?STR
80a0: 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20  ING?\"", 0);.   
80b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
80c0: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
80d0: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
80e0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
80f0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c  interp, argv[i],
8100: 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75   &a[i-2]) ) retu
8110: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8120: 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  }.  z = sqlite3_
8130: 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c  mprintf(argv[1],
8140: 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67   a[0], a[1], arg
8150: 63 3e 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20  c>4 ? argv[4] : 
8160: 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70  NULL);.  Tcl_App
8170: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8180: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
8190: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
81a0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
81b0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
81c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73  lite3_snprintf_s
81d0: 74 72 20 49 4e 54 45 47 45 52 20 46 4f 52 4d 41  tr INTEGER FORMA
81e0: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
81f0: 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43  R STRING.**.** C
8200: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
8210: 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67   two integer arg
8220: 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73  uments and one s
8230: 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a  tring argument.*
8240: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
8250: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74  ite3_snprintf_st
8260: 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  r(.  void *NotUs
8270: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8280: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8290: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
82a0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
82b0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
82c0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
82d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
82e0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
82f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8300: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8310: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8320: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8330: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 69 6e 74  t a[3], i;.  int
8340: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   n;.  char *z;. 
8350: 20 69 66 28 20 61 72 67 63 3c 35 20 7c 7c 20 61   if( argc<5 || a
8360: 72 67 63 3e 36 20 29 7b 0a 20 20 20 20 54 63 6c  rgc>6 ){.    Tcl
8370: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8380: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
8390: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
83a0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
83b0: 20 20 20 20 22 20 49 4e 54 20 46 4f 52 4d 41 54      " INT FORMAT
83c0: 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e 47   INT INT ?STRING
83d0: 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ?\"", 0);.    re
83e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
83f0: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
8400: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
8410: 76 5b 31 5d 2c 20 26 6e 29 20 29 20 72 65 74 75  v[1], &n) ) retu
8420: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8430: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 54  if( n<0 ){.    T
8440: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8450: 69 6e 74 65 72 70 2c 20 22 4e 20 6d 75 73 74 20  interp, "N must 
8460: 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22  be non-negative"
8470: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
8480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
8490: 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c 35 3b 20    for(i=3; i<5; 
84a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
84b0: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
84c0: 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 33   argv[i], &a[i-3
84d0: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
84e0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d  ERROR;.  }.  z =
84f0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
8500: 20 6e 2b 31 20 29 3b 0a 20 20 73 71 6c 69 74 65   n+1 );.  sqlite
8510: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 2c  3_snprintf(n, z,
8520: 20 61 72 67 76 5b 32 5d 2c 20 61 5b 30 5d 2c 20   argv[2], a[0], 
8530: 61 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61  a[1], argc>4 ? a
8540: 72 67 76 5b 35 5d 20 3a 20 4e 55 4c 4c 29 3b 0a  rgv[5] : NULL);.
8550: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8560: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
8570: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
8580: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
8590: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
85a0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
85b0: 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 46 4f  printf_double FO
85c0: 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54  RMAT INTEGER INT
85d0: 45 47 45 52 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a  EGER DOUBLE.**.*
85e0: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
85f0: 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20  ith two integer 
8600: 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e  arguments and on
8610: 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e  e double argumen
8620: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t.*/.static int 
8630: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
8640: 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a  double(.  void *
8650: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
8660: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
8670: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
8680: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
8690: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
86a0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
86b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
86c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
86d0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
86e0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
86f0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
8700: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
8710: 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a  .  int a[3], i;.
8720: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68    double r;.  ch
8730: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
8740: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
8750: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8760: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
8770: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
8780: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
8790: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
87a0: 49 4e 54 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30  INT DOUBLE\"", 0
87b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
87c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
87d0: 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b  or(i=2; i<4; i++
87e0: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
87f0: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
8800: 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20  gv[i], &a[i-2]) 
8810: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8820: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
8830: 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65  l_GetDouble(inte
8840: 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 29  rp, argv[4], &r)
8850: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
8860: 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  ROR;.  z = sqlit
8870: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
8880: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
8890: 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  r);.  Tcl_Append
88a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
88b0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
88c0: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
88d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
88e0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
88f0: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
8900: 64 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20  d FORMAT DOUBLE 
8910: 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c  DOUBLE.**.** Cal
8920: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61  l mprintf with a
8930: 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61   single double a
8940: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
8950: 20 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20   the product of 
8960: 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d  the.** two argum
8970: 65 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65  ents given above
8980: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
8990: 74 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72  to generate over
89a0: 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c  flow and underfl
89b0: 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f  ow.** doubles to
89c0: 20 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20   test that they 
89d0: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72  are converted pr
89e0: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  operly..*/.stati
89f0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
8a00: 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20 20  rintf_scaled(.  
8a10: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
8a20: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8a30: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
8a40: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
8a50: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
8a60: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
8a70: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
8a80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8a90: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
8aa0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
8ab0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
8ac0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
8ad0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
8ae0: 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20    double r[2];. 
8af0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
8b00: 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  argc!=4 ){.    T
8b10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8b20: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
8b30: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
8b40: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
8b50: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 44        " FORMAT D
8b60: 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c  OUBLE DOUBLE\"",
8b70: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8b80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8b90: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
8ba0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
8bb0: 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72  _GetDouble(inter
8bc0: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69  p, argv[i], &r[i
8bd0: 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  -2]) ) return TC
8be0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
8bf0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
8c00: 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d  tf(argv[1], r[0]
8c10: 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70  *r[1]);.  Tcl_Ap
8c20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8c30: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
8c40: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
8c50: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
8c60: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
8c70: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
8c80: 74 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53 54  tronly FORMAT ST
8c90: 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  RING.**.** Call 
8ca0: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73  mprintf with a s
8cb0: 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67  ingle double arg
8cc0: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 74  ument which is t
8cd0: 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68  he product of th
8ce0: 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e  e.** two argumen
8cf0: 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20  ts given above. 
8d00: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
8d10: 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c   generate overfl
8d20: 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77  ow and underflow
8d30: 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74  .** doubles to t
8d40: 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61 72  est that they ar
8d50: 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70  e converted prop
8d60: 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erly..*/.static 
8d70: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
8d80: 6e 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76  ntf_stronly(.  v
8d90: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
8da0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8db0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
8dc0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
8dd0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
8de0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
8df0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
8e00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8e10: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
8e20: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
8e30: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
8e40: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
8e50: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  */.){.  char *z;
8e60: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
8e70: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
8e80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8e90: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
8ea0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
8eb0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
8ec0: 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c  ORMAT STRING\"",
8ed0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8ee0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8ef0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
8f00: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72  intf(argv[1], ar
8f10: 67 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70  gv[2]);.  Tcl_Ap
8f20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8f30: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
8f40: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
8f50: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
8f60: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
8f70: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68  qlite3_mprintf_h
8f80: 65 78 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20  exdouble FORMAT 
8f90: 48 45 58 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  HEX.**.** Call m
8fa0: 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69  printf with a si
8fb0: 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75  ngle double argu
8fc0: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 64 65  ment which is de
8fd0: 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  rived from the.*
8fe0: 2a 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e  * hexadecimal en
8ff0: 63 6f 64 69 6e 67 20 6f 66 20 61 6e 20 49 45 45  coding of an IEE
9000: 45 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61  E double..*/.sta
9010: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
9020: 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c  mprintf_hexdoubl
9030: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
9040: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
9050: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
9060: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
9070: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
9080: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
9090: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
90a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
90b0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
90c0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
90d0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
90e0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
90f0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  ument */.){.  ch
9100: 61 72 20 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65 20  ar *z;.  double 
9110: 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 20 78  r;.  unsigned  x
9120: 31 2c 20 78 32 3b 0a 20 20 6c 6f 6e 67 20 6c 6f  1, x2;.  long lo
9130: 6e 67 20 75 6e 73 69 67 6e 65 64 20 64 3b 0a 20  ng unsigned d;. 
9140: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
9150: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9160: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
9170: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
9180: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
9190: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
91a0: 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20 30  MAT STRING\"", 0
91b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
91c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
91d0: 66 28 20 73 73 63 61 6e 66 28 61 72 67 76 5b 32  f( sscanf(argv[2
91e0: 5d 2c 20 22 25 30 38 78 25 30 38 78 22 2c 20 26  ], "%08x%08x", &
91f0: 78 32 2c 20 26 78 31 29 21 3d 32 20 29 7b 0a 20  x2, &x1)!=2 ){. 
9200: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9210: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 32 6e 64  ult(interp, "2nd
9220: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
9230: 20 62 65 20 31 36 2d 63 68 61 72 61 63 74 65 72   be 16-character
9240: 73 20 6f 66 20 68 65 78 22 2c 20 30 29 3b 0a 20  s of hex", 0);. 
9250: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9260: 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 20 3d 20 78  ROR;.  }.  d = x
9270: 32 3b 0a 20 20 64 20 3d 20 28 64 3c 3c 33 32 29  2;.  d = (d<<32)
9280: 20 2b 20 78 31 3b 0a 20 20 6d 65 6d 63 70 79 28   + x1;.  memcpy(
9290: 26 72 2c 20 26 64 2c 20 73 69 7a 65 6f 66 28 72  &r, &d, sizeof(r
92a0: 29 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  ));.  z = sqlite
92b0: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
92c0: 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70  ], r);.  Tcl_App
92d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
92e0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
92f0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
9300: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9310: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
9320: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72  ite3_enable_shar
9330: 65 64 5f 63 61 63 68 65 20 20 20 20 20 20 42 4f  ed_cache      BO
9340: 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 23 69 66 20  OLEAN.**.*/.#if 
9350: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9360: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
9370: 45 29 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  E).static int te
9380: 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  st_enable_shared
9390: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
93a0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
93b0: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
93c0: 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
93d0: 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
93e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
93f0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
9400: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
9410: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
9420: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9440: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
9450: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
9460: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
9470: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
9480: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
9490: 74 20 72 63 3b 0a 20 20 69 6e 74 20 65 6e 61 62  t rc;.  int enab
94a0: 6c 65 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20  le;.  int ret = 
94b0: 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
94c0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
94d0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
94e0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c  , 1, objv, "BOOL
94f0: 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  EAN");.    retur
9500: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9510: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f  .  if( Tcl_GetBo
9520: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
9530: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 65  erp, objv[1], &e
9540: 6e 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  nable) ){.    re
9550: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9560: 20 20 7d 0a 20 20 72 65 74 20 3d 20 73 71 6c 69    }.  ret = sqli
9570: 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
9580: 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72  dOnly()->useShar
9590: 65 64 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  edData;.  rc = s
95a0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
95b0: 61 72 65 64 5f 63 61 63 68 65 28 65 6e 61 62 6c  ared_cache(enabl
95c0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
95d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
95e0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
95f0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
9600: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
9610: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
9620: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9630: 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  R;.  }.  Tcl_Set
9640: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
9650: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
9660: 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 72 65 74  Obj(ret));.  ret
9670: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
9680: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  ndif..../*.** Us
9690: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78 74  age: sqlite3_ext
96a0: 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
96b0: 65 73 20 20 20 44 42 20 20 20 20 42 4f 4f 4c 45  es   DB    BOOLE
96c0: 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  AN.**.*/.static 
96d0: 69 6e 74 20 74 65 73 74 5f 65 78 74 65 6e 64 65  int test_extende
96e0: 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 0a  d_result_codes(.
96f0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
9700: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
9710: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
9720: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
9730: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
9740: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
9750: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
9760: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
9770: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
9780: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
9790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
97a0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
97b0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
97c0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
97d0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
97e0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
97f0: 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65  enable;.  sqlite
9800: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 6f 62  3 *db;..  if( ob
9810: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
9820: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
9830: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
9840: 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  DB BOOLEAN");.  
9850: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9860: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
9870: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
9880: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
9890: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
98a0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
98b0: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
98c0: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
98d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
98e0: 20 26 65 6e 61 62 6c 65 29 20 29 20 72 65 74 75   &enable) ) retu
98f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9900: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
9910: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 64 62  _result_codes(db
9920: 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20 72 65 74  , enable);.  ret
9930: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
9940: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
9950: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
9960: 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  umber.**.*/.stat
9970: 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69 62 76  ic int test_libv
9980: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a 20  ersion_number(. 
9990: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
99a0: 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
99b0: 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
99c0: 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
99d0: 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
99e0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
99f0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
9a00: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
9a10: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
9a20: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
9a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9a40: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9a50: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
9a60: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
9a70: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
9a80: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 53  ts */.){.  Tcl_S
9a90: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
9aa0: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
9ab0: 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  j(sqlite3_libver
9ac0: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29 3b  sion_number()));
9ad0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9ae0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
9af0: 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  : sqlite3_table_
9b00: 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 20  column_metadata 
9b10: 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d  DB dbname tblnam
9b20: 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f 0a  e colname.**.*/.
9b30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
9b40: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
9b50: 44 41 54 41 0a 73 74 61 74 69 63 20 69 6e 74 20  DATA.static int 
9b60: 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  test_table_colum
9b70: 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 43 6c  n_metadata(.  Cl
9b80: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
9b90: 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
9ba0: 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
9bb0: 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
9bc0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
9bd0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
9be0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
9bf0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
9c00: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
9c10: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
9c20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9c30: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
9c40: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
9c50: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
9c60: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
9c70: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
9c80: 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
9c90: 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73 74 20  r *zDb;.  const 
9ca0: 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 6f  char *zTbl;.  co
9cb0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a  nst char *zCol;.
9cc0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 63 6c 5f    int rc;.  Tcl_
9cd0: 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f  Obj *pRet;..  co
9ce0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 74  nst char *zDatat
9cf0: 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ype;.  const cha
9d00: 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20 20 69  r *zCollseq;.  i
9d10: 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 6e  nt notnull;.  in
9d20: 74 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20  t primarykey;.  
9d30: 69 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e  int autoincremen
9d40: 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
9d50: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  5 ){.    Tcl_Wro
9d60: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
9d70: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64  , 1, objv, "DB d
9d80: 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f  bname tblname co
9d90: 6c 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72 65 74  lname");.    ret
9da0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9db0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
9dc0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
9dd0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
9de0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
9df0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9e00: 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
9e10: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
9e20: 20 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zTbl = Tcl_GetS
9e30: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
9e40: 20 20 7a 43 6f 6c 20 3d 20 54 63 6c 5f 47 65 74    zCol = Tcl_Get
9e50: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b  String(objv[4]);
9e60: 0a 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a  ..  if( strlen(z
9e70: 44 62 29 3d 3d 30 20 29 20 7a 44 62 20 3d 20 30  Db)==0 ) zDb = 0
9e80: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
9e90: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
9ea0: 65 74 61 64 61 74 61 28 64 62 2c 20 7a 44 62 2c  etadata(db, zDb,
9eb0: 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a 20 20   zTbl, zCol, .  
9ec0: 20 20 20 20 26 7a 44 61 74 61 74 79 70 65 2c 20      &zDatatype, 
9ed0: 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f 74 6e  &zCollseq, &notn
9ee0: 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79 6b 65 79  ull, &primarykey
9ef0: 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  , &autoincrement
9f00: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
9f10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
9f20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9f30: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
9f40: 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
9f50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9f60: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65  RROR;.  }..  pRe
9f70: 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
9f80: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
9f90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
9fa0: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
9fb0: 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74 79 70 65  ingObj(zDatatype
9fc0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
9fd0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
9fe0: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
9ff0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 43 6f  NewStringObj(zCo
a000: 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a 20 20 54  llseq, -1));.  T
a010: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
a020: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
a030: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
a040: 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54 63 6c 5f  otnull));.  Tcl_
a050: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
a060: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
a070: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 72 69 6d  l_NewIntObj(prim
a080: 61 72 79 6b 65 79 29 29 3b 0a 20 20 54 63 6c 5f  arykey));.  Tcl_
a090: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
a0a0: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
a0b0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 75 74 6f  l_NewIntObj(auto
a0c0: 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a 20 20 54  increment));.  T
a0d0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
a0e0: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a  interp, pRet);..
a0f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
a100: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
a110: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
a120: 4e 43 52 42 4c 4f 42 0a 0a 2f 2a 0a 2a 2a 20 73  NCRBLOB../*.** s
a130: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
a140: 20 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54    CHANNEL OFFSET
a150: 20 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20   N.**.**   This 
a160: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
a170: 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69  to test the sqli
a180: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 20  te3_blob_read() 
a190: 69 6e 20 77 61 79 73 20 74 68 61 74 0a 2a 2a 20  in ways that.** 
a1a0: 20 20 74 68 65 20 54 63 6c 20 63 68 61 6e 6e 65    the Tcl channe
a1b0: 6c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73  l interface does
a1c0: 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73 74 20   not. The first 
a1d0: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 0a  argument should.
a1e0: 2a 2a 20 20 20 62 65 20 74 68 65 20 6e 61 6d 65  **   be the name
a1f0: 20 6f 66 20 61 20 76 61 6c 69 64 20 63 68 61 6e   of a valid chan
a200: 6e 65 6c 20 63 72 65 61 74 65 64 20 62 79 20 74  nel created by t
a210: 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d 65  he [incrblob] me
a220: 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61 20 64  thod.**   of a d
a230: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
a240: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  This function ca
a250: 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  lls sqlite3_blob
a260: 5f 72 65 61 64 28 29 0a 2a 2a 20 20 20 74 6f 20  _read().**   to 
a270: 72 65 61 64 20 4e 20 62 79 74 65 73 20 66 72 6f  read N bytes fro
a280: 6d 20 6f 66 66 73 65 74 20 4f 46 46 53 45 54 20  m offset OFFSET 
a290: 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  from the underly
a2a0: 69 6e 67 20 53 51 4c 69 74 65 0a 2a 2a 20 20 20  ing SQLite.**   
a2b0: 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a 0a  blob handle..**.
a2c0: 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73 2c  **   On success,
a2d0: 20 61 20 62 79 74 65 2d 61 72 72 61 79 20 6f 62   a byte-array ob
a2e0: 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ject containing 
a2f0: 74 68 65 20 72 65 61 64 20 64 61 74 61 20 69 73  the read data is
a300: 20 0a 2a 2a 20 20 20 72 65 74 75 72 6e 65 64 2e   .**   returned.
a310: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65   On failure, the
a320: 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73   interpreter res
a330: 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  ult is set to th
a340: 65 0a 2a 2a 20 20 20 74 65 78 74 20 72 65 70 72  e.**   text repr
a350: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
a360: 65 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  e returned error
a370: 20 63 6f 64 65 20 28 69 2e 65 2e 20 22 53 51 4c   code (i.e. "SQL
a380: 49 54 45 5f 4e 4f 4d 45 4d 22 29 0a 2a 2a 20 20  ITE_NOMEM").**  
a390: 20 61 6e 64 20 61 20 54 63 6c 20 65 78 63 65 70   and a Tcl excep
a3a0: 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a  tion is thrown..
a3b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
a3c0: 73 74 5f 62 6c 6f 62 5f 72 65 61 64 28 0a 20 20  st_blob_read(.  
a3d0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
a3e0: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
a3f0: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
a400: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
a410: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
a420: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
a430: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
a440: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
a450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a460: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a470: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
a480: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
a490: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
a4a0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
a4b0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b  Channel channel;
a4c0: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  .  ClientData in
a4d0: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 73 71  stanceData;.  sq
a4e0: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
a4f0: 62 3b 0a 20 20 69 6e 74 20 6e 6f 74 55 73 65 64  b;.  int notUsed
a500: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
a510: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
a520: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
a530: 42 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Buf;.  int rc;. 
a540: 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20   .  if( objc!=4 
a550: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
a560: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a570: 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45  1, objv, "CHANNE
a580: 4c 20 4f 46 46 53 45 54 20 4e 22 29 3b 0a 20 20  L OFFSET N");.  
a590: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a5a0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 63 68 61 6e 6e  OR;.  }..  chann
a5b0: 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  el = Tcl_GetChan
a5c0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
a5d0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
a5e0: 5d 29 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20  ]), &notUsed);. 
a5f0: 20 69 66 28 20 21 63 68 61 6e 6e 65 6c 0a 20 20   if( !channel.  
a600: 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f   || TCL_OK!=Tcl_
a610: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
a620: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
a630: 69 4f 66 66 73 65 74 29 0a 20 20 20 7c 7c 20 54  iOffset).   || T
a640: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
a650: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
a660: 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 79 74 65   objv[3], &nByte
a670: 29 0a 20 20 20 7c 7c 20 6e 42 79 74 65 3c 30 20  ).   || nByte<0 
a680: 7c 7c 20 69 4f 66 66 73 65 74 3c 30 0a 20 20 29  || iOffset<0.  )
a690: 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  { .    return TC
a6a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
a6b0: 69 6e 73 74 61 6e 63 65 44 61 74 61 20 3d 20 54  instanceData = T
a6c0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
a6d0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 6e 65  tanceData(channe
a6e0: 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 2a 28  l);.  pBlob = *(
a6f0: 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a  (sqlite3_blob **
a700: 29 69 6e 73 74 61 6e 63 65 44 61 74 61 29 3b 0a  )instanceData);.
a710: 0a 20 20 7a 42 75 66 20 3d 20 28 75 6e 73 69 67  .  zBuf = (unsig
a720: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 41  ned char *)Tcl_A
a730: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 72  lloc(nByte);.  r
a740: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
a750: 5f 72 65 61 64 28 70 42 6c 6f 62 2c 20 7a 42 75  _read(pBlob, zBu
a760: 66 2c 20 6e 42 79 74 65 2c 20 69 4f 66 66 73 65  f, nByte, iOffse
a770: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
a780: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
a790: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
a7a0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
a7b0: 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 42 75 66  yteArrayObj(zBuf
a7c0: 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 7d 65 6c  , nByte));.  }el
a7d0: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52  se{.    Tcl_SetR
a7e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
a7f0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73  har *)sqlite3Tes
a800: 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  tErrorName(rc), 
a810: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
a820: 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63   }.  Tcl_Free((c
a830: 68 61 72 20 2a 29 7a 42 75 66 29 3b 0a 0a 20 20  har *)zBuf);..  
a840: 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
a850: 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a  TE_OK ? TCL_OK :
a860: 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a   TCL_ERROR);.}..
a870: 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c  /*.** sqlite3_bl
a880: 6f 62 5f 77 72 69 74 65 20 43 48 41 4e 4e 45 4c  ob_write CHANNEL
a890: 20 4f 46 46 53 45 54 20 44 41 54 41 0a 2a 2a 0a   OFFSET DATA.**.
a8a0: 2a 2a 20 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  **   This comman
a8b0: 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  d is used to tes
a8c0: 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c  t the sqlite3_bl
a8d0: 6f 62 5f 77 72 69 74 65 28 29 20 69 6e 20 77 61  ob_write() in wa
a8e0: 79 73 20 74 68 61 74 0a 2a 2a 20 20 20 74 68 65  ys that.**   the
a8f0: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 69 6e 74   Tcl channel int
a900: 65 72 66 61 63 65 20 64 6f 65 73 20 6e 6f 74 2e  erface does not.
a910: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
a920: 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 20 20  ent should.**   
a930: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
a940: 20 76 61 6c 69 64 20 63 68 61 6e 6e 65 6c 20 63   valid channel c
a950: 72 65 61 74 65 64 20 62 79 20 74 68 65 20 5b 69  reated by the [i
a960: 6e 63 72 62 6c 6f 62 5d 20 6d 65 74 68 6f 64 0a  ncrblob] method.
a970: 2a 2a 20 20 20 6f 66 20 61 20 64 61 74 61 62 61  **   of a databa
a980: 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  se handle. This 
a990: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73  function calls s
a9a0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
a9b0: 65 28 29 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  e().**   to writ
a9c0: 65 20 74 68 65 20 44 41 54 41 20 62 79 74 65 2d  e the DATA byte-
a9d0: 61 72 72 61 79 20 74 6f 20 74 68 65 20 75 6e 64  array to the und
a9e0: 65 72 6c 79 69 6e 67 20 53 51 4c 69 74 65 20 62  erlying SQLite b
a9f0: 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a 20 20  lob handle..**  
aa00: 20 61 74 20 6f 66 66 73 65 74 20 4f 46 46 53 45   at offset OFFSE
aa10: 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20 73 75  T..**.**   On su
aa20: 63 63 65 73 73 2c 20 61 6e 20 65 6d 70 74 79 20  ccess, an empty 
aa30: 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
aa40: 65 64 2e 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  ed. On failure, 
aa50: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0a  the interpreter.
aa60: 2a 2a 20 20 20 72 65 73 75 6c 74 20 69 73 20 73  **   result is s
aa70: 65 74 20 74 6f 20 74 68 65 20 74 65 78 74 20 72  et to the text r
aa80: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
aa90: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 65 72   the returned er
aaa0: 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 20 20 28  ror code .**   (
aab0: 69 2e 65 2e 20 22 53 51 4c 49 54 45 5f 4e 4f 4d  i.e. "SQLITE_NOM
aac0: 45 4d 22 29 20 61 6e 64 20 61 20 54 63 6c 20 65  EM") and a Tcl e
aad0: 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68 72 6f  xception is thro
aae0: 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  wn..*/.static in
aaf0: 74 20 74 65 73 74 5f 62 6c 6f 62 5f 77 72 69 74  t test_blob_writ
ab00: 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
ab10: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
ab20: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
ab30: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
ab40: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
ab50: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
ab60: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
ab70: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
ab80: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
ab90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
aba0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
abb0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
abc0: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
abd0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
abe0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
abf0: 6e 6e 65 6c 3b 0a 20 20 43 6c 69 65 6e 74 44 61  nnel;.  ClientDa
ac00: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b  ta instanceData;
ac10: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
ac20: 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e 6f  *pBlob;.  int no
ac30: 74 55 73 65 64 3b 0a 20 20 69 6e 74 20 69 4f 66  tUsed;.  int iOf
ac40: 66 73 65 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  fset;.  int rc;.
ac50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
ac60: 20 2a 7a 42 75 66 3b 0a 20 20 69 6e 74 20 6e 42   *zBuf;.  int nB
ac70: 75 66 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a  uf;.  .  if( obj
ac80: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
ac90: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
aca0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43  erp, 1, objv, "C
acb0: 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 44 41  HANNEL OFFSET DA
acc0: 54 41 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TA");.    return
acd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
ace0: 0a 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c  .  channel = Tcl
acf0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
ad00: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
ad10: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 6e 6f 74  g(objv[1]), &not
ad20: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 21 63 68  Used);.  if( !ch
ad30: 61 6e 6e 65 6c 0a 20 20 20 7c 7c 20 54 43 4c 5f  annel.   || TCL_
ad40: 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
ad50: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
ad60: 6a 76 5b 32 5d 2c 20 26 69 4f 66 66 73 65 74 29  jv[2], &iOffset)
ad70: 0a 20 20 20 7c 7c 20 69 4f 66 66 73 65 74 3c 30  .   || iOffset<0
ad80: 0a 20 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  .  ){ .    retur
ad90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
ada0: 0a 0a 20 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ..  instanceData
adb0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
adc0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
add0: 61 6e 6e 65 6c 29 3b 0a 20 20 70 42 6c 6f 62 20  annel);.  pBlob 
ade0: 3d 20 2a 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f  = *((sqlite3_blo
adf0: 62 20 2a 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  b **)instanceDat
ae00: 61 29 3b 0a 0a 20 20 7a 42 75 66 20 3d 20 54 63  a);..  zBuf = Tc
ae10: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
ae20: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
ae30: 6e 42 75 66 29 3b 0a 20 20 72 63 20 3d 20 73 71  nBuf);.  rc = sq
ae40: 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
ae50: 28 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42  (pBlob, zBuf, nB
ae60: 75 66 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  uf, iOffset);.  
ae70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ae80: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
ae90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
aea0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65  char *)sqlite3Te
aeb0: 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  stErrorName(rc),
aec0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
aed0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72    }..  return (r
aee0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54  c==SQLITE_OK ? T
aef0: 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f  CL_OK : TCL_ERRO
af00: 52 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  R);.}.#endif../*
af10: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
af20: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
af30: 69 6f 6e 5f 76 32 20 44 42 2d 48 41 4e 44 4c 45  ion_v2 DB-HANDLE
af40: 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44   NAME CMP-PROC D
af50: 45 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20  EL-PROC.**.**   
af60: 54 68 69 73 20 54 63 6c 20 70 72 6f 63 20 69 73  This Tcl proc is
af70: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
af80: 67 20 74 68 65 20 65 78 70 65 72 69 6d 65 6e 74  g the experiment
af90: 61 6c 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f  al.**   sqlite3_
afa0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
afb0: 5f 76 32 28 29 20 69 6e 74 65 72 66 61 63 65 2e  _v2() interface.
afc0: 0a 2a 2f 0a 73 74 72 75 63 74 20 54 65 73 74 43  .*/.struct TestC
afd0: 6f 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20 20 54 63  ollationX {.  Tc
afe0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
aff0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
b000: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44  p;.  Tcl_Obj *pD
b010: 65 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73  el;.};.typedef s
b020: 74 72 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74  truct TestCollat
b030: 69 6f 6e 58 20 54 65 73 74 43 6f 6c 6c 61 74 69  ionX TestCollati
b040: 6f 6e 58 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  onX;.static void
b050: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
b060: 74 69 6f 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43  tionDel(void *pC
b070: 74 78 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61  tx){.  TestColla
b080: 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74  tionX *p = (Test
b090: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74  CollationX *)pCt
b0a0: 78 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 54  x;..  int rc = T
b0b0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
b0c0: 69 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 6c 2c  interp, p->pDel,
b0d0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
b0e0: 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c  |TCL_EVAL_GLOBAL
b0f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
b100: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42  _OK ){.    Tcl_B
b110: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70  ackgroundError(p
b120: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a  ->interp);.  }..
b130: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
b140: 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54  nt(p->pCmp);.  T
b150: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
b160: 70 2d 3e 70 44 65 6c 29 3b 0a 20 20 73 71 6c 69  p->pDel);.  sqli
b170: 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20 2a  te3_free((void *
b180: 29 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  )p);.}.static in
b190: 74 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c  t testCreateColl
b1a0: 61 74 69 6f 6e 43 6d 70 28 0a 20 20 76 6f 69 64  ationCmp(.  void
b1b0: 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 4c   *pCtx,.  int nL
b1c0: 65 66 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  eft,.  const voi
b1d0: 64 20 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e 74 20  d *zLeft,.  int 
b1e0: 6e 52 69 67 68 74 2c 0a 20 20 63 6f 6e 73 74 20  nRight,.  const 
b1f0: 76 6f 69 64 20 2a 7a 52 69 67 68 74 0a 29 7b 0a  void *zRight.){.
b200: 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58    TestCollationX
b210: 20 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61   *p = (TestColla
b220: 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 20 20  tionX *)pCtx;.  
b230: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
b240: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
b250: 4f 62 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20  Obj(p->pCmp);.  
b260: 69 6e 74 20 69 52 65 73 20 3d 20 30 3b 0a 0a 20  int iRes = 0;.. 
b270: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
b280: 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63  t(pScript);.  Tc
b290: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b2a0: 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70  lement(0, pScrip
b2b0: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
b2c0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 4c 65 66  Obj((char *)zLef
b2d0: 74 2c 20 6e 4c 65 66 74 29 29 3b 0a 20 20 54 63  t, nLeft));.  Tc
b2e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b2f0: 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70  lement(0, pScrip
b300: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
b310: 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 52 69 67  Obj((char *)zRig
b320: 68 74 2c 6e 52 69 67 68 74 29 29 3b 0a 0a 20 20  ht,nRight));..  
b330: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
b340: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
b350: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 54 43  erp, pScript, TC
b360: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43  L_EVAL_DIRECT|TC
b370: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20  L_EVAL_GLOBAL). 
b380: 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c    || TCL_OK!=Tcl
b390: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 70  _GetIntFromObj(p
b3a0: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  ->interp, Tcl_Ge
b3b0: 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e  tObjResult(p->in
b3c0: 74 65 72 70 29 2c 20 26 69 52 65 73 29 0a 20 20  terp), &iRes).  
b3d0: 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67  ){.    Tcl_Backg
b3e0: 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e  roundError(p->in
b3f0: 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  terp);.  }.  Tcl
b400: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _DecrRefCount(pS
b410: 63 72 69 70 74 29 3b 0a 0a 20 20 72 65 74 75 72  cript);..  retur
b420: 6e 20 69 52 65 73 3b 0a 7d 0a 73 74 61 74 69 63  n iRes;.}.static
b430: 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65   int test_create
b440: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20  _collation_v2(. 
b450: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
b460: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
b470: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
b480: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
b490: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
b4a0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
b4b0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
b4c0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b4e0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
b4f0: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
b500: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
b510: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
b520: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 65 73  ents */.){.  Tes
b530: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a  tCollationX *p;.
b540: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
b550: 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b    if( objc!=5 ){
b560: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
b570: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
b580: 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c   objv, "DB-HANDL
b590: 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20  E NAME CMP-PROC 
b5a0: 44 45 4c 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20  DEL-PROC");.    
b5b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b5c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
b5d0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
b5e0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
b5f0: 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
b600: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b610: 3b 0a 0a 20 20 70 20 3d 20 28 54 65 73 74 43 6f  ;..  p = (TestCo
b620: 6c 6c 61 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74  llationX *)sqlit
b630: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
b640: 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29  (TestCollationX)
b650: 29 3b 0a 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f  );.  p->pCmp = o
b660: 62 6a 76 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65  bjv[3];.  p->pDe
b670: 6c 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70  l = objv[4];.  p
b680: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
b690: 70 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  p;.  Tcl_IncrRef
b6a0: 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a  Count(p->pCmp);.
b6b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
b6c0: 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20  nt(p->pDel);..  
b6d0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
b6e0: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20  ollation_v2(db, 
b6f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b700: 6a 76 5b 32 5d 29 2c 20 53 51 4c 49 54 45 5f 55  jv[2]), SQLITE_U
b710: 54 46 38 2c 20 0a 20 20 20 20 20 20 28 76 6f 69  TF8, .      (voi
b720: 64 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61 74  d *)p, testCreat
b730: 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20 74  eCollationCmp, t
b740: 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69  estCreateCollati
b750: 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 72 65 74  onDel.  );.  ret
b760: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
b770: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
b780: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
b790: 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c  on DB-HANDLE FIL
b7a0: 45 20 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74  E ?PROC?.*/.stat
b7b0: 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 6f 61 64  ic int test_load
b7c0: 5f 65 78 74 65 6e 73 69 6f 6e 28 0a 20 20 43 6c  _extension(.  Cl
b7d0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
b7e0: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
b7f0: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
b800: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
b810: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
b820: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
b830: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
b840: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
b850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b860: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
b870: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
b880: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
b890: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
b8a0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d  s */.){.  Tcl_Cm
b8b0: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
b8c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
b8d0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
b8e0: 7a 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  zDb;.  char *zFi
b8f0: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f  le;.  char *zPro
b900: 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  c = 0;.  char *z
b910: 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Err = 0;..  if( 
b920: 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21  objc!=4 && objc!
b930: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
b940: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
b950: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d  p, 1, objv, "DB-
b960: 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f  HANDLE FILE ?PRO
b970: 43 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  C?");.    return
b980: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
b990: 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
b9a0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
b9b0: 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
b9c0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
b9d0: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  ;.  if( objc==4 
b9e0: 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 54  ){.    zProc = T
b9f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
ba00: 76 5b 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  v[3]);.  }..  /*
ba10: 20 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64   Extract the C d
ba20: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66  atabase handle f
ba30: 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d  rom the Tcl comm
ba40: 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66  and name */.  if
ba50: 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
ba60: 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44  dInfo(interp, zD
ba70: 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  b, &cmdInfo) ){.
ba80: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
ba90: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
baa0: 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a  mmand not found:
bab0: 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29   ", zDb, (char*)
bac0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
bad0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
bae0: 64 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71  db = ((struct Sq
baf0: 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e  liteDb*)cmdInfo.
bb00: 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e  objClientData)->
bb10: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29  db;.  assert(db)
bb20: 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65  ;..  /* Call the
bb30: 20 75 6e 64 65 72 6c 79 69 6e 67 20 43 20 66 75   underlying C fu
bb40: 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72  nction. If an er
bb50: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
bb60: 72 63 20 74 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f  rc to .  ** TCL_
bb70: 45 52 52 4f 52 20 61 6e 64 20 6c 6f 61 64 20 61  ERROR and load a
bb80: 6e 79 20 65 72 72 6f 72 20 73 74 72 69 6e 67 20  ny error string 
bb90: 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72  into the interpr
bba0: 65 74 65 72 2e 20 49 66 20 6e 6f 20 0a 20 20 2a  eter. If no .  *
bbb0: 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  * error occurs, 
bbc0: 73 65 74 20 72 63 20 74 6f 20 54 43 4c 5f 4f 4b  set rc to TCL_OK
bbd0: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
bbe0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
bbf0: 58 54 45 4e 53 49 4f 4e 0a 20 20 72 63 20 3d 20  XTENSION.  rc = 
bc00: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
bc10: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
bc20: 70 72 69 6e 74 66 28 22 74 68 69 73 20 62 75 69  printf("this bui
bc30: 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33  ld omits sqlite3
bc40: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
bc50: 29 22 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20  )");.#else.  rc 
bc60: 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  = sqlite3_load_e
bc70: 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a 46 69  xtension(db, zFi
bc80: 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72  le, zProc, &zErr
bc90: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
bca0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bcb0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
bcc0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 20  lt(interp, zErr 
bcd0: 3f 20 7a 45 72 72 20 3a 20 22 22 2c 20 54 43 4c  ? zErr : "", TCL
bce0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
bcf0: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
bd00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
bd10: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  = TCL_OK;.  }.  
bd20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
bd30: 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  r);..  return rc
bd40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
bd50: 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  : sqlite3_enable
bd60: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20  _load_extension 
bd70: 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 0a  DB-HANDLE ONOFF.
bd80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
bd90: 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 28 0a  st_enable_load(.
bda0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
bdb0: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20  entData, /* Not 
bdc0: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
bdd0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
bde0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
bdf0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
be00: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
be10: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be30: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
be40: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
be50: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
be60: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
be70: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
be80: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
be90: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
bea0: 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  ;.  char *zDb;. 
beb0: 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 0a 20 20 69   int onoff;..  i
bec0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
bed0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
bee0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
bef0: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4f  jv, "DB-HANDLE O
bf00: 4e 4f 46 46 22 29 3b 0a 20 20 20 20 72 65 74 75  NOFF");.    retu
bf10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
bf20: 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
bf30: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
bf40: 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20  ;..  /* Extract 
bf50: 74 68 65 20 43 20 64 61 74 61 62 61 73 65 20 68  the C database h
bf60: 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 54  andle from the T
bf70: 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20  cl command name 
bf80: 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65  */.  if( !Tcl_Ge
bf90: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
bfa0: 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e  erp, zDb, &cmdIn
bfb0: 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  fo) ){.    Tcl_A
bfc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
bfd0: 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74  rp, "command not
bfe0: 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20   found: ", zDb, 
bff0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
c000: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c010: 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28 73 74  .  }.  db = ((st
c020: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
c030: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
c040: 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73  Data)->db;.  ass
c050: 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47  ert(db);..  /* G
c060: 65 74 20 74 68 65 20 6f 6e 6f 66 66 20 70 61 72  et the onoff par
c070: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 66 28 20  ameter */.  if( 
c080: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
c090: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
c0a0: 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29  jv[2], &onoff) )
c0b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
c0c0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66  _ERROR;.  }..#if
c0d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c0e0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
c0f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
c100: 74 28 69 6e 74 65 72 70 2c 20 22 74 68 69 73 20  t(interp, "this 
c110: 62 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69  build omits sqli
c120: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
c130: 6f 6e 28 29 22 29 3b 0a 20 20 72 65 74 75 72 6e  on()");.  return
c140: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
c150: 65 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  e.  sqlite3_enab
c160: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
c170: 6e 28 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20  n(db, onoff);.  
c180: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23  return TCL_OK;.#
c190: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
c1a0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 61 62  sage:  sqlite_ab
c1b0: 6f 72 74 0a 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f  ort.**.** Shutdo
c1c0: 77 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  wn the process i
c1d0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54 68 69  mmediately.  Thi
c1e0: 73 20 69 73 20 6e 6f 74 20 61 20 63 6c 65 61 6e  s is not a clean
c1f0: 20 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68   shutdown..** Th
c200: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  is command is us
c210: 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 72  ed to test the r
c220: 65 63 6f 76 65 72 61 62 69 6c 69 74 79 20 6f 66  ecoverability of
c230: 20 61 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a   a database in.*
c240: 2a 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  * the event of a
c250: 20 70 72 6f 67 72 61 6d 20 63 72 61 73 68 2e 0a   program crash..
c260: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
c270: 6c 69 74 65 5f 61 62 6f 72 74 28 0a 20 20 76 6f  lite_abort(.  vo
c280: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
c290: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
c2a0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
c2b0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
c2c0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
c2d0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
c2e0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
c2f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c300: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
c310: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
c320: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
c330: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
c340: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  /.){.  assert( i
c350: 6e 74 65 72 70 3d 3d 30 20 29 3b 20 20 20 2f 2a  nterp==0 );   /*
c360: 20 54 68 69 73 20 77 69 6c 6c 20 61 6c 77 61 79   This will alway
c370: 73 20 66 61 69 6c 20 2a 2f 0a 20 20 72 65 74 75  s fail */.  retu
c380: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
c390: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
c3a0: 67 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 75  g routine is a u
c3b0: 73 65 72 2d 64 65 66 69 6e 65 64 20 53 51 4c 20  ser-defined SQL 
c3c0: 66 75 6e 63 74 69 6f 6e 20 77 68 6f 73 65 20 70  function whose p
c3d0: 75 72 70 6f 73 65 0a 2a 2a 20 69 73 20 74 6f 20  urpose.** is to 
c3e0: 74 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 5f  test the sqlite_
c3f0: 73 65 74 5f 72 65 73 75 6c 74 28 29 20 41 50 49  set_result() API
c400: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c410: 20 74 65 73 74 46 75 6e 63 28 73 71 6c 69 74 65   testFunc(sqlite
c420: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
c430: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
c440: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
c450: 67 76 29 7b 0a 20 20 77 68 69 6c 65 28 20 61 72  gv){.  while( ar
c460: 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e  gc>=2 ){.    con
c470: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 30 20 3d  st char *zArg0 =
c480: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
c490: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
c4a0: 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 72  0]);.    if( zAr
c4b0: 67 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  g0 ){.      if( 
c4c0: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
c4d0: 70 28 7a 41 72 67 30 2c 20 22 69 6e 74 22 29 20  p(zArg0, "int") 
c4e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c4f0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
c500: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76  ntext, sqlite3_v
c510: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d  alue_int(argv[1]
c520: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
c530: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
c540: 6d 70 28 7a 41 72 67 30 2c 22 69 6e 74 36 34 22  mp(zArg0,"int64"
c550: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
c560: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
c570: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71  nt64(context, sq
c580: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
c590: 34 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20  4(argv[1]));.   
c5a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
c5b0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
c5c0: 30 2c 22 73 74 72 69 6e 67 22 29 3d 3d 30 20 29  0,"string")==0 )
c5d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c5e0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
c5f0: 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73 71  ntext, (char*)sq
c600: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
c610: 28 61 72 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20  (argv[1]), -1,. 
c620: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
c630: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
c640: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
c650: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72  lite3StrICmp(zAr
c660: 67 30 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20  g0,"double")==0 
c670: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c680: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
c690: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
c6a0: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61  3_value_double(a
c6b0: 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20  rgv[1]));.      
c6c0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
c6d0: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
c6e0: 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  null")==0 ){.   
c6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
c700: 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74  ult_null(context
c710: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
c720: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
c730: 70 28 7a 41 72 67 30 2c 22 76 61 6c 75 65 22 29  p(zArg0,"value")
c740: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
c750: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
c760: 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  lue(context, arg
c770: 76 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  v[sqlite3_value_
c780: 69 6e 74 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a  int(argv[1])]);.
c790: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c7a0: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
c7b0: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
c7c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f   }else{.      go
c7d0: 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
c7e0: 20 20 7d 0a 20 20 20 20 61 72 67 63 20 2d 3d 20    }.    argc -= 
c7f0: 32 3b 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32  2;.    argv += 2
c800: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  ;.  }.  return;.
c810: 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71  .error_out:.  sq
c820: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
c830: 6f 72 28 63 6f 6e 74 65 78 74 2c 22 66 69 72 73  or(context,"firs
c840: 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  t argument shoul
c850: 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20  d be one of: ". 
c860: 20 20 20 20 20 22 69 6e 74 20 69 6e 74 36 34 20       "int int64 
c870: 73 74 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75  string double nu
c880: 6c 6c 20 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a  ll value", -1);.
c890: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
c8a0: 20 20 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65    sqlite_registe
c8b0: 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  r_test_function 
c8c0: 20 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20   DB  NAME.**.** 
c8d0: 52 65 67 69 73 74 65 72 20 74 68 65 20 74 65 73  Register the tes
c8e0: 74 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f  t SQL function o
c8f0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 44  n the database D
c900: 42 20 75 6e 64 65 72 20 74 68 65 20 6e 61 6d 65  B under the name
c910: 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63   NAME..*/.static
c920: 20 69 6e 74 20 74 65 73 74 5f 72 65 67 69 73 74   int test_regist
c930: 65 72 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20  er_func(.  void 
c940: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
c950: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
c960: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
c970: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
c980: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
c990: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
c9a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c9b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
c9c0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
c9d0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
c9e0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
c9f0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
ca00: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
ca10: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
ca20: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
ca30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ca40: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
ca50: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
ca60: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
ca70: 0a 20 20 20 20 20 20 20 22 20 44 42 20 46 55 4e  .       " DB FUN
ca80: 43 54 49 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b  CTION-NAME", 0);
ca90: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
caa0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
cab0: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
cac0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
cad0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
cae0: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
caf0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
cb00: 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b  nction(db, argv[
cb10: 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  2], -1, SQLITE_U
cb20: 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20 20 74  TF8, 0, .      t
cb30: 65 73 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  estFunc, 0, 0);.
cb40: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
cb50: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
cb60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
cb70: 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 30  te3ErrStr(rc), 0
cb80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
cb90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
cba0: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
cbb0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
cbc0: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
cbd0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
cbe0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
cbf0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
cc00: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54  te3_finalize  ST
cc10: 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69  MT .**.** Finali
cc20: 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68  ze a statement h
cc30: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
cc40: 20 69 6e 74 20 74 65 73 74 5f 66 69 6e 61 6c 69   int test_finali
cc50: 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ze(.  void * cli
cc60: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
cc70: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
cc80: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
cc90: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
cca0: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
ccb0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
ccc0: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
ccd0: 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20 69 66 28   *db = 0;..  if(
cce0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
ccf0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
cd00: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
cd10: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
cd20: 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
cd30: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
cd40: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
cd50: 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a   " <STMT>", 0);.
cd60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
cd70: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
cd80: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
cd90: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
cda0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
cdb0: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
cdc0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69   TCL_ERROR;..  i
cdd0: 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
cde0: 64 62 20 3d 20 53 74 6d 74 54 6f 44 62 28 70 53  db = StmtToDb(pS
cdf0: 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tmt);.  }.  rc =
ce00: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
ce10: 65 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f  e(pStmt);.  Tcl_
ce20: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
ce30: 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
ce40: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
ce50: 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 64 62  TATIC);.  if( db
ce60: 20 26 26 20 73 71 6c 69 74 65 33 54 65 73 74 45   && sqlite3TestE
ce70: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
ce80: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
ce90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
cea0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
ceb0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
cec0: 69 74 65 33 5f 72 65 73 65 74 20 20 53 54 4d 54  ite3_reset  STMT
ced0: 20 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20   .**.** Reset a 
cee0: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
cef0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cf00: 74 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f  test_reset(.  vo
cf10: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
cf20: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
cf30: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
cf40: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
cf50: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
cf60: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
cf70: 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  tmt;.  int rc;..
cf80: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
cf90: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
cfa0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
cfb0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
cfc0: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
cfd0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
cfe0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
cff0: 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c  , 0), " <STMT>",
d000: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
d010: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
d020: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
d030: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
d040: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
d050: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
d060: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d070: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
d080: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
d090: 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71   if( pStmt && sq
d0a0: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
d0b0: 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
d0c0: 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 7b  b(pStmt), rc) ){
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 54 63 6c  ERROR;.  }.  Tcl
d0f0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
d100: 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
d110: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
d120: 53 54 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66  STATIC);./*.  if
d130: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
d140: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d150: 7d 0a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  }.*/.  return TC
d160: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
d170: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
d180: 78 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a  xpired STMT .**.
d190: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
d1a0: 66 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  f a recompilatio
d1b0: 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
d1c0: 6e 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65  nt is recommende
d1d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
d1e0: 20 74 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20   test_expired(. 
d1f0: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
d200: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
d210: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
d220: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
d230: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
d240: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
d250: 2a 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62  *pStmt;.  if( ob
d260: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
d270: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d280: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
d290: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
d2a0: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
d2b0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
d2c0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
d2d0: 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20  <STMT>", 0);.   
d2e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d2f0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
d300: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
d310: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
d320: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
d330: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
d340: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
d350: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
d360: 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
d370: 6e 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 78 70  nObj(sqlite3_exp
d380: 69 72 65 64 28 70 53 74 6d 74 29 29 29 3b 0a 20  ired(pStmt)));. 
d390: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
d3a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
d3b0: 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65   sqlite3_transfe
d3c0: 72 5f 62 69 6e 64 69 6e 67 73 20 46 52 4f 4d 53  r_bindings FROMS
d3d0: 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a  TMT TOSTMT.**.**
d3e0: 20 54 72 61 6e 73 66 65 72 20 61 6c 6c 20 62 69   Transfer all bi
d3f0: 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46 52 4f 4d  ndings from FROM
d400: 53 54 4d 54 20 6f 76 65 72 20 74 6f 20 54 4f 53  STMT over to TOS
d410: 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  TMT.*/.static in
d420: 74 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f  t test_transfer_
d430: 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 20 63  bind(.  void * c
d440: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
d450: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
d460: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
d470: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
d480: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
d490: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c 20  3_stmt *pStmt1, 
d4a0: 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20 6f  *pStmt2;.  if( o
d4b0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
d4c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d4d0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
d4e0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
d4f0: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
d500: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
d510: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
d520: 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53 54   FROM-STMT TO-ST
d530: 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
d540: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d550: 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
d560: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
d570: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
d580: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31 29  jv[1]), &pStmt1)
d590: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
d5a0: 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d  OR;.  if( getStm
d5b0: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
d5c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
d5d0: 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 32  bjv[2]), &pStmt2
d5e0: 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  )) return TCL_ER
d5f0: 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
d600: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
d610: 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74  .     Tcl_NewInt
d620: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61 6e  Obj(sqlite3_tran
d630: 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70 53  sfer_bindings(pS
d640: 74 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b 0a  tmt1,pStmt2)));.
d650: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
d660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
d670: 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
d680: 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  s DB.**.** Retur
d690: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
d6a0: 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20  changes made to 
d6b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 79 20  the database by 
d6c0: 74 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a 2a 20  the last SQL.** 
d6d0: 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  execution..*/.st
d6e0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 68  atic int test_ch
d6f0: 61 6e 67 65 73 28 0a 20 20 76 6f 69 64 20 2a 20  anges(.  void * 
d700: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
d710: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
d720: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
d730: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
d740: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
d750: 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62  e3 *db;.  if( ob
d760: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
d770: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d780: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
d790: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
d7a0: 22 22 2c 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  "",.       Tcl_G
d7b0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
d7c0: 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
d7d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d7e0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
d7f0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
d800: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
d810: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
d820: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
d830: 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
d840: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
d850: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
d860: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29  ite3_changes(db)
d870: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
d880: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
d890: 69 73 20 69 73 20 74 68 65 20 22 73 74 61 74 69  is is the "stati
d8a0: 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20 74 68  c_bind_value" th
d8b0: 61 74 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  at variables are
d8c0: 20 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e 0a 2a   bound to when.*
d8d0: 2a 20 74 68 65 20 46 4c 41 47 20 6f 70 74 69 6f  * the FLAG optio
d8e0: 6e 20 6f 66 20 73 71 6c 69 74 65 33 5f 62 69 6e  n of sqlite3_bin
d8f0: 64 20 69 73 20 22 73 74 61 74 69 63 22 0a 2a 2f  d is "static".*/
d900: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 71  .static char *sq
d910: 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
d920: 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 73 74 61 74  _value = 0;.stat
d930: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 74  ic int sqlite_st
d940: 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 20  atic_bind_nbyte 
d950: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  = 0;../*.** Usag
d960: 65 3a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  e:  sqlite3_bind
d970: 20 20 56 4d 20 20 49 44 58 20 20 56 41 4c 55 45    VM  IDX  VALUE
d980: 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 53 65    FLAGS.**.** Se
d990: 74 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ts the value of 
d9a0: 74 68 65 20 49 44 58 2d 74 68 20 6f 63 63 75 72  the IDX-th occur
d9b0: 61 6e 63 65 20 6f 66 20 22 3f 22 20 69 6e 20 74  ance of "?" in t
d9c0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 0a  he original SQL.
d9d0: 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56 41 4c 55  ** string.  VALU
d9e0: 45 20 69 73 20 74 68 65 20 6e 65 77 20 76 61 6c  E is the new val
d9f0: 75 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  ue.  If FLAGS=="
da00: 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41 4c 55 45  null" then VALUE
da10: 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 20 61   is.** ignored a
da20: 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  nd the value is 
da30: 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66  set to NULL.  If
da40: 20 46 4c 41 47 53 3d 3d 22 73 74 61 74 69 63 22   FLAGS=="static"
da50: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c   then.** the val
da60: 75 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ue is set to the
da70: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 74 61 74   value of a stat
da80: 69 63 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65  ic variable name
da90: 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 73 74 61  d.** "sqlite_sta
daa0: 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2e  tic_bind_value".
dab0: 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 6f 72    If FLAGS=="nor
dac0: 6d 61 6c 22 20 74 68 65 6e 20 61 20 63 6f 70 79  mal" then a copy
dad0: 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41 4c 55 45  .** of the VALUE
dae0: 20 69 73 20 6d 61 64 65 2e 20 20 49 66 20 46 4c   is made.  If FL
daf0: 41 47 53 3d 3d 22 62 6c 6f 62 31 30 22 20 74 68  AGS=="blob10" th
db00: 65 6e 20 61 20 56 41 4c 55 45 20 69 73 20 69 67  en a VALUE is ig
db10: 6e 6f 72 65 64 0a 2a 2a 20 61 6e 20 61 20 31 30  nored.** an a 10
db20: 2d 62 79 74 65 20 62 6c 6f 62 20 22 61 62 63 5c  -byte blob "abc\
db30: 30 30 30 78 79 7a 5c 30 30 30 70 71 22 20 69 73  000xyz\000pq" is
db40: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 73 74   inserted..*/.st
db50: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
db60: 6e 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nd(.  void *NotU
db70: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
db80: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
db90: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
dba0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
dbb0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
dbc0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
dbd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
dbe0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
dbf0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
dc00: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
dc10: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
dc20: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
dc30: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
dc40: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  mt;.  int rc;.  
dc50: 69 6e 74 20 69 64 78 3b 0a 20 20 69 66 28 20 61  int idx;.  if( a
dc60: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
dc70: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
dc80: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
dc90: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
dca0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
dcb0: 20 20 20 20 20 20 22 20 56 4d 20 49 44 58 20 56        " VM IDX V
dcc0: 41 4c 55 45 20 28 6e 75 6c 6c 7c 73 74 61 74 69  ALUE (null|stati
dcd0: 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c 20 30 29  c|normal)\"", 0)
dce0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
dcf0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
dd00: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
dd10: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
dd20: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
dd30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dd40: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
dd50: 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20  nterp, argv[2], 
dd60: 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
dd70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
dd80: 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
dd90: 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  null")==0 ){.   
dda0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
ddb0: 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
ddc0: 64 78 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  dx);.  }else if(
ddd0: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
dde0: 22 73 74 61 74 69 63 22 29 3d 3d 30 20 29 7b 0a  "static")==0 ){.
ddf0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
de00: 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
de10: 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74  , idx, sqlite_st
de20: 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c  atic_bind_value,
de30: 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65   -1, 0);.  }else
de40: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
de50: 5b 34 5d 2c 22 73 74 61 74 69 63 2d 6e 62 79 74  [4],"static-nbyt
de60: 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  es")==0 ){.    r
de70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
de80: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78  _text(pStmt, idx
de90: 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  , sqlite_static_
dea0: 62 69 6e 64 5f 76 61 6c 75 65 2c 0a 20 20 20 20  bind_value,.    
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 20 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63     sqlite_static
dee0: 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 30 29 3b  _bind_nbyte, 0);
def0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
df00: 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 6f 72  cmp(argv[4],"nor
df10: 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mal")==0 ){.    
df20: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
df30: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
df40: 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d 31 2c 20  x, argv[3], -1, 
df50: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
df60: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
df70: 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 62  trcmp(argv[4],"b
df80: 6c 6f 62 31 30 22 29 3d 3d 30 20 29 7b 0a 20 20  lob10")==0 ){.  
df90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
dfa0: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
dfb0: 69 64 78 2c 20 22 61 62 63 5c 30 30 30 78 79 7a  idx, "abc\000xyz
dfc0: 5c 30 30 30 70 71 22 2c 20 31 30 2c 20 53 51 4c  \000pq", 10, SQL
dfd0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d  ITE_STATIC);.  }
dfe0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70  else{.    Tcl_Ap
dff0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e000: 70 2c 20 22 34 74 68 20 61 72 67 75 6d 65 6e 74  p, "4th argument
e010: 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
e020: 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f       "\"null\" o
e030: 72 20 5c 22 73 74 61 74 69 63 5c 22 20 6f 72 20  r \"static\" or 
e040: 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20 30 29 3b  \"normal\"", 0);
e050: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e060: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
e070: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
e080: 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
e090: 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
e0a0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
e0b0: 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ROR;.  if( rc ){
e0c0: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 35  .    char zBuf[5
e0d0: 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  0];.    sprintf(
e0e0: 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72  zBuf, "(%d) ", r
e0f0: 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  c);.    Tcl_Appe
e100: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e110: 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 45 72   zBuf, sqlite3Er
e120: 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20  rStr(rc), 0);.  
e130: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e140: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
e150: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e   TCL_OK;.}..#ifn
e160: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e170: 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67  UTF16./*.** Usag
e180: 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c  e: add_test_coll
e190: 61 74 65 20 3c 64 62 20 70 74 72 3e 20 3c 75 74  ate <db ptr> <ut
e1a0: 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75  f8> <utf16le> <u
e1b0: 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68  tf16be>.**.** Th
e1c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
e1d0: 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74  sed to test that
e1e0: 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20   SQLite selects 
e1f0: 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6c 6c  the correct coll
e200: 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e 63  ation.** sequenc
e210: 65 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20  e callback when 
e220: 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e  multiple version
e230: 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74  s (for different
e240: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29   text encodings)
e250: 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c  .** are availabl
e260: 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67  e..**.** Calling
e270: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
e280: 67 69 73 74 65 72 73 20 74 68 65 20 63 6f 6c 6c  gisters the coll
e290: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 22  ation sequence "
e2a0: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a  test_collate".**
e2b0: 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20 68   with database h
e2c0: 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54 68 65 20  andle <db>. The 
e2d0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
e2e0: 6d 75 73 74 20 62 65 20 61 20 6c 69 73 74 20 6f  must be a list o
e2f0: 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65  f three.** boole
e300: 61 6e 20 76 61 6c 75 65 73 2e 20 49 66 20 74 68  an values. If th
e310: 65 20 66 69 72 73 74 20 69 73 20 74 72 75 65 2c  e first is true,
e320: 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f 6e 20   then a version 
e330: 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  of test_collate 
e340: 69 73 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  is.** registered
e350: 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20 74   for UTF-8, if t
e360: 68 65 20 73 65 63 6f 6e 64 20 69 73 20 74 72 75  he second is tru
e370: 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69 73 20  e, a version is 
e380: 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 0a 2a  registered for.*
e390: 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74  * UTF-16le, if t
e3a0: 68 65 20 74 68 69 72 64 20 69 73 20 74 72 75 65  he third is true
e3b0: 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76 65 72  , a UTF-16be ver
e3c0: 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  sion is availabl
e3d0: 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75 73 20 76  e..** Previous v
e3e0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 65 73 74 5f  ersions of test_
e3f0: 63 6f 6c 6c 61 74 65 20 61 72 65 20 64 65 6c 65  collate are dele
e400: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ted..**.** The c
e410: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
e420: 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69  e test_collate i
e430: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
e440: 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20   calling the.** 
e450: 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63  following TCL sc
e460: 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74  ript:.**.**   "t
e470: 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 65 6e 63  est_collate <enc
e480: 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e 22 0a 2a  > <lhs> <rhs>".*
e490: 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73 3e 20 61  *.** The <lhs> a
e4a0: 6e 64 20 3c 72 68 73 3e 20 61 72 65 20 74 68 65  nd <rhs> are the
e4b0: 20 74 77 6f 20 76 61 6c 75 65 73 20 62 65 69 6e   two values bein
e4c0: 67 20 63 6f 6d 70 61 72 65 64 2c 20 65 6e 63 6f  g compared, enco
e4d0: 64 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a  ded in UTF-8..**
e4e0: 20 54 68 65 20 3c 65 6e 63 3e 20 70 61 72 61 6d   The <enc> param
e4f0: 65 74 65 72 20 69 73 20 74 68 65 20 65 6e 63 6f  eter is the enco
e500: 64 69 6e 67 20 6f 66 20 74 68 65 20 63 6f 6c 6c  ding of the coll
e510: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74  ation function t
e520: 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  hat.** SQLite se
e530: 6c 65 63 74 65 64 20 74 6f 20 63 61 6c 6c 2e 20  lected to call. 
e540: 54 68 65 20 54 43 4c 20 74 65 73 74 20 73 63 72  The TCL test scr
e550: 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ipt implements t
e560: 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63 6f 6c 6c  he.** "test_coll
e570: 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a  ate" proc..**.**
e580: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
e590: 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20 77  will only work w
e5a0: 69 74 68 20 6f 6e 65 20 69 6e 74 65 70 72 65 74  ith one intepret
e5b0: 65 72 20 61 74 20 61 20 74 69 6d 65 2c 20 61 73  er at a time, as
e5c0: 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 70 20 70   the.** interp p
e5d0: 6f 69 6e 74 65 72 20 74 6f 20 75 73 65 20 77 68  ointer to use wh
e5e0: 65 6e 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  en evaluating th
e5f0: 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20  e TCL script is 
e600: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 54 65  stored in.** pTe
e610: 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 2e  stCollateInterp.
e620: 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 49  .*/.static Tcl_I
e630: 6e 74 65 72 70 2a 20 70 54 65 73 74 43 6f 6c 6c  nterp* pTestColl
e640: 61 74 65 49 6e 74 65 72 70 3b 0a 73 74 61 74 69  ateInterp;.stati
e650: 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61  c int test_colla
e660: 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20  te_func(.  void 
e670: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
e680: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41  , const void *zA
e690: 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73  ,.  int nB, cons
e6a0: 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20  t void *zB.){.  
e6b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 20 3d 20  Tcl_Interp *i = 
e6c0: 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
e6d0: 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63 69 6e 20  rp;.  int encin 
e6e0: 3d 20 28 69 6e 74 29 70 43 74 78 3b 0a 20 20 69  = (int)pCtx;.  i
e6f0: 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e 3b  nt res;.  int n;
e700: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ..  sqlite3_valu
e710: 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f 4f  e *pVal;.  Tcl_O
e720: 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d 20  bj *pX;..  pX = 
e730: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
e740: 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c  ("test_collate",
e750: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
e760: 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a 20  RefCount(pX);.. 
e770: 20 73 77 69 74 63 68 28 20 65 6e 63 69 6e 20 29   switch( encin )
e780: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
e790: 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 54 63  E_UTF8:.      Tc
e7a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
e7b0: 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f  lement(i,pX,Tcl_
e7c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
e7d0: 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20  F-8",-1));.     
e7e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
e7f0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3a   SQLITE_UTF16LE:
e800: 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
e810: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
e820: 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69  i,pX,Tcl_NewStri
e830: 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22  ngObj("UTF-16LE"
e840: 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65  ,-1));.      bre
e850: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
e860: 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20 20  ITE_UTF16BE:.   
e870: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
e880: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
e890: 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  ,Tcl_NewStringOb
e8a0: 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 2d 31 29  j("UTF-16BE",-1)
e8b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e8c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
e8d0: 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
e8e0: 7d 0a 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  }..  pVal = sqli
e8f0: 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
e900: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
e910: 74 53 74 72 28 30 2c 20 70 56 61 6c 2c 20 6e 41  tStr(0, pVal, nA
e920: 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c  , zA, encin, SQL
e930: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 6e  ITE_STATIC);.  n
e940: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
e950: 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20  _bytes(pVal);.  
e960: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
e970: 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20  dElement(i,pX,. 
e980: 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
e990: 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
e9a0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
e9b0: 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 73 71 6c  pVal),n));.  sql
e9c0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
e9d0: 30 2c 20 70 56 61 6c 2c 20 6e 42 2c 20 7a 42 2c  0, pVal, nB, zB,
e9e0: 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53   encin, SQLITE_S
e9f0: 54 41 54 49 43 29 3b 0a 20 20 6e 20 3d 20 73 71  TATIC);.  n = sq
ea00: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
ea10: 73 28 70 56 61 6c 29 3b 0a 20 20 54 63 6c 5f 4c  s(pVal);.  Tcl_L
ea20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
ea30: 65 6e 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20  ent(i,pX,.      
ea40: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
ea50: 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
ea60: 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
ea70: 2c 6e 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ,n));.  sqlite3V
ea80: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
ea90: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
eaa0: 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63  (i, pX, 0);.  Tc
eab0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
eac0: 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74  X);.  Tcl_GetInt
ead0: 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47  FromObj(i, Tcl_G
eae0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c 20  etObjResult(i), 
eaf0: 26 72 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  &res);.  return 
eb00: 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  res;.}.static in
eb10: 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a  t test_collate(.
eb20: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
eb30: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
eb40: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
eb50: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
eb60: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
eb70: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
eb80: 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71  .  int val;.  sq
eb90: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
eba0: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  l;.  int rc;..  
ebb0: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f  if( objc!=5 ) go
ebc0: 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 70  to bad_args;.  p
ebd0: 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72  TestCollateInter
ebe0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69 66  p = interp;.  if
ebf0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
ec00: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
ec10: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
ec20: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
ec30: 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54  _ERROR;..  if( T
ec40: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
ec50: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
ec60: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
ec70: 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
ec80: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
ec90: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
eca0: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  llation(db, "tes
ecb0: 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49  t_collate", SQLI
ecc0: 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
ecd0: 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
ece0: 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65 73  TE_UTF8, val?tes
ecf0: 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30  t_collate_func:0
ed00: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
ed10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
ed20: 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
ed30: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
ed40: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
ed50: 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
ed60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  TCL_ERROR;.    r
ed70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
ed80: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
ed90: 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
eda0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
edb0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76   .            (v
edc0: 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46  oid *)SQLITE_UTF
edd0: 31 36 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63  16LE, val?test_c
ede0: 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
edf0: 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d      if( TCL_OK!=
ee00: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
ee10: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
ee20: 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[4], &val) ) r
ee30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ee40: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ee50: 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 69 66 28  MEMDEBUG.    if(
ee60: 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
ee70: 46 61 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  Fail>0 ){.      
ee80: 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
ee90: 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e  ail++;.    }.#en
eea0: 64 69 66 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  dif.    pVal = s
eeb0: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
eec0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
eed0: 6c 75 65 53 65 74 53 74 72 28 30 2c 20 70 56 61  lueSetStr(0, pVa
eee0: 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f 6c  l, -1, "test_col
eef0: 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  late", SQLITE_UT
ef00: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
ef10: 43 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  C);.    rc = sql
ef20: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
ef30: 61 74 69 6f 6e 31 36 28 64 62 2c 20 0a 20 20 20  ation16(db, .   
ef40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
ef50: 6c 75 65 54 65 78 74 28 30 2c 20 70 56 61 6c 2c  lueText(0, pVal,
ef60: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
ef70: 49 56 45 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  IVE), SQLITE_UTF
ef80: 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 20  16BE, .         
ef90: 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f   (void *)SQLITE_
efa0: 55 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73  UTF16BE, val?tes
efb0: 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30  t_collate_func:0
efc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
efd0: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
efe0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
eff0: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
f000: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
f010: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f020: 20 20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c    .  if( rc!=SQL
f030: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
f040: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f050: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65  nterp, sqlite3Te
f060: 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  stErrorName(rc),
f070: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
f080: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
f090: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
f0a0: 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c  .bad_args:.  Tcl
f0b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f0c0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
f0d0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
f0e0: 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65  "",.      Tcl_Ge
f0f0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
f100: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44  bjv[0], 0), " <D
f110: 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  B> <utf8> <utf16
f120: 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20  le> <utf16be>", 
f130: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
f140: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
f150: 20 57 68 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74   When the collat
f160: 69 6f 6e 20 6e 65 65 64 65 64 20 63 61 6c 6c 62  ion needed callb
f170: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20  ack is invoked, 
f180: 72 65 63 6f 72 64 20 74 68 65 20 6e 61 6d 65 20  record the name 
f190: 6f 66 20 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  of .** the reque
f1a0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 66  sted collating f
f1b0: 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 20 54  unction here.  T
f1c0: 68 65 20 72 65 63 6f 72 64 65 64 20 6e 61 6d 65  he recorded name
f1d0: 20 69 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f   is linked.** to
f1e0: 20 61 20 54 43 4c 20 76 61 72 69 61 62 6c 65 20   a TCL variable 
f1f0: 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 6b 65  and used to make
f200: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72   sure that the r
f210: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
f220: 6f 6e 0a 2a 2a 20 6e 61 6d 65 20 69 73 20 63 6f  on.** name is co
f230: 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
f240: 20 63 68 61 72 20 7a 4e 65 65 64 65 64 43 6f 6c   char zNeededCol
f250: 6c 61 74 69 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61  lation[200];.sta
f260: 74 69 63 20 63 68 61 72 20 2a 70 7a 4e 65 65 64  tic char *pzNeed
f270: 65 64 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e  edCollation = zN
f280: 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a  eededCollation;.
f290: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77  ../*.** Called w
f2a0: 68 65 6e 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  hen a collating 
f2b0: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 65 65 64  sequence is need
f2c0: 65 64 2e 20 20 52 65 67 69 73 74 65 72 65 64 20  ed.  Registered 
f2d0: 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
f2e0: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
f2f0: 64 31 36 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  d16()..*/.static
f300: 20 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c 6c 61   void test_colla
f310: 74 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a 20 20  te_needed_cb(.  
f320: 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 73  void *pCtx, .  s
f330: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e  qlite3 *db,.  in
f340: 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 63 6f  t eTextRep,.  co
f350: 6e 73 74 20 76 6f 69 64 20 2a 70 4e 61 6d 65 0a  nst void *pName.
f360: 29 7b 0a 20 20 69 6e 74 20 65 6e 63 20 3d 20 45  ){.  int enc = E
f370: 4e 43 28 64 62 29 3b 0a 20 20 69 6e 74 20 69 3b  NC(db);.  int i;
f380: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f  .  char *z;.  fo
f390: 72 28 7a 20 3d 20 28 63 68 61 72 2a 29 70 4e 61  r(z = (char*)pNa
f3a0: 6d 65 2c 20 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a  me, i=0; *z || z
f3b0: 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  [1]; z++){.    i
f3c0: 66 28 20 2a 7a 20 29 20 7a 4e 65 65 64 65 64 43  f( *z ) zNeededC
f3d0: 6f 6c 6c 61 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20  ollation[i++] = 
f3e0: 2a 7a 3b 0a 20 20 7d 0a 20 20 7a 4e 65 65 64 65  *z;.  }.  zNeede
f3f0: 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20  dCollation[i] = 
f400: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  0;.  sqlite3_cre
f410: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ate_collation(. 
f420: 20 20 20 20 20 64 62 2c 20 22 74 65 73 74 5f 63       db, "test_c
f430: 6f 6c 6c 61 74 65 22 2c 20 45 4e 43 28 64 62 29  ollate", ENC(db)
f440: 2c 20 28 76 6f 69 64 20 2a 29 65 6e 63 2c 20 74  , (void *)enc, t
f450: 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
f460: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
f470: 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c  e: add_test_coll
f480: 61 74 65 5f 6e 65 65 64 65 64 20 44 42 0a 2a 2f  ate_needed DB.*/
f490: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
f4a0: 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 28  _collate_needed(
f4b0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
f4c0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
f4d0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
f4e0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
f4f0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
f500: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
f510: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
f520: 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74  f( objc!=2 ) got
f530: 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66  o bad_args;.  if
f540: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
f550: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
f560: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
f570: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
f580: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
f590: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
f5a0: 5f 6e 65 65 64 65 64 31 36 28 64 62 2c 20 30 2c  _needed16(db, 0,
f5b0: 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65   test_collate_ne
f5c0: 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a 4e 65 65  eded_cb);.  zNee
f5d0: 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30 5d 20  dedCollation[0] 
f5e0: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
f5f0: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
f600: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
f610: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f620: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
f630: 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  K;..bad_args:.  
f640: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
f650: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
f660: 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72  , "DB");.  retur
f670: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
f680: 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
f690: 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65  add_alignment_te
f6a0: 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20 20 44  st_collations  D
f6b0: 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 77 6f 20  B.**.** Add two 
f6c0: 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  new collating se
f6d0: 71 75 65 6e 63 65 73 20 74 6f 20 74 68 65 20 64  quences to the d
f6e0: 61 74 61 62 61 73 65 20 44 42 0a 2a 2a 0a 2a 2a  atabase DB.**.**
f6f0: 20 20 20 20 20 75 74 66 31 36 5f 61 6c 69 67 6e       utf16_align
f700: 65 64 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f  ed.**     utf16_
f710: 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a 2a 20  unaligned.**.** 
f720: 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 73  Both collating s
f730: 65 71 75 65 6e 63 65 73 20 75 73 65 20 74 68 65  equences use the
f740: 20 73 61 6d 65 20 73 6f 72 74 20 6f 72 64 65 72   same sort order
f750: 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a 2a 20 54   as BINARY..** T
f760: 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e  he only differen
f770: 63 65 20 69 73 20 74 68 61 74 20 74 68 65 20 75  ce is that the u
f780: 74 66 31 36 5f 61 6c 69 67 6e 65 64 20 63 6f 6c  tf16_aligned col
f790: 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
f7a0: 63 65 20 69 73 20 64 65 63 6c 61 72 65 64 20 77  ce is declared w
f7b0: 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 55  ith the SQLITE_U
f7c0: 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 66 6c 61  TF16_ALIGNED fla
f7d0: 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61  g..** Both colla
f7e0: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 69  ting functions i
f7f0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 75 6e 61  ncrement the una
f800: 6c 69 67 6e 65 64 20 75 74 66 31 36 20 63 6f 75  ligned utf16 cou
f810: 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65 76 65 72  nter.** whenever
f820: 20 74 68 65 79 20 73 65 65 20 61 20 73 74 72 69   they see a stri
f830: 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73 20 6f  ng that begins o
f840: 6e 20 61 6e 20 6f 64 64 20 62 79 74 65 20 62 6f  n an odd byte bo
f850: 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  undary..*/.stati
f860: 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e 65 64 5f  c int unaligned_
f870: 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 3d  string_counter =
f880: 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 61   0;.static int a
f890: 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63  lignmentCollFunc
f8a0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
f8b0: 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  d,.  int nKey1, 
f8c0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
f8d0: 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
f8e0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
f8f0: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e  2.){.  int rc, n
f900: 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b  ;.  n = nKey1<nK
f910: 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b  ey2 ? nKey1 : nK
f920: 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b 65 79 31  ey2;.  if( nKey1
f930: 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 69 6e 74  >0 && 1==(1&(int
f940: 29 70 4b 65 79 31 29 20 29 20 75 6e 61 6c 69 67  )pKey1) ) unalig
f950: 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74  ned_string_count
f960: 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b 65 79  er++;.  if( nKey
f970: 32 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 69 6e  2>0 && 1==(1&(in
f980: 74 29 70 4b 65 79 32 29 20 29 20 75 6e 61 6c 69  t)pKey2) ) unali
f990: 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  gned_string_coun
f9a0: 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d 20 6d 65  ter++;.  rc = me
f9b0: 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79  mcmp(pKey1, pKey
f9c0: 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d  2, n);.  if( rc=
f9d0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e  =0 ){.    rc = n
f9e0: 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20  Key1 - nKey2;.  
f9f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
fa00: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 5f  .static int add_
fa10: 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63  alignment_test_c
fa20: 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20 76 6f 69  ollations(.  voi
fa30: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
fa40: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
fa50: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
fa60: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
fa70: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
fa80: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
fa90: 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20 20 20  ( objc>=2 ){.   
faa0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
fab0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
fac0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
fad0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
fae0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  TCL_ERROR;.    s
faf0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
fb00: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66  llation(db, "utf
fb10: 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22 2c 0a 20  16_unaligned",. 
fb20: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54         SQLITE_UT
fb30: 46 31 36 2c 20 0a 20 20 20 20 20 20 20 20 30 2c  F16, .        0,
fb40: 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75   alignmentCollFu
fb50: 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nc);.    sqlite3
fb60: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
fb70: 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 61 6c 69  n(db, "utf16_ali
fb80: 67 6e 65 64 22 2c 0a 20 20 20 20 20 20 20 20 53  gned",.        S
fb90: 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 20 53 51  QLITE_UTF16 | SQ
fba0: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
fbb0: 45 44 2c 20 0a 20 20 20 20 20 20 20 20 30 2c 20  ED, .        0, 
fbc0: 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e  alignmentCollFun
fbd0: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
fbe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
fbf0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
fc00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46  (SQLITE_OMIT_UTF
fc10: 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73  16) */../*.** Us
fc20: 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 66 75  age: add_test_fu
fc30: 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74 72 3e 20  nction <db ptr> 
fc40: 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
fc50: 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a   <utf16be>.**.**
fc60: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
fc70: 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
fc80: 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63  hat SQLite selec
fc90: 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 75  ts the correct u
fca0: 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ser.** function 
fcb0: 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75  callback when mu
fcc0: 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20  ltiple versions 
fcd0: 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74  (for different t
fce0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a  ext encodings).*
fcf0: 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e  * are available.
fd00: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74  .**.** Calling t
fd10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69  his routine regi
fd20: 73 74 65 72 73 20 75 70 20 74 6f 20 74 68 72 65  sters up to thre
fd30: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  e versions of th
fd40: 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a  e user function.
fd50: 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  ** "test_functio
fd60: 6e 22 20 77 69 74 68 20 64 61 74 61 62 61 73 65  n" with database
fd70: 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 20 49   handle <db>.  I
fd80: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
fd90: 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74 72 75 65  ument is.** true
fda0: 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f 6e  , then a version
fdb0: 20 6f 66 20 74 65 73 74 5f 66 75 6e 63 74 69 6f   of test_functio
fdc0: 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
fdd0: 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20 74 68  for UTF-8, if th
fde0: 65 0a 2a 2a 20 74 68 69 72 64 20 69 73 20 74 72  e.** third is tr
fdf0: 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69 73  ue, a version is
fe00: 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
fe10: 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65  UTF-16le, if the
fe20: 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a 20 74 72   fourth is.** tr
fe30: 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76  ue, a UTF-16be v
fe40: 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
fe50: 62 6c 65 2e 20 20 50 72 65 76 69 6f 75 73 20 76  ble.  Previous v
fe60: 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a 20 74 65  ersions of.** te
fe70: 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  st_function are 
fe80: 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
fe90: 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
fea0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
feb0: 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66  by calling the f
fec0: 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63 72  ollowing TCL scr
fed0: 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65  ipt:.**.**   "te
fee0: 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 65 6e 63  st_function <enc
fef0: 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a 2a 20 57  > <arg>".**.** W
ff00: 68 65 72 65 20 3c 65 6e 63 3e 20 69 73 20 6f 6e  here <enc> is on
ff10: 65 20 6f 66 20 55 54 46 2d 38 2c 20 55 54 46 2d  e of UTF-8, UTF-
ff20: 31 36 4c 45 20 6f 72 20 55 54 46 31 36 42 45 2c  16LE or UTF16BE,
ff30: 20 61 6e 64 20 3c 61 72 67 3e 20 69 73 20 74 68   and <arg> is th
ff40: 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75  e.** single argu
ff50: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
ff60: 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  he SQL function.
ff70: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
ff80: 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 54 43  ned by.** the TC
ff90: 4c 20 73 63 72 69 70 74 20 69 73 20 75 73 65 64  L script is used
ffa0: 20 61 73 20 74 68 65 20 72 65 74 75 72 6e 20 76   as the return v
ffb0: 61 6c 75 65 20 6f 66 20 74 68 65 20 53 51 4c 20  alue of the SQL 
ffc0: 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a 2a 2a 20  function. It.** 
ffd0: 69 73 20 70 61 73 73 65 64 20 74 6f 20 53 51 4c  is passed to SQL
ffe0: 69 74 65 20 75 73 69 6e 67 20 55 54 46 2d 31 36  ite using UTF-16
fff0: 42 45 20 66 6f 72 20 61 20 55 54 46 2d 38 20 74  BE for a UTF-8 t
10000 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  est_function(), 
10010 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20 61 20 55  UTF-8.** for a U
10020 54 46 2d 31 36 4c 45 20 74 65 73 74 5f 66 75 6e  TF-16LE test_fun
10030 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20 55 54 46  ction(), and UTF
10040 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20 69 6d 70  -16LE for an imp
10050 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74  lementation that
10060 0a 2a 2a 20 70 72 65 66 65 72 73 20 55 54 46 2d  .** prefers UTF-
10070 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  16BE..*/.#ifndef
10080 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
10090 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  16.static void t
100a0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
100b0 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  8(.  sqlite3_con
100c0 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
100d0 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
100e0 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
100f0 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
10100 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f  *interp;.  Tcl_O
10110 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  bj *pX;.  sqlite
10120 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
10130 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49   interp = (Tcl_I
10140 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f  nterp *)sqlite3_
10150 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
10160 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53  .  pX = Tcl_NewS
10170 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66  tringObj("test_f
10180 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20  unction", -1);. 
10190 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
101a0 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  t(pX);.  Tcl_Lis
101b0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
101c0 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63  t(interp, pX, Tc
101d0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
101e0 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a 20 20  UTF-8", -1));.  
101f0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10200 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10210 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f   pX, .      Tcl_
10220 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
10230 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
10240 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c  e_text(argv[0]),
10250 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   -1));.  Tcl_Eva
10260 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
10270 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  X, 0);.  Tcl_Dec
10280 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
10290 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
102a0 74 65 78 74 28 70 43 74 78 2c 20 54 63 6c 5f 47  text(pCtx, Tcl_G
102b0 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
102c0 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53 51 4c 49  nterp), -1, SQLI
102d0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
102e0 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
102f0 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71  alueNew(0);.  sq
10300 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
10310 28 30 2c 20 70 56 61 6c 2c 20 2d 31 2c 20 54 63  (0, pVal, -1, Tc
10320 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
10330 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20  t(interp), .    
10340 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
10350 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
10360 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
10370 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20 73  text16be(pCtx, s
10380 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
10390 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20 20  t16be(pVal),.   
103a0 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52     -1, SQLITE_TR
103b0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
103c0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
103d0 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  l);.}.static voi
103e0 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  d test_function_
103f0 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69 74  utf16le(.  sqlit
10400 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
10410 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
10420 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
10430 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49  *argv.){.  Tcl_I
10440 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
10450 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20   Tcl_Obj *pX;.  
10460 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
10470 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20  Val;.  interp = 
10480 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71  (Tcl_Interp *)sq
10490 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
104a0 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63  pCtx);.  pX = Tc
104b0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
104c0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
104d0 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
104e0 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
104f0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10500 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10510 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pX, Tcl_NewStrin
10520 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c  gObj("UTF-16LE",
10530 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
10540 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10550 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20  t(interp, pX, . 
10560 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
10570 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
10580 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
10590 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a  argv[0]), -1));.
105a0 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
105b0 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a  interp, pX, 0);.
105c0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
105d0 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d  nt(pX);.  pVal =
105e0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
105f0 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
10600 6c 75 65 53 65 74 53 74 72 28 30 2c 20 70 56 61  lueSetStr(0, pVa
10610 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74  l, -1, Tcl_GetSt
10620 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
10630 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54  p), .      SQLIT
10640 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
10650 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
10660 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
10670 74 78 2c 28 63 68 61 72 2a 29 73 71 6c 69 74 65  tx,(char*)sqlite
10680 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61  3_value_text(pVa
10690 6c 29 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41  l),-1,SQLITE_TRA
106a0 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
106b0 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
106c0 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
106d0 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
106e0 74 66 31 36 62 65 28 0a 20 20 73 71 6c 69 74 65  tf16be(.  sqlite
106f0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
10700 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
10710 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
10720 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e  argv.){.  Tcl_In
10730 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
10740 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73  Tcl_Obj *pX;.  s
10750 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
10760 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28  al;.  interp = (
10770 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c  Tcl_Interp *)sql
10780 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70  ite3_user_data(p
10790 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c  Ctx);.  pX = Tcl
107a0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74  _NewStringObj("t
107b0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d  est_function", -
107c0 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  1);.  Tcl_IncrRe
107d0 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63  fCount(pX);.  Tc
107e0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
107f0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
10800 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  X, Tcl_NewString
10810 4f 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 20  Obj("UTF-16BE", 
10820 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
10830 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10840 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20  (interp, pX, .  
10850 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
10860 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69  gObj((char*)sqli
10870 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
10880 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20  rgv[0]), -1));. 
10890 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
108a0 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20  nterp, pX, 0);. 
108b0 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
108c0 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20  t(pX);.  pVal = 
108d0 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
108e0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  0);.  sqlite3Val
108f0 75 65 53 65 74 53 74 72 28 30 2c 20 70 56 61 6c  ueSetStr(0, pVal
10900 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
10910 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
10920 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
10930 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
10940 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
10950 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65  _result_text16le
10960 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
10970 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56  alue_text16le(pV
10980 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
10990 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
109a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
109b0 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65  Free(pVal);.}.#e
109c0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
109d0 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61  MIT_UTF16 */.sta
109e0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66 75 6e  tic int test_fun
109f0 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20  ction(.  void * 
10a00 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10a10 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10a20 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10a30 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10a40 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
10a50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
10a60 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  16.  sqlite3 *db
10a70 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20  ;.  int val;..  
10a80 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f  if( objc!=5 ) go
10a90 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69  to bad_args;.  i
10aa0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
10ab0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
10ac0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
10ad0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
10ae0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
10af0 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
10b00 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
10b10 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
10b20 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
10b30 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76  L_ERROR;.  if( v
10b40 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
10b50 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
10b60 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63  n(db, "test_func
10b70 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45  tion", 1, SQLITE
10b80 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20  _UTF8, .        
10b90 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
10ba0 63 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30  ction_utf8, 0, 0
10bb0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c  );.  }.  if( TCL
10bc0 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
10bd0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
10be0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
10bf0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
10c00 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20  RROR;.  if( val 
10c10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
10c20 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
10c30 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  b, "test_functio
10c40 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  n", 1, SQLITE_UT
10c50 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  F16LE, .        
10c60 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
10c70 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30  ction_utf16le, 0
10c80 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
10c90 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
10ca0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
10cb0 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
10cc0 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
10cd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76  L_ERROR;.  if( v
10ce0 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
10cf0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
10d00 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63  n(db, "test_func
10d10 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45  tion", 1, SQLITE
10d20 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20  _UTF16BE, .     
10d30 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f     interp, test_
10d40 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65  function_utf16be
10d50 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
10d60 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62  return TCL_OK;.b
10d70 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41  ad_args:.  Tcl_A
10d80 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10d90 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
10da0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
10db0 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  ,.      Tcl_GetS
10dc0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
10dd0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e  v[0], 0), " <DB>
10de0 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
10df0 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29  > <utf16be>", 0)
10e00 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
10e10 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
10e20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
10e30 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  ROR;.}../*.** Us
10e40 61 67 65 3a 20 20 20 20 20 20 20 20 20 74 65 73  age:         tes
10e50 74 5f 65 72 72 73 74 72 20 3c 65 72 72 20 63 6f  t_errstr <err co
10e60 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  de>.**.** Test t
10e70 68 61 74 20 74 68 65 20 65 6e 67 6c 69 73 68 20  hat the english 
10e80 6c 61 6e 67 75 61 67 65 20 73 74 72 69 6e 67 20  language string 
10e90 65 71 75 69 76 61 6c 65 6e 74 73 20 66 6f 72 20  equivalents for 
10ea0 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
10eb0 65 73 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20  es.** are sane. 
10ec0 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  The parameter is
10ed0 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72   an integer repr
10ee0 65 73 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69  esenting an sqli
10ef0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
10f00 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  * The result is 
10f10 61 20 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c  a list of two el
10f20 65 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 72 69  ements, the stri
10f30 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
10f40 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f  n of the.** erro
10f50 72 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 65  r code and the e
10f60 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
10f70 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  explanation..*/.
10f80 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
10f90 65 72 72 73 74 72 28 0a 20 20 76 6f 69 64 20 2a  errstr(.  void *
10fa0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
10fb0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10fc0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
10fd0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
10fe0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72  objv[].){.  char
10ff0 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69   *zCode;.  int i
11000 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
11010 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
11020 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11030 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72  1, objv, "<error
11040 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20   code>");.  }.. 
11050 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74   zCode = Tcl_Get
11060 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
11070 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30  .  for(i=0; i<20
11080 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; i++){.    if(
11090 20 30 3d 3d 73 74 72 63 6d 70 28 74 31 45 72 72   0==strcmp(t1Err
110a0 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65  orName(i), zCode
110b0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ) ) break;.  }. 
110c0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
110d0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
110e0 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 29 2c  qlite3ErrStr(i),
110f0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
11100 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
11110 73 61 67 65 3a 20 20 20 20 62 72 65 61 6b 70 6f  sage:    breakpo
11120 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  int.**.** This r
11130 6f 75 74 69 6e 65 20 65 78 69 73 74 73 20 66 6f  outine exists fo
11140 72 20 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d 20  r one purpose - 
11150 74 6f 20 70 72 6f 76 69 64 65 20 61 20 70 6c 61  to provide a pla
11160 63 65 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62  ce to put a.** b
11170 72 65 61 6b 70 6f 69 6e 74 20 77 69 74 68 20 47  reakpoint with G
11180 44 42 20 74 68 61 74 20 63 61 6e 20 62 65 20 74  DB that can be t
11190 72 69 67 67 65 72 65 64 20 75 73 69 6e 67 20 54  riggered using T
111a0 43 4c 20 63 6f 64 65 2e 20 20 54 68 65 20 75 73  CL code.  The us
111b0 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 69 73  e.** for this is
111c0 20 77 68 65 6e 20 61 20 70 61 72 74 69 63 75 6c   when a particul
111d0 61 72 20 74 65 73 74 20 66 61 69 6c 73 20 6f 6e  ar test fails on
111e0 20 28 73 61 79 29 20 74 68 65 20 31 34 38 35 74   (say) the 1485t
111f0 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  h iteration..** 
11200 49 6e 20 74 68 65 20 54 43 4c 20 74 65 73 74 20  In the TCL test 
11210 73 63 72 69 70 74 2c 20 77 65 20 63 61 6e 20 61  script, we can a
11220 64 64 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69  dd code like thi
11230 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20  s:.**.**     if 
11240 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b  {$i==1485} break
11250 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  point.**.** Then
11260 20 72 75 6e 20 74 65 73 74 66 69 78 74 75 72 65   run testfixture
11270 20 69 6e 20 74 68 65 20 64 65 62 75 67 67 65 72   in the debugger
11280 20 61 6e 64 20 77 61 69 74 20 66 6f 72 20 74 68   and wait for th
11290 65 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a  e breakpoint to.
112a0 2a 2a 20 66 69 72 65 2e 20 20 54 68 65 6e 20 61  ** fire.  Then a
112b0 64 64 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70  dditional breakp
112c0 6f 69 6e 74 73 20 63 61 6e 20 62 65 20 73 65 74  oints can be set
112d0 20 74 6f 20 74 72 61 63 65 20 64 6f 77 6e 20 74   to trace down t
112e0 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69  he bug..*/.stati
112f0 63 20 69 6e 74 20 74 65 73 74 5f 62 72 65 61 6b  c int test_break
11300 70 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e  point(.  void *N
11310 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
11320 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
11330 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
11340 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
11350 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
11360 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11380 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
11390 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
113a0 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
113b0 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
113c0 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
113d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
113e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
113f0 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  othing */.}../*.
11400 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
11410 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
11420 62 20 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a  b  STMT IDX N.**
11430 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
11440 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
11450 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  ob interface.  S
11460 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
11470 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
11480 49 44 58 20 69 73 20 74 68 65 20 69 6e 64 65 78  IDX is the index
11490 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
114a0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
114b0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
114c0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
114d0 20 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66   a N-byte zero-f
114e0 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68  illed BLOB to th
114f0 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  e wildcard..*/.s
11500 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
11510 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20  ind_zeroblob(.  
11520 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
11530 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
11540 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
11550 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
11560 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
11570 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
11580 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
11590 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
115a0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
115b0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
115c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
115d0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
115e0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
115f0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
11600 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
11610 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
11620 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b  MT N VALUE", 0);
11630 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11640 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
11650 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
11660 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
11670 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
11680 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
11690 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
116a0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
116b0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
116c0 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
116d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
116e0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
116f0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
11700 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72  objv[3], &n) ) r
11710 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11720 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
11730 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 70  _bind_zeroblob(p
11740 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20  Stmt, idx, n);. 
11750 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
11760 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
11770 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
11780 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
11790 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
117a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
117b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
117c0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
117d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
117e0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
117f0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20  lite3_bind_int  
11800 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a  STMT N VALUE.**.
11810 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
11820 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74  te3_bind_int int
11830 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
11840 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
11850 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
11860 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
11870 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
11880 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
11890 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
118a0 2a 2a 20 62 69 6e 64 73 20 61 20 33 32 2d 62 69  ** binds a 32-bi
118b0 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20  t integer VALUE 
118c0 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64  to that wildcard
118d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
118e0 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a 20  test_bind_int(. 
118f0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
11900 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
11910 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
11920 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
11930 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
11940 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
11950 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
11960 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a  x;.  int value;.
11970 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
11980 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
11990 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
119a0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
119b0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
119c0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
119d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
119e0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
119f0 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22   " STMT N VALUE"
11a00 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
11a10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
11a20 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
11a30 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
11a40 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11a50 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
11a60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11a70 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
11a80 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
11a90 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29  , objv[2], &idx)
11aa0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11ab0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
11ac0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
11ad0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
11ae0 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54  alue) ) return T
11af0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
11b00 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  = sqlite3_bind_i
11b10 6e 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  nt(pStmt, idx, v
11b20 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  alue);.  if( sql
11b30 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
11b40 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
11b50 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
11b60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11b70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11b80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
11b90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11ba0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
11bb0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
11bc0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
11bd0 69 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d 54 20  ind_int64  STMT 
11be0 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65  N VALUE.**.** Te
11bf0 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
11c00 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65 72 66  ind_int64 interf
11c10 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
11c20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
11c30 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
11c40 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
11c50 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
11c60 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
11c70 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
11c80 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69  binds a 64-bit i
11c90 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20  nteger VALUE to 
11ca0 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a  that wildcard..*
11cb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
11cc0 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20  t_bind_int64(.  
11cd0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
11ce0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
11cf0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
11d00 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
11d10 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
11d20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
11d30 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
11d40 3b 0a 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20  ;.  i64 value;. 
11d50 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
11d60 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
11d70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11d80 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
11d90 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
11da0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
11db0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
11dc0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
11dd0 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c  " STMT N VALUE",
11de0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
11df0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
11e00 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
11e10 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
11e20 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11e30 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
11e40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11e50 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
11e60 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
11e70 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
11e80 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
11e90 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
11ea0 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
11eb0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
11ec0 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72   &value) ) retur
11ed0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
11ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
11ef0 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69  d_int64(pStmt, i
11f00 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66  dx, value);.  if
11f10 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
11f20 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
11f30 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
11f40 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11f50 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
11f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11f70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11f80 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
11f90 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
11fa0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
11fb0 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20  te3_bind_double 
11fc0 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a   STMT N VALUE.**
11fd0 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
11fe0 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
11ff0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
12000 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
12010 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
12020 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
12030 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
12040 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
12050 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
12060 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36  and.** binds a 6
12070 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41  4-bit integer VA
12080 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64  LUE to that wild
12090 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
120a0 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f  int test_bind_do
120b0 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  uble(.  void * c
120c0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
120d0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
120e0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
120f0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
12100 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
12110 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
12120 20 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75 62   int idx;.  doub
12130 6c 65 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  le value;.  int 
12140 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
12150 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
12160 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12170 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
12180 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
12190 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
121a0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
121b0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
121c0 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a  T N VALUE", 0);.
121d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
121e0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
121f0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
12200 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
12210 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
12220 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
12230 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
12240 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
12250 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
12260 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
12270 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12280 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
12290 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
122a0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75  , objv[3], &valu
122b0 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
122c0 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
122d0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
122e0 6c 65 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  le(pStmt, idx, v
122f0 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  alue);.  if( sql
12300 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
12310 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
12320 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
12330 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12340 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
12350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
12360 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12370 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
12380 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
12390 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
123a0 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54 20 4e 0a  nd_null  STMT N.
123b0 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
123c0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
123d0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
123e0 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
123f0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
12400 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
12410 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
12420 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
12430 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
12440 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e  and.** binds a N
12450 55 4c 4c 20 74 6f 20 74 68 65 20 77 69 6c 64 63  ULL to the wildc
12460 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
12470 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c  nt test_bind_nul
12480 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  l(.  void * clie
12490 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
124a0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
124b0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
124c0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
124d0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
124e0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
124f0 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72 63 3b  t idx;.  int rc;
12500 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
12510 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
12520 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
12530 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
12540 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
12550 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
12560 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
12570 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
12580 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
12590 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
125a0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
125b0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
125c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
125d0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
125e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
125f0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
12600 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
12610 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
12620 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12630 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
12640 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
12650 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69  pStmt, idx);.  i
12660 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
12670 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
12680 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
12690 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
126a0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
126b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
126c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
126d0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
126e0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
126f0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
12700 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 20 53  te3_bind_text  S
12710 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54  TMT N STRING BYT
12720 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ES.**.** Test th
12730 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  e sqlite3_bind_t
12740 65 78 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ext interface.  
12750 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
12760 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
12770 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
12780 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
12790 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
127a0 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
127b0 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
127c0 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 53  a UTF-8 string S
127d0 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c  TRING to the wil
127e0 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72 69  dcard.  The stri
127f0 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74 65  ng is BYTES byte
12800 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74  s.** long..*/.st
12810 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
12820 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69 64 20  nd_text(.  void 
12830 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
12840 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12850 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
12860 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
12870 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
12880 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
12890 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
128a0 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72  nt bytes;.  char
128b0 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72   *value;.  int r
128c0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
128d0 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
128e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
128f0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
12900 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
12910 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
12920 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
12930 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
12940 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c   N VALUE BYTES",
12950 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
12960 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
12970 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
12980 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
12990 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
129a0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
129b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
129c0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
129d0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
129e0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
129f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12a00 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63  OR;.  value = Tc
12a10 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
12a20 5b 33 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [3]);.  if( Tcl_
12a30 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
12a40 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
12a50 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
12a60 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
12a70 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
12a80 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
12a90 20 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 53   value, bytes, S
12aa0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
12ab0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
12ac0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
12ad0 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
12ae0 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
12af0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
12b00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12b10 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
12b20 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
12b30 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72  sqlite3TestError
12b40 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
12b50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12b60 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
12b70 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
12b80 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
12b90 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20  te3_bind_text16 
12ba0 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e  ?-static? STMT N
12bb0 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a   STRING BYTES.**
12bc0 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
12bd0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
12be0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
12bf0 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
12c00 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
12c10 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
12c20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
12c30 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
12c40 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
12c50 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55  and.** binds a U
12c60 54 46 2d 31 36 20 73 74 72 69 6e 67 20 53 54 52  TF-16 string STR
12c70 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63  ING to the wildc
12c80 61 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67  ard.  The string
12c90 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a   is BYTES bytes.
12ca0 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ** long..*/.stat
12cb0 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
12cc0 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69 64 20  _text16(.  void 
12cd0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
12ce0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12cf0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
12d00 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
12d10 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
12d20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
12d30 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73  TF16.  sqlite3_s
12d40 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
12d50 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74  t idx;.  int byt
12d60 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75  es;.  char *valu
12d70 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
12d80 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 29 20 3d  void (*xDel)() =
12d90 20 28 6f 62 6a 63 3d 3d 36 3f 53 51 4c 49 54 45   (objc==6?SQLITE
12da0 5f 53 54 41 54 49 43 3a 53 51 4c 49 54 45 5f 54  _STATIC:SQLITE_T
12db0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 54 63 6c  RANSIENT);.  Tcl
12dc0 5f 4f 62 6a 20 2a 6f 53 74 6d 74 20 20 20 20 3d  _Obj *oStmt    =
12dd0 20 6f 62 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20   objv[objc-4];. 
12de0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20   Tcl_Obj *oN    
12df0 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33     = objv[objc-3
12e00 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53  ];.  Tcl_Obj *oS
12e10 74 72 69 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f 62  tring  = objv[ob
12e20 6a 63 2d 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a  jc-2];.  Tcl_Obj
12e30 20 2a 6f 42 79 74 65 73 20 20 20 3d 20 6f 62 6a   *oBytes   = obj
12e40 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66  v[objc-1];..  if
12e50 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
12e60 63 21 3d 36 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c!=6){.    Tcl_A
12e70 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12e80 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
12e90 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
12ea0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
12eb0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
12ec0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
12ed0 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53  MT N VALUE BYTES
12ee0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
12ef0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
12f00 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
12f10 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
12f20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 53 74  cl_GetString(oSt
12f30 6d 74 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  mt), &pStmt) ) r
12f40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12f50 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
12f60 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
12f70 20 6f 4e 2c 20 26 69 64 78 29 20 29 20 72 65 74   oN, &idx) ) ret
12f80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12f90 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29   value = (char*)
12fa0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
12fb0 46 72 6f 6d 4f 62 6a 28 6f 53 74 72 69 6e 67 2c  FromObj(oString,
12fc0 20 30 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47   0);.  if( Tcl_G
12fd0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
12fe0 65 72 70 2c 20 6f 42 79 74 65 73 2c 20 26 62 79  erp, oBytes, &by
12ff0 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
13000 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
13010 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
13020 78 74 31 36 28 70 53 74 6d 74 2c 20 69 64 78 2c  xt16(pStmt, idx,
13030 20 28 76 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20   (void *)value, 
13040 62 79 74 65 73 2c 20 78 44 65 6c 29 3b 0a 20 20  bytes, xDel);.  
13050 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
13060 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
13070 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
13080 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
13090 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
130a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
130b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
130c0 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  ROR;.  }..#endif
130d0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
130e0 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
130f0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
13100 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
13110 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d  te3_bind_blob ?-
13120 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 44  static? STMT N D
13130 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20  ATA BYTES.**.** 
13140 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
13150 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72  _bind_blob inter
13160 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
13170 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
13180 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
13190 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
131a0 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
131b0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
131c0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
131d0 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f   binds a BLOB to
131e0 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20   the wildcard.  
131f0 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59 54 45  The BLOB is BYTE
13200 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  S bytes in size.
13210 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
13220 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20  est_bind_blob(. 
13230 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
13240 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
13250 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
13260 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
13270 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
13280 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
13290 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
132a0 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  x;.  int bytes;.
132b0 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20    char *value;. 
132c0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
132d0 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79  e3_destructor_ty
132e0 70 65 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d  pe xDestructor =
132f0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
13300 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  T;..  if( objc!=
13310 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a  5 && objc!=6 ){.
13320 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
13330 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
13340 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
13350 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
13360 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
13370 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
13380 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41   0), " STMT N DA
13390 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  TA BYTES", 0);. 
133a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
133b0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
133c0 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78  objc==6 ){.    x
133d0 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c  Destructor = SQL
133e0 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20  ITE_STATIC;.    
133f0 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69  objv++;.  }..  i
13400 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
13410 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
13420 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
13430 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
13440 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13450 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
13460 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13470 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
13480 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13490 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47  .  value = Tcl_G
134a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
134b0 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
134c0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
134d0 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
134e0 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
134f0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
13500 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
13510 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  b(pStmt, idx, va
13520 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 73  lue, bytes, xDes
13530 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28 20  tructor);.  if( 
13540 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
13550 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
13560 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
13570 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13580 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
13590 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
135a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
135b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
135c0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
135d0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
135e0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
135f0 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a  count  STMT.**.*
13600 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
13610 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64 73  ber of wildcards
13620 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74   in the given st
13630 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
13640 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
13650 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
13660 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
13670 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
13680 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
13690 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
136a0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
136b0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
136c0 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
136d0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
136e0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
136f0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
13700 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
13710 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13720 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
13730 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
13740 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
13750 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
13760 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
13770 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
13780 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
13790 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
137a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
137b0 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
137c0 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
137d0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
137e0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
137f0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
13800 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a  _name  STMT  N.*
13810 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13820 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20  name of the Nth 
13830 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66  wildcard.  The f
13840 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69 73  irst wildcard is
13850 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20   1..** An empty 
13860 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
13870 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ed if N is out o
13880 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68  f range or if th
13890 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73  e wildcard.** is
138a0 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74   nameless..*/.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 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
138d0 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
138e0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
138f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
13900 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
13910 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
13920 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
13930 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
13940 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  t i;..  if( objc
13950 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
13960 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13970 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
13980 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  MT N");.    retu
13990 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
139a0 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
139b0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
139c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
139d0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
139e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
139f0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
13a00 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
13a10 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20  p, objv[2], &i) 
13a20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13a30 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
13a40 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
13a50 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
13a60 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69  ngObj(sqlite3_bi
13a70 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
13a80 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20  e(pStmt,i),-1). 
13a90 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   );.  return TCL
13aa0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
13ab0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
13ac0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
13ad0 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a  dex  STMT  NAME.
13ae0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
13af0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77 69   index of the wi
13b00 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e 41  ldcard called NA
13b10 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ME.  Return 0 if
13b20 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
13b30 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a  such wildcard..*
13b40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
13b50 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
13b60 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20 2a  _index(.  void *
13b70 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
13b80 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
13b90 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
13ba0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
13bb0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
13bc0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
13bd0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
13be0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
13bf0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
13c00 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e  1, objv, "STMT N
13c10 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
13c20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
13c30 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
13c40 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
13c50 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
13c60 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
13c70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13c80 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
13c90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
13ca0 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a     Tcl_NewIntObj
13cb0 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  (.       sqlite3
13cc0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
13cd0 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f  index(pStmt,Tcl_
13ce0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
13cf0 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a  ])).     ).  );.
13d00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
13d10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
13d20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72     sqlite3_clear
13d30 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a 2a  _bindings STMT.*
13d40 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
13d50 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69  test_clear_bindi
13d60 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ngs(.  void * cl
13d70 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
13d80 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
13d90 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
13da0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
13db0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
13dc0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
13dd0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
13de0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
13df0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
13e00 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
13e10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13e20 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
13e30 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
13e40 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
13e50 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
13e60 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
13e70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
13e80 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
13e90 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
13ea0 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61 72  bj(sqlite3_clear
13eb0 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 29  _bindings(pStmt)
13ec0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
13ed0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
13ee0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 73  age:   sqlite3_s
13ef0 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e 44  leep MILLISECOND
13f00 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  S.*/.static int 
13f10 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20 76 6f  test_sleep(.  vo
13f20 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
13f30 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
13f40 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
13f50 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
13f60 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
13f70 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20 6f  int ms;..  if( o
13f80 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
13f90 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
13fa0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
13fb0 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
13fc0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13fd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
13fe0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
13ff0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
14000 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20 20  1], &ms) ){.    
14010 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14020 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
14030 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
14040 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
14050 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d 73 29  qlite3_sleep(ms)
14060 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
14070 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
14080 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72  age: sqlite3_err
14090 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  code DB.**.** Re
140a0 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20  turn the string 
140b0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
140c0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
140d0 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a  t sqlite3_* API.
140e0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65  ** error code. e
140f0 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  .g. "SQLITE_ERRO
14100 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  R"..*/.static in
14110 74 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a  t test_errcode(.
14120 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
14130 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
14140 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
14150 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
14160 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
14170 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
14180 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
14190 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69  r zBuf[30];..  i
141a0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
141b0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
141c0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
141d0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
141e0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
141f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
14200 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
14210 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
14220 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
14230 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
14240 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
14250 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
14260 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
14270 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
14280 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
14290 28 64 62 29 3b 0a 20 20 69 66 28 20 28 72 63 26  (db);.  if( (rc&
142a0 30 78 66 66 29 3d 3d 72 63 20 29 7b 0a 20 20 20  0xff)==rc ){.   
142b0 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20   zBuf[0] = 0;.  
142c0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e  }else{.    sprin
142d0 74 66 28 7a 42 75 66 2c 22 2b 25 64 22 2c 20 72  tf(zBuf,"+%d", r
142e0 63 3e 3e 38 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  c>>8);.  }.  Tcl
142f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
14300 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
14310 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 7a  ErrorName(rc), z
14320 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
14330 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
14340 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65 73 74  ** Usage:   test
14350 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a  _errmsg DB.**.**
14360 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54 46   Returns the UTF
14370 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  -8 representatio
14380 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d  n of the error m
14390 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f  essage string fo
143a0 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  r the.** most re
143b0 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41  cent sqlite3_* A
143c0 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  PI call..*/.stat
143d0 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d  ic int test_errm
143e0 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  sg(.  void * cli
143f0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
14400 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
14410 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
14420 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
14430 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
14440 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
14450 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20  r *zErr;..  if( 
14460 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
14470 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
14480 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
14490 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
144a0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
144b0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
144c0 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
144d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
144e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
144f0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
14500 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
14510 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
14520 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
14530 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d  ERROR;..  zErr =
14540 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
14550 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  db);.  Tcl_SetOb
14560 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
14570 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14580 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72  (zErr, -1));.  r
14590 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
145a0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
145b0 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44 42  test_errmsg16 DB
145c0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  .**.** Returns t
145d0 68 65 20 55 54 46 2d 31 36 20 72 65 70 72 65 73  he UTF-16 repres
145e0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
145f0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
14600 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ring for the.** 
14610 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
14620 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20  te3_* API call. 
14630 54 68 69 73 20 69 73 20 61 20 62 79 74 65 20 61  This is a byte a
14640 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20 74  rray object at t
14650 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c  he TCL .** level
14660 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64 65  , and it include
14670 73 20 74 68 65 20 30 78 30 30 20 30 78 30 30 20  s the 0x00 0x00 
14680 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73  terminator bytes
14690 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
146a0 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74 72  he.** UTF-16 str
146b0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
146c0 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36  nt test_errmsg16
146d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
146e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
146f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
14700 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
14710 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
14720 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
14730 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
14740 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
14750 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b  onst void *zErr;
14760 0a 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 30  .  int bytes = 0
14770 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
14780 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
14790 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
147a0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
147b0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
147c0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
147d0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
147e0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
147f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14800 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
14810 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
14820 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
14830 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
14840 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14850 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
14860 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a  3_errmsg16(db);.
14870 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
14880 20 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65    bytes = sqlite
14890 33 55 74 66 31 36 42 79 74 65 4c 65 6e 28 7a 45  3Utf16ByteLen(zE
148a0 72 72 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 54  rr, -1);.  }.  T
148b0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
148c0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
148d0 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72  yteArrayObj(zErr
148e0 2c 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69  , bytes));.#endi
148f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14900 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
14910 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
14920 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
14930 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71  e3_prepare DB sq
14940 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a  l bytes tailvar.
14950 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
14960 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
14970 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
14980 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
14990 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
149a0 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
149b0 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
149c0 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
149d0 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
149e0 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
149f0 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
14a00 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
14a10 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
14a20 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
14a30 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
14a40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
14a50 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20 20 76  est_prepare(.  v
14a60 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
14a70 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
14a80 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
14a90 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
14aa0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
14ab0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
14ac0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
14ad0 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
14ae0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
14af0 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  il = 0;.  sqlite
14b00 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
14b10 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
14b20 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
14b30 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
14b40 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
14b50 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
14b60 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
14b70 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
14b80 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
14b90 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
14ba0 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
14bb0 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 0);.    retu
14bc0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14bd0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
14be0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
14bf0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
14c00 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
14c10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14c20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
14c30 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
14c40 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
14c50 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
14c60 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
14c70 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
14c80 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
14c90 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20  te3_prepare(db, 
14ca0 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
14cb0 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20  tmt, &zTail);.  
14cc0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
14cd0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
14ce0 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
14cf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
14d00 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 69 66   zTail ){.    if
14d10 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
14d20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65      bytes = byte
14d30 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29  s - (zTail-zSql)
14d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
14d50 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
14d60 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54  p, objv[4], 0, T
14d70 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14d80 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30  zTail, bytes), 0
14d90 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
14da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14db0 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
14dc0 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  =0 );.    sprint
14dd0 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  f(zBuf, "(%d) ",
14de0 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
14df0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
14e00 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
14e10 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
14e20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14e30 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
14e40 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
14e50 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
14e60 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
14e70 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
14e80 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
14e90 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70  RROR;.    Tcl_Ap
14ea0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
14eb0 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d  p, zBuf, 0);.  }
14ec0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
14ed0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
14ee0 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
14ef0 65 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65  e_v2 DB sql byte
14f00 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20  s tailvar.**.** 
14f10 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62  Compile up to <b
14f20 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74  ytes> bytes of t
14f30 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20  he supplied SQL 
14f40 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69  string <sql> usi
14f50 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  ng.** database h
14f60 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20  andle <DB>. The 
14f70 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76  parameter <tailv
14f80 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  al> is the name 
14f90 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76  of a global.** v
14fa0 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
14fb0 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65  set to the unuse
14fc0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71  d portion of <sq
14fd0 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a  l> (if any). A.*
14fe0 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73  * STMT handle is
14ff0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
15000 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
15010 65 70 61 72 65 5f 76 32 28 0a 20 20 76 6f 69 64  epare_v2(.  void
15020 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
15030 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15040 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
15050 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
15060 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
15070 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
15080 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
15090 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f   int bytes;.  co
150a0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20  nst char *zTail 
150b0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
150c0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
150d0 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
150e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
150f0 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
15100 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
15110 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
15120 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
15130 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
15140 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15150 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
15160 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c   bytes tailvar",
15170 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
15180 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
15190 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
151a0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
151b0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
151c0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
151d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
151e0 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
151f0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
15200 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
15210 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
15220 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
15230 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15240 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
15250 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
15260 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
15270 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20  tmt, &zTail);.  
15280 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54  assert(rc==SQLIT
15290 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30  E_OK || pStmt==0
152a0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
152b0 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
152c0 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
152d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
152e0 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
152f0 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20     if( bytes>=0 
15300 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d  ){.      bytes =
15310 20 62 79 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d   bytes - (zTail-
15320 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
15330 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
15340 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
15350 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   0, Tcl_NewStrin
15360 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65  gObj(zTail, byte
15370 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  s), 0);.  }.  if
15380 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15390 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
153a0 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
153b0 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25  printf(zBuf, "(%
153c0 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
153d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
153e0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
153f0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
15400 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
15410 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
15420 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
15430 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
15440 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
15450 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
15460 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
15470 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
15480 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15490 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
154a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
154b0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
154c0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
154d0 72 65 70 61 72 65 31 36 20 44 42 20 73 71 6c 20  repare16 DB sql 
154e0 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a  bytes tailvar.**
154f0 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74  .** Compile up t
15500 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20  o <bytes> bytes 
15510 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
15520 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e  SQL string <sql>
15530 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61   using.** databa
15540 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20  se handle <DB>. 
15550 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74  The parameter <t
15560 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e  ailval> is the n
15570 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a  ame of a global.
15580 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  ** variable that
15590 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75   is set to the u
155a0 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  nused portion of
155b0 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e   <sql> (if any).
155c0 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c   A.** STMT handl
155d0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
155e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
155f0 74 5f 70 72 65 70 61 72 65 31 36 28 0a 20 20 76  t_prepare16(.  v
15600 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15610 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15620 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15630 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15640 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
15650 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15660 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
15670 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
15680 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f  void *zSql;.  co
15690 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20  nst void *zTail 
156a0 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  = 0;.  Tcl_Obj *
156b0 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  pTail = 0;.  sql
156c0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
156d0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
156e0 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63  f[50]; .  int rc
156f0 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20  ;.  int bytes;  
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15710 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70 65   The integer spe
15720 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33 20  cified as arg 3 
15730 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b  */.  int objlen;
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15750 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61 79  * The byte-array
15760 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32   length of arg 2
15770 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
15780 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
15790 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
157a0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
157b0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
157c0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
157d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
157e0 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
157f0 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20  tailvar", 0);.  
15800 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15810 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
15820 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
15830 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
15840 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
15850 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15860 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = 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 62 6a 76 5b 32 5d 2c 20 26 6f  mObj(objv[2], &o
15890 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63  bjlen);.  if( Tc
158a0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
158b0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
158c0 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
158d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
158e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
158f0 70 61 72 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c  pare16(db, zSql,
15900 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
15910 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28 20 73  &zTail);.  if( s
15920 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
15930 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
15940 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15950 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29  RROR;.  if( rc )
15960 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
15970 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
15980 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20  f( zTail ){.    
15990 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20  objlen = objlen 
159a0 2d 20 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28  - ((u8 *)zTail-(
159b0 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 7d 65  u8 *)zSql);.  }e
159c0 6c 73 65 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20  lse{.    objlen 
159d0 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 69 6c  = 0;.  }.  pTail
159e0 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
159f0 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61  rayObj((u8 *)zTa
15a00 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 54  il, objlen);.  T
15a10 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
15a20 70 54 61 69 6c 29 3b 0a 20 20 54 63 6c 5f 4f 62  pTail);.  Tcl_Ob
15a30 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
15a40 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61   objv[4], 0, pTa
15a50 69 6c 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  il, 0);.  Tcl_De
15a60 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c  crRefCount(pTail
15a70 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20  );..  if( pStmt 
15a80 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
15a90 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
15aa0 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
15ab0 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
15ac0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15ad0 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
15ae0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
15af0 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  f, 0);.#endif /*
15b00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
15b10 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
15b20 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
15b30 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
15b40 72 65 70 61 72 65 31 36 5f 76 32 20 44 42 20 73  repare16_v2 DB s
15b50 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
15b60 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
15b70 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
15b80 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
15b90 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
15ba0 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
15bb0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
15bc0 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
15bd0 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
15be0 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
15bf0 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
15c00 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
15c10 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
15c20 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
15c30 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
15c40 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
15c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15c60 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76  test_prepare16_v
15c70 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  2(.  void * clie
15c80 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
15c90 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
15ca0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
15cb0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
15cc0 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
15cd0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
15ce0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
15cf0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c  const void *zSql
15d00 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
15d10 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c  zTail = 0;.  Tcl
15d20 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b  _Obj *pTail = 0;
15d30 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
15d40 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
15d50 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20  ar zBuf[50]; .  
15d60 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79  int rc;.  int by
15d70 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  tes;            
15d80 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
15d90 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20  er specified as 
15da0 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f  arg 3 */.  int o
15db0 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  bjlen;          
15dc0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
15dd0 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66  -array length of
15de0 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28   arg 2 */..  if(
15df0 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
15e00 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15e10 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
15e20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
15e30 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
15e40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
15e50 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
15e60 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
15e70 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
15e80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
15e90 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
15ea0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
15eb0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
15ec0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
15ed0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
15ee0 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
15ef0 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
15f00 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20  2], &objlen);.  
15f10 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
15f20 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
15f30 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
15f40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15f50 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
15f60 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28  e3_prepare16_v2(
15f70 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c  db, zSql, bytes,
15f80 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29   &pStmt, &zTail)
15f90 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
15fa0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
15fb0 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
15fc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15fd0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
15fe0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15ff0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61 69  .  }..  if( zTai
16000 6c 20 29 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20  l ){.    objlen 
16010 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20  = objlen - ((u8 
16020 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53  *)zTail-(u8 *)zS
16030 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ql);.  }else{.  
16040 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20    objlen = 0;.  
16050 7d 0a 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f  }.  pTail = Tcl_
16060 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
16070 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a  (u8 *)zTail, obj
16080 6c 65 6e 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  len);.  Tcl_Incr
16090 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
160a0 0a 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72  .  Tcl_ObjSetVar
160b0 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
160c0 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b  ], 0, pTail, 0);
160d0 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
160e0 75 6e 74 28 70 54 61 69 6c 29 3b 0a 0a 20 20 69  unt(pTail);..  i
160f0 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
16100 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
16110 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
16120 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
16130 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
16140 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
16150 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16160 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
16170 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16180 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
16190 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
161a0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
161b0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69 6c  sqlite3_open fil
161c0 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c  ename ?options-l
161d0 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist?.*/.static i
161e0 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20 20  nt test_open(.  
161f0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
16200 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
16210 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
16220 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
16230 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
16240 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
16250 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  ilename;.  sqlit
16260 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
16270 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
16280 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
16290 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b  =3 && objc!=2 ){
162a0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
162b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
162c0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
162d0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
162e0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
162f0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69  g(objv[0]), " fi
16300 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c  lename options-l
16310 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ist", 0);.    re
16320 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16330 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65    }..  zFilename
16340 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
16350 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 72 63 20  (objv[1]);.  rc 
16360 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
16370 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a  Filename, &db);.
16380 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33    .  if( sqlite3
16390 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
163a0 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
163b0 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   db) ) return TC
163c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41  L_ERROR;.  Tcl_A
163d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
163e0 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
163f0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
16400 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
16410 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20 66 69  qlite3_open16 fi
16420 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a  lename options.*
16430 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
16440 74 5f 6f 70 65 6e 31 36 28 0a 20 20 76 6f 69 64  t_open16(.  void
16450 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
16460 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
16470 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
16480 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
16490 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
164a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
164b0 55 54 46 31 36 0a 20 20 63 6f 6e 73 74 20 76 6f  UTF16.  const vo
164c0 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  id *zFilename;. 
164d0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
164e0 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
164f0 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  Buf[100];..  if(
16500 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
16510 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
16520 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
16530 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
16540 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
16550 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
16560 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d  v[0]), " filenam
16570 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c  e options-list",
16580 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
16590 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
165a0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63    zFilename = Tc
165b0 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
165c0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
165d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
165e0 33 5f 6f 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61  3_open16(zFilena
165f0 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69  me, &db);.  .  i
16600 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
16610 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
16620 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29  erp, zBuf, db) )
16630 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16640 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  R;.  Tcl_AppendR
16650 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
16660 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  uf, 0);.#endif /
16670 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
16680 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
16690 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
166a0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
166b0 63 6f 6d 70 6c 65 74 65 31 36 20 3c 55 54 46 2d  complete16 <UTF-
166c0 31 36 20 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a  16 string>.**.**
166d0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
166e0 20 73 75 70 70 6c 69 65 64 20 61 72 67 75 6d 65   supplied argume
166f0 6e 74 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65  nt is a complete
16700 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20   SQL statement, 
16710 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  or zero.** other
16720 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
16730 69 6e 74 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74  int test_complet
16740 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  e16(.  void * cl
16750 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
16760 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
16770 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
16780 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
16790 76 5b 5d 0a 29 7b 0a 23 69 66 20 21 64 65 66 69  v[].){.#if !defi
167a0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
167b0 43 4f 4d 50 4c 45 54 45 29 20 26 26 20 21 64 65  COMPLETE) && !de
167c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
167d0 54 5f 55 54 46 31 36 29 0a 20 20 63 68 61 72 20  T_UTF16).  char 
167e0 2a 7a 42 75 66 3b 0a 0a 20 20 69 66 28 20 6f 62  *zBuf;..  if( ob
167f0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
16800 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
16810 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
16820 3c 75 74 66 2d 31 36 20 73 71 6c 3e 22 29 3b 0a  <utf-16 sql>");.
16830 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16840 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75  RROR;.  }..  zBu
16850 66 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47  f = (char*)Tcl_G
16860 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
16870 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
16880 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
16890 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
168a0 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
168b0 5f 63 6f 6d 70 6c 65 74 65 31 36 28 7a 42 75 66  _complete16(zBuf
168c0 29 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  )));.#endif /* S
168d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c  QLITE_OMIT_COMPL
168e0 45 54 45 20 26 26 20 53 51 4c 49 54 45 5f 4f 4d  ETE && SQLITE_OM
168f0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
16900 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
16910 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
16920 69 74 65 33 5f 73 74 65 70 20 53 54 4d 54 0a 2a  ite3_step STMT.*
16930 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
16940 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
16950 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73  e next row..*/.s
16960 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
16970 74 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tep(.  void * cl
16980 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
16990 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
169a0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
169b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
169c0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
169d0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
169e0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
169f0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
16a00 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16a10 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
16a20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
16a30 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
16a40 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
16a50 30 5d 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29  0]), " STMT", 0)
16a60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
16a70 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
16a80 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
16a90 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
16aa0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
16ab0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
16ac0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16ad0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
16ae0 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20  p(pStmt);..  /* 
16af0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  if( rc!=SQLITE_D
16b00 4f 4e 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ONE && rc!=SQLIT
16b10 45 5f 52 4f 57 20 29 20 72 65 74 75 72 6e 20 54  E_ROW ) return T
16b20 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f 0a 20 20 54  CL_ERROR; */.  T
16b30 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
16b40 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
16b50 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
16b60 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
16b70 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
16b80 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
16b90 6e 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a  n_count STMT .**
16ba0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
16bb0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
16bc0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
16bd0 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53   sql statement S
16be0 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  TMT..*/.static i
16bf0 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63  nt test_column_c
16c00 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  ount(.  void * c
16c10 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
16c20 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16c30 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
16c40 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
16c50 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
16c60 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
16c70 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
16c80 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
16c90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
16ca0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
16cb0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
16cc0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
16cd0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
16ce0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
16cf0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16d00 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
16d10 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
16d20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
16d30 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
16d40 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
16d50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54   TCL_ERROR;..  T
16d60 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
16d70 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
16d80 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ntObj(sqlite3_co
16d90 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
16da0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
16db0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
16dc0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
16dd0 6c 75 6d 6e 5f 74 79 70 65 20 53 54 4d 54 20 63  lumn_type STMT c
16de0 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  olumn.**.** Retu
16df0 72 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20 74  rn the type of t
16e00 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d  he data in colum
16e10 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68  n 'column' of th
16e20 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a  e current row..*
16e30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
16e40 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a 20  t_column_type(. 
16e50 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
16e60 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
16e70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
16e80 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
16e90 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
16ea0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
16eb0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
16ec0 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a 0a 20 20  l;.  int tp;..  
16ed0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
16ee0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
16ef0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
16f00 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
16f10 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
16f20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
16f30 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
16f40 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
16f50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
16f60 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
16f70 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
16f80 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
16f90 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
16fa0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
16fb0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
16fc0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
16fd0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
16fe0 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
16ff0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
17000 74 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tp = sqlite3_col
17010 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
17020 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63 68 28 20  col);.  switch( 
17030 74 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  tp ){.    case S
17040 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 0a  QLITE_INTEGER: .
17050 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
17060 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 4e 54  ult(interp, "INT
17070 45 47 45 52 22 2c 20 54 43 4c 5f 53 54 41 54 49  EGER", TCL_STATI
17080 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
17090 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
170a0 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 54 63  E_NULL:.      Tc
170b0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
170c0 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f  rp, "NULL", TCL_
170d0 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
170e0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
170f0 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20  SQLITE_FLOAT:.  
17100 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
17110 74 28 69 6e 74 65 72 70 2c 20 22 46 4c 4f 41 54  t(interp, "FLOAT
17120 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
17130 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17140 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
17150 58 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  XT:.      Tcl_Se
17160 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
17170 22 54 45 58 54 22 2c 20 54 43 4c 5f 53 54 41 54  "TEXT", TCL_STAT
17180 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
17190 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
171a0 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 54  TE_BLOB:.      T
171b0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
171c0 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20 54 43 4c  erp, "BLOB", TCL
171d0 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
171e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
171f0 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
17200 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  t(0);.  }..  ret
17210 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
17220 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
17230 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
17240 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
17250 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
17260 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f  ta in column 'co
17270 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72  lumn' of the cur
17280 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73  rent row cast as
17290 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28 36 34 2d   an.** wide (64-
172a0 62 69 74 29 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  bit) integer..*/
172b0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
172c0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20  _column_int64(. 
172d0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
172e0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
172f0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
17300 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
17310 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
17320 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
17330 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
17340 6c 3b 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a  l;.  i64 iVal;..
17350 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
17360 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17370 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17380 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17390 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
173a0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
173b0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
173c0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
173d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
173e0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
173f0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
17400 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
17410 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
17420 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
17430 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
17440 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
17450 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
17460 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
17470 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
17480 20 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    iVal = sqlite3
17490 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
174a0 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c  tmt, col);.  Tcl
174b0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
174c0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
174d0 65 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a  eIntObj(iVal));.
174e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
174f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
17500 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
17510 62 6c 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  blob STMT column
17520 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
17530 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  est_column_blob(
17540 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
17550 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
17560 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
17570 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
17580 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
17590 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
175a0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
175b0 63 6f 6c 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b  col;..  int len;
175c0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
175d0 42 6c 6f 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Blob;..  if( obj
175e0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
175f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
17600 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
17610 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
17620 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
17630 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
17640 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
17650 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
17660 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17670 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
17680 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
17690 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
176a0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
176b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
176c0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
176d0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
176e0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
176f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17700 52 52 4f 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73  RROR;..  len = s
17710 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
17720 74 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  tes(pStmt, col);
17730 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  pBlob = sqlit
17740 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
17750 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63  Stmt, col);.  Tc
17760 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
17770 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79  nterp, Tcl_NewBy
17780 74 65 41 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62  teArrayObj(pBlob
17790 2c 20 6c 65 6e 29 29 3b 0a 20 20 72 65 74 75 72  , len));.  retur
177a0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
177b0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
177c0 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20  3_column_double 
177d0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
177e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
177f0 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c  a in column 'col
17800 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72  umn' of the curr
17810 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73 20  ent row cast as 
17820 61 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61  a double..*/.sta
17830 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
17840 75 6d 6e 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f  umn_double(.  vo
17850 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
17860 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
17870 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
17880 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
17890 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
178a0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
178b0 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
178c0 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 0a    double rVal;..
178d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
178e0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
178f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17900 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17910 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
17920 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17930 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
17940 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
17950 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17960 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
17970 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
17980 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
17990 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
179a0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
179b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
179c0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
179d0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
179e0 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
179f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
17a00 20 20 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    rVal = sqlite3
17a10 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
17a20 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63  Stmt, col);.  Tc
17a30 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
17a40 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 44 6f  nterp, Tcl_NewDo
17a50 75 62 6c 65 4f 62 6a 28 72 56 61 6c 29 29 3b 0a  ubleObj(rVal));.
17a60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
17a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
17a80 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f   sqlite3_data_co
17a90 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  unt STMT .**.** 
17aa0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
17ab0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74  r of columns ret
17ac0 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c  urned by the sql
17ad0 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e   statement STMT.
17ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
17af0 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 28 0a  est_data_count(.
17b00 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17b10 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17b20 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17b30 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17b40 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17b50 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
17b60 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
17b70 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
17b80 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
17b90 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
17ba0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
17bb0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
17bc0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
17bd0 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
17be0 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
17bf0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17c00 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
17c10 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
17c20 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
17c30 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
17c40 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17c50 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74  RROR;..  Tcl_Set
17c60 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
17c70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
17c80 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75  sqlite3_data_cou
17c90 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72  nt(pStmt)));.  r
17ca0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
17cb0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
17cc0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
17cd0 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  t STMT column.**
17ce0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
17cf0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
17d00 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  pe STMT column.*
17d10 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
17d20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20  te3_column_name 
17d30 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
17d40 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
17d50 74 6d 74 5f 75 74 66 38 28 0a 20 20 76 6f 69 64  tmt_utf8(.  void
17d60 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20   * clientData,  
17d70 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
17d80 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66   to SQLite API f
17d90 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  unction to be in
17da0 76 6f 6b 65 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  voke */.  Tcl_In
17db0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
17dc0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17dd0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17de0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
17df0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
17e00 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63  t col;.  const c
17e10 68 61 72 20 2a 28 2a 78 46 75 6e 63 29 28 73 71  har *(*xFunc)(sq
17e20 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
17e30 29 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  ) = clientData;.
17e40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
17e50 65 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  et;..  if( objc!
17e60 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
17e70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17e80 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
17e90 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
17ea0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
17eb0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
17ec0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
17ed0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
17ee0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
17ef0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
17f00 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
17f10 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
17f20 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
17f30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17f40 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
17f50 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
17f60 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
17f70 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17f80 4f 52 3b 0a 20 20 7a 52 65 74 20 3d 20 78 46 75  OR;.  zRet = xFu
17f90 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  nc(pStmt, col);.
17fa0 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20    if( zRet ){.  
17fb0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
17fc0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
17fd0 7a 52 65 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zRet, 0);.  }.  
17fe0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
17ff0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ..static int tes
18000 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  t_global_recover
18010 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
18020 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
18030 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
18040 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
18050 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
18060 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
18070 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41 4c 52 45  TE_OMIT_GLOBALRE
18080 43 4f 56 45 52 0a 20 20 69 6e 74 20 72 63 3b 0a  COVER.  int rc;.
18090 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
180a0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
180b0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
180c0 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
180d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
180e0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
180f0 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
18100 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65 74  ver();.  Tcl_Set
18110 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
18120 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
18130 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
18140 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  IC);.#endif.  re
18150 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
18160 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
18170 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
18180 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
18190 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
181a0 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
181b0 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
181c0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
181d0 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53  e3_column_name S
181e0 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74  TMT column.*/.st
181f0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
18200 6d 74 5f 75 74 66 31 36 28 0a 20 20 76 6f 69 64  mt_utf16(.  void
18210 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20   * clientData,  
18220 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
18230 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63   SQLite API func
18240 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
18250 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
18260 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
18270 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
18280 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
18290 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
182a0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
182b0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
182c0 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
182d0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
182e0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
182f0 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76  ame16;.  const v
18300 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71  oid *(*xFunc)(sq
18310 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
18320 29 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  ) = clientData;.
18330 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
18340 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
18350 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
18360 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
18370 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
18380 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
18390 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
183a0 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
183b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
183c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
183d0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
183e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
183f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
18400 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
18410 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
18420 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
18430 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
18440 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
18450 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18460 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75  .  zName16 = xFu
18470 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  nc(pStmt, col);.
18480 20 20 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b    if( zName16 ){
18490 0a 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f  .    pRet = Tcl_
184a0 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
184b0 7a 4e 61 6d 65 31 36 2c 20 73 71 6c 69 74 65 33  zName16, sqlite3
184c0 55 74 66 31 36 42 79 74 65 4c 65 6e 28 7a 4e 61  Utf16ByteLen(zNa
184d0 6d 65 31 36 2c 20 2d 31 29 2b 32 29 3b 0a 20 20  me16, -1)+2);.  
184e0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
184f0 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
18500 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
18510 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
18520 36 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54  6 */..  return T
18530 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
18540 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
18550 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63  olumn_int STMT c
18560 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
18570 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
18580 6e 5f 62 79 74 65 73 20 53 54 4d 54 20 63 6f 6c  n_bytes STMT col
18590 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
185a0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
185b0 62 79 74 65 73 31 36 20 53 54 4d 54 20 63 6f 6c  bytes16 STMT col
185c0 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  umn.**.*/.static
185d0 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 69   int test_stmt_i
185e0 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
185f0 65 6e 74 44 61 74 61 2c 20 20 20 20 2f 2a 20 50  entData,    /* P
18600 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65  ointer to SQLite
18610 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f   API function to
18620 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20   be invoked */. 
18630 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18640 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18650 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18660 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
18670 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
18680 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
18690 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  int (*xFunc)(sql
186a0 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
186b0 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a   = clientData;..
186c0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
186d0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
186e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
186f0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
18700 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
18710 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
18720 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
18730 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
18740 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18750 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
18760 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
18770 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
18780 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
18790 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
187a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
187b0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
187c0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
187d0 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
187e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
187f0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
18800 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
18810 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70  ewIntObj(xFunc(p
18820 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20  Stmt, col)));.  
18830 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
18840 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18850 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 2f 2a 0a  _OMIT_DISKIO./*.
18860 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
18870 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
18880 65 20 3c 66 69 6c 65 6e 61 6d 65 3e 0a 2a 2f 0a  e <filename>.*/.
18890 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
188a0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
188b0 64 57 72 69 74 65 28 0a 20 20 76 6f 69 64 20 2a  dWrite(.  void *
188c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
188d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
188e0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
188f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18900 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
18910 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b  te3_file *pFile;
18920 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
18930 20 64 75 6d 6d 79 3b 0a 20 20 63 68 61 72 20 7a   dummy;.  char z
18940 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  Buf[100];..  if(
18950 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
18960 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18970 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
18980 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
18990 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
189a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
189b0 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d  v[0]), " filenam
189c0 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
189d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
189e0 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
189f0 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
18a00 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
18a10 62 6a 76 5b 31 5d 29 2c 20 26 70 46 69 6c 65 2c  bjv[1]), &pFile,
18a20 20 26 64 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20   &dummy);.  if( 
18a30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18a40 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
18a50 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
18a60 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
18a70 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
18a80 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18a90 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
18aa0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
18ab0 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
18ac0 42 75 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20 54  Buf, pFile);.  T
18ad0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
18ae0 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
18af0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18b00 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  R;.}../*.** Usag
18b10 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  e:  sqlite3OsClo
18b20 73 65 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e  se <file handle>
18b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18b40 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 43 6c 6f  est_sqlite3OsClo
18b50 73 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  se(.  void * cli
18b60 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
18b70 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
18b80 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
18b90 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
18ba0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
18bb0 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 20 20 69  file *pFile;.  i
18bc0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
18bd0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
18be0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18bf0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
18c00 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
18c10 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
18c20 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
18c30 5d 29 2c 20 22 20 66 69 6c 65 68 61 6e 64 6c 65  ]), " filehandle
18c40 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
18c50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18c60 0a 0a 20 20 69 66 28 20 67 65 74 46 69 6c 65 50  ..  if( getFileP
18c70 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18c80 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18c90 76 5b 31 5d 29 2c 20 26 70 46 69 6c 65 29 20 29  v[1]), &pFile) )
18ca0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
18cb0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
18cc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73   = sqlite3OsClos
18cd0 65 28 26 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  e(&pFile);.  if(
18ce0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18cf0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
18d00 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
18d10 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
18d20 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
18d30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18d40 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
18d50 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
18d60 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
18d70 6c 69 74 65 33 4f 73 4c 6f 63 6b 20 3c 66 69 6c  lite3OsLock <fil
18d80 65 20 68 61 6e 64 6c 65 3e 20 3c 6c 6f 63 6b 74  e handle> <lockt
18d90 79 70 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ype>.*/.static i
18da0 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f  nt test_sqlite3O
18db0 73 4c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20  sLock(.  void * 
18dc0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18dd0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18de0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18df0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18e00 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18e10 65 33 5f 66 69 6c 65 20 2a 20 70 46 69 6c 65 3b  e3_file * pFile;
18e20 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
18e30 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
18e40 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18e50 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
18e60 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
18e70 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
18e80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18e90 62 6a 76 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20  bjv[0]), .      
18ea0 20 20 22 20 66 69 6c 65 68 61 6e 64 6c 65 20 28    " filehandle (
18eb0 53 48 41 52 45 44 7c 52 45 53 45 52 56 45 44 7c  SHARED|RESERVED|
18ec0 50 45 4e 44 49 4e 47 7c 45 58 43 4c 55 53 49 56  PENDING|EXCLUSIV
18ed0 45 29 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  E)", 0);.    ret
18ee0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18ef0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 46 69 6c   }..  if( getFil
18f00 65 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  ePointer(interp,
18f10 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18f20 62 6a 76 5b 31 5d 29 2c 20 26 70 46 69 6c 65 29  bjv[1]), &pFile)
18f30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
18f40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
18f50 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22   if( 0==strcmp("
18f60 53 48 41 52 45 44 22 2c 20 54 63 6c 5f 47 65 74  SHARED", Tcl_Get
18f70 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29  String(objv[2]))
18f80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
18f90 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65  ite3OsLock(pFile
18fa0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
18fb0 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 30    }.  else if( 0
18fc0 3d 3d 73 74 72 63 6d 70 28 22 52 45 53 45 52 56  ==strcmp("RESERV
18fd0 45 44 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ED", Tcl_GetStri
18fe0 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a  ng(objv[2])) ){.
18ff0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19000 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 52 45  OsLock(pFile, RE
19010 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
19020 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d  }.  else if( 0==
19030 73 74 72 63 6d 70 28 22 50 45 4e 44 49 4e 47 22  strcmp("PENDING"
19040 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
19050 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20  objv[2])) ){.   
19060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
19070 6f 63 6b 28 70 46 69 6c 65 2c 20 50 45 4e 44 49  ock(pFile, PENDI
19080 4e 47 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20  NG_LOCK);.  }.  
19090 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 74 72 63  else if( 0==strc
190a0 6d 70 28 22 45 58 43 4c 55 53 49 56 45 22 2c 20  mp("EXCLUSIVE", 
190b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
190c0 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72  jv[2])) ){.    r
190d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
190e0 6b 28 70 46 69 6c 65 2c 20 45 58 43 4c 55 53 49  k(pFile, EXCLUSI
190f0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 65 6c 73  VE_LOCK);.  }els
19100 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  e{.    Tcl_Appen
19110 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19120 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
19130 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
19140 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
19150 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 0a  ring(objv[0]), .
19160 20 20 20 20 20 20 20 20 22 20 66 69 6c 65 68 61          " fileha
19170 6e 64 6c 65 20 28 53 48 41 52 45 44 7c 52 45 53  ndle (SHARED|RES
19180 45 52 56 45 44 7c 50 45 4e 44 49 4e 47 7c 45 58  ERVED|PENDING|EX
19190 43 4c 55 53 49 56 45 29 22 2c 20 30 29 3b 0a 20  CLUSIVE)", 0);. 
191a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
191b0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
191c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
191d0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
191e0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
191f0 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
19200 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
19210 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19220 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
19230 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
19240 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
19250 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 20 3c 66 69  ite3OsUnlock <fi
19260 6c 65 20 68 61 6e 64 6c 65 3e 0a 2a 2f 0a 73 74  le handle>.*/.st
19270 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71  atic int test_sq
19280 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 0a 20  lite3OsUnlock(. 
19290 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
192a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
192b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
192c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
192d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
192e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
192f0 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  * pFile;.  int r
19300 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
19310 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
19320 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19330 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
19340 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
19350 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
19360 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
19370 22 20 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30  " filehandle", 0
19380 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
19390 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
193a0 69 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74  if( getFilePoint
193b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
193c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
193d0 29 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20  ), &pFile) ){.  
193e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
193f0 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
19400 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
19410 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  File, NO_LOCK);.
19420 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19430 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
19440 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
19450 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
19460 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
19470 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72  ATIC);.    retur
19480 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19490 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
194a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
194b0 3a 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70  :  sqlite3OsTemp
194c0 46 69 6c 65 4e 61 6d 65 0a 2a 2f 0a 73 74 61 74  FileName.*/.stat
194d0 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69  ic int test_sqli
194e0 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  te3OsTempFileNam
194f0 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
19500 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
19510 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
19520 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
19530 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
19540 5d 0a 29 7b 0a 20 20 63 68 61 72 20 7a 46 69 6c  ].){.  char zFil
19550 65 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  e[SQLITE_TEMPNAM
19560 45 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 72  E_SIZE];.  int r
19570 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
19580 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
19590 28 7a 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (zFile);.  if( r
195a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
195b0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
195c0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
195d0 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
195e0 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
195f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19600 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  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 7a 46 69 6c 65 2c 20 30 29 3b 0a  erp, zFile, 0);.
19630 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
19640 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19650 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
19660 73 65 74 5f 6d 61 67 69 63 20 20 44 42 20 20 4d  set_magic  DB  M
19670 41 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a  AGIC-NUMBER.**.*
19680 2a 20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d 61  * Set the db->ma
19690 67 69 63 20 76 61 6c 75 65 2e 20 20 54 68 69 73  gic value.  This
196a0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
196b0 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79 20   error recovery 
196c0 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  logic..*/.static
196d0 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 65 74 5f   int sqlite_set_
196e0 6d 61 67 69 63 28 0a 20 20 76 6f 69 64 20 2a 20  magic(.  void * 
196f0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
19700 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19710 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
19720 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
19730 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
19740 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
19750 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
19760 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
19770 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
19780 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
19790 5d 2c 0a 20 20 20 20 20 20 20 20 20 22 20 44 42  ],.         " DB
197a0 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20 20 20   MAGIC", 0);.   
197b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
197c0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
197d0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
197e0 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
197f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19800 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  OR;.  if( strcmp
19810 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54  (argv[2], "SQLIT
19820 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d  E_MAGIC_OPEN")==
19830 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
19840 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
19850 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  C_OPEN;.  }else 
19860 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
19870 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
19880 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b  C_CLOSED")==0 ){
19890 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
198a0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
198b0 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OSED;.  }else if
198c0 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d  ( strcmp(argv[2]
198d0 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  , "SQLITE_MAGIC_
198e0 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20  BUSY")==0 ){.   
198f0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
19900 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a  ITE_MAGIC_BUSY;.
19910 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
19920 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
19930 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22  ITE_MAGIC_ERROR"
19940 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
19950 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
19960 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  AGIC_ERROR;.  }e
19970 6c 73 65 20 69 66 28 20 54 63 6c 5f 47 65 74 49  lse if( Tcl_GetI
19980 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
19990 32 5d 2c 20 26 64 62 2d 3e 6d 61 67 69 63 29 20  2], &db->magic) 
199a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
199b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
199c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
199d0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
199e0 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
199f0 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67    DB .**.** Trig
19a00 67 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70 74  ger an interrupt
19a10 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63   on DB.*/.static
19a20 20 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72 72   int test_interr
19a30 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  upt(.  void * cl
19a40 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
19a50 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19a60 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
19a70 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ar **argv.){.  s
19a80 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
19a90 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
19aa0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19ab0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
19ac0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
19ad0 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
19ae0 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
19af0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19b00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
19b10 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
19b20 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
19b30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19b40 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  R;.  sqlite3_int
19b50 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72 65  errupt(db);.  re
19b60 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
19b70 73 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69 74  static u8 *sqlit
19b80 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e  e3_stack_baselin
19b90 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69  e = 0;../*.** Fi
19ba0 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69 74  ll the stack wit
19bb0 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61 74  h a known bitpat
19bc0 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tern..*/.static 
19bd0 76 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28 76  void prepStack(v
19be0 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  oid){.  int i;. 
19bf0 20 75 33 32 20 62 69 67 42 75 66 5b 36 35 35 33   u32 bigBuf[6553
19c00 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  6];.  for(i=0; i
19c10 3c 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29 3b  <sizeof(bigBuf);
19c20 20 69 2b 2b 29 20 62 69 67 42 75 66 5b 69 5d 20   i++) bigBuf[i] 
19c30 3d 20 30 78 64 65 61 64 62 65 65 66 3b 0a 20 20  = 0xdeadbeef;.  
19c40 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
19c50 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a 29 26 62  seline = (u8*)&b
19c60 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 7d 0a  igBuf[65536];.}.
19c70 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 63  ./*.** Get the c
19c80 75 72 72 65 6e 74 20 73 74 61 63 6b 20 64 65 70  urrent stack dep
19c90 74 68 2e 20 20 55 73 65 64 20 66 6f 72 20 64 65  th.  Used for de
19ca0 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
19cb0 0a 75 36 34 20 73 71 6c 69 74 65 33 53 74 61 63  .u64 sqlite3Stac
19cc0 6b 44 65 70 74 68 28 76 6f 69 64 29 7b 0a 20 20  kDepth(void){.  
19cd0 75 38 20 78 3b 0a 20 20 72 65 74 75 72 6e 20 28  u8 x;.  return (
19ce0 75 36 34 29 28 73 71 6c 69 74 65 33 5f 73 74 61  u64)(sqlite3_sta
19cf0 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d 20 26 78  ck_baseline - &x
19d00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
19d10 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63  e:  sqlite3_stac
19d20 6b 5f 75 73 65 64 20 44 42 20 53 51 4c 0a 2a 2a  k_used DB SQL.**
19d30 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65 61 73 75  .** Try to measu
19d40 72 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  re the amount of
19d50 20 73 74 61 63 6b 20 73 70 61 63 65 20 75 73 65   stack space use
19d60 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73  d by a call to s
19d70 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a 2f 0a 73  qlite3_exec.*/.s
19d80 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
19d90 74 61 63 6b 5f 75 73 65 64 28 0a 20 20 76 6f 69  tack_used(.  voi
19da0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
19db0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
19dc0 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
19dd0 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
19de0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
19df0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
19e00 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
19e10 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19e20 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
19e30 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
19e40 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
19e50 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 53 51  .        " DB SQ
19e60 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  L", 0);.    retu
19e70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19e80 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
19e90 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
19ea0 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
19eb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19ec0 20 70 72 65 70 53 74 61 63 6b 28 29 3b 0a 20 20   prepStack();.  
19ed0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
19ee0 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  ec(db, argv[2], 
19ef0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28  0, 0, 0);.  for(
19f00 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30 20 26 26  i=65535; i>=0 &&
19f10 20 28 28 75 33 32 2a 29 73 71 6c 69 74 65 33 5f   ((u32*)sqlite3_
19f20 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 29 5b  stack_baseline)[
19f30 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65 65 66 3b  -i]==0xdeadbeef;
19f40 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53 65   i--){}.  Tcl_Se
19f50 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
19f60 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
19f70 28 69 2a 34 29 29 3b 0a 20 20 72 65 74 75 72 6e  (i*4));.  return
19f80 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
19f90 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f  * Usage: sqlite_
19fa0 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20  delete_function 
19fb0 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  DB function-name
19fc0 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  .**.** Delete th
19fd0 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  e user function 
19fe0 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27 20  'function-name' 
19ff0 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61  from database ha
1a000 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20 69  ndle DB. It.** i
1a010 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1a020 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
1a030 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73 20   was created as 
1a040 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65 72  UTF8, any number
1a050 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73   of.** arguments
1a060 20 28 74 68 65 20 77 61 79 20 74 68 65 20 54 43   (the way the TC
1a070 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73  L interface does
1a080 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   it)..*/.static 
1a090 69 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e 63 74  int delete_funct
1a0a0 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ion(.  void * cl
1a0b0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1a0c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1a0d0 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1a0e0 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ar **argv.){.  i
1a0f0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1a100 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1a110 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1a120 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a130 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1a140 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1a150 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1a160 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f      " DB functio
1a170 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20  n-name", 0);.   
1a180 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a190 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1a1a0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1a1b0 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1a1c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a1d0 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1a1e0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1a1f0 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  on(db, argv[2], 
1a200 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
1a210 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
1a220 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1a230 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
1a240 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
1a250 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
1a260 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1a270 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1a280 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  ite_delete_colla
1a290 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69 6f  tion DB collatio
1a2a0 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c  n-name.**.** Del
1a2b0 65 74 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ete the collatio
1a2c0 6e 20 73 65 71 75 65 6e 63 65 20 27 63 6f 6c 6c  n sequence 'coll
1a2d0 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d  ation-name' from
1a2e0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1a2f0 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73 20 61   .** DB. It is a
1a300 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1a310 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1a320 63 65 20 77 61 73 20 63 72 65 61 74 65 64 20 61  ce was created a
1a330 73 20 55 54 46 38 20 28 74 68 65 20 0a 2a 2a 20  s UTF8 (the .** 
1a340 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65  way the TCL inte
1a350 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a  rface does it)..
1a360 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
1a370 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  lete_collation(.
1a380 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1a390 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1a3a0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1a3b0 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1a3c0 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63  argv.){.  int rc
1a3d0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1a3e0 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
1a3f0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1a400 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1a410 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1a420 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1a430 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
1a440 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d   DB function-nam
1a450 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
1a460 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a470 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1a480 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1a490 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1a4a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a4b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
1a4c0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
1a4d0 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c 49  b, argv[2], SQLI
1a4e0 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b 0a  TE_UTF8, 0, 0);.
1a4f0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1a500 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1a510 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
1a520 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
1a530 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1a540 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1a550 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
1a560 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52  ommit DB.**.** R
1a570 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1a580 65 20 64 61 74 61 62 61 73 65 20 44 42 20 69 73  e database DB is
1a590 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 75   currently in au
1a5a0 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a  to-commit mode..
1a5b0 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  ** Return false 
1a5c0 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
1a5d0 63 20 69 6e 74 20 67 65 74 5f 61 75 74 6f 63 6f  c int get_autoco
1a5e0 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  mmit(.  void * c
1a5f0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1a600 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1a610 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1a620 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1a630 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
1a640 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1a650 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
1a660 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a670 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1a680 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1a690 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1a6a0 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1a6b0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1a6c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1a6d0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1a6e0 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1a6f0 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1a700 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a710 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
1a720 64 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  d", sqlite3_get_
1a730 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b  autocommit(db));
1a740 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1a750 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1a760 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1a770 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1a780 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 62  Usage: sqlite3_b
1a790 75 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d  usy_timeout DB M
1a7a0 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  S.**.** Set the 
1a7b0 62 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20 54  busy timeout.  T
1a7c0 68 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73 69  his is more easi
1a7d0 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74 68  ly done using th
1a7e0 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74  e timeout.** met
1a7f0 68 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20 69  hod of the TCL i
1a800 6e 74 65 72 66 61 63 65 2e 20 20 42 75 74 20 77  nterface.  But w
1a810 65 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f 20  e need a way to 
1a820 74 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a 2a  test the case.**
1a830 20 77 68 65 72 65 20 69 74 20 72 65 74 75 72 6e   where it return
1a840 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  s SQLITE_MISUSE.
1a850 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1a860 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  est_busy_timeout
1a870 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1a880 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1a890 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1a8a0 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1a8b0 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
1a8c0 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74 65  rc, ms;.  sqlite
1a8d0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1a8e0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1a8f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a900 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1a910 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a920 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1a930 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a       " DB", 0);.
1a940 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a950 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1a960 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1a970 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1a980 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1a990 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1a9a0 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
1a9b0 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20  argv[2], &ms) ) 
1a9c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a9d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1a9e0 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62  _busy_timeout(db
1a9f0 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70  , ms);.  Tcl_App
1aa00 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1aa10 2c 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  , sqlite3TestErr
1aa20 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
1aa30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1aa40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1aa50 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74    tcl_variable_t
1aa60 79 70 65 20 56 41 52 49 41 42 4c 45 4e 41 4d 45  ype VARIABLENAME
1aa70 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1aa80 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
1aa90 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74  ternal represent
1aaa0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a  ation for the.**
1aab0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 67 69   value of the gi
1aac0 76 65 6e 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ven variable..*/
1aad0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 5f  .static int tcl_
1aae0 76 61 72 69 61 62 6c 65 5f 74 79 70 65 28 0a 20  variable_type(. 
1aaf0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1ab00 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1ab10 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1ab20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1ab30 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1ab40 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72  .  Tcl_Obj *pVar
1ab50 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
1ab60 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1ab70 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1ab80 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49 41 42  1, objv, "VARIAB
1ab90 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  LE");.    return
1aba0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1abb0 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74    pVar = Tcl_Get
1abc0 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 54  Var2Ex(interp, T
1abd0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1abe0 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f 4c 45  v[1]), 0, TCL_LE
1abf0 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a 20 20  AVE_ERR_MSG);.  
1ac00 69 66 28 20 70 56 61 72 3d 3d 30 20 29 20 72 65  if( pVar==0 ) re
1ac10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ac20 20 20 69 66 28 20 70 56 61 72 2d 3e 74 79 70 65    if( pVar->type
1ac30 50 74 72 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  Ptr ){.    Tcl_S
1ac40 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1ac50 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
1ac60 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70 65 50  gObj(pVar->typeP
1ac70 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a  tr->name, -1));.
1ac80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1ac90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1aca0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65  age:  sqlite3_re
1acb0 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f 4e 3f  lease_memory ?N?
1acc0 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  .**.** Attempt t
1acd0 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79  o release memory
1ace0 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1acf0 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  but not actually
1ad00 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 54 68   required..** Th
1ad10 65 20 69 6e 74 65 67 65 72 20 4e 20 69 73 20 74  e integer N is t
1ad20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1ad30 65 73 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  es we are trying
1ad40 20 74 6f 20 72 65 6c 65 61 73 65 2e 20 20 54 68   to release.  Th
1ad50 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  e .** return val
1ad60 75 65 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  ue is the amount
1ad70 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74 75 61   of memory actua
1ad80 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f  lly released..*/
1ad90 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1ada0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
1adb0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1adc0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1add0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1ade0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1adf0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1ae00 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
1ae10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
1ae20 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20  ORY_MANAGEMENT) 
1ae30 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1ae40 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
1ae50 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20 61    int N;.  int a
1ae60 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  mt;.  if( objc!=
1ae70 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  1 && objc!=2 ){.
1ae80 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1ae90 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1aea0 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20  objv, "?N?");.  
1aeb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1aec0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
1aed0 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc==2 ){.    if(
1aee0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1aef0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1af00 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e  1], &N) ) return
1af10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
1af20 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d 31 3b  lse{.    N = -1;
1af30 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c  .  }.  amt = sql
1af40 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
1af50 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65  ory(N);.  Tcl_Se
1af60 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1af70 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1af80 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (amt));.#endif. 
1af90 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1afa0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1afb0 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
1afc0 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a  ap_limit ?N?.**.
1afd0 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20  ** Query or set 
1afe0 74 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69  the soft heap li
1aff0 6d 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  mit for the curr
1b000 65 6e 74 20 74 68 72 65 61 64 2e 20 20 54 68 65  ent thread.  The
1b010 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c  .** limit is onl
1b020 79 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65  y changed if the
1b030 20 4e 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20   N is present.  
1b040 54 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6d  The previous lim
1b050 69 74 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  it.** is returne
1b060 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1b070 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f   test_soft_heap_
1b080 6c 69 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20  limit(.  void * 
1b090 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1b0a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b0b0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1b0c0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1b0d0 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66  bjv[].){.#if def
1b0e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1b0f0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
1b100 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69 6e 65  MENT) && !define
1b110 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
1b120 53 4b 49 4f 29 0a 20 20 69 6e 74 20 61 6d 74 3b  SKIO).  int amt;
1b130 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26  .  if( objc!=1 &
1b140 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  & objc!=2 ){.   
1b150 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1b160 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1b170 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72  v, "?N?");.    r
1b180 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b190 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c  .  }.  amt = sql
1b1a0 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
1b1b0 61 64 4f 6e 6c 79 28 29 2d 3e 6e 53 6f 66 74 48  adOnly()->nSoftH
1b1c0 65 61 70 4c 69 6d 69 74 3b 0a 20 20 69 66 28 20  eapLimit;.  if( 
1b1d0 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69  objc==2 ){.    i
1b1e0 6e 74 20 4e 3b 0a 20 20 20 20 69 66 28 20 54 63  nt N;.    if( Tc
1b1f0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1b200 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
1b210 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &N) ) return TC
1b220 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  L_ERROR;.    sql
1b230 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
1b240 69 6d 69 74 28 4e 29 3b 0a 20 20 7d 0a 20 20 54  imit(N);.  }.  T
1b250 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1b260 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1b270 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e  ntObj(amt));.#en
1b280 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
1b290 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1b2a0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 63  age:   sqlite3_c
1b2b0 6c 65 61 72 5f 74 73 64 5f 6d 65 6d 64 65 62 75  lear_tsd_memdebu
1b2c0 67 0a 2a 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c  g.**.** Clear al
1b2d0 6c 20 6f 66 20 74 68 65 20 4d 45 4d 44 45 42 55  l of the MEMDEBU
1b2e0 47 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  G information ou
1b2f0 74 20 6f 66 20 74 68 72 65 61 64 2d 73 70 65 63  t of thread-spec
1b300 69 66 69 63 20 64 61 74 61 2e 0a 2a 2a 20 54 68  ific data..** Th
1b310 69 73 20 77 69 6c 6c 20 61 6c 6c 6f 77 20 69 74  is will allow it
1b320 20 74 6f 20 62 65 20 64 65 61 6c 6c 6f 63 61 74   to be deallocat
1b330 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1b340 74 20 74 65 73 74 5f 63 6c 65 61 72 5f 74 73 64  t test_clear_tsd
1b350 5f 6d 65 6d 64 65 62 75 67 28 0a 20 20 76 6f 69  _memdebug(.  voi
1b360 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1b370 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1b380 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1b390 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1b3a0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 72  ST objv[].){.  r
1b3b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b3c0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
1b3d0 73 71 6c 69 74 65 33 5f 74 73 64 5f 72 65 6c 65  sqlite3_tsd_rele
1b3e0 61 73 65 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 73  ase.**.** Call s
1b3f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 68 72  qlite3ReleaseThr
1b400 65 61 64 44 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  eadData..*/.stat
1b410 69 63 20 69 6e 74 20 74 65 73 74 5f 74 73 64 5f  ic int test_tsd_
1b420 72 65 6c 65 61 73 65 28 0a 20 20 76 6f 69 64 20  release(.  void 
1b430 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1b440 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1b450 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1b460 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1b470 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64   objv[].){.#if d
1b480 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 45  efined(SQLITE_ME
1b490 4d 44 45 42 55 47 29 0a 20 20 73 71 6c 69 74 65  MDEBUG).  sqlite
1b4a0 33 52 65 6c 65 61 73 65 54 68 72 65 61 64 44 61  3ReleaseThreadDa
1b4b0 74 61 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  ta();.#endif.  r
1b4c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b4d0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
1b4e0 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
1b4f0 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c  leanup.**.** Cal
1b500 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 68  l the sqlite3_th
1b510 72 65 61 64 5f 63 6c 65 61 6e 75 70 20 41 50 49  read_cleanup API
1b520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b530 74 65 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61  test_thread_clea
1b540 6e 75 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  nup(.  void * cl
1b550 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1b560 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1b570 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1b580 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1b590 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1b5a0 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28  _thread_cleanup(
1b5b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1b5c0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
1b5d0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 70  age:   sqlite3_p
1b5e0 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 20  ager_refcounts  
1b5f0 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
1b600 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65 72  a list of number
1b610 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20  s which are the 
1b620 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20 66 6f  PagerRefcount fo
1b630 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20  r all.** pagers 
1b640 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61 73 65  on each database
1b650 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
1b660 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1b670 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 28  pager_refcounts(
1b680 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1b690 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1b6a0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b6b0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1b6c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1b6d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1b6e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
1b6f0 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62   v, *a;.  Tcl_Ob
1b700 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69  j *pResult;..  i
1b710 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1b720 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1b730 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1b740 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1b750 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
1b760 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
1b770 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
1b780 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
1b790 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b7a0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1b7b0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1b7c0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1b7d0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1b7e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1b7f0 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d 20  OR;.  pResult = 
1b800 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
1b810 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1b820 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
1b830 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
1b840 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==0 ){.      v =
1b850 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
1b860 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65        a = sqlite
1b870 33 50 61 67 65 72 53 74 61 74 73 28 73 71 6c 69  3PagerStats(sqli
1b880 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62  te3BtreePager(db
1b890 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a  ->aDb[i].pBt));.
1b8a0 20 20 20 20 20 20 76 20 3d 20 61 5b 30 5d 3b 0a        v = a[0];.
1b8b0 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69      }.    Tcl_Li
1b8c0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1b8d0 6e 74 28 30 2c 20 70 52 65 73 75 6c 74 2c 20 54  nt(0, pResult, T
1b8e0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29  cl_NewIntObj(v))
1b8f0 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
1b900 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1b910 20 70 52 65 73 75 6c 74 29 3b 0a 20 20 72 65 74   pResult);.  ret
1b920 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
1b930 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
1b940 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
1b950 74 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c  t.**.** Some TCL
1b960 20 62 75 69 6c 64 73 20 28 65 78 3a 20 63 79 67   builds (ex: cyg
1b970 77 69 6e 29 20 64 6f 20 6e 6f 74 20 73 75 70 70  win) do not supp
1b980 6f 72 74 20 36 34 2d 62 69 74 20 69 6e 74 65 67  ort 64-bit integ
1b990 65 72 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65  ers.  This.** le
1b9a0 61 64 73 20 74 6f 20 61 20 6e 75 6d 62 65 72 20  ads to a number 
1b9b0 6f 66 20 74 65 73 74 20 66 61 69 6c 75 72 65 73  of test failures
1b9c0 2e 20 20 54 68 65 20 70 72 65 73 65 6e 74 20 63  .  The present c
1b9d0 6f 6d 6d 61 6e 64 20 63 68 65 63 6b 73 20 74 68  ommand checks th
1b9e0 65 0a 2a 2a 20 54 43 4c 20 62 75 69 6c 64 20 74  e.** TCL build t
1b9f0 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
1ba00 20 6e 6f 74 20 69 74 20 73 75 70 70 6f 72 74 73   not it supports
1ba10 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73   64-bit integers
1ba20 2e 20 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73  .  It.** returns
1ba30 20 54 52 55 45 20 69 66 20 69 74 20 64 6f 65 73   TRUE if it does
1ba40 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f   and FALSE if no
1ba50 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  t..**.** This co
1ba60 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
1ba70 20 77 61 72 6e 20 75 73 65 72 73 20 74 68 61 74   warn users that
1ba80 20 74 68 65 69 72 20 54 43 4c 20 62 75 69 6c 64   their TCL build
1ba90 20 69 73 20 64 65 66 65 63 74 69 76 65 0a 2a 2a   is defective.**
1baa0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 65 72   and that the er
1bab0 72 6f 72 73 20 74 68 65 79 20 61 72 65 20 73 65  rors they are se
1bac0 65 69 6e 67 20 69 6e 20 74 68 65 20 74 65 73 74  eing in the test
1bad0 20 73 63 72 69 70 74 73 20 6d 69 67 68 74 20 62   scripts might b
1bae0 65 0a 2a 2a 20 61 20 72 65 73 75 6c 74 20 6f 66  e.** a result of
1baf0 20 74 68 65 69 72 20 64 65 66 65 63 74 69 76 65   their defective
1bb00 20 54 43 4c 20 72 61 74 68 65 72 20 74 68 61 6e   TCL rather than
1bb10 20 70 72 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c   problems in SQL
1bb20 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ite..*/.static i
1bb30 6e 74 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74  nt working_64bit
1bb40 5f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  _int(.  ClientDa
1bb50 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
1bb60 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
1bb70 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
1bb80 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
1bb90 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1bba0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
1bbb0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
1bbc0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
1bbd0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
1bbe0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
1bbf0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1bc00 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
1bc10 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1bc20 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
1bc30 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1bc40 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74    Tcl_Obj *pTest
1bc50 4f 62 6a 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69  Obj;.  int worki
1bc60 6e 67 20 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74  ng = 0;..  pTest
1bc70 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64  Obj = Tcl_NewWid
1bc80 65 49 6e 74 4f 62 6a 28 31 30 30 30 30 30 30 2a  eIntObj(1000000*
1bc90 28 69 36 34 29 31 32 33 34 35 36 37 38 39 30 29  (i64)1234567890)
1bca0 3b 0a 20 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74  ;.  working = st
1bcb0 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rcmp(Tcl_GetStri
1bcc0 6e 67 28 70 54 65 73 74 4f 62 6a 29 2c 20 22 31  ng(pTestObj), "1
1bcd0 32 33 34 35 36 37 38 39 30 30 30 30 30 30 30 22  234567890000000"
1bce0 29 3d 3d 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72  )==0;.  Tcl_Decr
1bcf0 52 65 66 43 6f 75 6e 74 28 70 54 65 73 74 4f 62  RefCount(pTestOb
1bd00 6a 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  j);.  Tcl_SetObj
1bd10 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1bd20 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
1bd30 28 77 6f 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65  (working));.  re
1bd40 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1bd50 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
1bd60 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74 68  commands with th
1bd70 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1bd80 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65  r..*/.int Sqlite
1bd90 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49  test1_Init(Tcl_I
1bda0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
1bdb0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
1bdc0 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
1bdd0 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
1bde0 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
1bdf0 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  t_count;.  exter
1be00 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  n int sqlite3_op
1be10 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a 20  en_file_count;. 
1be20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
1be30 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 3b 0a  te3_sort_count;.
1be40 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
1be50 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
1be60 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  e;.  extern int 
1be70 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
1be80 73 69 7a 65 3b 0a 20 20 65 78 74 65 72 6e 20 69  size;.  extern i
1be90 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
1bea0 68 61 72 65 64 43 61 63 68 65 52 65 70 6f 72 74  haredCacheReport
1beb0 28 76 6f 69 64 2a 2c 0a 20 20 20 20 20 20 20 20  (void*,.        
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bee0 20 20 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 69 6e    Tcl_Interp*,in
1bef0 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f 4e 53 54 2a  t,Tcl_Obj*CONST*
1bf00 29 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  );.  static stru
1bf10 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
1bf20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f  zName;.     Tcl_
1bf30 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a  CmdProc *xProc;.
1bf40 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20    } aCmd[] = {. 
1bf50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
1bf60 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20  printf_int",    
1bf70 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1bf80 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
1bf90 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a 20  intf_int    },. 
1bfa0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
1bfb0 70 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c 20 20  printf_int64",  
1bfc0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1bfd0 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
1bfe0 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c 0a 20  intf_int64  },. 
1bff0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
1c000 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20  printf_str",    
1c010 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1c020 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
1c030 69 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a 20  intf_str    },. 
1c040 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
1c050 6e 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20  nprintf_str",   
1c060 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1c070 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 73 6e 70  roc*)sqlite3_snp
1c080 72 69 6e 74 66 5f 73 74 72 20 20 20 7d 2c 0a 20  rintf_str   },. 
1c090 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
1c0a0 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 22 2c  printf_stronly",
1c0b0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1c0c0 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
1c0d0 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a 20  intf_stronly},. 
1c0e0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
1c0f0 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c 20  printf_double", 
1c100 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1c110 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
1c120 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a 20  intf_double },. 
1c130 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
1c140 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c 20  printf_scaled", 
1c150 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1c160 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
1c170 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a 20  intf_scaled },. 
1c180 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
1c190 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
1c1a0 22 2c 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f  ",   (Tcl_CmdPro
1c1b0 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  c*)sqlite3_mprin
1c1c0 74 66 5f 68 65 78 64 6f 75 62 6c 65 7d 2c 0a 20  tf_hexdouble},. 
1c1d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
1c1e0 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c 20  printf_z_test", 
1c1f0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1c200 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74  roc*)test_mprint
1c210 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  f_z        },.  
1c220 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
1c230 72 69 6e 74 66 5f 6e 5f 74 65 73 74 22 2c 20 20  rintf_n_test",  
1c240 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
1c250 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66  oc*)test_mprintf
1c260 5f 6e 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  _n        },.   
1c270 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 70    { "sqlite3_snp
1c280 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20  rintf_int",     
1c290 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
1c2a0 63 2a 29 74 65 73 74 5f 73 6e 70 72 69 6e 74 66  c*)test_snprintf
1c2b0 5f 69 6e 74 20 20 20 20 20 7d 2c 0a 20 20 20 20  _int     },.    
1c2c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 61 73 74   { "sqlite3_last
1c2d0 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20  _insert_rowid", 
1c2e0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1c2f0 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69  *)test_last_rowi
1c300 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  d       },.     
1c310 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  { "sqlite3_exec_
1c320 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20  printf",        
1c330 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
1c340 29 74 65 73 74 5f 65 78 65 63 5f 70 72 69 6e 74  )test_exec_print
1c350 66 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  f      },.     {
1c360 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 22 2c   "sqlite3_exec",
1c370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c380 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1c390 74 65 73 74 5f 65 78 65 63 20 20 20 20 20 20 20  test_exec       
1c3a0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
1c3b0 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72  "sqlite3_exec_nr
1c3c0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
1c3d0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
1c3e0 65 73 74 5f 65 78 65 63 5f 6e 72 20 20 20 20 20  est_exec_nr     
1c3f0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
1c400 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c  sqlite3_get_tabl
1c410 65 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20  e_printf",      
1c420 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
1c430 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69  st_get_table_pri
1c440 6e 74 66 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ntf },.     { "s
1c450 71 6c 69 74 65 33 5f 63 6c 6f 73 65 22 2c 20 20  qlite3_close",  
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1c470 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
1c480 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 20 20  ite_test_close  
1c490 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1c4a0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1c4b0 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54  ction",       (T
1c4c0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
1c4d0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1c4e0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1c4f0 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72  ite3_create_aggr
1c500 65 67 61 74 65 22 2c 20 20 20 20 20 20 28 54 63  egate",      (Tc
1c510 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
1c520 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
1c530 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1c540 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74  te_register_test
1c550 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 28 54 63 6c  _function", (Tcl
1c560 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72  _CmdProc*)test_r
1c570 65 67 69 73 74 65 72 5f 66 75 6e 63 20 20 20 20  egister_func    
1c580 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1c590 65 5f 61 62 6f 72 74 22 2c 20 20 20 20 20 20 20  e_abort",       
1c5a0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
1c5b0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f  CmdProc*)sqlite_
1c5c0 61 62 6f 72 74 20 20 20 20 20 20 20 20 20 20 7d  abort          }
1c5d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1c5e0 5f 62 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20  _bind",         
1c5f0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
1c600 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e  mdProc*)test_bin
1c610 64 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  d             },
1c620 0a 20 20 20 20 20 7b 20 22 62 72 65 61 6b 70 6f  .     { "breakpo
1c630 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
1c640 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
1c650 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 72 65 61  dProc*)test_brea
1c660 6b 70 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a  kpoint       },.
1c670 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1c680 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  key",           
1c690 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
1c6a0 50 72 6f 63 2a 29 74 65 73 74 5f 6b 65 79 20 20  Proc*)test_key  
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1c6c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72      { "sqlite3_r
1c6d0 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20  ekey",          
1c6e0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
1c6f0 72 6f 63 2a 29 74 65 73 74 5f 72 65 6b 65 79 20  roc*)test_rekey 
1c700 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1c710 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 65 74     { "sqlite_set
1c720 5f 6d 61 67 69 63 22 2c 20 20 20 20 20 20 20 20  _magic",        
1c730 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
1c740 6f 63 2a 29 73 71 6c 69 74 65 5f 73 65 74 5f 6d  oc*)sqlite_set_m
1c750 61 67 69 63 20 20 20 20 20 20 7d 2c 0a 20 20 20  agic      },.   
1c760 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 69 6e 74    { "sqlite3_int
1c770 65 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 20  errupt",        
1c780 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
1c790 63 2a 29 74 65 73 74 5f 69 6e 74 65 72 72 75 70  c*)test_interrup
1c7a0 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  t        },.    
1c7b0 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c 65 74   { "sqlite_delet
1c7c0 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20  e_function",    
1c7d0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
1c7e0 2a 29 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f  *)delete_functio
1c7f0 6e 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  n       },.     
1c800 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c 65 74 65  { "sqlite_delete
1c810 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 20 20 20 20  _collation",    
1c820 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
1c830 29 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f  )delete_collatio
1c840 6e 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  n      },.     {
1c850 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75   "sqlite3_get_au
1c860 74 6f 63 6f 6d 6d 69 74 22 2c 20 20 20 20 20 20  tocommit",      
1c870 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
1c880 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 20  get_autocommit  
1c890 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
1c8a0 22 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 75  "sqlite3_stack_u
1c8b0 73 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  sed",           
1c8c0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
1c8d0 65 73 74 5f 73 74 61 63 6b 5f 75 73 65 64 20 20  est_stack_used  
1c8e0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
1c8f0 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
1c900 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20  eout",          
1c910 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
1c920 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 20  st_busy_timeout 
1c930 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 70      },.     { "p
1c940 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20  rintf",         
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1c960 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
1c970 74 5f 70 72 69 6e 74 66 20 20 20 20 20 20 20 20  t_printf        
1c980 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1c990 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 22 2c  lite3_io_trace",
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
1c9b0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
1c9c0 5f 69 6f 5f 74 72 61 63 65 20 20 20 20 20 20 20  _io_trace       
1c9d0 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74    },.  };.  stat
1c9e0 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
1c9f0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
1ca00 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f     Tcl_ObjCmdPro
1ca10 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20 20 76  c *xProc;.     v
1ca20 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 3b  oid *clientData;
1ca30 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d  .  } aObjCmd[] =
1ca40 20 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74   {.     { "sqlit
1ca50 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_connection_po
1ca60 69 6e 74 65 72 22 2c 20 20 20 20 67 65 74 5f 73  inter",    get_s
1ca70 71 6c 69 74 65 5f 70 6f 69 6e 74 65 72 2c 20 30  qlite_pointer, 0
1ca80 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1ca90 74 65 33 5f 62 69 6e 64 5f 69 6e 74 22 2c 20 20  te3_bind_int",  
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1cab0 5f 62 69 6e 64 5f 69 6e 74 2c 20 20 20 20 20 20  _bind_int,      
1cac0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
1cad0 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
1cae0 6f 62 22 2c 20 20 20 20 20 20 20 20 20 74 65 73  ob",         tes
1caf0 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 2c  t_bind_zeroblob,
1cb00 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
1cb10 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
1cb20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
1cb30 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 2c 20 20  st_bind_int64,  
1cb40 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73    0 },.     { "s
1cb50 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
1cb60 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  le",           t
1cb70 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 2c  est_bind_double,
1cb80 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
1cb90 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
1cba0 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
1cbb0 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20  test_bind_null  
1cbc0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
1cbd0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65  "sqlite3_bind_te
1cbe0 78 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xt",            
1cbf0 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 20   test_bind_text 
1cc00 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
1cc10 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74   "sqlite3_bind_t
1cc20 65 78 74 31 36 22 2c 20 20 20 20 20 20 20 20 20  ext16",         
1cc30 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74    test_bind_text
1cc40 31 36 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  16   ,0 },.     
1cc50 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
1cc60 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20  blob",          
1cc70 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f     test_bind_blo
1cc80 62 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  b     ,0 },.    
1cc90 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
1cca0 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
1ccb0 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  ",  test_bind_pa
1ccc0 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 2c 20 30  rameter_count, 0
1ccd0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1cce0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
1ccf0 72 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73 74 5f  r_name",   test_
1cd00 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
1cd10 61 6d 65 2c 20 20 30 7d 2c 0a 20 20 20 20 20 7b  ame,  0},.     {
1cd20 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70   "sqlite3_bind_p
1cd30 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 22 2c  arameter_index",
1cd40 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61    test_bind_para
1cd50 6d 65 74 65 72 5f 69 6e 64 65 78 2c 20 30 7d 2c  meter_index, 0},
1cd60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1cd70 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 22  _clear_bindings"
1cd80 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6c  ,        test_cl
1cd90 65 61 72 5f 62 69 6e 64 69 6e 67 73 2c 20 30 7d  ear_bindings, 0}
1cda0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1cdb0 33 5f 73 6c 65 65 70 22 2c 20 20 20 20 20 20 20  3_sleep",       
1cdc0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73            test_s
1cdd0 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 30  leep,          0
1cde0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1cdf0 65 33 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20  e3_errcode",    
1ce00 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
1ce10 65 72 72 63 6f 64 65 20 20 20 20 20 20 20 2c 30  errcode       ,0
1ce20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
1ce30 74 65 33 5f 65 72 72 6d 73 67 22 2c 20 20 20 20  te3_errmsg",    
1ce40 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1ce50 5f 65 72 72 6d 73 67 20 20 20 20 20 20 20 20 2c  _errmsg        ,
1ce60 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
1ce70 69 74 65 33 5f 65 72 72 6d 73 67 31 36 22 2c 20  ite3_errmsg16", 
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
1ce90 74 5f 65 72 72 6d 73 67 31 36 20 20 20 20 20 20  t_errmsg16      
1cea0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
1ceb0 6c 69 74 65 33 5f 6f 70 65 6e 22 2c 20 20 20 20  lite3_open",    
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1ced0 73 74 5f 6f 70 65 6e 20 20 20 20 20 20 20 20 20  st_open         
1cee0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
1cef0 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 22 2c 20  qlite3_open16", 
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1cf10 65 73 74 5f 6f 70 65 6e 31 36 20 20 20 20 20 20  est_open16      
1cf20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
1cf30 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
1cf40 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  16",            
1cf50 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 20  test_complete16 
1cf60 20 20 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b     ,0 },..     {
1cf70 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   "sqlite3_prepar
1cf80 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
1cf90 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 20 20    test_prepare  
1cfa0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
1cfb0 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61  { "sqlite3_prepa
1cfc0 72 65 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  re16",          
1cfd0 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 31     test_prepare1
1cfe0 36 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  6     ,0 },.    
1cff0 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70   { "sqlite3_prep
1d000 61 72 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20  are_v2",        
1d010 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65      test_prepare
1d020 5f 76 32 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  _v2    ,0 },.   
1d030 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65    { "sqlite3_pre
1d040 70 61 72 65 31 36 5f 76 32 22 2c 20 20 20 20 20  pare16_v2",     
1d050 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72       test_prepar
1d060 65 31 36 5f 76 32 20 20 2c 30 20 7d 2c 0a 20 20  e16_v2  ,0 },.  
1d070 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69     { "sqlite3_fi
1d080 6e 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20  nalize",        
1d090 20 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c        test_final
1d0a0 69 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  ize      ,0 },. 
1d0b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72      { "sqlite3_r
1d0c0 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20  eset",          
1d0d0 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 73 65         test_rese
1d0e0 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  t         ,0 },.
1d0f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1d100 65 78 70 69 72 65 64 22 2c 20 20 20 20 20 20 20  expired",       
1d110 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 78 70          test_exp
1d120 69 72 65 64 20 20 20 20 20 20 20 2c 30 20 7d 2c  ired       ,0 },
1d130 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1d140 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e  _transfer_bindin
1d150 67 73 22 2c 20 20 20 20 20 74 65 73 74 5f 74 72  gs",     test_tr
1d160 61 6e 73 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d  ansfer_bind ,0 }
1d170 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1d180 33 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20  3_changes",     
1d190 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
1d1a0 68 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20  hanges       ,0 
1d1b0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1d1c0 65 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20  e3_step",       
1d1d0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
1d1e0 73 74 65 70 20 20 20 20 20 20 20 20 20 20 2c 30  step          ,0
1d1f0 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c   },..     { "sql
1d200 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
1d210 6f 72 79 22 2c 20 20 20 20 20 20 20 20 74 65 73  ory",        tes
1d220 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  t_release_memory
1d230 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b  ,     0},.     {
1d240 20 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68   "sqlite3_soft_h
1d250 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20  eap_limit",     
1d260 20 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70    test_soft_heap
1d270 5f 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20  _limit,    0},. 
1d280 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
1d290 6c 65 61 72 5f 74 73 64 5f 6d 65 6d 64 65 62 75  lear_tsd_memdebu
1d2a0 67 22 2c 20 20 20 20 74 65 73 74 5f 63 6c 65 61  g",    test_clea
1d2b0 72 5f 74 73 64 5f 6d 65 6d 64 65 62 75 67 2c 20  r_tsd_memdebug, 
1d2c0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
1d2d0 74 65 33 5f 74 73 64 5f 72 65 6c 65 61 73 65 22  te3_tsd_release"
1d2e0 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
1d2f0 5f 74 73 64 5f 72 65 6c 65 61 73 65 2c 20 20 20  _tsd_release,   
1d300 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
1d310 22 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f  "sqlite3_thread_
1d320 63 6c 65 61 6e 75 70 22 2c 20 20 20 20 20 20 20  cleanup",       
1d330 20 74 65 73 74 5f 74 68 72 65 61 64 5f 63 6c 65   test_thread_cle
1d340 61 6e 75 70 2c 20 20 20 20 20 30 7d 2c 0a 20 20  anup,     0},.  
1d350 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 61     { "sqlite3_pa
1d360 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 22 2c 20  ger_refcounts", 
1d370 20 20 20 20 20 20 74 65 73 74 5f 70 61 67 65 72        test_pager
1d380 5f 72 65 66 63 6f 75 6e 74 73 2c 20 20 20 20 30  _refcounts,    0
1d390 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
1d3a0 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
1d3b0 6f 6e 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  on",        test
1d3c0 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c  _load_extension,
1d3d0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
1d3e0 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f  "sqlite3_enable_
1d3f0 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c  load_extension",
1d400 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61   test_enable_loa
1d410 64 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  d,        0},.  
1d420 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
1d430 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f  tended_result_co
1d440 64 65 73 22 2c 20 74 65 73 74 5f 65 78 74 65 6e  des", test_exten
1d450 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
1d460 2c 20 30 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73  , 0},..     /* s
1d470 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28  qlite3_column_*(
1d480 29 20 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20  ) API */.     { 
1d490 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
1d4a0 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  count",         
1d4b0 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75   test_column_cou
1d4c0 6e 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  nt  ,0 },.     {
1d4d0 20 22 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63   "sqlite3_data_c
1d4e0 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
1d4f0 20 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e    test_data_coun
1d500 74 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  t    ,0 },.     
1d510 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
1d520 6e 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 20  n_type",        
1d530 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74     test_column_t
1d540 79 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  ype   ,0 },.    
1d550 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
1d560 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  mn_blob",       
1d570 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
1d580 62 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20  blob   ,0 },.   
1d590 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
1d5a0 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  umn_double",    
1d5b0 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
1d5c0 5f 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20  _double ,0 },.  
1d5d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
1d5e0 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20  lumn_int64",    
1d5f0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
1d600 6e 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20  n_int64  ,0 },. 
1d610 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
1d620 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 20  olumn_text",    
1d630 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66     test_stmt_utf
1d640 38 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  8,  sqlite3_colu
1d650 6d 6e 5f 74 65 78 74 20 20 20 20 20 20 7d 2c 0a  mn_text      },.
1d660 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
1d670 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 22  column_decltype"
1d680 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  ,   test_stmt_ut
1d690 66 38 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  f8,  sqlite3_col
1d6a0 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 20 7d 2c  umn_decltype  },
1d6b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1d6c0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20  _column_name",  
1d6d0 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75       test_stmt_u
1d6e0 74 66 38 2c 20 20 73 71 6c 69 74 65 33 5f 63 6f  tf8,  sqlite3_co
1d6f0 6c 75 6d 6e 5f 6e 61 6d 65 20 20 20 20 20 20 7d  lumn_name      }
1d700 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1d710 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20  3_column_int",  
1d720 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f        test_stmt_
1d730 69 6e 74 2c 20 20 20 73 71 6c 69 74 65 33 5f 63  int,   sqlite3_c
1d740 6f 6c 75 6d 6e 5f 69 6e 74 20 20 20 20 20 20 20  olumn_int       
1d750 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
1d760 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 22  e3_column_bytes"
1d770 2c 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74  ,      test_stmt
1d780 5f 69 6e 74 2c 20 20 20 73 71 6c 69 74 65 33 5f  _int,   sqlite3_
1d790 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 20 20 20  column_bytes    
1d7a0 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54   },.#ifdef SQLIT
1d7b0 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
1d7c0 4d 45 54 41 44 41 54 41 0a 7b 20 22 73 71 6c 69  METADATA.{ "sqli
1d7d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62  te3_column_datab
1d7e0 61 73 65 5f 6e 61 6d 65 22 2c 20 74 65 73 74 5f  ase_name", test_
1d7f0 73 74 6d 74 5f 75 74 66 38 2c 20 73 71 6c 69 74  stmt_utf8, sqlit
1d800 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
1d810 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c  se_name},.{ "sql
1d820 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
1d830 65 5f 6e 61 6d 65 22 2c 20 74 65 73 74 5f 73 74  e_name", test_st
1d840 6d 74 5f 75 74 66 38 2c 20 73 71 6c 69 74 65 33  mt_utf8, sqlite3
1d850 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
1d860 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f  me},.{ "sqlite3_
1d870 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61  column_origin_na
1d880 6d 65 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75  me", test_stmt_u
1d890 74 66 38 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tf8, sqlite3_col
1d8a0 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 7d  umn_origin_name}
1d8b0 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ,.#endif..#ifnde
1d8c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1d8d0 46 31 36 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  F16.     { "sqli
1d8e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
1d8f0 31 36 22 2c 20 20 20 20 74 65 73 74 5f 73 74 6d  16",    test_stm
1d900 74 5f 69 6e 74 2c 20 20 20 73 71 6c 69 74 65 33  t_int,   sqlite3
1d910 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20  _column_bytes16 
1d920 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
1d930 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1d940 31 36 22 2c 20 20 20 20 20 74 65 73 74 5f 73 74  16",     test_st
1d950 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65  mt_utf16, sqlite
1d960 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 20  3_column_text16 
1d970 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
1d980 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
1d990 6c 74 79 70 65 31 36 22 2c 20 74 65 73 74 5f 73  ltype16", test_s
1d9a0 74 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74  tmt_utf16, sqlit
1d9b0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
1d9c0 70 65 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73  pe16},.     { "s
1d9d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
1d9e0 6d 65 31 36 22 2c 20 20 20 20 20 74 65 73 74 5f  me16",     test_
1d9f0 73 74 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69  stmt_utf16, sqli
1da00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31  te3_column_name1
1da10 36 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  6    },.     { "
1da20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65  add_alignment_te
1da30 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 22 2c 20  st_collations", 
1da40 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65  add_alignment_te
1da50 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 2c 20 30  st_collations, 0
1da60 20 20 20 20 20 20 7d 2c 0a 23 69 66 64 65 66 20        },.#ifdef 
1da70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
1da80 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 22  LUMN_METADATA.{"
1da90 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1daa0 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 22 2c  atabase_name16",
1dab0 0a 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  .  test_stmt_utf
1dac0 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  16, sqlite3_colu
1dad0 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65  mn_database_name
1dae0 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63  16},.{"sqlite3_c
1daf0 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65  olumn_table_name
1db00 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75  16", test_stmt_u
1db10 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f  tf16, sqlite3_co
1db20 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31  lumn_table_name1
1db30 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f  6},.{"sqlite3_co
1db40 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65  lumn_origin_name
1db50 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75  16", test_stmt_u
1db60 74 66 31 36 2c 20 73 71 6c 69 74 65 33 5f 63 6f  tf16, sqlite3_co
1db70 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65  lumn_origin_name
1db80 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64  16},.#endif.#end
1db90 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
1dba0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
1dbb0 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72  ion_v2", test_cr
1dbc0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
1dbd0 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  2, 0 },.     { "
1dbe0 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
1dbf0 65 63 6f 76 65 72 22 2c 20 20 20 20 20 74 65 73  ecover",     tes
1dc00 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  t_global_recover
1dc10 2c 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  , 0   },.     { 
1dc20 22 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69  "working_64bit_i
1dc30 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 77 6f  nt",          wo
1dc40 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 2c  rking_64bit_int,
1dc50 20 20 20 30 20 20 20 7d 2c 0a 0a 20 20 20 20 20     0   },..     
1dc60 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f  /* Functions fro
1dc70 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66 6e 64 65  m os.h */.#ifnde
1dc80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
1dc90 53 4b 49 4f 0a 20 20 20 20 20 7b 20 22 73 71 6c  SKIO.     { "sql
1dca0 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
1dcb0 69 74 65 22 2c 74 65 73 74 5f 73 71 6c 69 74 65  ite",test_sqlite
1dcc0 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
1dcd0 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
1dce0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 22 2c 20  qlite3OsClose", 
1dcf0 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69         test_sqli
1dd00 74 65 33 4f 73 43 6c 6f 73 65 2c 20 30 20 7d 2c  te3OsClose, 0 },
1dd10 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1dd20 4f 73 4c 6f 63 6b 22 2c 20 20 20 20 20 20 20 20  OsLock",        
1dd30 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4c   test_sqlite3OsL
1dd40 6f 63 6b 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ock, 0 },.     {
1dd50 20 22 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46   "sqlite3OsTempF
1dd60 69 6c 65 4e 61 6d 65 22 2c 20 74 65 73 74 5f 73  ileName", test_s
1dd70 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
1dd80 4e 61 6d 65 2c 20 30 20 7d 2c 0a 20 20 20 0a 20  Name, 0 },.   . 
1dd90 20 20 20 20 2f 2a 20 43 75 73 74 6f 6d 20 74 65      /* Custom te
1dda0 73 74 20 69 6e 74 65 72 66 61 63 65 73 20 2a 2f  st interfaces */
1ddb0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1ddc0 4f 73 55 6e 6c 6f 63 6b 22 2c 20 20 20 20 20 20  OsUnlock",      
1ddd0 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f     test_sqlite3O
1dde0 73 55 6e 6c 6f 63 6b 2c 20 30 20 20 20 20 7d 2c  sUnlock, 0    },
1ddf0 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
1de00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1de10 36 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65  6.     { "add_te
1de20 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20  st_collate",    
1de30 20 20 20 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65      test_collate
1de40 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20 7d  , 0            }
1de50 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65  ,.     { "add_te
1de60 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
1de70 64 22 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  d", test_collate
1de80 5f 6e 65 65 64 65 64 2c 20 30 20 20 20 20 20 7d  _needed, 0     }
1de90 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65  ,.     { "add_te
1dea0 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20  st_function",   
1deb0 20 20 20 20 74 65 73 74 5f 66 75 6e 63 74 69 6f      test_functio
1dec0 6e 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 7d  n, 0           }
1ded0 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
1dee0 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72  "sqlite3_test_er
1def0 72 73 74 72 22 2c 20 20 20 20 20 74 65 73 74 5f  rstr",     test_
1df00 65 72 72 73 74 72 2c 20 30 20 20 20 20 20 20 20  errstr, 0       
1df10 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
1df20 22 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79  "tcl_variable_ty
1df30 70 65 22 2c 20 20 20 20 20 20 20 74 63 6c 5f 76  pe",       tcl_v
1df40 61 72 69 61 62 6c 65 5f 74 79 70 65 2c 20 30 20  ariable_type, 0 
1df50 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66        },.#ifndef
1df60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1df70 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 7b  RED_CACHE.     {
1df80 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65   "sqlite3_enable
1df90 5f 73 68 61 72 65 64 5f 63 61 63 68 65 22 2c 20  _shared_cache", 
1dfa0 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72  test_enable_shar
1dfb0 65 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  ed, 0  },.     {
1dfc0 20 22 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64   "sqlite3_shared
1dfd0 5f 63 61 63 68 65 5f 72 65 70 6f 72 74 22 2c 20  _cache_report", 
1dfe0 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72  sqlite3BtreeShar
1dff0 65 64 43 61 63 68 65 52 65 70 6f 72 74 2c 20 30  edCacheReport, 0
1e000 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
1e010 20 22 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72   "sqlite3_libver
1e020 73 69 6f 6e 5f 6e 75 6d 62 65 72 22 2c 20 74 65  sion_number", te
1e030 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  st_libversion_nu
1e040 6d 62 65 72 2c 20 30 20 20 7d 2c 0a 23 69 66 64  mber, 0  },.#ifd
1e050 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1e060 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
1e070 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
1e080 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
1e090 74 61 64 61 74 61 22 2c 20 74 65 73 74 5f 74 61  tadata", test_ta
1e0a0 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
1e0b0 61 74 61 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69  ata, 0  },.#endi
1e0c0 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
1e0d0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1e0e0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
1e0f0 6c 6f 62 5f 72 65 61 64 22 2c 20 20 74 65 73 74  lob_read",  test
1e100 5f 62 6c 6f 62 5f 72 65 61 64 2c 20 30 20 20 7d  _blob_read, 0  }
1e110 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
1e120 33 5f 62 6c 6f 62 5f 77 72 69 74 65 22 2c 20 74  3_blob_write", t
1e130 65 73 74 5f 62 6c 6f 62 5f 77 72 69 74 65 2c 20  est_blob_write, 
1e140 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d  0  },.#endif.  }
1e150 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 62  ;.  static int b
1e160 69 74 6d 61 73 6b 5f 73 69 7a 65 20 3d 20 73 69  itmask_size = si
1e170 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 3b  zeof(Bitmask)*8;
1e180 0a 20 20 69 6e 74 20 69 3b 0a 20 20 65 78 74 65  .  int i;.  exte
1e190 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  rn int sqlite3_w
1e1a0 68 65 72 65 5f 74 72 61 63 65 3b 0a 20 20 65 78  here_trace;.  ex
1e1b0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
1e1c0 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 73 71 6c  _sync_count, sql
1e1d0 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
1e1e0 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
1e1f0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
1e200 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  mp_count;.  exte
1e210 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  rn int sqlite3_m
1e220 65 6d 55 73 65 64 3b 0a 20 20 65 78 74 65 72 6e  emUsed;.  extern
1e230 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d   int sqlite3_mem
1e240 4d 61 78 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  Max;.  extern in
1e250 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63  t sqlite3_like_c
1e260 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
1e270 6e 74 20 73 71 6c 69 74 65 33 5f 74 73 64 5f 63  nt sqlite3_tsd_c
1e280 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
1e290 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  nt sqlite3_xfero
1e2a0 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  pt_count;.  exte
1e2b0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
1e2c0 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
1e2d0 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
1e2e0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
1e2f0 69 74 65 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65  itedb_count;.  e
1e300 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1e310 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
1e320 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
1e330 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
1e340 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 3b 0a 23  _pgfree_count;.#
1e350 69 66 20 4f 53 5f 55 4e 49 58 20 26 26 20 64 65  if OS_UNIX && de
1e360 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1e370 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 48  T) && defined(TH
1e380 52 45 41 44 53 41 46 45 29 20 26 26 20 54 48 52  READSAFE) && THR
1e390 45 41 44 53 41 46 45 0a 20 20 65 78 74 65 72 6e  EADSAFE.  extern
1e3a0 20 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72   int threadsOver
1e3b0 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
1e3c0 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  cks;.#endif.#if 
1e3d0 4f 53 5f 57 49 4e 0a 20 20 65 78 74 65 72 6e 20  OS_WIN.  extern 
1e3e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  int sqlite3_os_t
1e3f0 79 70 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  ype;.#endif.#ifd
1e400 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1e410 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
1e420 69 74 65 33 5f 6f 73 5f 74 72 61 63 65 3b 0a 20  ite3_os_trace;. 
1e430 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
1e440 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74  te3_vdbe_addop_t
1e450 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66  race;.#endif.#if
1e460 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1e470 20 20 65 78 74 65 72 6e 20 63 68 61 72 20 73 71    extern char sq
1e480 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
1e490 5b 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61  [];.  static cha
1e4a0 72 20 2a 71 75 65 72 79 5f 70 6c 61 6e 20 3d 20  r *query_plan = 
1e4b0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
1e4c0 61 6e 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f  an;.#endif..  fo
1e4d0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
1e4e0 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d  aCmd)/sizeof(aCm
1e4f0 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  d[0]); i++){.   
1e500 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61   Tcl_CreateComma
1e510 6e 64 28 69 6e 74 65 72 70 2c 20 61 43 6d 64 5b  nd(interp, aCmd[
1e520 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b 69  i].zName, aCmd[i
1e530 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a  ].xProc, 0, 0);.
1e540 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1e550 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29  <sizeof(aObjCmd)
1e560 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b  /sizeof(aObjCmd[
1e570 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  0]); i++){.    T
1e580 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
1e590 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a  and(interp, aObj
1e5a0 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20  Cmd[i].zName, . 
1e5b0 20 20 20 20 20 20 20 61 4f 62 6a 43 6d 64 5b 69         aObjCmd[i
1e5c0 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a 43 6d 64  ].xProc, aObjCmd
1e5d0 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74 61 2c 20  [i].clientData, 
1e5e0 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c 69  0);.  }.  Tcl_Li
1e5f0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
1e600 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f 75  qlite_search_cou
1e610 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
1e620 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 65 61 72  r*)&sqlite3_sear
1e630 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  ch_count, TCL_LI
1e640 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
1e650 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
1e660 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e  sqlite_sort_coun
1e670 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
1e680 2a 29 26 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  *)&sqlite3_sort_
1e690 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
1e6a0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
1e6b0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
1e6c0 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
1e6d0 65 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  e", .      (char
1e6e0 2a 29 26 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62  *)&sqlite3_max_b
1e6f0 6c 6f 62 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e  lobsize, TCL_LIN
1e700 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
1e710 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
1e720 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
1e730 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
1e740 29 26 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63  )&sqlite3_like_c
1e750 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
1e760 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
1e770 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
1e780 74 65 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  te_interrupt_cou
1e790 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
1e7a0 72 2a 29 26 73 71 6c 69 74 65 33 5f 69 6e 74 65  r*)&sqlite3_inte
1e7b0 72 72 75 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c  rrupt_count, TCL
1e7c0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
1e7d0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
1e7e0 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66  , "sqlite_open_f
1e7f0 69 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  ile_count", .   
1e800 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
1e810 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  e3_open_file_cou
1e820 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
1e830 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
1e840 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
1e850 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 22 2c 20  _current_time", 
1e860 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
1e870 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
1e880 69 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ime, TCL_LINK_IN
1e890 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
1e8a0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
1e8b0 65 33 5f 74 73 64 5f 63 6f 75 6e 74 22 2c 0a 20  e3_tsd_count",. 
1e8c0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
1e8d0 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 2c 20  ite3_tsd_count, 
1e8e0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
1e8f0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1e900 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 78 66  erp, "sqlite3_xf
1e910 65 72 6f 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20  eropt_count",.  
1e920 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
1e930 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
1e940 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
1e950 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
1e960 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
1e970 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1e980 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
1e990 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65  r*)&sqlite3_page
1e9a0 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20  r_readdb_count, 
1e9b0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
1e9c0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1e9d0 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
1e9e0 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
1e9f0 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
1ea00 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  )&sqlite3_pager_
1ea10 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54  writedb_count, T
1ea20 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
1ea30 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
1ea40 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67  rp, "sqlite3_pag
1ea50 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22  er_writej_count"
1ea60 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
1ea70 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
1ea80 69 74 65 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  itej_count, TCL_
1ea90 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
1eaa0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
1eab0 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
1eac0 70 67 66 72 65 65 5f 63 6f 75 6e 74 22 2c 0a 20  pgfree_count",. 
1ead0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
1eae0 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
1eaf0 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  e_count, TCL_LIN
1eb00 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20  K_INT);.#ifndef 
1eb10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1eb20 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  6.  Tcl_LinkVar(
1eb30 69 6e 74 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e  interp, "unalign
1eb40 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
1eb50 72 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  r",.      (char*
1eb60 29 26 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69  )&unaligned_stri
1eb70 6e 67 5f 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f  ng_counter, TCL_
1eb80 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
1eb90 66 0a 23 69 66 20 4f 53 5f 55 4e 49 58 20 26 26  f.#if OS_UNIX &&
1eba0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ebb0 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
1ebc0 28 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  (THREADSAFE) && 
1ebd0 54 48 52 45 41 44 53 41 46 45 0a 20 20 54 63 6c  THREADSAFE.  Tcl
1ebe0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
1ebf0 20 22 74 68 72 65 61 64 73 4f 76 65 72 72 69 64   "threadsOverrid
1ec00 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
1ec10 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
1ec20 26 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65  &threadsOverride
1ec30 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 2c  EachOthersLocks,
1ec40 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
1ec50 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
1ec60 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1ec70 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
1ec80 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c  nterp, "sqlite_l
1ec90 61 73 74 5f 6e 65 65 64 65 64 5f 63 6f 6c 6c 61  ast_needed_colla
1eca0 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 28 63 68  tion",.      (ch
1ecb0 61 72 2a 29 26 70 7a 4e 65 65 64 65 64 43 6f 6c  ar*)&pzNeededCol
1ecc0 6c 61 74 69 6f 6e 2c 20 54 43 4c 5f 4c 49 4e 4b  lation, TCL_LINK
1ecd0 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b  _STRING|TCL_LINK
1ece0 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e  _READ_ONLY);.#en
1ecf0 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20  dif.#if OS_WIN. 
1ed00 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1ed10 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f  erp, "sqlite_os_
1ed20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 28 63 68  type",.      (ch
1ed30 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f  ar*)&sqlite3_os_
1ed40 74 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  type, TCL_LINK_I
1ed50 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  NT);.#endif.#ifd
1ed60 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1ed70 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
1ed80 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 71 75 65  erp, "sqlite_que
1ed90 72 79 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20  ry_plan",.      
1eda0 28 63 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c  (char*)&query_pl
1edb0 61 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52  an, TCL_LINK_STR
1edc0 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41  ING|TCL_LINK_REA
1edd0 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a  D_ONLY);.#endif.
1ede0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1edf0 42 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  BUG.  Tcl_LinkVa
1ee00 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
1ee10 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 22 2c 0a  e_addop_trace",.
1ee20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
1ee30 6c 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70  lite3_vdbe_addop
1ee40 5f 74 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b  _trace, TCL_LINK
1ee50 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
1ee60 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
1ee70 6c 69 74 65 5f 77 68 65 72 65 5f 74 72 61 63 65  lite_where_trace
1ee80 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
1ee90 26 73 71 6c 69 74 65 33 5f 77 68 65 72 65 5f 74  &sqlite3_where_t
1eea0 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
1eeb0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
1eec0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
1eed0 74 65 5f 6f 73 5f 74 72 61 63 65 22 2c 0a 20 20  te_os_trace",.  
1eee0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
1eef0 74 65 33 5f 6f 73 5f 74 72 61 63 65 2c 20 54 43  te3_os_trace, TC
1ef00 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e  L_LINK_INT);.#en
1ef10 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1ef20 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 54 63 6c  E_MEMDEBUG.  Tcl
1ef30 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
1ef40 20 22 73 71 6c 69 74 65 5f 6d 65 6d 75 73 65 64   "sqlite_memused
1ef50 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
1ef60 26 73 71 6c 69 74 65 33 5f 6d 65 6d 55 73 65 64  &sqlite3_memUsed
1ef70 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 20 7c  , TCL_LINK_INT |
1ef80 20 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f   TCL_LINK_READ_O
1ef90 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  NLY);.  Tcl_Link
1efa0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
1efb0 69 74 65 5f 6d 65 6d 6d 61 78 22 2c 0a 20 20 20  ite_memmax",.   
1efc0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
1efd0 65 33 5f 6d 65 6d 4d 61 78 2c 20 54 43 4c 5f 4c  e3_memMax, TCL_L
1efe0 49 4e 4b 5f 49 4e 54 20 7c 20 54 43 4c 5f 4c 49  INK_INT | TCL_LI
1eff0 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23  NK_READ_ONLY);.#
1f000 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
1f010 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
1f020 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
1f030 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
1f040 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a  pentemp_count",.
1f050 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
1f060 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
1f070 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
1f080 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63  NT);.#endif.  Tc
1f090 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
1f0a0 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63  , "sqlite_static
1f0b0 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2c 0a 20 20  _bind_value",.  
1f0c0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
1f0d0 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
1f0e0 61 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  alue, TCL_LINK_S
1f0f0 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69  TRING);.  Tcl_Li
1f100 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
1f110 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
1f120 64 5f 6e 62 79 74 65 22 2c 0a 20 20 20 20 20 20  d_nbyte",.      
1f130 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73  (char*)&sqlite_s
1f140 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65  tatic_bind_nbyte
1f150 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
1f160 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
1f170 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 74  nterp, "sqlite_t
1f180 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a  emp_directory",.
1f190 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
1f1a0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
1f1b0 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  tory, TCL_LINK_S
1f1c0 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69  TRING);.  Tcl_Li
1f1d0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 62  nkVar(interp, "b
1f1e0 69 74 6d 61 73 6b 5f 73 69 7a 65 22 2c 0a 20 20  itmask_size",.  
1f1f0 20 20 20 20 28 63 68 61 72 2a 29 26 62 69 74 6d      (char*)&bitm
1f200 61 73 6b 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49  ask_size, TCL_LI
1f210 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f  NK_INT|TCL_LINK_
1f220 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 69 66 20  READ_ONLY);.#if 
1f230 4f 53 5f 55 4e 49 58 0a 20 20 54 63 6c 5f 4c 69  OS_UNIX.  Tcl_Li
1f240 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
1f250 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74  qlite_sync_count
1f260 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
1f270 26 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f  &sqlite3_sync_co
1f280 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
1f290 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
1f2a0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
1f2b0 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  e_fullsync_count
1f2c0 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
1f2d0 26 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e  &sqlite3_fullsyn
1f2e0 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  c_count, TCL_LIN
1f2f0 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 20 2f  K_INT);.#endif /
1f300 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a 0a 20 20  * OS_UNIX */..  
1f310 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1f320 0a                                               .